src/HOL/Matrix/cplex/CplexMatrixConverter.ML
changeset 33245 65232054ffd0
parent 32491 d5d8bea0cd94
equal deleted inserted replaced
33244:db230399f890 33245:65232054ffd0
    73           | setprod vec positive (cplexVar v) = set_elem vec (s2i v) (if positive then "1" else "-1")
    73           | setprod vec positive (cplexVar v) = set_elem vec (s2i v) (if positive then "1" else "-1")
    74           | setprod vec positive (cplexProd (cplexNum num, cplexVar v)) = 
    74           | setprod vec positive (cplexProd (cplexNum num, cplexVar v)) = 
    75             set_elem vec (s2i v) (if positive then num else "-"^num)
    75             set_elem vec (s2i v) (if positive then num else "-"^num)
    76           | setprod _ _ _ = raise (Converter "term is not a normed product")        
    76           | setprod _ _ _ = raise (Converter "term is not a normed product")        
    77 
    77 
    78         fun sum2vec (cplexSum ts) = Library.foldl (fn (vec, t) => setprod vec true t) (empty_vector, ts)
    78         fun sum2vec (cplexSum ts) = fold (fn t => fn vec => setprod vec true t) ts empty_vector
    79           | sum2vec t = setprod empty_vector true t                                                
    79           | sum2vec t = setprod empty_vector true t                                                
    80 
    80 
    81         fun constrs2Ab j A b [] = (A, b)
    81         fun constrs2Ab j A b [] = (A, b)
    82           | constrs2Ab j A b ((_, cplexConstr (cplexLeq, (t1,t2)))::cs) = 
    82           | constrs2Ab j A b ((_, cplexConstr (cplexLeq, (t1,t2)))::cs) = 
    83             constrs2Ab (j+1) (set_vector A j (sum2vec t1)) (set_elem b j (num2str true t2)) cs
    83             constrs2Ab (j+1) (set_vector A j (sum2vec t1)) (set_elem b j (num2str true t2)) cs
    98         (goal_maximize, sum2vec goal_term, A, b, (varcount, i2s, s2i))
    98         (goal_maximize, sum2vec goal_term, A, b, (varcount, i2s, s2i))
    99     end
    99     end
   100 
   100 
   101 fun convert_results (cplex.Optimal (opt, entries)) name2index =
   101 fun convert_results (cplex.Optimal (opt, entries)) name2index =
   102     let
   102     let
   103         fun setv (v, (name, value)) = (matrix_builder.set_elem v (name2index name) value) 
   103         fun setv (name, value) v = matrix_builder.set_elem v (name2index name) value
   104     in
   104     in
   105         (opt, Library.foldl setv (matrix_builder.empty_vector, entries))
   105         (opt, fold setv entries (matrix_builder.empty_vector))
   106     end
   106     end
   107   | convert_results _ _ = raise (Converter "No optimal result")
   107   | convert_results _ _ = raise (Converter "No optimal result")
   108 
   108 
   109 end;
   109 end;
   110 
   110