(* Multivariate polynomial inequalities *)
(* Examples are taken from the paper:
César Muñoz and Anthony Narkawicz,
Formalization of a Representation of Bernstein Polynomials and Applications to Global Optimization,
Journal of Automated Reasoning, DOI: 10.1007/s10817-012-9256-3
http://shemesh.larc.nasa.gov/people/cam/Bernstein/ *)
(* Set up the loading path:
load_path := "path to the formal_ineqs directory" :: !load_path;;
*)
(* Change default arithmetic options before loading other libraries *)
(* (arithmetic options cannot be changed later) *)
needs "arith_options.hl";;
(* Set the base of natural number arithmetic to 200 *)
Arith_options.base := 200;;
(* Load all verification libraries *)
(* Note: the verification library loads Multivariate/realanalysis.ml,
so it is recommended to use a checkpointed version of HOL Light
with preloaded realanalysis.ml *)
needs "verifier/m_verifier_main.hl";;
(*
Set the level of info/debug printing:
0 - no info/debug printing
1 - report important steps (default)
2 - report everything
*)
needs "verifier_options.hl";;
Verifier_options.info_print_level := 1;;
(* Open the main verification module *)
open M_verifier_main;;
(* Data *)
(* Polynomials *)
let schwefel_poly = `(x1 - x2 pow 2) pow 2 + (x2 - &1) pow 2 +
(x1 - x3 pow 2) pow 2 + (x3 - &1) pow 2` and
rd_poly = `-- x1 + &2 * x2 - x3 - #0.835634534 * x2 * (&1 + x2)` and
caprasse_poly = `-- x1 * x3 pow 3 + &4 * x2 * x3 pow 2 * x4 +
&4 * x1 * x3 * x4 pow 2 + &2 * x2 * x4 pow 3 + &4 * x1 * x3 + &4 * x3 pow 2 -
&10 * x2 * x4 - &10 * x4 pow 2 + &2` and
lv_poly = `x1 * x2 pow 2 + x1 * x3 pow 2 + x1 * x4 pow 2 - #1.1 * x1 + &1` and
butcher_poly = `x6 * x2 pow 2 + x5 * x3 pow 2 - x1 * x4 pow 2 + x4 pow 2 -
&1 / &3 * x1 + &4 / &3 * x4` and
magnetism_poly = `x1 pow 2 + &2 * x2 pow 2 + &2 * x3 pow 2 + &2 * x4 pow 2 +
&2 * x5 pow 2 + &2 * x6 pow 2 + &2 * x7 pow 2 - x1` and
heart_poly = `-- x1 * x6 pow 3 + &3 * x1 * x6 * x7 pow 2 - x3 * x7 pow 3 +
&3 * x3 * x7 * x6 pow 2 - x2 * x5 pow 3 + &3 * x2 * x5 * x8 pow 2 - x4 * x8 pow 3 +
&3 * x4 * x8 * x5 pow 2 - #0.9563453`;;
(* Minimal values *)
let schwefel_min = `-- #0.00000000058806` and
rd_min = `-- #36.7126907` and
caprasse_min = `-- #3.1801` and
lv_min = `-- #20.801` and
butcher_min = `-- #1.44` and
magnetism_min = `-- #0.25001` and
heart_min = `-- #1.7435`;;
(* Domains *)
let schwefel_dom = `[-- &10; -- &10; -- &10]`, `[&10; &10; &10]` and
rd_dom = `[-- &5; -- &5; -- &5]`, `[&5; &5; &5]` and
caprasse_dom = `[-- #0.5; -- #0.5; -- #0.5; -- #0.5]`, `[#0.5; #0.5; #0.5; #0.5]` and
lv_dom = `[-- &2; -- &2; -- &2; -- &2]`, `[&2; &2; &2; &2]` and
butcher_dom = `[-- &1; -- #0.1; -- #0.1; -- &1; -- #0.1; -- #0.1]`,
`[&0; #0.9; #0.5; -- #0.1; -- #0.05; -- #0.03]` and
magnetism_dom = `[-- &1; -- &1; -- &1; -- &1; -- &1; -- &1; -- &1]`,
`[&1; &1; &1; &1; &1; &1; &1]` and
heart_dom = `[-- #0.1; #0.4; -- #0.7; -- #0.7; #0.1; -- #0.1; -- #0.3; -- #1.1]`,
`[#0.4; &1; -- #0.4; #0.4; #0.2; #0.2; #1.1; -- #0.3]`;;
let mk_poly_ineq poly_tm min_tm dom =
let n = length (frees poly_tm) in
let xs = map (fun i -> "x"^string_of_int i) (1--n) in
let ineq_tm = mk_binop `(<):real->real->bool` min_tm poly_tm in
let ineq2_tm = M_verifier_main.mk_ineq ineq_tm xs dom in
ineq2_tm;;
(* Create all inequalities *)
let schwefel_ineq,
rd_ineq,
caprasse_ineq,
lv_ineq,
butcher_ineq,
magnetism_ineq,
heart_ineq =
mk_poly_ineq schwefel_poly schwefel_min schwefel_dom,
mk_poly_ineq rd_poly rd_min rd_dom,
mk_poly_ineq caprasse_poly caprasse_min caprasse_dom,
mk_poly_ineq lv_poly lv_min lv_dom,
mk_poly_ineq butcher_poly butcher_min butcher_dom,
mk_poly_ineq magnetism_poly magnetism_min magnetism_dom,
mk_poly_ineq heart_poly heart_min heart_dom;;
(* Tests *)
let test_schwefel () =
verify_ineq default_params 5 schwefel_ineq;;
let test_rd () =
verify_ineq default_params 5 rd_ineq;;
let test_caprasse () =
verify_ineq default_params 5 caprasse_ineq;;
let test_lv () =
verify_ineq default_params 5 lv_ineq;;
let test_butcher () =
verify_ineq default_params 5 butcher_ineq;;
let test_magnetism () =
verify_ineq default_params 5 magnetism_ineq;;
let test_heart () =
verify_ineq {default_params with eps = 1e-10} 5 heart_ineq;;
let run_tests () =
[test_schwefel(); test_rd(); test_caprasse(); test_lv();
test_butcher(); test_magnetism(); test_heart()];;
let results () =
map fst (run_tests());;
results();;