Thanks. That did the trick.  I knew it was easy.  I just couldn't seem to find 
it...

virtual ExecStatus propagate(Space& home, const ModEventDelta&)  {
            if (x0.assigned())
            {
                  Iter::Ranges::Singleton r0(x0.val() - offset1 > 0 ? x0.val() 
- offset1 : 0, x0.val() + offset0);
                  GECODE_ME_CHECK(x1.minus_r(home, r0, false));
            }
            else if (x1.assigned())
            {
                  Iter::Ranges::Singleton r1(x1.val() - offset0 > 0 ? x1.val() 
- offset0 : 0, x1.val() + offset1);
                  GECODE_ME_CHECK(x0.minus_r(home, r1, false));
            }

            if (x0.max() + offset0 < x1.min() || x1.max() + offset1 < x0.min())
                  return home.ES_SUBSUMED(*this);
            else
                  return ES_FIX;
      }

David Zaremby
Senior Software Engineer
LSS / Strategic Products

Lockheed Martin Simulation, Training & Support
12506 Lake Underhill Road, MP-823
Orlando, FL 32825
From: Christian Schulte [mailto:[email protected]]
Sent: Tuesday, April 13, 2010 2:11 PM
To: Zaremby, David; [email protected]
Subject: RE: [gecode-users] Cutting holes within a view optimally

Check the minus_r member function and the range iterator
                Iter::Ranges::Singleton
The latter allows to specify a single range.

That should do the trick!

Cheers
Christian

--
Christian Schulte, web.ict.kth.se/~cschulte/

From: [email protected] [mailto:[email protected]] On Behalf Of 
Zaremby, David
Sent: Tuesday, April 13, 2010 7:34 PM
To: [email protected] gecode
Subject: [gecode-users] Cutting holes within a view optimally

Gecoders,

I am struggling with finding the best way to cut a hole in a view during 
propegation without doing a simple for loop. I originally thought I should use 
a Range and Iterator and execute the minus_v method, but I can't find an easy 
way to construct one easily using specific values other than using a value 
array of ints but I would still need a loop to initialize the array. What is 
the best way to do this with the least computation?

The end goal of this propagator is to put a gap between two domains however 
there is no guarantee that x0 < x1  so you really can't reduce much on the 
domain until one is assigned a start. Additionally you can't use an offset view 
because you only want the offset to apply if the task is the earlier one one.

virtual ExecStatus propagate(Space& home, const ModEventDelta&)  {
            if (x0.assigned())
            {
                  //create a range that x1 cant equal over (x0.val - offset1, 
x0.val + offset0)
                  for (int i = x0.val() - offset1; i < x0.val() + offset0; ++i)
                  {
                        GECODE_ME_CHECK(x1.nq(home, i));
                  }
            }
            else if (x1.assigned())
            {
                  //create a range that x0 cant equal over (x1.val - offset0, 
x1.val + offset1)
                  for (int i = x1.val() - offset0; i < x1.val() + offset1; ++i)
                  {
                        GECODE_ME_CHECK(x0.nq(home, i));
                  }
            }

            if (x0.max() + offset0 <= x1.min() || x1.max() + offset1 <= 
x0.min())
                  return home.ES_SUBSUMED(*this);
            else
                  return ES_FIX;
      }

David Zaremby
Senior Software Engineer
LSS / Strategic Products

Lockheed Martin Simulation, Training & Support
12506 Lake Underhill Road, MP-823
Orlando, FL 32825
_______________________________________________
Gecode users mailing list
[email protected]
https://www.gecode.org/mailman/listinfo/gecode-users

Reply via email to