[gecode-users] Variable implementations are copied automatically during search, right?

Christian Schulte cschulte at kth.se
Wed Mar 21 17:47:15 CET 2018


Yes, that's right. No caveats. It is as you say: you only have to update yourself if you want to use them for your own purposes, the rest the propagator, brancher, etc in question take care of.

Best
Christian

--
Christian Schulte, https://chschulte.github.io/
Professor of Computer Science, KTH, cschulte at kth.se
Expert Researcher, RISE SICS, christian.schulte at ri.se


-----Original Message-----
From: users-bounces at gecode.org <users-bounces at gecode.org> On Behalf Of Sebastian Albert
Sent: Wednesday, March 21, 2018 17:40
To: users at gecode.org
Subject: [gecode-users] Variable implementations are copied automatically during search, right?

Dear Gecode users and maintainers

I was wondering whether I can use auxilliary variables to formulate and post constraints (i.e., propagators) in my model in the initial constructor without copying them in the copy constructor (as long as I don't want to use their values later on and thus do not need them as member variables in my Space subclass). It seems that this is true and everything still works correctly. (However, I may need to post branchings for them, too, depending on how they are used.) Am I right?
So, I conclude that variable implementations are taken care of either by the Space or indirectly when the propagators/branchers are copying their views.

Are there any caveats?

Here's a small working example (which is not useful, but a test to experiment whether I am right):

using namespace Gecode;

class Test : public Space {
protected:
    IntVar a, b;
public:
    Test(void) {
        a = IntVar(*this, 1, 5);
        b = IntVar(*this, 1, 5);
        IntVar a_temp = IntVar(*this, 1, 5);
        IntVar b_temp = IntVar(*this, 1, 5);
        rel(*this, a == a_temp);
        rel(*this, b == b_temp);
        rel(*this, 2 * a_temp == b_temp);
        branch(*this, a, INT_VAL_MED());
        branch(*this, b, INT_VAL_MED());
    }

    void print(void) const {
        std::cout << a << " " << b << std::endl;
    }

    Test(Test& s) : Space(s) {
        a.update(*this, s.a);
        b.update(*this, s.b);
    }

    virtual Space* copy() {
        return new Test(*this);
    }

};

Thanks
Sebastian

_______________________________________________
Gecode users mailing list
users at gecode.org
https://www.gecode.org/mailman/listinfo/gecode-users



More information about the users mailing list