Constraint

class Constraint

The Constraint object stores the information regarding a constraint in the algebraic model. It can contain multiple constraint instances, or can be scalar. Generally, numerical values are available for each ConstraintInstance, which are accessible through the function Constraint.get. For scalar constraints, direct accessors to the values are available (see functions Constraint.body or Constraint.dual below).

For ease of use, values for the entire algebraic entity can be accessed directly and assigned to MATLAB vectors using the DataFrame object. To assign values in this way, see AMPL.setData. To get the values use Constraint.getValues.

get(key)

classmethod Constraint.get(key)

Syntax

v = get(key)

Description

v = get(key) returns the ConstraintInstance corresponding to the specified key. Note that the same effect can be achieved using MATLAB’s indexing operator (round brackets).

Input Arguments

key

The key of the constraint instance to look up.

**Output Arguments**

v

The specified constraint instance

Example

Create an indexed constraint, get a reference to an instance and drop it

ampl.eval('var x{1..5} <= 10;');
ampl.eval('maximize z : sum{i in 1..5} x[i];');
ampl.eval('c{i in 1..5}: x[i] <= i;');

x = ampl.getVariable('x');
c = ampl.getConstraint('c');
ampl.solve;
x.getValues

c.get(3).drop();
ampl.solve;
x.getValues

gives:

ans =
x [*] :=
1  1
2  2
3  3
4  4
5  5
;

ans =
x [*] :=
1   1
2   2
3  10
4   4
5   5
;

getValues

classmethod Constraint.getValues()

Syntax

df = c.getValues()

df = c.getValues(suffixes)

Description

These functions return a dataframe with all the specified values of the constraint, decoupled from the underlying AMPL. To gain access to the data, see DataFrame.

c.getValues() gets the AMPL value (equivalent to the suffix dual)

c.getValues(suffixes) allows the user to specify which suffixes to get

Input Arguments

suffixes

Strings specifying which suffixes of the constraint to get (see AMPL built-in suffixes).

**Output Arguments**

df

A dataframe containing all the specified values of the constraint and its indices

Example

Create an algebraic variable in AMPL, then get the body and the lower and upper bounds for all instances in a dataframe.

 ampl.eval('var x{1..5} <= 10;');
ampl.eval('maximize z : sum{i in 1..5} x[i];');
ampl.eval('c{i in 1..5}: -i <= x[i] <= i;');


c = ampl.getConstraint('c');
ampl.solve;
df = c.getValues('body', 'lb', 'ub')

gives:

i in 1 .. 5  |  body  lb    ub
1.0          |  1.0   -1.0  1.0
2.0          |  2.0   -2.0  2.0
3.0          |  3.0   -3.0  3.0
4.0          |  4.0   -4.0  4.0
5.0          |  5.0   -5.0  5.0

body()

classmethod Constraint.body()

Syntax

v = body()

Description

v = body() FOR SCALAR CONSTRAINTS ONLY: Get the current value of the constraint’s body

**Output Arguments**

v

The current body of the constraint

Example

Create a scalar constraint c (using AMPL.eval) and get its body.

ampl.eval('var x := 4.2;');
ampl.eval('c : 0<= x <= 5;');
c = ampl.getConstraint('c');
c.body

gives:

ans =
4.2000

dual

classmethod Constraint.dual()

Syntax

v = dual

Description

dual (VALID ONLY FOR SCALAR COSTRAINTS) Get the current value of the constraint’s dual variable.

**Output Arguments**

v

The value of the dual variable corresponding to the constraint

Example

Create a scalar constraint c and get its dual value.

ampl.eval('var x := 4.2;');
ampl.eval('c : 0<= x <= 5;');
c = ampl.getConstraint('c');
c.dual

gives:

ans = 0

setDual(v)

classmethod ConstraintInstance.setDual()

Syntax

setDual(v)

Description

setDual(v) Assigns the specified value to the dual variable for this constraint instance. Equivalent to the AMPL code:

var x{1..2};
c{i in 1..2}: x[i]<=i;
let c[1] := v;

Input Arguments

v

The value to be assigned

Example

Create a constraint c and sets its dual value. We have to switch off AMPL presolve abilities to see the effect consistently.

ampl.setBoolOption('presolve', 0)
ampl.eval('var x{1..2};');
ampl.eval('c{i in 1..2}: x[i] <= 20;');
cinstance = ampl.getConstraint('c').get(1);
cinstance.setDual(4);
cinstance.dual

gives:

ans =
  4

lb

classmethod Constraint.lb()

Syntax

v = lb

Description

lb Access the current lower bound of the constraint (if scalar)

**Output Arguments**

v

The lower bound of the constraint

Example

Create a scalar constraint c and get its lower bound.

ampl.eval('var x := 4.2;');
ampl.eval('c : 0<= x <= 5;');
c = ampl.getConstraint('c');
c.lb

gives:

ans = 0

ub

classmethod Constraint.ub()

Syntax

v = ub

Description

dual Access the current upper bound of the constraint (if scalar).

**Output Arguments**

v

The upper bound of the constraint

Example

Create a scalar constraint c and get its lower bound.

ampl.eval('var x := 4.2;');
ampl.eval('c : 0<= x <= 5;');
c = ampl.getConstraint('c');
c.lb

gives:

ans = 0

drop

classmethod Constraint.drop()

Syntax

drop

Description

drop Drop all instances in the constraint, corresponding to the AMPL code drop constraintname;.

Example

Create a scalar constraint c1 and an indexed constraint c2 (using AMPL.eval) and drop them.

  ampl.eval('var x{1..3}<=4;');
  ampl.eval('maximize z: sum{i in 1..3} x[i];');
  ampl.eval('c1: x[2] <= 1;');
  ampl.eval('c2 {i in 1..3} : x[i] <= i;');
  x = ampl.getVariable('x');
  ampl.solve;
  x.display
  ampl.getConstraint('c1').drop
  ampl.solve;
  x.display
  ampl.getConstraint('c2').drop
  ampl.solve;
  x.display

gives::

  ans =
  x [*] :=
  1  1
  2  1
  3  3
  ;

  ans =
  x [*] :=
  1  1
  2  2
  3  3
  ;


  ans =
  x [*] :=
  1  4
  2  4
  3  4
  ;

restore

classmethod Constraint.restore()

Syntax

restore

Description

restore Restore all instances in the constraint

Example

Create a constraint c1, drop it and restore it

ampl.eval('var x{1..3}<=4;');
ampl.eval('maximize z: sum{i in 1..3} x[i];');
ampl.eval('c2 {i in 1..3} : x[i] <= i;');
x = ampl.getVariable('x');
c2 = ampl.getConstraint('c2')
c2.drop;
ampl.solve;
x.display
c2.restore;
ampl.solve;
x.display

gives:

x [*] :=
1  4
2  4
3  4
;


ans =

x [*] :=
1  1
2  2
3  3
;