Hi, I am experimenting with hybrid algorithms, using eplex and ic. I am encountering a problem with labeling, exemplified by the following code: :- lib(eplex). :- lib(ic). hyb1(W,X,Y,F) :- eplex: (F :: 0.0..100.0), eplex_solver_setup(min(F),F,[],[new_constraint]), eplex: ([W,X,Y] :: 0..10), % constrain X to be integral for ic, so we can use ic:search() on it ic: (X #:: 0..10), eplex: (2*W + X + Y $= 13), eplex: (F $= W + 3*Y), ic:search([X],0,input_order,indomain,complete,[]), eplex_var_get(W,solution,W), eplex_var_get(Y,solution,Y), eplex_get(cost,F) . hyb2(W,X,Y,F) :- eplex: (F :: 0.0..100.0), eplex_solver_setup(min(F),F,[],[new_constraint]), eplex: ([W,Y] :: 0..10), dim(X,[2]), eplex: (X[1..2] :: 0..10), % constrain X to be integral for ic, so we can use ic:search() on it ic: (X[1..2] #:: 0..10), eplex: (2*W + X[1] + X[2] + Y $= 13), eplex: (F $= W + 3*Y), ic:search([X[1..2]],0,input_order,indomain,complete,[]), eplex_var_get(W,solution,W), eplex_var_get(Y,solution,Y), eplex_get(cost,F) . The query hyb1(W,X,Y,F) works as expected. The query hyb2(W,X,Y,F) results in a type error: [eclipse 3]: hyb2(W,X,Y,F). Eplex warning: Imposing integer bounds on variable(s) [W, Y] for eplex instance eplex does not impose integer type. Eplex warning: Imposing integer bounds on variable(s) [](_938, _939)[1 .. 2] for eplex instance eplex does not impose integer type. type error in indomain([](_1059{}(','(:(ic, ..(0, 10)), :(eplex, @(..(0.0, 10.0), 10.0)))), _1041{}(','(:(ic, ..(0, 10)), :(eplex, @(..(0.0, 10.0), 3.0)))))[1 .. 2]) Abort [eclipse 4]: The only difference between hyb1 and hyb2 is that X is a single variable in hyb1 but a 2-element array in hyb2. I don't understand why or how the array is treated differently. And is there a way around this issue? I see that when I change X from an array to an explicit list [X1,X2], the problem goes away. But in my application I need an array. KostasReceived on Tue Oct 02 2012 - 17:45:50 CEST
This archive was generated by hypermail 2.2.0 : Wed Oct 03 2012 - 06:14:04 CEST