1 needs "../formal_lp/formal_interval/m_taylor_arith.hl";;
2 needs "../formal_lp/formal_interval/m_verifier.hl";;
8 let poly1 = expr_to_vector_fun `x1 * x2`;;
9 let poly2 = expr_to_vector_fun `x2 + x1 * x2`;;
11 let (_, _, _, eval1), tf1 = mk_verification_functions pp poly1 false `&0` and
12 (_, _, _, eval2), tf2 = mk_verification_functions pp poly2 false `&0`;;
15 let xx = `[&1; &1]` and
18 let xx1 = convert_to_float_list pp true xx and
19 zz1 = convert_to_float_list pp false zz;;
21 let xx_float, zz_float =
22 let pad = replicate 0.0 (8 - length (dest_list xx1)) in
23 map float_of_float_tm (dest_list xx1) @ pad,
24 map float_of_float_tm (dest_list zz1) @ pad;;
26 let domain_th = mk_m_center_domain n pp xx1 zz1;;
28 evalf (Uni_compose (uatan, tf2)) xx_float zz_float;;
29 eval_m_taylor_mul n pp (eval1 domain_th) (eval2 domain_th);;
30 evalf (Product (tf1, tf2)) xx_float zz_float;;
34 (******************************)
38 let eval_d0 i t1 t2 = failwith "eval_d0";;
39 let eval_dd0 i j t1 t2 = failwith "eval_dd0";;
40 let eval_0 t1 t2 = failwith "eval_0";;
43 (******************************)
51 let eval_x = eval_m_taylor_poly0 pp `\x:real^1. x$1`;;
55 let ( - ), ( * ), atn = eval_m_taylor_sub n pp, eval_m_taylor_mul n pp, eval_m_taylor_atn n pp in
58 let tf = Plus (Product (x1, x1), Scale (Uni_compose (uatan, x1), ineg one));;
61 let xx = `[#0.01]` and
64 let xx1 = convert_to_float_list pp true xx and
65 zz1 = convert_to_float_list pp false zz;;
67 let xx_float, zz_float =
68 let pad = replicate 0.0 (8 - length (dest_list xx1)) in
69 map float_of_float_tm (dest_list xx1) @ pad,
70 map float_of_float_tm (dest_list zz1) @ pad;;
72 let domain_th = mk_m_center_domain n pp xx1 zz1;;
74 evalf tf xx_float zz_float;;
76 let certificate = run_test tf xx_float zz_float false 0.0 true false true false 0.0;;
77 let c1 = transform_result xx_float zz_float certificate;;
79 m_verify_list n pp (eval_d0, eval_dd0, eval_0, f_eval) c1 xx1 zz1;;
82 (********************)
87 let atan_num = `let P00, P01, P02 = #4.26665376811246382, #3.291955407318148, #0.281939359003812 in
90 x * (x1 * P01 + x2 * P02 + P00)`;;
92 let atan_denom = `let Q00, Q01 = #4.26665376811354027, #4.714173328637605 in
95 x1 * Q01 + x2 + Q00`;;
98 let num_poly = (expr_to_vector_fun o rand o concl o REPEATC let_CONV) atan_num;;
99 let denom_poly = (expr_to_vector_fun o rand o concl o REPEATC let_CONV) atan_denom;;
101 let (_, _, _, eval_num), tf_num = mk_verification_functions pp num_poly false `&0`;;
102 let (_, _, _, eval_denom), tf_denom = mk_verification_functions pp denom_poly false `&0`;;
104 let (_, _, _, eval_eps), tf_eps = mk_verification_functions pp `\x:real^1. #0.00000001` false `&0`;;
107 let eval_approx_hi th =
109 let eps = eval_eps th in
110 let atn, inv, ( * ), ( - ) = eval_m_taylor_atn n pp, eval_m_taylor_inv n pp,
111 eval_m_taylor_mul n pp, eval_m_taylor_sub n pp in
112 (eval_num th * inv (eval_denom th) - atn x) - eps;;
115 let xx = `[#0.0000001]` and
118 let xx1 = convert_to_float_list pp true xx and
119 zz1 = convert_to_float_list pp false zz;;
121 let xx_float, zz_float =
122 let pad = replicate 0.0 (8 - length (dest_list xx1)) in
123 map float_of_float_tm (dest_list xx1) @ pad,
124 map float_of_float_tm (dest_list zz1) @ pad;;
126 let domain_th = mk_m_center_domain n pp xx1 zz1;;
129 eval_approx_hi domain_th;;
130 (* 10: 0.800 (p = 15) *)
131 test 1 eval_approx_hi domain_th;;
135 let tf_approx_hi = Plus (Plus (Product (tf_num, Uni_compose (uinv, tf_denom)),
136 Scale (Uni_compose (uatan, x1), ineg one)),
137 Scale (tf_eps, ineg one));;
140 let certificate = run_test tf_approx_hi xx_float zz_float false 0.0 true false true false 0.0;;
141 result_stat certificate;;
142 let c1 = transform_result xx_float zz_float certificate;;
144 m_verify_list n pp (eval_d0, eval_dd0, eval_0, eval_approx_hi) c1 xx1 zz1;;
154 let eval_x = eval_m_taylor_poly0 pp `\x:real^2. x$1` and
155 eval_y = eval_m_taylor_poly0 pp `\x:real^2. x$2`;;
157 let eval_xy = eval_m_taylor_poly0 pp `\x:real^2. x$1 * x$2`;;
162 let ( - ), ( * ), atn = eval_m_taylor_sub n pp, eval_m_taylor_mul n pp, eval_m_taylor_atn n pp in
163 atn (x * y) - x * y;;
166 let xy = eval_xy th in
167 let ( - ), ( * ), atn = eval_m_taylor_sub n pp, eval_m_taylor_mul n pp, eval_m_taylor_atn n pp in
171 let tf = Plus (Uni_compose (uatan, Product (x1, x2)), Scale (Product (x1, x2), ineg one));;
174 let xx = `[#0.1; #0.1]` and
175 zz = `[#0.6; #0.6]`;;
177 let xx1 = convert_to_float_list pp true xx and
178 zz1 = convert_to_float_list pp false zz;;
180 let xx_float, zz_float =
181 let pad = replicate 0.0 (8 - length (dest_list xx1)) in
182 map float_of_float_tm (dest_list xx1) @ pad,
183 map float_of_float_tm (dest_list zz1) @ pad;;
185 let domain_th = mk_m_center_domain n pp xx1 zz1;;
187 let certificate = run_test tf xx_float zz_float false 0.0 true false true false 0.0;;
188 let c1 = transform_result xx_float zz_float certificate;;
191 test 1 (m_verify_list n pp (eval_d0, eval_dd0, eval_0, f_eval) c1 xx1) zz1;;
193 test 1 (m_verify_list n pp (eval_d0, eval_dd0, eval_0, f_eval2) c1 xx1) zz1;;
202 let (_, _, _, eval_xy), tf0 =
203 mk_verification_functions pp `\x:real^6. x$1 * x$2 + x$3 * x$4 + x$5 * x$6` false `&0`;;
206 let xy = eval_xy th in
207 let ( - ), ( * ), sqrt = eval_m_taylor_sub n pp, eval_m_taylor_mul n pp, eval_m_taylor_sqrt n pp in
211 let xy = eval_xy th in
212 let ( - ), ( * ), atn = eval_m_taylor_sub n pp, eval_m_taylor_mul n pp, eval_m_taylor_atn n pp in
216 let tf_sqrt = Plus (tf0, Scale (Uni_compose (usqrt, tf0), ineg one));;
217 let tf_atn = Plus (Uni_compose (uatan, tf0), Scale (tf0, ineg one));;
220 let xx = `[#0.1; #0.1; #0.1; #0.1; #0.1; #0.1]` and
221 zz = `[#0.2; #0.2; #0.2; #0.2; #0.2; #0.2]`;;
223 let xx1 = convert_to_float_list pp true xx and
224 zz1 = convert_to_float_list pp false zz;;
226 let xx_float, zz_float =
227 let pad = replicate 0.0 (8 - length (dest_list xx1)) in
228 map float_of_float_tm (dest_list xx1) @ pad,
229 map float_of_float_tm (dest_list zz1) @ pad;;
232 let certificate_sqrt = run_test tf_sqrt xx_float zz_float false 0.0 true false true false 0.0;;
233 let c1_sqrt = transform_result xx_float zz_float certificate_sqrt;;
235 let certificate_atn = run_test tf_atn xx_float zz_float false 0.0 true false true false 0.0;;
236 let c1_atn = transform_result xx_float zz_float certificate_atn;;
238 m_verify_list n pp (eval_d0, eval_dd0, eval_0, f_eval_sqrt) c1_sqrt xx1 zz1;;
239 m_verify_list n pp (eval_d0, eval_dd0, eval_0, f_eval_atn) c1_atn xx1 zz1;;
243 (*********************************)
253 let tm = (rand o concl o SPEC_ALL o REWRITE_RULE[Sphere.delta_x]) Sphere.delta_y in
254 expr_to_vector_fun tm;;
258 let tm = (rand o concl o SPECL[`y1*y1`; `y2*y2`; `y3*y3`; `y4*y4`; `y5*y5`; `y6*y6`]) Sphere.delta_x4 in
259 expr_to_vector_fun tm;;
261 (* 4 * y1 * delta_y *)
262 let four_y1_delta_y_poly =
263 let x_var, tm = dest_abs delta_y_poly in
264 mk_abs (x_var, mk_binop mul_op_real `&4` (mk_binop mul_op_real `(x:real^6)$1 * x$1` tm));;
267 let neg_delta_y4_poly =
268 let x_var, tm = dest_abs delta_y4_poly in
269 mk_abs (x_var, mk_comb (neg_op_real, tm));;
272 let (_, _, _, eval_neg_delta_y4), tf_neg_delta_y4 =
273 mk_verification_functions pp neg_delta_y4_poly false `&0`;;
275 let (_, _, _, eval_4y1_delta_y), tf_4y1_delta_y =
276 mk_verification_functions pp four_y1_delta_y_poly false `&0`;;
278 let (_, _, _, eval_pi2), tf_pi2 =
279 mk_verification_functions pp `\x:real^6. pi / &2` false `&0`;;
282 let (_, _, _, eval_pi2_plus), tf_pi2_plus =
283 mk_verification_functions pp `\x:real^6. pi / &2 - #1.893` false `&0`;;
291 let denom = Uni_compose (uinv, Uni_compose (usqrt, tf_4y1_delta_y)) in
292 Plus (tf_pi2_plus, Uni_compose (uatan, Product (tf_neg_delta_y4, denom)));;
294 let eval_dih_y_hi th =
295 let inv, atn, sqrt, ( * ), ( + ) =
296 eval_m_taylor_inv n pp, eval_m_taylor_atn n pp, eval_m_taylor_sqrt n pp,
297 eval_m_taylor_mul n pp, eval_m_taylor_add n pp in
298 let poly1 = eval_4y1_delta_y th and
299 poly2 = eval_neg_delta_y4 th and
300 pi2 = eval_pi2_plus th in
301 pi2 + atn (poly2 * inv (sqrt (poly1)));;
307 let xx = `[&2; &2; &2; &2; &2; &2]` and
308 zz = `[#2.52; #2.52; #2.52; #2.52; #2.52; #2.52]`;;
310 let xx1 = convert_to_float_list pp true xx and
311 zz1 = convert_to_float_list pp false zz;;
315 let xx_s = `[&2; &2; &2; &2; &2; &2]` and
316 zz_s = `[#2.1; #2.1; #2.1; #2.1; #2.1; #2.1]`;;
319 let xx1_s = convert_to_float_list pp true xx_s and
320 zz1_s = convert_to_float_list pp false zz_s in
321 mk_m_center_domain n pp xx1_s zz1_s;;
323 (* 10: 9.121 (pp = 15); 300: 5.5 (pp = 8) *)
324 test 1 eval_dih_y_hi domain_th;;
329 let xx_s = `[&2; &2; &2; &2; &2; &2]` and
330 zz_s = `[#2.52; #2.1; #2.1; #2.1; #2.1; #2.1]`;;
332 let xx1_s = convert_to_float_list pp true xx_s and
333 zz1_s = convert_to_float_list pp false zz_s;;
336 let xx_float, zz_float, xx_s_float, zz_s_float =
337 let pad = replicate 0.0 (8 - length (dest_list xx1)) in
338 map float_of_float_tm (dest_list xx1) @ pad,
339 map float_of_float_tm (dest_list zz1) @ pad,
340 map float_of_float_tm (dest_list xx1_s) @ pad,
341 map float_of_float_tm (dest_list zz1_s) @ pad;;
347 let c_dih_y_s = run_test tf_dih_y_hi xx_s_float zz_s_float false 0.0 true false true false 0.0;;
348 let c_dih_y = run_test tf_dih_y_hi xx_float zz_float false 0.0 true false true false 0.0;;
349 let c_dih_y0 = run_test tf_dih_y_hi xx_float zz_float false 0.0 true false false false 0.0;;
350 let c_dih_y_full = run_test tf_dih_y_hi xx_float zz_float false 0.0 true true true true 0.0;;
351 let c_dih_y_min = run_test tf_dih_y_hi xx_float zz_float false 0.0 false false false false 0.0;;
354 result_stat c_dih_y_s;;
356 (* pass = 4292, mono = 8, pass_mono = 2 *)
357 result_stat c_dih_y;;
358 (* pass = 4294, mono = 10 *)
359 result_stat c_dih_y0;;
360 (* pass = 4292, mono = 8, pass_mono = 2 *)
361 result_stat c_dih_y_full;;
362 (* pass = 4317, mono = 0 *)
363 result_stat c_dih_y_min;;
365 m_verify_raw0 n pp (eval_d0, eval_dd0, eval_0, eval_dih_y) c_dih_y_s xx1_s zz1_s;;
366 (* 10: 38.418; 300: 22.289 (pp = 8)*)
367 test 1 (m_verify_raw0 n pp (eval_d0, eval_dd0, eval_0, eval_dih_y) c_dih_y_s xx1_s) zz1_s;;
371 m_verify_raw0 n pp (eval_d0, eval_dd0, eval_0, eval_dih_y) c_dih_y0 xx1 zz1;;
372 let c1_dih_y = transform_result xx_float zz_float c_dih_y;;
376 (*************************************)
379 let denom = Uni_compose (uinv, Uni_compose (usqrt, tf_4y1_delta_y)) in
380 Plus (tf_pi2, Uni_compose (uatan, Product (tf_neg_delta_y4, denom)));;
385 let _, tf_neg_pi = mk_verification_functions 15 `\x:real^6. --pi` false `&0`;;
389 let dih1 = tf_dih_y and
390 dih2 = Composite (tf_dih_y, x2, x3, x1, x5, x6, x4, unit, unit) and
391 dih3 = Composite (tf_dih_y, x3, x1, x2, x6, x4, x5, unit, unit) in
392 Plus (dih1, Plus (dih2, Plus (dih3, tf_neg_pi)));;
396 let pi_val= 3.1415926535897932;;
397 let sol0_val = 0.5512855984325308;;
398 let const1_val = sol0_val /. pi_val;;
399 let const1_plus1 = const1_val +. 1.0;;
401 let _, tf_ly = mk_verification_functions 15 `\x:real^1. #2.52 / #0.52 - x$1 * inv(#0.52)` false `&0`;;
402 let tf_lnazim_y = Product (tf_ly, tf_dih_y);;
406 let azim1 = tf_lnazim_y and
407 azim2 = Composite (tf_lnazim_y, x2, x3, x1, x5, x6, x4, unit, unit) and
408 azim3 = Composite (tf_lnazim_y, x3, x1, x2, x6, x4, x5, unit, unit) in
409 let f1 = Scale (tf_sol_y, mk_interval (const1_plus1, const1_plus1)) and
410 f2 = Plus (azim1, Plus (azim2, azim3)) in
411 Plus (f1, Scale (f2, mk_interval (~-.const1_val, ~-.const1_val)));;
417 Plus (tf_dih_y, Scale (unit, ineg (mk_interval (1.893, 1.893))));;
422 Plus (Scale (unit, mk_interval (0.852, 0.852)), Scale (tf_dih_y, ineg one));;
425 (* taum + 0.626 * dih_y - 0.77 > 0 *)
427 let f = Plus (tf_taum, Scale (tf_dih_y, mk_interval (0.626, 0.626))) in
428 Plus (Scale (unit, mk_interval (0.77, 0.77)), Scale (f, ineg one));;
431 (* taum - 0.259 * dih_y + 0.32 > 0 *)
433 let f = Plus (tf_taum, Scale (tf_dih_y, mk_interval (-0.259, -0.259))) in
434 Plus (Scale (unit, mk_interval (-0.32, -0.32)), Scale (f, ineg one));;
437 (* taum - 0.507 * dih_y + 0.724 > 0 *)
439 let f = Plus (tf_taum, Scale (tf_dih_y, mk_interval (-0.507, -0.507))) in
440 Plus (Scale (unit, mk_interval (-0.724, -0.724)), Scale (f, ineg one));;
443 (* sol_y - 0.55125 - 0.196 * (y4 + y5 + y6 - 6) + 0.38 * (y1 + y2 + y3 - 6) > 0 *)
444 let _, tf_poly = mk_verification_functions 15
445 `\x:real^6. #0.55125 + #0.196 * (x$4 + x$5 + x$6 - &6) - #0.38 * (x$1 + x$2 + x$3 - &6)` false `&0`;;
448 Plus (tf_poly, Scale (tf_sol_y, ineg one));;
451 (* dih_y - 1.2308 + 0.3639 * (y2 + y3 + y5 + y6 - 8) - 0.235 * (y1 - 2) - 0.685 * (y4 - 2) > 0 *)
452 let _, tf_poly = mk_verification_functions 15
453 `\x:real^6. #1.2308 - #0.3639 * (x$2 + x$3 + x$5 + x$6 - &8) + #0.235 * (x$1 - &2) + #0.685 * (x$4 - &2)`
457 Plus (tf_poly, Scale (tf_dih_y, ineg one));;
463 let c1_1 = run_test tf_test1 xx_float zz_float false 0.0 true false true false 0.0;;
464 let c1 = run_test tf_test1 xx_float zz_float false 0.0 false false false false 0.0;;
471 let c2_1 = run_test tf_test2 xx_float zz_float false 0.0 true false true false 0.0;;
472 let c2 = run_test tf_test2 xx_float zz_float false 0.0 false false false false 0.0;;
473 (* pass = 8891, mono = 77, pass_mono = 2 *)
479 let c3 = run_test tf_test3 xx_float zz_float false 0.0 false false false false 0.0 and
480 c4 = run_test tf_test4 xx_float zz_float false 0.0 false false false false 0.0 and
481 c5 = run_test tf_test5 xx_float zz_float false 0.0 false false false false 0.0;;
495 let c6_1 = run_test tf_test6 xx_float zz_float false 0.0 true false true false 0.0;;
496 let c6 = run_test tf_test6 xx_float zz_float false 0.0 false false false false 0.0;;
497 (* pass = 67337, mono = 214, pass_mono = 33 *)
504 let c7_1 = run_test tf_test7 xx_float zz_float false 0.0 true false true false 0.0;;
505 let c7 = run_test tf_test7 xx_float zz_float false 0.0 false false false false 0.0;;
506 let c7_full = run_test tf_test7 xx_float zz_float false 0.0 true true true true 0.0;;
507 (* pass = 21104, mono = 1203, pass_mono = 58 *)
508 result_stat c7_full;;
509 (* pass = 21104, mono = 1203, pass_mono = 58 *)
518 let rec get_pass_intervals r =
520 | Result_pass (_, xx, zz) -> [xx, zz]
521 | Result_glue (_, _, r1, r2) -> get_pass_intervals r1 @ get_pass_intervals r2
524 let sum_rs rs = itlist (+) (map result_size rs) 0;;
525 let sum1_rs rs = itlist (+) (filter (fun s -> s = 1) (map result_size rs)) 0;;
528 let c1_ints = get_pass_intervals c1;;
529 let c2_ints = get_pass_intervals c2;;
530 let c3_ints = get_pass_intervals c3;;
531 let c4_ints = get_pass_intervals c4;;
532 let c5_ints = get_pass_intervals c5;;
533 let c6_ints = get_pass_intervals c6;;
534 let c7_ints = get_pass_intervals c7;;
537 let c2_1_rs = map (fun (xx, zz) ->
538 run_test tf_test2 xx zz false 0.0 false false false false 0.0) c1_ints;;
540 let c2_7_rs = map (fun (xx, zz) ->
541 run_test tf_test2 xx zz false 0.0 false false false false 0.0) c7_ints;;
554 let c1_2_rs = map (fun (xx, zz) ->
555 run_test tf_test1 xx zz false 0.0 false false false false 0.0) c2_ints;;
557 let c1_7_rs = map (fun (xx, zz) ->
558 run_test tf_test1 xx zz false 0.0 false false false false 0.0) c7_ints;;
573 let c7_2_rs = map (fun (xx, zz) ->
574 run_test tf_test7 xx zz false 0.0 false false false false 0.0) c2_ints;;
584 let c4_3_rs = map (fun (xx, zz) ->
585 run_test tf_test4 xx zz false 0.0 false false false false 0.0) c3_ints and
586 c5_3_rs = map (fun (xx, zz) ->
587 run_test tf_test5 xx zz false 0.0 false false false false 0.0) c3_ints;;