(* Tests *)
needs "../formal_lp/formal_interval/m_verifier.hl";;
let reset_all () =
Arith_cache.reset_stat();
Arith_cache.reset_cache();
Arith_float.reset_stat();
Arith_float.reset_cache();;
let dest_int int =
let f1, f2 = Informal_interval.dest_interval int in
Informal_float.dest_float f1, Informal_float.dest_float f2;;
let dest_f = Informal_float.dest_float;;
let dest_dom dom =
map dest_f dom.Informal_taylor.lo,
map dest_f dom.Informal_taylor.hi,
map dest_f dom.Informal_taylor.y,
map dest_f dom.Informal_taylor.w;;
let dest_ti ti =
dest_int ti.Informal_taylor.f,
map dest_int ti.Informal_taylor.df,
map (map dest_int) ti.Informal_taylor.ddf;;
needs "../formal_lp/formal_interval/m_examples_poly.hl";;
(***)
(* delta_y *)
let delta_y_poly =
let tm = (rand o concl o SPEC_ALL o REWRITE_RULE[Sphere.delta_x]) Sphere.delta_y in
expr_to_vector_fun tm;;
let pp = 10;;
let pp0 = 4;;
let n = 6;;
let xx = `[&2;&2;&2;&2;&2;&2]` and
zz = `[#2.52;#2.52;#2.52;#2.52;#2.52;#2.52]`;;
let xx1 = convert_to_float_list pp0 true xx and
zz1 = convert_to_float_list pp0 false zz;;
let xx2 = Informal_taylor.convert_to_float_list pp0 true xx and
zz2 = Informal_taylor.convert_to_float_list pp0 false zz;;
let xx_float = map float_of_float_tm (dest_list xx1) and
zz_float = map float_of_float_tm (dest_list zz1);;
let eval_delta_y, tf_delta_y, ti_delta_y = mk_verification_functions pp delta_y_poly true `#127.999`;;
let certificate = run_test tf_delta_y xx_float zz_float false 0.0 true true true true 0.0;;
let c1 = transform_result xx_float zz_float certificate;;
(* 10: 362; 165 (find_and_replace_all); 300: 75 *)
(* 10 (cached, float_cached): 33.778 *)
reset_all();;
test 1 (m_verify_list n pp eval_delta_y c1 xx1) zz1;;
let p_min = 1 and
p_max = pp and
p_split = pp;;
let cp1 = Informal_verifier.m_verify_list p_split p_min p_max ti_delta_y c1 xx2 zz2;;
(* 10: 26.950 *)
reset_all();;
test 1 (m_p_verify_list n pp eval_delta_y cp1 xx1) zz1;;
(************************)
let poly1 = `x2 + x3 + x5 + x6 - #7.99 - #0.00385 * delta_y x1 x2 x3 x4 x5 x6 -
#2.75 * ((x1 + x4) * #0.5 - sqrt (&8))`;;
let poly_ineq = (expr_to_vector_fun o rand o concl o
REWRITE_CONV[Sphere.delta_y; Sphere.delta_x]) poly1;;
let pp = 10;;
let pp0 = 5;;
let n = 6;;
let xx = `[sqrt (&8); &2; &2; sqrt (&8); &2; &2]` and
zz = `[&3; #2.07; #2.07; &4 * #1.26; #2.07; #2.07]`;;
let xx1 = convert_to_float_list pp0 true xx and
zz1 = convert_to_float_list pp0 false zz;;
let xx2 = Informal_taylor.convert_to_float_list pp0 true xx and
zz2 = Informal_taylor.convert_to_float_list pp0 false zz;;
let xx_float = map float_of_float_tm (dest_list xx1) and
zz_float = map float_of_float_tm (dest_list zz1);;
let eval_ineq, tf_ineq, ti_ineq = mk_verification_functions pp poly_ineq true `&0`;;
let certificate = run_test tf_ineq xx_float zz_float false 0.0 true true true true 0.0;;
let c1 = transform_result xx_float zz_float certificate;;
let p_split = pp and
p_min = 1 and
p_max = pp;;
let cp1 = Informal_verifier.m_verify_list p_split p_min p_max ti_ineq c1 xx2 zz2;;
(* 10: 14.665 *)
reset_all();;
test 1 (m_verify_list n pp eval_ineq c1 xx1) zz1;;
(* 10: 4.788 *)
test 1 (m_verify_list n pp eval_ineq c1 xx1) zz1;;
(* 10: 12.465 *)
reset_all();;
test 1 (m_p_verify_list n p_split eval_ineq cp1 xx1) zz1;;
(* 10: 4.520 *)
test 1 (m_p_verify_list n p_split eval_ineq cp1 xx1) zz1;;
(*******************************)
let get_m_cell_domain =
let domain_hash = Hashtbl.create 20 in
let mem, find, add = Hashtbl.mem domain_hash,
Hashtbl.find domain_hash, Hashtbl.add domain_hash in
fun n pp domain0 path ->
let rec get_rec domain_th path hash =
match path with
| [] -> domain_th
| (s, j) :: ps ->
let hash' = hash^s^(string_of_int j) in
if mem hash' then
get_rec (find hash') ps hash'
else
if s = "l" or s = "r" then
let domain1_th, domain2_th = split_domain n pp j domain_th in
let hash1 = hash^"l"^(string_of_int j) and
hash2 = hash^"r"^(string_of_int j) in
let _ = add hash1 domain1_th; add hash2 domain2_th in
if s = "l" then
get_rec domain1_th ps hash'
else
get_rec domain2_th ps hash'
else
let l_flag = (s = "ml") in
let domain_th', _ = restrict_domain n j l_flag domain_th in
let _ = add hash' domain_th' in
get_rec domain_th' ps hash' in
get_rec domain0 path "";;
let m_p_verify_list0 n p_split fs certificate_list xx zz th_refs =
let domain_th0 = mk_m_center_domain n p_split xx zz in
let size = length certificate_list in
let k = ref 0 in
let rec rec_verify certificate_list th_list =
match certificate_list with
| [] -> th_list
| (path, certificate) :: cs ->
let _ = k := !k + 1; report (sprintf "List: %d/%d" !k size) in
let domain_th = get_m_cell_domain n p_split domain_th0 path in
let th = m_p_verify_raw n p_split fs certificate domain_th th_list in
rec_verify cs (th_list @ [th]) in
rec_verify certificate_list th_refs;;
let i_get_m_cell_domain =
let domain_hash = Hashtbl.create 20 in
let mem, find, add = Hashtbl.mem domain_hash,
Hashtbl.find domain_hash, Hashtbl.add domain_hash in
fun pp domain0 path ->
let rec get_rec domain_th path hash =
match path with
| [] -> domain_th
| (s, j) :: ps ->
let hash' = hash^s^(string_of_int j) in
if mem hash' then
get_rec (find hash') ps hash'
else
if s = "l" or s = "r" then
let domain1_th, domain2_th = Informal_verifier.split_domain pp j domain_th in
let hash1 = hash^"l"^(string_of_int j) and
hash2 = hash^"r"^(string_of_int j) in
let _ = add hash1 domain1_th; add hash2 domain2_th in
if s = "l" then
get_rec domain1_th ps hash'
else
get_rec domain2_th ps hash'
else
let l_flag = (s = "ml") in
let domain_th' = Informal_verifier.restrict_domain j l_flag domain_th in
let _ = add hash' domain_th' in
get_rec domain_th' ps hash' in
get_rec domain0 path "";;
let i_m_verify_list p_split p_min p_max fs certificate_list xx zz =
let domain0 = Informal_taylor.mk_m_center_domain p_split xx zz in
let size = length certificate_list in
let k = ref 0 in
let rec rec_verify certificate_list dom_list tree_list =
match certificate_list with
| [] -> rev tree_list, dom_list
| (path, certificate) :: cs ->
let _ = k := !k + 1; report (sprintf "List: %d/%d" !k size) in
let domain = i_get_m_cell_domain p_split domain0 path in
let tree = Informal_verifier.m_verify_raw p_split p_min p_max fs certificate domain dom_list in
rec_verify cs (dom_list @ [domain]) ((path, tree) :: tree_list) in
rec_verify certificate_list [] [];;
(***********************)
let l1, l2 = chop_list 26 cp1;;
let ths1 = m_p_verify_list0 n p_split eval_ineq l1 xx1 zz1 [];;
let path2, c2 = hd l2;;
let dom2_th = get_m_cell_domain n p_split (mk_m_center_domain n p_split xx1 zz1) path2;;
let dom2 = i_get_m_cell_domain p_split (Informal_taylor.mk_m_center_domain p_split xx2 zz2) path2;;
dest_dom dom2;;
m_p_verify_raw n p_split eval_ineq c2 dom2_th ths1;;
c2;;
let d1_th, d2_th = split_domain n p_split (3 + 1) dom2_th;;
let d1, d2 = Informal_verifier.split_domain p_split (3 + 1) dom2;;
let t2_th = eval_ineq.taylor 4 4 d2_th;;
eval_m_taylor_upper_partial n 4 4 t2_th;;
let t2 = ti_ineq.Informal_verifier.taylor 4 d2;;
dest_f (Informal_taylor.eval_m_taylor_upper_partial 4 4 t2);;
let f0, df0, ddf0 = dest_ti t2;;
let _, _, _, _, f1, df1, ddf1 = dest_m_taylor (concl t2_th);;
df1;;
df0;;
(* partial 4, upper bound: -67 * 10^-2, (true, 671, 47) *)
let x_tm, body_tm = dest_abs poly_ineq;;
let new_f = mk_abs (x_tm, mk_binop sub_op_real `&0` body_tm);;
let partial4 = gen_partial_poly 4 new_f;;
let g1 = mk_eval_function_eq pp partial4;;
let g0 = Informal_taylor.mk_eval_function pp (rand (concl partial4));;
let _, y1, _ = dest_m_cell_domain (concl d2_th);;
let y0 = d2.Informal_taylor.y;;
g1 2 y1 y1;;
dest_int (g0 2 y0 y0);;
float_interval_pow_simple 2 4 (mk_const_interval (mk_float 29 49));;
let ff = Informal_float.mk_float (Int 29) 49;;
dest_int (Informal_interval.pow_interval 2 4 (Informal_interval.mk_interval (ff, ff)));;
let g_test = `\x:real^2. (-- &77 / &10000) * x$2 * x$1 pow 4`;;
let pp = 10;;
let g1 = mk_eval_function_eq pp (REFL g_test);;
let g0 = Informal_taylor.mk_eval_function pp g_test;;
let yy = `[#2.9; &3]`;;
let y1' = mk_vector (convert_to_float_list pp true yy);;
let y0' = Informal_taylor.convert_to_float_list pp true yy;;
g1 2 y1' y1';;
dest_int (g0 2 y0' y0');;
partial4;;
(***)
List.nth ddf0 5;;
List.nth (dest_list ddf1) 5;;
d2_th;;
dest_dom d2;;
m_p_verify_list0 n p_split eval_ineq l2 xx1 zz1 ths1;;
List.nth cp1 26;;
let x = 2;;
(***)
(* schwefel *)
let pp = 12;;
let n = 3;;
let xx = `[-- &10; -- &10; -- &10]` and
zz = `[&10; &10; &10]`;;
let xx1 = convert_to_float_list pp true xx and
zz1 = convert_to_float_list pp false zz;;
let xx2 = Informal_taylor.convert_to_float_list pp true xx and
zz2 = Informal_taylor.convert_to_float_list pp false zz;;
let xx_float = map float_of_float_tm (dest_list xx1) and
zz_float = map float_of_float_tm (dest_list zz1);;
let eval_schwefel, tf_schwefel, i_schwefel = mk_verification_functions pp schwefel_poly true schwefel_min;;
let c00 = run_test tf_schwefel xx_float zz_float false 0.0 true true false false 0.0;;
let c0 = run_test tf_schwefel xx_float zz_float false 0.0 true true false true 0.0;;
result_stat c0;;
let c1' = run_test tf_schwefel xx_float zz_float false 0.0 true true true true 0.0;;
let c1 = transform_result xx_float zz_float c1';;
let p_split = pp and
p_min = 1 and p_max = pp;;
reset_all();;
let cp0 = Informal_verifier.m_verify_raw0 p_split p_min p_max i_schwefel c0 xx2 zz2;;
(* 10: 27.006 *)
reset_all();;
test 1 (m_verify_raw0 n pp eval_schwefel c0 xx1) zz1;;
(* 10: 24.642 *)
reset_all();;
test 1 (m_p_verify_raw0 n p_split eval_schwefel cp0 xx1) zz1;;
(* 10: 136.257 *)
reset_all();;
test 1 (m_verify_raw0 n pp eval_schwefel c00 xx1) zz1;;
let cp00 = Informal_verifier.m_verify_raw0 p_split p_min p_max i_schwefel c00 xx2 zz2;;
(* 10: 126.400 *)
reset_all();;
test 1 (m_p_verify_raw0 n p_split eval_schwefel cp00 xx1) zz1;;
(* 10: 23.297 *)
reset_all();;
test 1 (m_verify_list n pp eval_schwefel c1 xx1) zz1;;
let cp1 = Informal_verifier.m_verify_list p_split p_min p_max i_schwefel c1 xx2 zz2;;
(* 10: 21.205 *)
reset_all();;
test 1 (m_p_verify_list n p_split eval_schwefel cp1 xx1) zz1;;
(***)
(* rd *)
let pp = 12;;
let n = 3;;
let xx = `[-- &5; -- &5; -- &5]` and
zz = `[&5; &5; &5]`;;
let xx1 = convert_to_float_list pp true xx and
zz1 = convert_to_float_list pp false zz;;
let xx2 = Informal_taylor.convert_to_float_list pp true xx and
zz2 = Informal_taylor.convert_to_float_list pp false zz;;
let xx_float = map float_of_float_tm (dest_list xx1) and
zz_float = map float_of_float_tm (dest_list zz1);;
let eval_rd, tf_rd, i_rd = mk_verification_functions pp rd_poly true rd_min;;
let certificate = run_test tf_rd xx_float zz_float false 0.0 true true true false 0.0;;
(* 1 *)
result_size certificate;;
m_verify_raw0 n pp eval_rd certificate xx1 zz1;;
let p_split = pp and
p_min = 1 and
p_max = pp;;
Informal_verifier.m_verify_raw0 p_split p_min p_max i_rd certificate xx2 zz2;;
(***)
(* caprasse *)
let pp = 8;;
let n = 4;;
let xx = `[-- #0.5; -- #0.5; -- #0.5; -- #0.5]` and
zz = `[#0.5; #0.5; #0.5; #0.5]`;;
let xx1 = convert_to_float_list pp true xx and
zz1 = convert_to_float_list pp false zz;;
let xx2 = Informal_taylor.convert_to_float_list pp true xx and
zz2 = Informal_taylor.convert_to_float_list pp false zz;;
let xx_float = map float_of_float_tm (dest_list xx1) and
zz_float = map float_of_float_tm (dest_list zz1);;
let eval_caprasse, tf_caprasse, ti_caprasse = mk_verification_functions pp caprasse_poly true caprasse_min;;
let c0 = run_test tf_caprasse xx_float zz_float false 0.0 true true false true 0.0;;
let certificate = run_test tf_caprasse xx_float zz_float false 0.0 true true true true 0.0;;
let c1 = transform_result xx_float zz_float certificate;;
(* 10: 1.668 *)
reset_all();;
test 1 (m_verify_list n pp eval_caprasse c1 xx1) zz1;;
let p_split = pp and
p_min = 1 and
p_max = pp;;
let cp1 = Informal_verifier.m_verify_list p_split p_min p_max ti_caprasse c1 xx2 zz2;;
(* 10: 1.552 *)
reset_all();;
test 1 (m_p_verify_list n p_split eval_caprasse cp1 xx1) zz1;;
(***)
(* magnetism *)
let pp = 8;;
let n = 7;;
let xx = `[-- &1; -- &1; -- &1; -- &1; -- &1; -- &1; -- &1]` and
zz = `[&1; &1; &1; &1; &1; &1; &1]`;;
let xx1 = convert_to_float_list pp true xx and
zz1 = convert_to_float_list pp false zz;;
let xx2 = Informal_taylor.convert_to_float_list pp true xx and
zz2 = Informal_taylor.convert_to_float_list pp false zz;;
let xx_float = map float_of_float_tm (dest_list xx1) and
zz_float = map float_of_float_tm (dest_list zz1);;
let eval_magnetism, tf_magnetism, ti_magnetism =
mk_verification_functions pp magnetism_poly true magnetism_min;;
let certificate = run_test tf_magnetism xx_float zz_float false 0.0 true true true true 0.0;;
result_stat certificate;;
let c1 = transform_result xx_float zz_float certificate;;
(* 10: 1.34 *)
reset_all();;
test 1 (m_verify_list n pp eval_magnetism c1 xx1) zz1;;
let p_split = pp and
p_min = 1 and
p_max = pp;;
let cp1 = Informal_verifier.m_verify_list p_split p_min p_max ti_magnetism c1 xx2 zz2;;
(* 10: 1.372 *)
reset_all();;
test 1 (m_p_verify_list n p_split eval_magnetism cp1 xx1) zz1;;
(***)
(* heart *)
let pp = 10;;
let pp0 = 6;;
let n = 8;;
let xx = `[-- #0.1; #0.4; -- #0.7; -- #0.7; #0.1; -- #0.1; -- #0.3; -- #1.1]` and
zz = `[#0.4; &1; -- #0.4; #0.4; #0.2; #0.2; #1.1; -- #0.3]`;;
let xx1 = convert_to_float_list pp0 true xx and
zz1 = convert_to_float_list pp0 false zz;;
let xx2 = Informal_taylor.convert_to_float_list pp0 true xx and
zz2 = Informal_taylor.convert_to_float_list pp0 false zz;;
let xx_float = map float_of_float_tm (dest_list xx1) and
zz_float = map float_of_float_tm (dest_list zz1);;
let eval_heart, tf_heart, ti_heart = mk_verification_functions pp heart_poly true heart_min;;
let certificate = run_test tf_heart xx_float zz_float false 0.0 true true true true 1e-10;;
let c1 = transform_result xx_float zz_float certificate;;
let p_split = pp and
p_min = 1 and
p_max = 10;;
let cp1 = Informal_verifier.m_verify_list p_split p_min p_max ti_heart c1 xx2 zz2;;
(* 10: 1.528 *)
reset_all();;
test 1 (m_verify_list n pp eval_heart c1 xx1) zz1;;
(* 10: 1.496 *)
reset_all();;
test 1 (m_p_verify_list n p_split eval_heart cp1 xx1) zz1;;