How can I put an absolute term for a variable into a linear model?

You cannot put an absolute term for a variable directly into a linear model such as LP or MIP. The model fragment below will not work:

```
[...]
obj.. z=e=sum(j, abs(x(j)));
cons(i).. sum(j, a(i,j)*x(j)) =l= b(i);
model foo /all/;
solve foo minimizing z using lp;
```

Various error messages will be given:

```
14 solve foo minimizing z using lp;
**** $51,256
**** 51 Endogenous function argument(s) not allowed in linear models
**** 256 Error(s) in analyzing solve statement. More detail appears
**** Below the solve statement above
**** The following LP errors were detected in model foo:
**** 51 equation obj.. the function ABS is called with non-constant arguments
```

Instead of using the *abs()* function, you could introduce two positive variables *xpos(j)* and *xneg(j)* and substitute:

*abs(x(j)) = xpos(j) + xneg(j)*

*x(j) = xpos(j) - xneg(j)*

This reformulation splits the *x(j)* into a positive part *xpos(j)* and a negative part *xneg(j)*. Note that this only works if *abs(x(j))* is minimized, because in that case, either *xpos(j)* or *xneg(j)* is forced to zero in an optimal solution.

The reformulated model fragment is:

```
[...]
positive variable xpos(j), xneg(j);
[...]
obj.. z=e=sum(j, xpos(j) + xneg(j));
cons(i).. sum(j, a(i,j)*(xpos(j) - xneg(j))) =l= b(i);
model foo /all/;
solve foo minimizing z using lp;
```