[gecode-users] Extending the flatzinc interface

Jean-Noël Monette jean-noel.monette at it.uu.se
Mon May 7 13:58:30 CEST 2012


Hello,

I would like to extend the Gecode/Flatzinc interface to handle 
"natively" more constraints (that I implemented in Gecode). The way I do 
it is to add new constraints to the Registry global object. So my code 
looks like:

#include <gecode/flatzinc.hh>
#include <gecode/flatzinc/registry.hh>
#include "my_cstr_prop.hh"

namespace Gecode { namespace FlatZinc {

void p_my_cstr(FlatZincSpace& s, const ConExpr& ce, AST::Node* ann) {
       IntVar x = getIntVar(s, ce[0]);
       IntVar y = getIntVar(s, ce[1]);
       My_CSTR(s,x,y,ann2icl(ann));
     }

class MyPoster {
    public:
    MyPoster(void) {
        registry().add("my_cstr", &p_my_cstr);
    }
};
MyPoster __my_poster;
}}

This is done by "monkey-see-monkey-do" from the file registry.cpp. 
However, I ran into several problems. First, I had to add the definition 
of "getIntVar" and "ann2icl", that I just copy-pasted from registry.cpp 
(as they are not declared in a header file, and furthermore are in an 
anonymous namespace). So, my question is to know if this is the way I'm 
suppose to do it, or if there is a more straightforward way to extend 
the Gecode/Flatzinc interface with new constraints.


Second (this might be more related to c++ rather than Gecode, apologizes 
if this is indeed the case), I've been unable to link the resulting 
object file against libgecodeflatzinc.so with the following command 
(fz.o is the object file from fz.cpp in the gecode distrib):

g++   ./src_c/fz.o ./src_c/my_cstr.o   -lgecodeflatzinc -lgecodedriver 
-lgecodesearch -lgecodeminimodel -lgecodeset -lgecodeint -lgecodekernel 
-lgecodesupport

It yields the following error:

./src_c/my_cstr.o: In function `global constructors keyed to 
_Z3NEQN6Gecode4HomeENS_6IntVarES1_NS_11IntConLevelE':
my_cstr.cpp:(.text+0x2667): undefined reference to 
`Gecode::FlatZinc::registry()'
my_cstr.cpp:(.text+0x2679): undefined reference to 
`Gecode::FlatZinc::Registry::add(std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&, void 
(*)(Gecode::FlatZinc::FlatZincSpace&, Gecode::FlatZinc::ConExpr const&, 
Gecode::FlatZinc::AST::Node*))'

However, I'm able to link the same object file against the object files 
that are compiled into libgecodeflatzinc:

g++  ./src_c/fz.o ./src_c/my_cstr.o  gecode-3.7.3/gecode/flatzinc/*.o 
-lgecodedriver -lgecodesearch -lgecodeminimodel -lgecodeset -lgecodeint 
-lgecodekernel -lgecodesupport

So, I'm wondering why and how this is happening, and I have no clue... 
(I'm using Gecode 3.7.1, compiler is gcc 4.5.2, on Ubuntu 11.04)

Thank you very much for your help,

Jean-Noël Monette




More information about the users mailing list