FRAMES NO FRAMES

Macro ILCALTRCDEMON

Definition file: ilsched/altresh.h
ILCALTRCDEMON(DemonClass, ConstraintClass, method)

This macro creates an instance of the class DemonClass which is a subclass of IlcAltRCDemon. When this demon is triggered, it executes the function method of the constraint ConstraintClass given as parameter to the macro. The signature of this method must be: void ConstraintClass::method(IlcAltResConstraint rc, IlcResource resource). The argument resource is a possible resource whose change in some ranges for the alternative resource constraint is responsible for the triggering of the demon; for example, the start min of the activity if the resource was selected in the alternative resource constraint. Actually, the demon is trigerred each time a change happens in the start, end, duration, processing time, or capacity range.

Once the resource demon class has been defined with the macro ILCALTRCDEMON(DemonClass, ConstraintClass, method), an instance of this demon can be created by passing an instance of ConstraintClass as a parameter of the member function IlcAltResConstraint::whenRange as follows:

 ConstraintClass* ct = ...;
 IlcAltRCDemon myDemon = DemonClass(ct);

Example

The following code defines a demon AltRCDemonCaller that prints pieces of information about the resources whose ranges change.

  class AltRCDemonCallI : public IlcConstraintI {
    IlcAltResConstraint _ct;
  public:
    AltRCDemonCallI(IlcManager m, IlcAltResConstraint ct)
      :IlcConstraintI(m), _ct(ct)
      {}
    ~AltRCDemonCallI() {}
    virtual void post();
    virtual void propagate();
    void showInfo(IlcAltResConstraint rc, IlcResource resource);
  };

  void AltRCDemonCallI::showInfo(IlcAltResConstraint rc, IlcResource resource) {
    IlcAltResSet set = rc.getAltResSet();
    cout << endl << "--------AltRCDemonCallI---------" << endl;
    cout << "IlcAltResConstraint :" << rc << endl;
    cout << "IlcResource : " << resource << endl;
    cout << "Index : " << set.getIndex(resource) << " in " << rc.getIndexVariable() << endl;
    cout << "--------------------------------" << endl;
  }

  ILCALTRCDEMON(AltRCDemonCaller, AltRCDemonCallI, showInfo);

  void AltRCDemonCallI::post() {
    _ct.whenRange(AltRCDemonCaller(this));
  }

  void AltRCDemonCallI::propagate() {
    cout << endl << "--------AltRCDemonCallI---------" << endl;
    cout << "Demon For " << _ct << endl;
    cout << "--------------------------------" << endl;
  }

  IloSolver ...;
  IlcSchedule schedule(s, 0, 500);
  IlcDiscreteResource r1(schedule, 2);
  IlcDiscreteResource r2(schedule, 2);
  r1.setName("r1");
  r2.setName("r2");
  IlcAltResSet set(schedule, 2, r1, r2);
  IlcActivity a1(schedule, 30);
  IlcAltResConstraint rc1 = a1.requires(set, 2);
  s.add(rc1);
  s.add(new (s.getHeap()) AltRCDemonCallI(s, rc1));
 

See Also: