FRAMES NO FRAMES

IlcEqUnion

public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcIntSetVar set, IlcIntToIntFunction F)
public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcAnySetVar set, IlcAnyToIntFunction F)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcIntSetVar set, IlcIntToAnyFunction F)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcAnySetVar set, IlcAnyToAnyFunction F)
Definition file: ilsolver/setcst.h
Include file: <ilsolver/ilosolver.h>

These functions create and return a constraint that forces the variable unionset to be equal to the union of the values returned by the function F when applied to the elements of the constrained set variable set.

Adding These Constraints

You may add these constraints only during a Solver search; that is, inside a goal (an instance of IlcGoal) or inside a constraint (an instance of IlcConstraint). If you are looking for similar functionality in a constraint to add to a model, see IloEqUnion.

Example

It can be useful to constrain the values of an attribute of a computed set of objects. For example, if we have to assign crew members to a flight, and if each crew member has an attribute that describes the language he or she speaks, with this IlcEqUnion constraint, it is possible to post constraints on the set of languages that must be spoken during a flight.

 enum Language {English, French, German};
 class CrewMember {
 public:
    const char* _name;
    IlcInt      _language;
    CrewMember(IloSolver s, const char* name, Language lang);
 };
 //Access to the language spoken by a crew member
 IlcAnyToIntFunction languages;
 //Possible crew members
 IlcAnyArray c(s, 3);
 c[0]= new (s.getHeap()) CrewMember(s, "John", English);
 c[1]= new (s.getHeap()) CrewMember(s, "Kai", German);
 c[2]= new (s.getHeap()) CrewMember(s, "Julie", French);
 //The flight
 IlcAnySetVar crew(s, c, "NewYork-Paris");
 //The languages spoken on this flight
 IlcIntSetVar langs(s, IlcIntArray(s, 3, English, French, German));

Now that we have defined the classes and constraints, we add them during a Solver search, for example, inside a goal or constraint.

 s.add(IlcEqUnion(langs, crew, languages));
 //At least 2 different languages spoken
 s.add(IlcCard(langs) >= 2);
 //French must be spoken
 s.add(IlcMember(French, langs));

See Also:


IlcEqUnion

public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcIntSetVar set, IlcIntToIntExpFunction F)
public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcAnySetVar set, IlcAnyToIntExpFunction F)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcIntSetVar set, IlcIntToAnyExpFunction F)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcAnySetVar set, IlcAnyToAnyExpFunction F)
Definition file: ilsolver/setcst.h
Include file: <ilsolver/ilosolver.h>

These functions create and return a constraint that forces the variable unionset to be equal to the union of the values returned by the function F when applied to the elements of the constrained set variable set. The values returned by F are constrained expressions or variables (that is, instances of IlcIntExp, IlcIntVar, IlcAnyExp, or IlcAnyVar).

Adding These Constraints

You may add these constraints only during a Solver search; that is, inside a goal (an instance of IlcGoal) or inside a constraint (an instance of IlcConstraint). If you are looking for similar functionality in a constraint to add to a model, see IloEqUnion.

Example

These IlcEqUnion constraints can be useful to express constraints on the values of a constrained attribute of a computed set of objects. For example, if we have to connect cards to a rack, and if for each card we also have to connect one sensor, it is possible to express constraints on the set of sensors connected to the cards in the rack. To do so, we define the following classes.

 class Sensor {
 public:
    const char* _name;
    Sensor(IloSolver s, const char* name);
 };
 class Card {
 public:
    IlcAnyVar _sensor;
    Card(IloSolver s, IlcAnyArray sensors)
     :_sensor(s, sensors) {}
 };
 //Access to the sensor connected to a card
 IlcAnyToAnyExpFunction sensorsAccess;
 //The possible sensors
 IlcAnyArray sensors(s, 4);
 sensors[0] = new (s.getHeap()) Sensor(s, "Sensor#0");
 sensors[1] = new (s.getHeap()) Sensor(s, "Sensor#1");
 sensors[2] = new (s.getHeap()) Sensor(s, "Sensor#2");
 sensors[3] = new (s.getHeap()) Sensor(s, "Sensor#3");
 //The possible cards
 IlcAnyArray cards(s, 3);
 cards[0] = new (s.getHeap()) Card(s, sensors);
 cards[1] = new (s.getHeap()) Card(s, sensors);
 cards[2] = new (s.getHeap()) Card(s, sensors);
 //The cards connected to the rack
 IlcAnySetVar rackCards(s, cards, "Rack#1");
 //The sensors connected to the rack
 IlcAnySetVar rackSensors(s, sensors);

Now that we have defined the classes and constraints, we add them during a Solver search, for example, inside a goal or constraint.

 s.add(IlcEqUnion(rackSensors, rackCards, sensorAccess));
 //At most 10 sensors in the rack
 s.add(IlcCard(rackSensors) <= 10);
 //sensor#1 in a card of the rack
 s.add(IlcMember(sensors[1], rackSensors));

