I am using docplex (CpoModel) with Python to solve a CSP and I have the following problem: when I test it with a very simple infeasible problem, it does not return that the problem is infeasible in a reasonable amount of time (it never stops). However, for feasible problems, it finishes and outputs a solution. Is there something wrong in my code or is this caused by lack of optimization in the search strategies? If so, how can I optimize the search with docplex?
Here is the code in case there is some error there:
def solve(G):
mdl = CpoModel(name='unit')
epsilon=0.1
length = len(G.nodes())*2
variables={}
for v in G.nodes():
variables[v] = (mdl.integer_var(0, 2*length**2, name="v"+str(v)+"-1"), mdl.integer_var(0, 2*length**2, name="v"+str(v)+"-2"))
mdl.add_constraint(variables[v][1] - variables[v][0] >= length+epsilon) #this is verified
for (u,v) in G.edges():
mdl.add_constraint(mdl.logical_or(mdl.logical_or(mdl.logical_or(
mdl.logical_and((variables[u][0]-variables[v][0]<=0-epsilon), variables[v][0]-variables[u][0]<=length-epsilon),
mdl.logical_and((variables[v][0]-variables[u][0]<=0-epsilon), (variables[u][0]-variables[v][0]<=length-epsilon))),
mdl.logical_or(
mdl.logical_and((variables[u][1]-variables[v][0]<=0-epsilon), (variables[v][0]-variables[u][1]<=length-epsilon)),
mdl.logical_and((variables[v][0]-variables[u][1]<=0-epsilon), (variables[u][1]-variables[v][0]<=length-epsilon)))),
mdl.logical_or(mdl.logical_or(mdl.logical_and((variables[u][0]-variables[v][1]<=0-epsilon), (variables[v][1]-variables[u][0]<=length-epsilon)),
mdl.logical_and((variables[v][1]-variables[u][0]<=0-epsilon), (variables[u][0]-variables[v][1]<=length-epsilon))),
mdl.logical_or(mdl.logical_and((variables[u][1]-variables[v][1]<=0-epsilon), (variables[v][1]-variables[u][1]<=length-epsilon)),
mdl.logical_and((variables[v][1]-variables[u][1]<=0-epsilon), (variables[u][1]-variables[v][1]<=length-epsilon))))))
for (u,v) in (nx.complement(G)).edges():
mdl.add_constraint(mdl.logical_or(
mdl.logical_or(
(variables[u][1] - variables[v][0] <= -length-epsilon),
mdl.logical_and(mdl.logical_and((variables[u][0] - variables[v][0] <= -length-epsilon), (variables[v][0] - variables[u][1] <= -length-epsilon)), (variables[u][1] - variables[v][1] <= -length-epsilon))),
mdl.logical_or(
mdl.logical_or(mdl.logical_and((variables[u][0] - variables[v][0] <= -length-epsilon), (variables[v][1] - variables[u][1] <= -length-epsilon)),
(variables[v][1] - variables[u][0] <= -length-epsilon)),
mdl.logical_or(
mdl.logical_and(mdl.logical_and((variables[v][0] - variables[u][0] <= -length-epsilon), (variables[u][0] - variables[v][1] <= -length-epsilon)), (variables[v][1] - variables[u][1] <= -length-epsilon)),
mdl.logical_and((variables[v][0] - variables[u][0] <= -length-epsilon), (variables[u][1] - variables[v][1] <= -length-epsilon))))
))
sol = mdl.solve( )
sol.get_search_status()
sol.print_solution()