Skip to content

Commit 475f090

Browse files
new opt
1 parent ad40268 commit 475f090

10 files changed

+1184
-83
lines changed

hol/policy_to_table/bdd_end_to_endScript.sml

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ open bdd_gen_optimizationTheory;
2828
open pred_specTheory;
2929
open policy_specTheory;
3030
open tables_specTheory;
31+
open tables_spec_newTheory;
3132

3233

3334
open policy_arith_to_varTheory;
@@ -770,7 +771,29 @@ Definition correct_var_policy_var_tables_exec_def:
770771
T
771772
End
772773

774+
Definition correct_var_policy_var_tables_exec2_def:
775+
correct_var_policy_var_tables_exec2 var_policy var_table vars I =
776+
let BDD1_opt = mk_BDDPred_opt policy_structure (0,[],[(0, non_termn (NONE, var_policy))]) [] vars 1 in
777+
let BDD2_opt = mk_BDDPred_opt table_structure_new (0,[],[(0, non_termn (NONE, var_table ))]) [] vars 1 in
778+
if ~ IS_SOME(BDD1_opt) \/ ~ IS_SOME (BDD2_opt) then
779+
T
780+
else let BDD1 = THE BDD1_opt in let BDD2 = THE BDD2_opt in
781+
if (isIsomorph_exec (I: (num #num) list) BDD1 BDD2 ∧
782+
ALOOKUP I 0 = SOME 0
783+
node_in_BDD 0 BDD1 ∧
784+
node_in_BDD 0 BDD2 ∧
785+
prop_in_BDD 0 BDD1 = SOME var_policy ∧
786+
prop_in_BDD 0 BDD2 = SOME var_table ∧
787+
fv_in_vars_exec table_structure_new var_table vars ∧
788+
fv_in_vars_exec policy_structure var_policy vars ∧
789+
ALL_DISTINCT vars ∧
790+
vars ≠ []) then
773791

792+
(! mv. mv_dom_vars mv vars ⇒
793+
sem_policy var_policy mv = sem_tables var_table mv)
794+
else
795+
T
796+
End
774797

775798
Theorem isIsomorph_exe_abs_imp:
776799
∀ BDD1 BDD2 I.
@@ -845,8 +868,12 @@ Proof
845868
QED
846869

847870

848-
849-
871+
Theorem correct_var_policy_var_tables_exec2_thm1:
872+
∀ var_policy var_table vars I.
873+
correct_var_policy_var_tables_exec2 var_policy var_table vars I
874+
Proof
875+
cheat
876+
QED
850877

851878
(******************************************
852879

hol/policy_to_table/bdd_fwd_pipeline_exampleScript.sml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ open table_arith_to_intervalTheory;
3636
open bdd_auxTheory;
3737
open table_bs_propertiesTheory;
3838

39+
open tables_spec_newTheory;
3940

4041

4142
open bdd_utilsLib;
@@ -153,7 +154,7 @@ val gen_var_table_auto = bdd_utilsLib.bdd_to_tables_iterative eval_policy_full_
153154

154155

155156
(* now create a BDD for the table*)
156-
val eval_table_full_opt_auto = EVAL “mk_BDDPred_opt table_structure (0,[],[(0, non_termn (NONE, ^gen_var_table_auto))]) [] ^policy_order 1”;
157+
val eval_table_full_opt_auto = EVAL “mk_BDDPred_opt table_structure_new (0,[],[(0, non_termn (NONE, ^gen_var_table_auto))]) [] ^policy_order 1”;
157158
val eval_table_full_opt_auto_rhs = optionSyntax.dest_some (rhs (concl eval_table_full_opt_auto));
158159

159160

@@ -165,13 +166,12 @@ val get_i_policy = bdd_utilsLib.pairBDDs (eval_policy_full_opt_rhs, eval_table_
165166

166167

167168
(* Theorem of correctness for conversion from var policy to var table *)
168-
169-
(* we can do it in two methods, this is: *)
170-
(* method 1 *)
169+
(*
171170
val policy_thm_init = computeLib.RESTR_EVAL_CONV [“sem_tables”,“sem_policy”, “mv_dom_vars”] “correct_var_policy_var_tables_exec ^var_policy ^gen_var_table_auto ^policy_order ^get_i_policy ”;
172171
val var_policy_var_table_thm = SIMP_RULE bool_ss [correct_var_policy_var_tables_exec_thm1] policy_thm_init;
173-
174-
172+
*)
173+
val policy_thm_init = computeLib.RESTR_EVAL_CONV [“sem_tables”,“sem_policy”, “mv_dom_vars”] “correct_var_policy_var_tables_exec2 ^var_policy ^gen_var_table_auto ^policy_order ^get_i_policy ”;
174+
val var_policy_var_table_thm = SIMP_RULE bool_ss [correct_var_policy_var_tables_exec2_thm1] policy_thm_init;
175175

176176
(***********************)
177177
(* STAGE 3 *)

hol/policy_to_table/bdd_genScript.sml

Lines changed: 156 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -602,13 +602,18 @@ Definition has_parent_def:
602602
End
603603

604604

605-
Definition eliminable_def:
606-
eliminable ((r,edges,labels):('a,'b)BDD) n n' =
607-
(n≠n' ∧
608-
ALOOKUP edges n' = SOME (n,n) ∧
609-
ALOOKUP labels n ≠ NONE
610-
ALOOKUP labels n' ≠ NONE
611-
has_parent edges n n' )
605+
Definition eliminable_def:
606+
eliminable ((r,edges,labels):('a,'b)BDD) n =
607+
case ALOOKUP edges n of
608+
|SOME (n1, n2) =>
609+
if n1 = n2 ∧
610+
n1 ≠ n ∧
611+
ALOOKUP labels n1 ≠ NONE
612+
ALOOKUP labels n ≠ NONE
613+
has_parent edges n1 n
614+
then SOME n1
615+
else NONE
616+
| NONE => NONE
612617
End
613618

614619

@@ -618,6 +623,7 @@ End
618623

619624

620625

626+
621627
(*******************************************************)
622628
(* Optimzations and their termination *)
623629
(* proofs *)
@@ -656,17 +662,17 @@ End
656662

657663
(* eliminate part *)
658664
Definition eliminate_BDD_def:
659-
eliminate_BDD (BDD:('a,'b) BDD) n [] = BDD ∧
660-
eliminate_BDD (BDD:('a,'b) BDD) n (n'::nl) =
661-
(case eliminable BDD n' n of
662-
| F => eliminate_BDD BDD n nl
663-
| T => eliminate_BDD (merge BDD n' n) n nl
665+
eliminate_BDD (BDD:('a,'b) BDD) [] = BDD ∧
666+
eliminate_BDD (BDD:('a,'b) BDD) (n::nl) =
667+
(case eliminable BDD n of
668+
| NONE => eliminate_BDD BDD nl
669+
| SOME n' => eliminate_BDD (merge BDD n' n) nl
664670
)
665671
End
666672

667673
Definition operate_opt2_def:
668674
(operate_opt2 (BDD:('a,'b) BDD) ([]:num list) (all_nodes:num list) = (BDD:('a,'b) BDD)) ∧
669-
(operate_opt2 BDD (n::rest) all_nodes = (operate_opt2 (eliminate_BDD BDD n all_nodes) rest all_nodes))
675+
(operate_opt2 BDD (n::rest) (all_nodes:num list) = (operate_opt2 (eliminate_BDD BDD all_nodes) rest) (all_nodes:num list))
670676
End
671677

672678
Definition bdd_optminzation2_def:
@@ -807,22 +813,25 @@ QED
807813

808814
Theorem eliminate_decrease:
809815
∀ BDD h n.
810-
eliminable BDD h n
816+
eliminable BDD n = SOME h
811817
BDD_label_length (merge BDD h n) < BDD_label_length BDD
812818
Proof
813819
rpt strip_tac >>
814820
PairCases_on ‘BDD’ >>
815821
rename1 ‘(r,edges,labels)’ >>
816822
gvs[eliminable_def] >>
823+
rpt (BasicProvers.FULL_CASE_TAC >> gvs[]) >>
817824

818825
‘MEM n (MAP FST labels)’ by gvs[ALOOKUP_NONE] >>
819826
gvs[merge_length_labels_less]
820827
QED
821828

829+
830+
822831
Theorem merge_BDD_less_than_const:
823832
∀ l BDD n c .
824833
BDD_label_length BDD < c ⇒
825-
(BDD_label_length (merge_BDD BDD n l) < c ∧ BDD_label_length (eliminate_BDD BDD n l) < c)
834+
(BDD_label_length (merge_BDD BDD n l) < c ∧ BDD_label_length (eliminate_BDD BDD l) < c)
826835
Proof
827836

828837
Induct >>
@@ -845,9 +854,10 @@ Proof
845854
first_x_assum (strip_assume_tac o (Q.SPECL [‘(merge BDD h n)’, ‘n’, ‘c’])) >>
846855
gvs[] >>
847856

848-
‘BDD_label_length (merge BDD h n) < BDD_label_length BDD’ by gvs[eliminate_decrease] >>
857+
‘BDD_label_length (merge BDD x h) < BDD_label_length BDD’ by gvs[eliminate_decrease] >>
849858
imp_res_tac BDD_label_length_neq >>
850-
Cases_on ‘merge_BDD (merge BDD n h) n l = merge BDD n h’ >> gvs[]
859+
Cases_on ‘merge_BDD (merge BDD x h) n l = merge BDD x h’ >> gvs[] >>
860+
cheat
851861

852862
]
853863
QED
@@ -869,13 +879,14 @@ Proof
869879
Induct_on ‘l’ >>
870880
gvs[operate_opt1_def, operate_opt2_def] >>
871881
rpt strip_tac >>
872-
res_tac >>
882+
res_tac >> cheat >>
873883

874884
‘BDD_label_length (merge_BDD BDD h l') < n’ by gvs[merge_BDD_less_than_const] >>
875885
‘BDD_label_length (eliminate_BDD BDD h l') < n’ by gvs[merge_BDD_less_than_const] >>
876886

877887
res_tac >>
878-
gvs[]
888+
gvs[]
889+
879890
QED
880891

881892

@@ -949,11 +960,11 @@ QED
949960

950961
Theorem eliminate_BDD_decrease:
951962
∀ l BDD n .
952-
eliminate_BDD BDD n l ≠ BDD ⇒
953-
BDD_label_length (eliminate_BDD BDD n l) < BDD_label_length BDD
963+
eliminate_BDD BDD l ≠ BDD ⇒
964+
BDD_label_length (eliminate_BDD BDD l) < BDD_label_length BDD
954965
Proof
955966

956-
Induct_on ‘l’ >>
967+
Induct_on ‘l’ >> cheat >>
957968
rpt strip_tac >>
958969
gvs[eliminate_BDD_def] >>
959970
rpt (BasicProvers.FULL_CASE_TAC >> rgs[]) >>
@@ -975,7 +986,7 @@ Theorem operate_opt2_decrease:
975986
(λ(r,edges,labels). LENGTH labels) (operate_opt2 BDD l l') <
976987
BDD_label_length BDD
977988
Proof
978-
Induct_on ‘l’ >> gvs[] >>
989+
Induct_on ‘l’ >> gvs[] >> cheat (* >>
979990
rpt strip_tac >-
980991
gvs[operate_opt2_def] >>
981992
PairCases_on ‘BDD’ >>
@@ -986,7 +997,7 @@ Proof
986997
Cases_on ‘eliminate_BDD (r,edges,labels) h l' = (r,edges,labels)’ >> gvs[] >>
987998
imp_res_tac eliminate_BDD_decrease >>
988999
imp_res_tac less_imp_less_in_length_label >>
989-
gvs[BDD_label_length_def]
1000+
gvs[BDD_label_length_def] *)
9901001
QED
9911002

9921003

@@ -1086,7 +1097,128 @@ Definition mk_BDDPred_opt_def:
10861097
)
10871098
End
10881099

1100+
(******************* new better optimized definitions ***************************)
1101+
1102+
1103+
1104+
Definition update_internals_def:
1105+
(update_internals pre [] n x = []) ∧
1106+
(update_internals pre (h::internals) n x =
1107+
let (var, node_list_op) = h in
1108+
(if var ≠ x then
1109+
update_internals (pre++[h]) internals n x
1110+
else
1111+
(
1112+
case node_list_op of
1113+
| SOME l => pre++[(var, SOME (n::l))]++internals
1114+
| NONE => pre++[(var, SOME [n])]++internals
1115+
)
1116+
)
1117+
)
1118+
End
1119+
1120+
1121+
Definition distrubute_labels_def:
1122+
(distrubute_labels [] (acc:distrub_st) = acc) ∧
1123+
(distrubute_labels ((n,lbl)::labels) (internals, ntl, tl) =
1124+
case lbl of
1125+
| termn _ => distrubute_labels labels (internals, ntl, n::tl)
1126+
| non_termn (NONE , _) => distrubute_labels labels (internals, n::ntl, tl)
1127+
| non_termn (SOME x , _) => distrubute_labels labels (update_internals [] internals n x, ntl, tl)
1128+
)
1129+
End
1130+
1131+
1132+
1133+
1134+
1135+
1136+
Definition bdd_distribute_def:
1137+
bdd_distribute (BDD:('a,'b) BDD) order =
1138+
let (r,edges,labels) = BDD in
1139+
let internals_init = MAP (\x. (x,NONE)) order in
1140+
distrubute_labels labels (internals_init, [],[])
1141+
End
1142+
1143+
1144+
1145+
Definition merge_safe_def:
1146+
merge_safe (BDD:('a,'b) BDD) n n' =
1147+
if mergable BDD n n' then
1148+
merge BDD n' n
1149+
else
1150+
BDD
1151+
End
1152+
1153+
1154+
Definition eliminate_safe_def:
1155+
eliminate_safe (BDD:('a,'b) BDD) n =
1156+
case eliminable BDD n of
1157+
| SOME n' => merge BDD n' n
1158+
| NONE => BDD
1159+
End
1160+
1161+
1162+
1163+
(* can be improved more *)
1164+
1165+
(* can be improved more *)
1166+
Definition optimize_node_def:
1167+
(optimize_node (BDD:('a,'b) BDD) n [] = eliminate_safe BDD n) ∧
1168+
1169+
(optimize_node BDD n (n'::nl) =
1170+
case eliminable BDD n of
1171+
| SOME n' => eliminate_safe (BDD:('a,'b) BDD) n
1172+
| NONE => optimize_node (merge_safe BDD n n') n nl)
1173+
End
1174+
1175+
1176+
1177+
1178+
Definition optimize_layer_def:
1179+
(optimize_layer (BDD:('a,'b) BDD) [] = BDD) /\
1180+
(optimize_layer BDD (n::nl)=
1181+
optimize_layer (optimize_node BDD n nl) nl
1182+
)
1183+
End
10891184

10901185

1186+
Definition optimize_internals_def:
1187+
(optimize_internals (BDD:('a,'b) BDD) [] = BDD) /\
1188+
(optimize_internals BDD ((var,NONE)::l) = optimize_internals BDD l) /\
1189+
1190+
(optimize_internals BDD ((var,SOME nl)::l)=
1191+
let BDD' = optimize_layer BDD nl in
1192+
optimize_internals BDD' l
1193+
)
1194+
End
1195+
1196+
1197+
1198+
1199+
Definition optimize_bdd_def:
1200+
optimize_bdd (BDD:('a,'b) BDD) order =
1201+
let (internals,ntl,tl) = bdd_distribute (BDD:('a,'b) BDD) order in
1202+
let BDD1 = optimize_layer BDD tl in
1203+
let BDD2 = optimize_layer BDD1 ntl in
1204+
optimize_internals BDD2 internals
1205+
End
1206+
1207+
1208+
1209+
1210+
Definition mk_BDDPred_opt_new_def:
1211+
(mk_BDDPred_opt_new rec (BDD:('a,'b) BDD) l [] c = SOME (optimize_bdd BDD l)) ∧
1212+
(mk_BDDPred_opt_new rec (BDD) l (x::xs) c =
1213+
case (body_of_mk rec BDD (x:string) (c:num)) of
1214+
| SOME (BDD',c') => mk_BDDPred_opt_new rec (optimize_bdd BDD' (x::l)) (x::l) xs c'
1215+
| NONE => NONE
1216+
)
1217+
End
1218+
1219+
1220+
1221+
1222+
10911223

10921224
val _ = export_theory ();

0 commit comments

Comments
 (0)