Of course it is possible to compose several levels of indirection. For example, we can post constraints on the processes assigned to the sensors which are connected to the cards that are plugged into a rack:

 s.add(IlcEqUnion(rackSensors,   rackCards,   sensorAccess));
 s.add(IlcEqUnion(rackProcesses, rackSensors, processAccess));

See Also:


IlcEqUnion

public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcIntSetVar var1, IlcIntSetVar var2)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcAnySetVar var1, IlcAnySetVar var2, IlcFilterLevel level)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcAnySetVar var1, IlcAnySetVar var2)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcAnySetVar var1, IlcAnySetVar var2, IlcAnySetVar intersection)
public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcIntSetVar var1, IlcIntSetVar var2, IlcFilterLevel level)
public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcIntSetVar var1, IlcIntSetVar var2, IlcIntSetVar intersection)
public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcIntSetVarArray vars)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcAnySetVarArray vars)
Definition file: ilsolver/intset.h
Include file: <ilsolver/ilosolver.h>

These functions create and return a constraint that forces the value of unionset to be equal to the union of its other parameters (that is, the union of the set variables var1 and var2 or the union of the set variables in the array vars). The variable unionset and all the variables in vars must be built from the same initial array.

When you pass this function the optional parameter intersection, you enable Solver to propagate at a stronger filter level. It takes into account the fact that the cardinality of the unionset is equal to the cardinality of var1 plus the cardinality of var2 minus the cardinality of their intersection.

When you pass this function the optional parameter level, it computes the intersection of var1 and var2 internally and uses that information to extend the filter level during propagation. See the enumeration IlcFilterLevel for more details about its use.

Adding These Constraints

You may add these constraints only during a Solver search; that is, inside a goal (an instance of IlcGoal) or inside a constraint (an instance of IlcConstraint). If you are looking for similar functionality in a constraint to add to a model, see IloEqUnion documented in the IBM ILOG Concert Technology Reference Manual.

See Also:


IlcEqUnion

public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcIntSetVar set, IlcIntToIntSetVarFunction F)
public IlcConstraint IlcEqUnion(IlcIntSetVar unionset, IlcAnySetVar set, IlcAnyToIntSetVarFunction F)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcIntSetVar set, IlcIntToAnySetVarFunction F)
public IlcConstraint IlcEqUnion(IlcAnySetVar unionset, IlcAnySetVar set, IlcAnyToAnySetVarFunction F)
Definition file: ilsolver/setcst.h
Include file: <ilsolver/ilosolver.h>

These functions create and return a constraint that forces the variable unionset to be equal to the union of the values returned by the function F when applied to the elements of the constrained set variable set. The values returned by F are constrained set variables (that is, instances of IlcIntSetVar or IlcAnySetVar).

Adding These Constraints

You may add these constraints only during a Solver search; that is, inside a goal (an instance of IlcGoal) or inside a constraint (an instance of IlcConstraint). If you are looking for similar functionality in a constraint to add to a model, see IloEqUnion.

Example

These IlcEqUnion constraints can be useful to express constraints on the values of a constrained set attribute of a computed set of objects. For example, if we have to connect cards to a rack, and if for each card we also have to connect a set of sensors, it is possible to express constraints on the set of sensors connected to the cards in the rack.

 class Sensor {
 public:
    const char* _name;
    Sensor(IloSolver s, const char* name);
 };
 class Card {
 public:
    IlcAnySetVar _sensor;
    Card(IloSolver s, IlcAnyArray sensors)
     :_sensor(s, sensors) {}
 };
 //Access to the sensor connected to a card
 IlcAnyToAnySetVarFunction sensorsAccess;
 //The possible sensors
 IlcAnyArray sensors(s, 4);
 sensors[0] = new (s.getHeap()) Sensor(s, "Sensor#0");
 sensors[1] = new (s.getHeap()) Sensor(s, "Sensor#1");
 sensors[2] = new (s.getHeap()) Sensor(s, "Sensor#2");
 sensors[3] = new (s.getHeap()) Sensor(s, "Sensor#3");
 //The possible cards
 IlcAnyArray cards(s, 3);
 cards[0] = new (s.getHeap()) Card(s, sensors);
 cards[1] = new (s.getHeap()) Card(s, sensors);
 cards[2] = new (s.getHeap()) Card(s, sensors);
 //The cards connected to the rack
 IlcAnySetVar rackCards(s, cards, "Rack#1");
 //The sensors connected to the rack
 IlcAnySetVar rackSensors(s, sensors);

Now that we have defined these classes and constraints, we add them during a Solver search, for example, inside a goal or constraint.

 s.add(IlcEqUnion(rackSensors, rackCards, sensorAccess));
 //At most 10 sensors in the rack
 s.add(IlcCard(rackSensors) <= 10);
 //sensor#1 in a card of the rack
 s.add(IlcMember(sensors[1], rackSensors));

Of course it is possible to compose several levels of indirection. For example, we can access the processes assigned to the sensors which are connected to the cards that are plugged into a rack:

 s.add(IlcEqUnion(rackSensors,   rackCards,   sensorAccess));
 s.add(IlcEqUnion(rackProcesses, rackSensors, processAccess));

See Also: