@@ -112,8 +112,10 @@ type memo_tables = {
112112 boolean_mvbdu_extensional_description_of_range_list :
113113 (int * (int option * int option )) list Hash_1 .t ;
114114 boolean_mvbdu_variables_of_mvbdu : unit List_sig .list Hash_1 .t ;
115- boolean_mvbdu_extensional_description_of_mvbdu : (int * int ) list list Hash_1 .t ;
116- boolean_mvbdu_extensional_description_of_mvbdu_with_threshold : ((int * int ) list * bool Mvbdu_sig .mvbdu ) list Hash_2 .t ;
115+ boolean_mvbdu_extensional_description_of_mvbdu :
116+ (int * int ) list list Hash_1 .t ;
117+ boolean_mvbdu_extensional_description_of_mvbdu_with_threshold :
118+ ((int * int ) list * bool Mvbdu_sig .mvbdu ) list Hash_2 .t ;
117119}
118120
119121type mvbdu_dic =
@@ -340,8 +342,8 @@ let init_data parameters error =
340342 Hash_1. create parameters error 0
341343 in
342344 let error, mvbdu_extensional_description_of_mvbdu_with_threshold =
343- Hash_2. create parameters error (0 ,0 )
344- in
345+ Hash_2. create parameters error (0 , 0 )
346+ in
345347 let error, mvbdu_rename = Hash_2. create parameters error (0 , 0 ) in
346348 ( error,
347349 {
380382 boolean_mvbdu_variables_of_mvbdu = mvbdu_variables_of;
381383 boolean_mvbdu_extensional_description_of_mvbdu =
382384 mvbdu_extensional_description_of_mvbdu;
383- boolean_mvbdu_extensional_description_of_mvbdu_with_threshold =
384- mvbdu_extensional_description_of_mvbdu_with_threshold
385+ boolean_mvbdu_extensional_description_of_mvbdu_with_threshold =
386+ mvbdu_extensional_description_of_mvbdu_with_threshold;
385387 } )
386388
387389let init_remanent parameters error =
@@ -1399,80 +1401,90 @@ let rec extensional_description_of_mvbdu parameters handler error mvbdu =
13991401 },
14001402 output ) )
14011403
1402-
1403- let extensional_description_of_mvbdu_with_threshold parameters handler error ~threshold mvbdu =
1404- let error, (handler, bdd_true) = boolean_mvbdu_true parameters handler error parameters in
1405- match bdd_true with
1406- Some bdd_true ->
1407- begin
1404+ let extensional_description_of_mvbdu_with_threshold parameters handler error
1405+ ~threshold mvbdu =
1406+ let error, (handler, bdd_true) =
1407+ boolean_mvbdu_true parameters handler error parameters
1408+ in
1409+ match bdd_true with
1410+ | Some bdd_true ->
14081411 let rec aux1 parameters handler error ~threshold mvbdu =
1409- match
1410- Hash_2. unsafe_get parameters error (threshold,mvbdu.Mvbdu_sig. id)
1411- handler.Memo_sig. data.boolean_mvbdu_extensional_description_of_mvbdu_with_threshold
1412- with
1413- | error , Some output -> error, (handler, output)
1414- | error , None ->
1415- let rec aux2 mvbdu remanent handler error output =
1416- match mvbdu.Mvbdu_sig. value with
1417- | Mvbdu_sig. Leaf true -> error, (handler, ([] ,bdd_true) :: output)
1418- | Mvbdu_sig. Leaf false -> error, (handler, output)
1419- | Mvbdu_sig. Node a ->
1420- let id = a.Mvbdu_sig. variable in
1421- if id < = threshold
1422- then (* Recursion *)
1423- let error, (handler, branch_true) =
1424- aux1 parameters handler error ~threshold a.Mvbdu_sig. branch_true
1425- in
1426- let upper_bound = a.Mvbdu_sig. upper_bound in
1427- let error, (handler, output) =
1428- match remanent, branch_true with
1429- | _ , [] -> error, (handler, output)
1430- | None , _ -> Exception. warn parameters error __POS__ Exit (handler, [] )
1431- | Some (var , lower_bound ), list ->
1432- let head_list =
1433- let rec aux3 k res =
1434- if k < = lower_bound then
1435- res
1436- else
1437- aux3 (k - 1 ) (k :: res)
1438- in
1439- aux3 upper_bound []
1440- in
1441- let output =
1442- List. fold_left
1443- (fun output head ->
1444- List. fold_left
1445- (fun output (tail ,b ) -> ((var, head) :: tail,b) :: output)
1446- output list )
1447- output head_list
1412+ match
1413+ Hash_2. unsafe_get parameters error
1414+ (threshold, mvbdu.Mvbdu_sig. id)
1415+ handler.Memo_sig. data
1416+ .boolean_mvbdu_extensional_description_of_mvbdu_with_threshold
1417+ with
1418+ | error , Some output -> error, (handler, output)
1419+ | error , None ->
1420+ let rec aux2 mvbdu remanent handler error output =
1421+ match mvbdu.Mvbdu_sig. value with
1422+ | Mvbdu_sig. Leaf true -> error, (handler, ([] , bdd_true) :: output)
1423+ | Mvbdu_sig. Leaf false -> error, (handler, output)
1424+ | Mvbdu_sig. Node a ->
1425+ let id = a.Mvbdu_sig. variable in
1426+ if id < = threshold then (
1427+ (* Recursion *)
1428+ let error, (handler, branch_true) =
1429+ aux1 parameters handler error ~threshold a.Mvbdu_sig. branch_true
1430+ in
1431+ let upper_bound = a.Mvbdu_sig. upper_bound in
1432+ let error, (handler, output) =
1433+ match remanent, branch_true with
1434+ | _ , [] -> error, (handler, output)
1435+ | None , _ ->
1436+ Exception. warn parameters error __POS__ Exit (handler, [] )
1437+ | Some (var , lower_bound ), list ->
1438+ let head_list =
1439+ let rec aux3 k res =
1440+ if k < = lower_bound then
1441+ res
1442+ else
1443+ aux3 (k - 1 ) (k :: res)
14481444 in
1449- error, (handler, output)
1450- in
1451- aux2 a.Mvbdu_sig. branch_false
1452- (Some (a.Mvbdu_sig. variable, upper_bound))
1453- handler error output
1454- else (* threshold crossed, convert in bdd *)
1455- (* let error, (handler, bdd) = memo_identity parameters handler error parameters a in*)
1456- error, (handler, ([] ,mvbdu) :: output)
1457- in
1458- let error, (handler, output) = aux2 mvbdu None handler error [] in
1459- let error, memo =
1460- Hash_2. set parameters error (threshold,mvbdu.Mvbdu_sig. id) output
1461- handler.Memo_sig. data.boolean_mvbdu_extensional_description_of_mvbdu_with_threshold
1462- in
1463- ( error,
1464- ( {
1465- handler with
1466- Memo_sig. data =
1467- {
1468- handler.Memo_sig. data with
1469- boolean_mvbdu_extensional_description_of_mvbdu_with_threshold = memo;
1470- };
1471- },
1472- output ) )
1473- in aux1 parameters handler error ~threshold mvbdu
1474- end
1475- | None -> error, (handler,[] )
1445+ aux3 upper_bound []
1446+ in
1447+ let output =
1448+ List. fold_left
1449+ (fun output head ->
1450+ List. fold_left
1451+ (fun output (tail , b ) ->
1452+ ((var, head) :: tail, b) :: output)
1453+ output list )
1454+ output head_list
1455+ in
1456+ error, (handler, output)
1457+ in
1458+ aux2 a.Mvbdu_sig. branch_false
1459+ (Some (a.Mvbdu_sig. variable, upper_bound))
1460+ handler error output
1461+ ) else
1462+ (* threshold crossed, convert in bdd *)
1463+ (* let error, (handler, bdd) = memo_identity parameters handler error parameters a in*)
1464+ error, (handler, ([] , mvbdu) :: output)
1465+ in
1466+ let error, (handler, output) = aux2 mvbdu None handler error [] in
1467+ let error, memo =
1468+ Hash_2. set parameters error
1469+ (threshold, mvbdu.Mvbdu_sig. id)
1470+ output
1471+ handler.Memo_sig. data
1472+ .boolean_mvbdu_extensional_description_of_mvbdu_with_threshold
1473+ in
1474+ ( error,
1475+ ( {
1476+ handler with
1477+ Memo_sig. data =
1478+ {
1479+ handler.Memo_sig. data with
1480+ boolean_mvbdu_extensional_description_of_mvbdu_with_threshold =
1481+ memo;
1482+ };
1483+ },
1484+ output ) )
1485+ in
1486+ aux1 parameters handler error ~threshold mvbdu
1487+ | None -> error, (handler, [] )
14761488
14771489let print_boolean_mvbdu parameters
14781490 (error : Exception.exceptions_caught_and_uncaught ) =
0 commit comments