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.

_______________________________________________
Gecode users mailing list
[email protected]
https://www.gecode.org/mailman/listinfo/gecode-users

Reply via email to