Hi,
I've written a custom propagator. It is based on one of the existing
templates, Gecode:BinaryPropagator, with an array of boolean views as
the template argument. It works, but the compiler (g++ 4.1.2) is having
serious trouble with the code: if I try to use any compiler optimisation
(that is, anything other than -O0), the compiler eats up all memory
(including swap) and never finishes. I know that using many and/or
nested templates tends to increase compiler memory use, but this case is
worse than anything I've encountered before. Is this a known problem?
(perhaps fixed in some more recent g++ compiler). Is there some way to
work around it? (other than disabling compiler optimisation, because
that *really* slows down the solver). The only other option I can think
of is to write the propagator from scratch, without relying on any base
template.
Attached is a simplified version of the code (it doesn't contain any
actual functionality, just the minimum that is needed to cause the
compiler to behave this way).
Thanks,
/[EMAIL PROTECTED]
#include "gecode/kernel.hh"
#include "gecode/int.hh"
#include "gecode/minimodel.hh"
#include "gecode/search.hh"
typedef Gecode::ViewArray<Gecode::Int::BoolView> BoolViewArray;
typedef Gecode::BinaryPropagator
<BoolViewArray, Gecode::Int::PC_INT_VAL>
PropBaseType;
class ThePropagator : public PropBaseType {
public:
// constructor for posting
ThePropagator(Gecode::Space* home,
BoolViewArray& va0,
BoolViewArray& va1)
: PropBaseType(home, va0, va1) { };
// constructor for cloning
ThePropagator(Gecode::Space* home, bool share, ThePropagator& pp)
: PropBaseType(home, share, pp) { };
// copy of a propagator during cloning
virtual Gecode::Actor* copy(Gecode::Space* home, bool share)
{
return new (home) ThePropagator(home, share, *this);
};
// preform propagation
virtual Gecode::ExecStatus propagate
(Gecode::Space* home, Gecode::ModEventDelta med);
// Post the propagator
static Gecode::ExecStatus post
(Gecode::Space* home,
const Gecode::BoolVarArray& bv0,
const Gecode::BoolVarArray& bv1)
{
BoolViewArray va0(home, bv0.size());
for (int k = 0; k < bv0.size(); k++)
va0[k] = Gecode::Int::BoolView(bv0[k]);
BoolViewArray va1(home, bv1.size());
for (int k = 0; k < bv1.size(); k++)
va1[k] = Gecode::Int::BoolView(bv1[k]);
new (home) ThePropagator(home, va0, va1);
return Gecode::ES_OK;
};
};
Gecode::ExecStatus ThePropagator::propagate
(Gecode::Space* home, Gecode::ModEventDelta med)
{
return Gecode::ES_FIX;
}
class TheSpace : public Gecode::Space
{
protected:
Gecode::BoolVarArray bv0;
Gecode::BoolVarArray bv1;
public:
TheSpace(int n0, int n1);
TheSpace(bool share, TheSpace& s);
virtual Gecode::Space* copy(bool share);
};
TheSpace::TheSpace(int n0, int n1)
: bv0(this, n0, 0, 1),
bv1(this, n1, 0, 1)
{
ThePropagator::post(this, bv0, bv1);
}
TheSpace::TheSpace(bool share, TheSpace& cc)
: Gecode::Space(share, cc)
{
bv0.update(this, share, cc.bv0);
bv1.update(this, share, cc.bv1);
}
Gecode::Space* TheSpace::copy(bool share)
{
return new TheSpace(share, *this);
}
int main(int argc, char** argv)
{
TheSpace* cc = new TheSpace(10, 10);
std::cout << cc->status() << std::endl;
}
_______________________________________________
Gecode users mailing list
[EMAIL PROTECTED]
https://www.gecode.org/mailman/listinfo/gecode-users