[gecode-users] Any Advise on Delta

David Rijsman David.Rijsman at quintiq.com
Wed Jan 21 14:38:26 CET 2009


Christian,

in a previous conversation on 'Any Advise on assignment delta' you mentioned "the other operations that lead to 'any' are iterator-based variable domain updates which in most cases just remove a single value or a range (and hence the delta information is accurate).". Concerning this I have the following question:

I have been implementing a propagator which implements its own advise method. The intention of the advise method is to only schedule the invoking propagator if the maximum has changed. This is relatively easy to implement but I noticed that the 'delta' reporting is rather 'rough' implemented and my propagator gets scheduled quite often to conclude nothing. That is I am getting a lot of 'any' hits when there could have been more information. Specifically in my use case I have a cumulatives constraint whose propagator uses View::minus_r a lot and this propagator only reports 'any' deltas (as far as I can conclude). In the example in this e-mail clearly shows we could be more informative in the delta, it streams 1-0 (any) although I would expect 0-50. 

My question is if this is done for a reason and if so if this is done for many operators on the views?

//----------------------------------

#include "gecode/kernel.hh"
#include "gecode/int.hh"
#include "gecode/iter.hh" 

namespace Gecode
{
  class MyPropagator : public Propagator
  {
  public:
    MyPropagator(Space *home, Int::IntView v):
        Propagator(home),
        MView(v)
    {
      MView.subscribe(home, new (home) ViewAdvisor<Int::IntView>(home,this,MCouncil,MView));
    }

    MyPropagator* copy (Space* home, bool share)
    {
      return 0; 
    }

    ExecStatus propagate(Space *home, ModEventDelta med)
    {
      return ES_OK;
    }

    PropCost  cost (ModEventDelta med) const
    {
      return PC_LINEAR_LO;
    }

    ExecStatus  advise (Space *home, Advisor *a, const Delta *d) 
    {
      ViewAdvisor<Int::IntView>& advisor = static_cast<ViewAdvisor<Int::IntView>&>(*a);
      
      std::cout << advisor.view().min(d) << "-" << advisor.view().max(d) << std::endl;
      
      return ES_OK;
    }
  private:
    Int::IntView MView;
    Council<ViewAdvisor<Int::IntView>> MCouncil;
  };

  class MySpace : public Space
  {
  public:
    MySpace()
    {
      MX.init(this,0,100);

    }

    MySpace(bool share, MySpace &s):
      Space(share,s)
    {
       MX.update(this,share,s.MX);
    }

    MySpace* copy(bool share)
    {
      return new MySpace(share, *this);
    }

    IntVar MX;
  };
}

int main()
{
  Gecode::MySpace space;

  new (&space) Gecode::MyPropagator(&space,space.MX);

  Gecode::Int::IntView view(space.MX);

  Gecode::Iter::Ranges::Singleton d(0,50);

  view.minus_r(&space,d,false);
}

//----------------------------------

David

Quintiq Conference "Quintessence 09" Tuesday May 12th, 2009, Country Estate Duin & Kruidberg, near Amsterdam Schiphol, The Netherlands - for more information visit www.quintiq.com

This message contains information that may be privileged or confidential and is the property of Quintiq. It is only intended for the person to whom it is addressed. If you are not the intended recipient, you are not authorized to read, print, retain, copy, disseminate, distribute or use this message or any part thereof. If you have received this message in error, please notify the sender immediately and delete all copies of this message. Please note that e-mails are susceptible to change, therefore they are not binding.




More information about the gecode-users mailing list