[gecode-users] Problem with linear constraint over integers using minimodel ("undef ref")

Sascha Schnug saschaschnug at web.de
Tue Mar 28 05:08:27 CEST 2017


First of all: much apologies for the noise!
 
I did solve my problem:
 
While the stuff i presented was right (probably not the most natural CP-usage; but i'm still learning),
i made a mistake when i modified my Makefile (= my own steps deviated from the presentation in this mail).

The problem was indeed the ordering of linking, which is explained at the guide under 2.3.3.
My wrongly used Makefile did link to float before minimodel, which seems to be the problem.
(the original gist i used did not link to float and my first attempt adding -lgecodefloat was ignoring
the ordering-rules mentioned in the guide; maybe a simple schematic Makefile could be added)

The Makefile presented in my question at this mailing-list was correct (-lgecodefloat between -lgecodeset
and -lgecodeint) and compiles.

- 
Sascha-Dominic Schnug 
 

Gesendet: Dienstag, 28. März 2017 um 02:14 Uhr
Von: "Sascha Schnug" <saschaschnug at web.de>
An: users at gecode.org
Betreff: [gecode-users] Problem with linear constraint over integers using minimodel ("undef ref")
Hi,

i'm a new user of Gecode and i have some trouble.

I'm using Gecode 5.0, compiled with the defaults plus gmp & mpfr (although i don't think it's
needed for my case) under Windows using Cygwin (gcc/g++: 5.4). (If i recall correctly;
i needed to manually modify the 3rd-party code where the rounding-mode is selected).

