Esempio n. 1
0
	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);
			}
		}
	}
Esempio n. 2
0
	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);
	}