flatzinc.hh iostream gecode/kernel.hh gecode/int.hh map gecode/support/auto-link.hpp gecode/driver.hh gecode/flatzinc/conexpr.hh gecode/flatzinc/ast.hh gecode/flatzinc/varspec.hh /usr/include/gecode/flatzinc/parser.hh /usr/include/gecode/flatzinc/registry.hh Gecode::FlatZinc::Printer Gecode::FlatZinc::FlatZincOptions Gecode::FlatZinc::BranchInformation Gecode::FlatZinc::FlatZincSpace Gecode::FlatZinc::Error Gecode::FlatZinc Gecode GECODE_FLATZINC_EXPORT GECODE_LIBRARY_NAME "FlatZinc" /*-*-mode:C++;c-basic-offset:2;indent-tabs-mode:nil-*-*/ /* *Mainauthors: *GuidoTack<tack@gecode.org> * *Contributingauthors: *GabrielHjortBlindell<gabriel.hjort.blindell@gmail.com> * *Copyright: *GuidoTack,2007-2012 *GabrielHjortBlindell,2012 * *Lastmodified: *$Date:2013-07-0814:37:54+0200(Mon,08Jul2013)$by$Author:schulte$ *$Revision:13821$ * *ThisfileispartofGecode,thegenericconstraint *developmentenvironment: *http://www.gecode.org * *Permissionisherebygranted,freeofcharge,toanypersonobtaining *acopyofthissoftwareandassociateddocumentationfiles(the *"Software"),todealintheSoftwarewithoutrestriction,including *withoutlimitationtherightstouse,copy,modify,merge,publish, *distribute,sublicense,and/orsellcopiesoftheSoftware,andto *permitpersonstowhomtheSoftwareisfurnishedtodoso,subjectto *thefollowingconditions: * *Theabovecopyrightnoticeandthispermissionnoticeshallbe *includedinallcopiesorsubstantialportionsoftheSoftware. * *THESOFTWAREISPROVIDED"ASIS",WITHOUTWARRANTYOFANYKIND, *EXPRESSORIMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEWARRANTIESOF *MERCHANTABILITY,FITNESSFORAPARTICULARPURPOSEAND *NONINFRINGEMENT.INNOEVENTSHALLTHEAUTHORSORCOPYRIGHTHOLDERSBE *LIABLEFORANYCLAIM,DAMAGESOROTHERLIABILITY,WHETHERINANACTION *OFCONTRACT,TORTOROTHERWISE,ARISINGFROM,OUTOFORINCONNECTION *WITHTHESOFTWAREORTHEUSEOROTHERDEALINGSINTHESOFTWARE. * */ #ifndef__GECODE_FLATZINC_HH__ #define__GECODE_FLATZINC_HH__ #include<iostream> #include<gecode/kernel.hh> #include<gecode/int.hh> #ifdefGECODE_HAS_SET_VARS #include<gecode/set.hh> #endif #ifdefGECODE_HAS_FLOAT_VARS #include<gecode/float.hh> #endif #include<map> /* *SupportforDLLsunderWindows * */ #if!defined(GECODE_STATIC_LIBS)&&\ (defined(__CYGWIN__)||defined(__MINGW32__)||defined(_MSC_VER)) #ifdefGECODE_BUILD_FLATZINC #defineGECODE_FLATZINC_EXPORT__declspec(dllexport) #else #defineGECODE_FLATZINC_EXPORT__declspec(dllimport) #endif #else #ifdefGECODE_GCC_HAS_CLASS_VISIBILITY #defineGECODE_FLATZINC_EXPORT__attribute__((visibility("default"))) #else #defineGECODE_FLATZINC_EXPORT #endif #endif //Configureauto-linking #ifndefGECODE_BUILD_FLATZINC #defineGECODE_LIBRARY_NAME"FlatZinc" #include<gecode/support/auto-link.hpp> #endif #include<gecode/driver.hh> #include<gecode/flatzinc/conexpr.hh> #include<gecode/flatzinc/ast.hh> #include<gecode/flatzinc/varspec.hh> namespaceGecode{namespaceFlatZinc{ classGECODE_FLATZINC_EXPORTPrinter{ private: AST::Array*_output; voidprintElem(std::ostream&out, AST::Node*ai, constGecode::IntVarArray&iv, constGecode::BoolVarArray&bv #ifdefGECODE_HAS_SET_VARS , constGecode::SetVarArray&sv #endif #ifdefGECODE_HAS_FLOAT_VARS , constGecode::FloatVarArray&fv #endif )const; voidprintElemDiff(std::ostream&out, AST::Node*ai, constGecode::IntVarArray&iv1, constGecode::IntVarArray&iv2, constGecode::BoolVarArray&bv1, constGecode::BoolVarArray&bv2 #ifdefGECODE_HAS_SET_VARS , constGecode::SetVarArray&sv1, constGecode::SetVarArray&sv2 #endif #ifdefGECODE_HAS_FLOAT_VARS , constGecode::FloatVarArray&fv1, constGecode::FloatVarArray&fv2 #endif )const; public: Printer(void):_output(NULL){} voidinit(AST::Array*output); voidprint(std::ostream&out, constGecode::IntVarArray&iv, constGecode::BoolVarArray&bv #ifdefGECODE_HAS_SET_VARS , constGecode::SetVarArray&sv #endif #ifdefGECODE_HAS_FLOAT_VARS , constGecode::FloatVarArray&fv #endif )const; voidprintDiff(std::ostream&out, constGecode::IntVarArray&iv1,constGecode::IntVarArray&iv2, constGecode::BoolVarArray&bv1,constGecode::BoolVarArray&bv2 #ifdefGECODE_HAS_SET_VARS , constGecode::SetVarArray&sv1,constGecode::SetVarArray&sv2 #endif #ifdefGECODE_HAS_FLOAT_VARS , constGecode::FloatVarArray&fv1, constGecode::FloatVarArray&fv2 #endif )const; ~Printer(void); voidshrinkElement(AST::Node*node, std::map<int,int>&iv,std::map<int,int>&bv, std::map<int,int>&sv,std::map<int,int>&fv); voidshrinkArrays(Space&home, int&optVar,booloptVarIsInt, Gecode::IntVarArray&iv, Gecode::BoolVarArray&bv #ifdefGECODE_HAS_SET_VARS , Gecode::SetVarArray&sv #endif #ifdefGECODE_HAS_FLOAT_VARS , Gecode::FloatVarArray&fv #endif ); private: Printer(constPrinter&); Printer&operator=(constPrinter&); }; classFlatZincOptions:publicGecode::BaseOptions{ protected: Gecode::Driver::UnsignedIntOption_solutions; Gecode::Driver::BoolOption_allSolutions; Gecode::Driver::DoubleOption_threads; Gecode::Driver::BoolOption_free; Gecode::Driver::DoubleOption_decay; Gecode::Driver::UnsignedIntOption_c_d; Gecode::Driver::UnsignedIntOption_a_d; Gecode::Driver::UnsignedIntOption_node; Gecode::Driver::UnsignedIntOption_fail; Gecode::Driver::UnsignedIntOption_time; Gecode::Driver::IntOption_seed; Gecode::Driver::StringOption_restart; Gecode::Driver::DoubleOption_r_base; Gecode::Driver::UnsignedIntOption_r_scale; Gecode::Driver::BoolOption_nogoods; Gecode::Driver::UnsignedIntOption_nogoods_limit; Gecode::Driver::BoolOption_interrupt; Gecode::Driver::StringOption_mode; Gecode::Driver::BoolOption_stat; Gecode::Driver::StringValueOption_output; public: FlatZincOptions(constchar*s) :Gecode::BaseOptions(s), _solutions("-n","numberofsolutions(0=all)",1), _allSolutions("-a","returnallsolutions(equalto-solutions0)"), _threads("-p","numberofthreads(0=#processingunits)", Gecode::Search::Config::threads), _free("--free","noneedtofollowsearch-specification"), _decay("-decay","decayfactor",0.99), _c_d("-c-d","recomputationcommitdistance",Gecode::Search::Config::c_d), _a_d("-a-d","recomputationadaptiondistance",Gecode::Search::Config::a_d), _node("-node","nodecutoff(0=none,solutionmode)"), _fail("-fail","failurecutoff(0=none,solutionmode)"), _time("-time","time(inms)cutoff(0=none,solutionmode)"), _seed("-r","randomseed",0), _restart("-restart","restartsequencetype",RM_NONE), _r_base("-restart-base","baseforgeometricrestartsequence",1.5), _r_scale("-restart-scale","scalefactorforrestartsequence",250), _nogoods("-nogoods","whethertouseno-goodsfromrestarts",false), _nogoods_limit("-nogoods-limit","depthlimitforno-goodextraction", Search::Config::nogoods_limit), _interrupt("-interrupt","whethertocatchCtrl-C(true)ornot(false)", true), _mode("-mode","howtoexecutescript",Gecode::SM_SOLUTION), _stat("-s","emitstatistics"), _output("-o","filetosendoutputto"){ _mode.add(Gecode::SM_SOLUTION,"solution"); _mode.add(Gecode::SM_STAT,"stat"); _mode.add(Gecode::SM_GIST,"gist"); _restart.add(RM_NONE,"none"); _restart.add(RM_CONSTANT,"constant"); _restart.add(RM_LINEAR,"linear"); _restart.add(RM_LUBY,"luby"); _restart.add(RM_GEOMETRIC,"geometric"); add(_solutions);add(_threads);add(_c_d);add(_a_d); add(_allSolutions); add(_free); add(_decay); add(_node);add(_fail);add(_time);add(_interrupt); add(_seed); add(_restart);add(_r_base);add(_r_scale); add(_nogoods);add(_nogoods_limit); add(_mode);add(_stat); add(_output); } voidparse(int&argc,char*argv[]){ Gecode::BaseOptions::parse(argc,argv); if(_allSolutions.value()){ _solutions.value(0); } if(_stat.value()) _mode.value(Gecode::SM_STAT); } virtualvoidhelp(void){ std::cerr<<"GecodeFlatZincinterpreter"<<std::endl <<"-SupportedFlatZincversion:"<<GECODE_FLATZINC_VERSION <<std::endl<<std::endl; Gecode::BaseOptions::help(); } unsignedintsolutions(void)const{return_solutions.value();} boolallSolutions(void)const{return_allSolutions.value();} doublethreads(void)const{return_threads.value();} boolfree(void)const{return_free.value();} unsignedintc_d(void)const{return_c_d.value();} unsignedinta_d(void)const{return_a_d.value();} unsignedintnode(void)const{return_node.value();} unsignedintfail(void)const{return_fail.value();} unsignedinttime(void)const{return_time.value();} intseed(void)const{return_seed.value();} constchar*output(void)const{return_output.value();} Gecode::ScriptModemode(void)const{ returnstatic_cast<Gecode::ScriptMode>(_mode.value()); } doubledecay(void)const{return_decay.value();} RestartModerestart(void)const{ returnstatic_cast<RestartMode>(_restart.value()); } doublerestart_base(void)const{return_r_base.value();} unsignedintrestart_scale(void)const{return_r_scale.value();} boolnogoods(void)const{return_nogoods.value();} unsignedintnogoods_limit(void)const{return_nogoods_limit.value();} boolinterrupt(void)const{return_interrupt.value();} }; classBranchInformation:publicSharedHandle{ public: BranchInformation(void); BranchInformation(constBranchInformation&bi); voidinit(void); voidadd(constBrancherHandle&bh, conststd::string&rel0, conststd::string&rel1, conststd::vector<std::string>&n); voidprint(constBrancherHandle&bh, inta,inti,intn,std::ostream&o)const; #ifdefGECODE_HAS_FLOAT_VARS voidprint(constBrancherHandle&bh, inta,inti,constFloatNumBranch&nl,std::ostream&o)const; #endif }; classGECODE_FLATZINC_EXPORTFlatZincSpace:publicSpace{ public: enumMeth{ SAT,//<Solveassatisfactionproblem MIN,//<Solveasminimizationproblem MAX//<Solveasmaximizationproblem }; protected: intintVarCount; intboolVarCount; intfloatVarCount; intsetVarCount; int_optVar; bool_optVarIsInt; Meth_method; AST::Array*_solveAnnotations; FlatZincSpace(boolshare,FlatZincSpace&); private: template<template<class>classEngine> void runEngine(std::ostream&out,constPrinter&p, constFlatZincOptions&opt,Gecode::Support::Timer&t_total); template<template<class>classEngine, template<template<class>class,class>classMeta> void runMeta(std::ostream&out,constPrinter&p, constFlatZincOptions&opt,Gecode::Support::Timer&t_total); void branchWithPlugin(AST::Node*ann); public: Gecode::IntVarArrayiv; Gecode::IntVarArrayiv_aux; std::vector<bool>iv_introduced; int*iv_boolalias; Gecode::BoolVarArraybv; Gecode::BoolVarArraybv_aux; std::vector<bool>bv_introduced; #ifdefGECODE_HAS_SET_VARS Gecode::SetVarArraysv; Gecode::SetVarArraysv_aux; std::vector<bool>sv_introduced; #endif #ifdefGECODE_HAS_FLOAT_VARS Gecode::FloatVarArrayfv; Gecode::FloatVarArrayfv_aux; std::vector<bool>fv_introduced; #endif boolneedAuxVars; FlatZincSpace(void); ~FlatZincSpace(void); voidinit(intintVars,intboolVars,intsetVars,intfloatVars); voidnewIntVar(IntVarSpec*vs); voidaliasBool2Int(intiv,intbv); intaliasBool2Int(intiv); voidnewBoolVar(BoolVarSpec*vs); voidnewSetVar(SetVarSpec*vs); voidnewFloatVar(FloatVarSpec*vs); voidpostConstraint(constConExpr&ce,AST::Node*annotation); voidsolve(AST::Array*annotation); voidminimize(intvar,boolisInt,AST::Array*annotation); voidmaximize(intvar,boolisInt,AST::Array*annotation); voidrun(std::ostream&out,constPrinter&p, constFlatZincOptions&opt,Gecode::Support::Timer&t_total); voidprint(std::ostream&out,constPrinter&p)const; voidcompare(constSpace&s,std::ostream&out)const; voidcompare(constFlatZincSpace&s,std::ostream&out, constPrinter&p)const; voidshrinkArrays(Printer&p); Methmethod(void)const; intoptVar(void)const; booloptVarIsInt(void)const; voidcreateBranchers(AST::Node*ann, intseed,doubledecay, boolignoreUnknown, std::ostream&err=std::cerr); AST::Array*solveAnnotations(void)const; BranchInformationbranchInfo; virtualvoidconstrain(constSpace&s); virtualGecode::Space*copy(boolshare); IntArgsarg2intargs(AST::Node*arg,intoffset=0); IntArgsarg2boolargs(AST::Node*arg,intoffset=0); IntSetarg2intset(AST::Node*n); IntSetArgsarg2intsetargs(AST::Node*arg,intoffset=0); IntVarArgsarg2intvarargs(AST::Node*arg,intoffset=0); BoolVarArgsarg2boolvarargs(AST::Node*arg,intoffset=0,intsiv=-1); BoolVararg2BoolVar(AST::Node*n); IntVararg2IntVar(AST::Node*n); boolisBoolArray(AST::Node*b,int&singleInt); #ifdefGECODE_HAS_SET_VARS SetVararg2SetVar(AST::Node*n); SetVarArgsarg2setvarargs(AST::Node*arg,intoffset=0,intdoffset=0, constIntSet&od=IntSet::empty); #endif #ifdefGECODE_HAS_FLOAT_VARS FloatValArgsarg2floatargs(AST::Node*arg,intoffset=0); FloatVararg2FloatVar(AST::Node*n); FloatVarArgsarg2floatvarargs(AST::Node*arg,intoffset=0); #endif IntConLevelann2icl(AST::Node*ann); }; classError{ private: conststd::stringmsg; public: Error(conststd::string&where,conststd::string&what) :msg(where+":"+what){} conststd::string&toString(void)const{returnmsg;} }; GECODE_FLATZINC_EXPORT FlatZincSpace*parse(conststd::string&fileName, Printer&p,std::ostream&err=std::cerr, FlatZincSpace*fzs=NULL); GECODE_FLATZINC_EXPORT FlatZincSpace*parse(std::istream&is, Printer&p,std::ostream&err=std::cerr, FlatZincSpace*fzs=NULL); }} #endif //STATISTICS:flatzinc-any