123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112(* export as sub modules *)moduleVar=VarmoduleTerm=TermmodulePoly=PolymoduleCnstr=CnstrmoduleObjective=ObjectivemoduleProblem=ProblemmodulePclass=Problem.PclassmodulePMap=Map.Make(Poly)(* export polynomial builders and operators *)letc=Poly.cletvar=Poly.varletbinary=Poly.binaryletrange=Poly.rangeletrange2=Poly.range2letrange3=Poly.range3letrangeb=Poly.rangebletrange2b=Poly.range2bletrange3b=Poly.range3bletrangev=Poly.rangevletrange2v=Poly.range2vletrange3v=Poly.range3vletconcat=Poly.concatletof_float_array=Poly.of_float_arrayletzero=Poly.zeroletone=Poly.onelet(~--)=Poly.(~--)let(++)=Poly.(++)let(--)=Poly.(--)letexpand=Poly.expandlet(*~)=Poly.(*~)letdot=Poly.dotlet(*@)=Poly.(*@)letdiv=Poly.divlet(/~)=Poly.(/~)(* export constraint, objective, and problem builders *)leteq=Cnstr.eqlet(=~)=Cnstr.(=~)letlt=Cnstr.ltlet(<~)=Cnstr.(<~)letgt=Cnstr.gtlet(>~)=Cnstr.(>~)letmaximize=Objective.maximizeletminimize=Objective.minimizeletmake=Problem.make(* model validation and classification *)letvalidate=Problem.validateletclassify=Problem.classifyletvname_list=Problem.vname_list(* IO *)letto_string=Problem.to_stringletof_string=Parse.from_stringletread=Parse.from_fileletwrite?(short=false)fileproblem=letch=open_outfileinPrintf.fprintfch"%s\n"(Problem.to_string~shortproblem);close_outch(* Post-processing *)letcompute_termpmapt=matchtwith|Term.Constf->f|Term.Linear(f,x)->f*.PMap.find(Poly.of_varx)pmap|Term.Quad(f,x,y)->f*.PMap.find(Poly.of_varx)pmap*.PMap.find(Poly.of_vary)pmapletcompute_polypmapp=Poly.map(compute_termpmap)p|>List.fold_left(+.)0.