# Piecewise Constraint in Abstract Model

I would like to write a piecewise constraint for an Abstract Model in Pyomo.

\operatorname{pu}_i(t_i^{'v})=\begin{align}\begin{cases}\rho_1(e_i'-t_i^{'v})+\rho_2(e_i-e_i'),\quad& t_i^{'v}\le e_i',\\\rho_2(e_i-t_i^{'v}),&e_i'

The only variable here is $$t'^{v}_i$$, the $$\rho$$, $$e$$, and $$l$$ values are defined in a separate .dat file.

Here is what I tried to do, but I am struggling with the breakpoints:

def PenaltyCost_rule(model, v, i):
if value(model.t[v,i]) <= model.ep[i]:
return model.pn[v,i] == model.rho[1]*(model.ep[i]-model.t[v,i]) + model.rho[2]*(model.e[i]-model.ep[i])
if value(model.t[v,i]) >= model.ep[i] & value(model.t[v,i])<= model.e[i]:
return model.pn[v,i] == model.rho[2]*(model.e[i]-model.t[v,i])
if value(model.t[v,i]) >= model.e[i] & value(model.t[v,i]) <= model.l[i]:
return model.pn[v,i] == 0
if value(model.t[v,i]) >= model.l[i] & value(model.t[v,i])<= model.lp[i]:
return model.pn[v,i] == model.rho[3]*(model.t[v,i]-model.l[i])
if value(model.t[v,i]) >= model.lp[i]:
return model.pn[v,i] == model.rho[1]*(model.ep[i]-model.tp[i,v]) + model.rho[3]*(model.t[i]-model.l[i])
model.PenaltyConstConstraint = Constraint(model.v, model.n, rule=PenaltyCost_rule)

bpts = [model.ep[i],model.e[i], model.l[i],model.lp[i]]

model.Penalty_constraint = Piecewise(
model.v, model.n,
model.t, model.pn,
pw_pts=bpts,
pw_repn='INC',
pw_constr_type = 'EQ',
f_rule = PenaltyCost_rule)


If I understand the question correctly, you can just separate the breakpoint and dedicate an if-then condition for each of them inside your constraint generator function. BTW, take a look at the last line of your constraint (the figure that uploaded), the last $$l_i$$ should be $$l'_i$$ (??).