void FlatZincSpace::parseSolveAnn(AST::Array* ann) { bool hadSearchAnnotation = false; if (ann) { std::vector<AST::Node*> flatAnn; flattenAnnotations(ann, flatAnn); for (unsigned int i=0; i<flatAnn.size(); i++) { try { AST::Call *call = flatAnn[i]->getCall("int_search"); AST::Array *args = call->getArgs(4); AST::Array *vars = args->a[0]->getArray(); vec<Branching*> va; for (unsigned int i = 0; i < vars->a.size(); i++) { if (vars->a[i]->isInt()) continue; IntVar* v = iv[vars->a[i]->getIntVar()]; if (v->isFixed()) continue; va.push(v); } branch(va, ann2ivarsel(args->a[1]), ann2ivalsel(args->a[2])); if (AST::String* s = dynamic_cast<AST::String*>(args->a[3])) { if (s->s == "all") so.nof_solutions = 0; } hadSearchAnnotation = true; } catch (AST::TypeError& e) { (void) e; try { AST::Call *call = flatAnn[i]->getCall("bool_search"); AST::Array *args = call->getArgs(4); AST::Array *vars = args->a[0]->getArray(); vec<Branching*> va(vars->a.size()); for (int i=vars->a.size(); i--; ) va[i] = new BoolView(bv[vars->a[i]->getBoolVar()]); branch(va, ann2ivarsel(args->a[1]), ann2ivalsel(args->a[2])); if (AST::String* s = dynamic_cast<AST::String*>(args->a[3])) { if (s->s == "all") so.nof_solutions = 0; } hadSearchAnnotation = true; } catch (AST::TypeError& e) { (void) e; fprintf(stderr, "% Type error in search annotation. Ignoring!\n"); } } } } if (!hadSearchAnnotation) { fprintf(stderr, "% No search annotation given. Defaulting to VSIDS!\n"); if (!so.vsids) { so.vsids = true; engine.branching->add(&sat); } } }
void FlatZincSpace::fixAllSearch() { vec<Branching*> va; for (int i = 0; i < iv.size(); i++) { if (iv_introduced[i]) continue; IntVar* v = iv[i]; if (v->isFixed()) continue; va.push(v); } for (int i = 0; i < bv.size(); i++) { if (bv_introduced[i]) continue; va.push(new BoolView(bv[i])); } for (int i = iv.size(); i--; ) { if (!iv_introduced[i]) continue; IntVar* v = iv[i]; if (v->isFixed()) continue; va.push(v); } for (int i = 0; i < bv.size(); i++) { if (!bv_introduced[i]) continue; va.push(new BoolView(bv[i])); } if (va.size()) branch(va, VAR_INORDER, VAL_DEFAULT); }