While i made good progress at first (despite the fact that i'm rediscovering C++), the following
part of my code is not working:

Excerpt:
--------

#include <gecode/int.hh>
#include <gecode/search.hh>
#include <gecode/minimodel.hh>
#include <gecode/float.hh> // for later use

using Gecode;

protected:

IntVarArray q_start;
IntVarArray q_end;
IntVarArray q_length;

public:

IntVarArgs q_start_;
IntVarArgs q_end_;
IntVarArgs q_length_;

..........

for(int i=0; i<n_q; i++)
{
q_start_ << IntVar(*this, 0, 95);
q_end_ << IntVar(*this, 0, 95);
q_length_ << IntVar(*this, 0, 95);
}

q_start = IntVarArray(*this, q_start_);
q_end = IntVarArray(*this, q_end_);
q_length = IntVarArray(*this, q_length_);

..........

for(int q=0; q<n_q; ++q)
{
// get length of window / THIS SEEMS TO BE THE PROBLEM!
rel(*this, 1*q_length[q] == 1*q_end[q] - 1*q_start[q]); // minimodel-like
}

I think this follows the examples in the guide as well as other resources.

My Makefile looks like this (following https://gist.github.com/fepa/2187179; also uses the order mentioned in guide):

# Configure this makefile if needed then run
# $ make all
# to compile and link

# What files to compile
OBJS=problem.cpp solver.cpp
# What file to compile to
MAINFILE=solver
# What compiler to use
CC=g++
# Where is your gecode library?
# (Gecode's default 'make install' behavior installs gecode libraries and headers under /usr/local)
GECODEDIR=/usr/local

# 'make all' does both compiling and link (i.e 'make compile link')
all: compile link

# 'make compile' compiles files
compile: $(OBJS)
$(CC) -I$(GECODEDIR)/include -c $(OBJS)

# 'make link' links compiled files
link: $(OBJS)
$(CC) -o $(MAINFILE) -L$(GECODEDIR)/lib $(MAINFILE).o \
-lgecodeflatzinc -lgecodedriver \
-lgecodesearch -lgecodeminimodel -lgecodeset \
-lgecodefloat \
-lgecodeint -lgecodekernel -lgecodesupport

# 'make clean' cleans up generated files from make commands
clean:
rm -rf *o $(MAINFILE)

Now this is the ugly output i receive:

$ make
g++ -I/usr/local/include -c solver_v4.cpp -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
g++ -o solver_v4 -L/usr/local/lib solver_v4.o \
-lgecodeflatzinc -lgecodedriver -lgecodefloat \
-lgecodesearch -lgecodeminimodel -lgecodeset \
-lgecodeint -lgecodekernel -lgecodesupport
/usr/local/lib/libgecodeminimodel.a(float-expr.o): In function `Gecode::LinFloatExpr::post(Gecode::Home) const':
/cygdrive/x/gecode-5.0.0/gecode-5.0.0/gecode/minimodel/float-expr.cpp:220: undefined reference to `Gecode::Float::Linear::estimate(Gecode::Float::Linear::Term*, int, Gecode::FloatVal, double&, double&)'
/cygdrive/x/gecode-5.0.0/gecode-5.0.0/gecode/minimodel/float-expr.cpp:220:(.text+0x3df3): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Gecode::Float::Linear::estimate(Gecode::Float::Linear::Term*, int, Gecode::FloatVal, double&, double&)'
/cygdrive/x/gecode-5.0.0/gecode-5.0.0/gecode/minimodel/float-expr.cpp:223: undefined reference to `Gecode::Float::Linear::post(Gecode::Home, Gecode::Float::Linear::Term*, int, Gecode::FloatRelType, Gecode::FloatVal)'
/cygdrive/x/gecode-5.0.0/gecode-5.0.0/gecode/minimodel/float-expr.cpp:223:(.text+0x4029): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Gecode::Float::Linear::post(Gecode::Home, Gecode::Float::Linear::Term*, int, Gecode::FloatRelType, Gecode::FloatVal)'
/usr/local/lib/libgecodeminimodel.a(float-expr.o): In function `Gecode::LinFloatExpr::post(Gecode::Home, Gecode::FloatRelType, Gecode::BoolVar const&) const':
/cygdrive/x/gecode-5.0.0/gecode-5.0.0/gecode/minimodel/float-expr.cpp:205: undefined reference to `Gecode::Float::Linear::post(Gecode::Home, Gecode::Float::Linear::Term*, int, Gecode::FloatRelType, Gecode::FloatVal, Gecode::Reify)'
/cygdrive/x/gecode-5.0.0/gecode-5.0.0/gecode/minimodel/float-expr.cpp:205:(.text+0x4277): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Gecode::Float::Linear::post(Gecode::Home, Gecode::Float::Linear::Term*, int, Gecode::FloatRelType, Gecode::FloatVal, Gecode::Reify)'
/usr/local/lib/libgecodeminimodel.a(float-expr.o): In function `Gecode::LinFloatExpr::post(Gecode::Home, Gecode::FloatRelType) const':
/cygdrive/x/gecode-5.0.0/gecode-5.0.0/gecode/minimodel/float-expr.cpp:182: undefined reference to `Gecode::Float::Linear::post(Gecode::Home, Gecode::Float::Linear::Term*, int, Gecode::FloatRelType, Gecode::FloatVal)'
/cygdrive/x/gecode-5.0.0/gecode-5.0.0/gecode/minimodel/float-expr.cpp:182:(.text+0x468d): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Gecode::Float::Linear::post(Gecode::Home, Gecode::Float::Linear::Term*, int, Gecode::FloatRelType, Gecode::FloatVal)'
collect2: error: ld returned 1 exit status
make: *** [Makefile:24: link] Error 1

I'm kinda lost right now as i have no idea what the problem is. I did not check Gecode's sources yet.
My makefile uses some of GCC's STL-debugging tools, but they are not the reason for this.

Another remark:
In my previous compilation (without gmp + mpfr; added now) i build all the examples too.
-> all examples using float & minimodel are behaving strange:
=> they all seem to run without errors, but do not produce any output (clean shell)

I did not research the Script-like usage of gecode a lot, but i expect those examples should
produce output too like all the others.

Thanks for taking the time to read this! I hope i did not forget to mention relevant information.

-
Sascha-Dominic Schnug

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



More information about the users mailing list