Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
problem.ml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79module Pclass = struct type t = (* Linear *) | LP (* Quadratic *) | QP (* Quadratically Constrained; aka QCQP *) | QCP (* Mixed Integer Linear *) | MILP (* Mixed Integer Quadratic *) | MIQP (* Mixed Integer Quadratically Constrained *) | MIQCP let to_string = function | LP -> "LP" | QP -> "QP" | QCP -> "QCP" | MILP -> "MILP" | MIQP -> "MIQP" | MIQCP -> "MIQCP" end type t = Objective.t * Constraints.t let take_vars p = Objective.take_vars (fst p) @ List.concat (List.map Constraint.take_vars (snd p)) let uniq_vars p = let vars = take_vars p in List.sort_uniq Var.compare_name vars let uniq_vars_struct p = let vars = take_vars p in List.sort_uniq compare vars let collision p = let uniqn = List.length (uniq_vars p) in let uniql = List.length (uniq_vars_struct p) in if uniqn = uniql then false else ( Printf.printf "collision: uniq vars: %d uniq vars (struct): %d\n" uniqn uniql ; true ) let vname_list p = List.map Var.to_string (uniq_vars p) let classify p = let odeg = Objective.degree (fst p) in let cdeg = Constraints.degree (snd p) in if Vars.has_integer (uniq_vars p) then if cdeg = 2 then Pclass.MIQCP else if odeg = 2 then Pclass.MIQP else Pclass.MILP else if cdeg = 2 then Pclass.QCP else if odeg = 2 then Pclass.QP else Pclass.LP let validate p = not (collision p || Constraints.has_constant (snd p)) let to_string ?(short = false) p = let obj = Objective.to_string ~short (fst p) in let cnstrs = Constraints.to_string ~short (snd p) in let vars = uniq_vars p in let bound = Vars.to_bound_string ~short vars in let vtype = Vars.to_vtype_string vars in String.concat "\n" ( [obj; cnstrs] @ (match bound with None -> [] | Some b -> [b]) @ (match vtype with None -> [] | Some v -> [v]) @ ["end"] )