From 669b6cd31f5afa02b2d25555a4f1fc02701a777a Mon Sep 17 00:00:00 2001
From: Michele Alberti <michele.alberti@cea.fr>
Date: Mon, 17 Apr 2023 13:55:23 +0200
Subject: [PATCH] [verification] Early goal split before applying
 transformations.

---
 src/verification.ml            |  39 ++++++----
 tests/interpretation_acasxu.t  | 137 +--------------------------------
 tests/interpretation_dataset.t | 109 +-------------------------
 3 files changed, 27 insertions(+), 258 deletions(-)

diff --git a/src/verification.ml b/src/verification.ml
index 4e60bf6..9a52272 100644
--- a/src/verification.ml
+++ b/src/verification.ml
@@ -224,24 +224,29 @@ let answer_dataset limit config env prover config_prover driver dataset task =
   (prover_answer, additional_info)
 
 let answer_generic limit config prover config_prover driver task =
-  let task = Driver.prepare_task driver task in
-  let nn_file =
-    match Task.on_meta_excl Utils.meta_nn_filename task with
-    | Some [ MAstr nn_file ] -> Unix.realpath nn_file
-    | Some _ -> assert false (* By construction of the meta. *)
-    | None -> invalid_arg "No neural network model found in task"
-  in
-  let tasks =
-    (* We turn [task] into a list (ie, conjunction) of disjunctions of tasks. *)
-    match prover with
-    | Prover.Marabou -> Trans.apply Split.split_all task
-    | Pyrat | Nnenum -> Trans.apply Split.split_premises task
-    | _ -> [ task ]
-  in
-  let command = Whyconf.get_complete_command ~with_steps:false config_prover in
-  let command = Re__Core.replace_string nnet_or_onnx ~by:nn_file command in
+  let tasks = Trans.apply Split_goal.split_goal_full task in
   let answers =
-    List.map tasks ~f:(call_prover_on_task limit config command driver)
+    List.concat_map tasks ~f:(fun task ->
+      let task = Driver.prepare_task driver task in
+      let nn_file =
+        match Task.on_meta_excl Utils.meta_nn_filename task with
+        | Some [ MAstr nn_file ] -> Unix.realpath nn_file
+        | Some _ -> assert false (* By construction of the meta. *)
+        | None -> invalid_arg "No neural network model found in task"
+      in
+      let tasks =
+        (* Turn [task] into a list (ie, conjunction) of disjunctions of
+           tasks. *)
+        match prover with
+        | Prover.Marabou -> Trans.apply Split.split_all task
+        | Pyrat | Nnenum -> Trans.apply Split.split_premises task
+        | _ -> [ task ]
+      in
+      let command =
+        Whyconf.get_complete_command ~with_steps:false config_prover
+      in
+      let command = Re__Core.replace_string nnet_or_onnx ~by:nn_file command in
+      List.map tasks ~f:(call_prover_on_task limit config command driver))
   in
   let prover_answer = combine_prover_answers answers in
   let additional_info = Generic None in
diff --git a/tests/interpretation_acasxu.t b/tests/interpretation_acasxu.t
index 074f1d1..fb7b297 100644
--- a/tests/interpretation_acasxu.t
+++ b/tests/interpretation_acasxu.t
@@ -87,137 +87,6 @@ Test interpret on acasxu
   >       not (advises classifier i clear_of_conflict)
   > end
   > EOF
-  P1 : forall caisar_v:t, caisar_v1:t, caisar_v2:t, caisar_v3:t, caisar_v4:t.
-        ((le (0.0:t) (add RNE (mul RNE caisar_v (60261.0:t)) (19791.0:t)) /\
-          le (add RNE (mul RNE caisar_v (60261.0:t)) (19791.0:t)) (60760.0:t)) /\
-         (le (neg (3.141592999999999857863031138549558818340301513671875:t))
-          (add RNE
-           (mul RNE caisar_v1
-            (6.2831853071800001231395071954466402530670166015625:t))
-           (0.0:t)) /\
-          le
-          (add RNE
-           (mul RNE caisar_v1
-            (6.2831853071800001231395071954466402530670166015625:t))
-           (0.0:t))
-          (3.141592999999999857863031138549558818340301513671875:t)) /\
-         (le (neg (3.141592999999999857863031138549558818340301513671875:t))
-          (add RNE
-           (mul RNE caisar_v2
-            (6.2831853071800001231395071954466402530670166015625:t))
-           (0.0:t)) /\
-          le
-          (add RNE
-           (mul RNE caisar_v2
-            (6.2831853071800001231395071954466402530670166015625:t))
-           (0.0:t))
-          (3.141592999999999857863031138549558818340301513671875:t)) /\
-         (le (100.0:t) (add RNE (mul RNE caisar_v3 (1100.0:t)) (650.0:t)) /\
-          le (add RNE (mul RNE caisar_v3 (1100.0:t)) (650.0:t)) (1200.0:t)) /\
-         le (0.0:t) (add RNE (mul RNE caisar_v4 (1200.0:t)) (600.0:t)) /\
-         le (add RNE (mul RNE caisar_v4 (1200.0:t)) (600.0:t)) (1200.0:t)) /\
-        le (55947.6909999999988940544426441192626953125:t)
-        (add RNE (mul RNE caisar_v (60261.0:t)) (19791.0:t)) /\
-        le (1145.0:t) (add RNE (mul RNE caisar_v3 (1100.0:t)) (650.0:t)) /\
-        le (add RNE (mul RNE caisar_v4 (1200.0:t)) (600.0:t)) (60.0:t) ->
-        le
-        (add RNE
-         (mul RNE
-          (nnet_classifier
-           %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-          [0] (373.9499200000000200816430151462554931640625:t))
-         (7.51888402010059753166615337249822914600372314453125:t))
-        (1500.0:t)
-  nnet_classifier,
-  (Interpretation.Classifier
-     NNet: { Language.nn_inputs = 5; nn_outputs = 5; nn_ty_elt = t;
-             nn_filename =
-             "$TESTCASE_ROOT/TestNetwork.nnet";
-             nn_nier = <opaque> })
-  vector,
-  (Interpretation.Vector 5)
-  P2 : forall caisar_v:t, caisar_v1:t, caisar_v2:t, caisar_v3:t, caisar_v4:t.
-        ((le (0.0:t) (add RNE (mul RNE caisar_v (60261.0:t)) (19791.0:t)) /\
-          le (add RNE (mul RNE caisar_v (60261.0:t)) (19791.0:t)) (60760.0:t)) /\
-         (le (neg (3.141592999999999857863031138549558818340301513671875:t))
-          (add RNE
-           (mul RNE caisar_v1
-            (6.2831853071800001231395071954466402530670166015625:t))
-           (0.0:t)) /\
-          le
-          (add RNE
-           (mul RNE caisar_v1
-            (6.2831853071800001231395071954466402530670166015625:t))
-           (0.0:t))
-          (3.141592999999999857863031138549558818340301513671875:t)) /\
-         (le (neg (3.141592999999999857863031138549558818340301513671875:t))
-          (add RNE
-           (mul RNE caisar_v2
-            (6.2831853071800001231395071954466402530670166015625:t))
-           (0.0:t)) /\
-          le
-          (add RNE
-           (mul RNE caisar_v2
-            (6.2831853071800001231395071954466402530670166015625:t))
-           (0.0:t))
-          (3.141592999999999857863031138549558818340301513671875:t)) /\
-         (le (100.0:t) (add RNE (mul RNE caisar_v3 (1100.0:t)) (650.0:t)) /\
-          le (add RNE (mul RNE caisar_v3 (1100.0:t)) (650.0:t)) (1200.0:t)) /\
-         le (0.0:t) (add RNE (mul RNE caisar_v4 (1200.0:t)) (600.0:t)) /\
-         le (add RNE (mul RNE caisar_v4 (1200.0:t)) (600.0:t)) (1200.0:t)) /\
-        ((le (1500.0:t) (add RNE (mul RNE caisar_v (60261.0:t)) (19791.0:t)) /\
-          le (add RNE (mul RNE caisar_v (60261.0:t)) (19791.0:t)) (1800.0:t)) /\
-         le (neg (0.059999999999999997779553950749686919152736663818359375:t))
-         (add RNE
-          (mul RNE caisar_v1
-           (6.2831853071800001231395071954466402530670166015625:t))
-          (0.0:t)) /\
-         le
-         (add RNE
-          (mul RNE caisar_v1
-           (6.2831853071800001231395071954466402530670166015625:t))
-          (0.0:t))
-         (0.059999999999999997779553950749686919152736663818359375:t)) /\
-        le (3.100000000000000088817841970012523233890533447265625:t)
-        (add RNE
-         (mul RNE caisar_v2
-          (6.2831853071800001231395071954466402530670166015625:t))
-         (0.0:t)) /\
-        le (900.0:t) (add RNE (mul RNE caisar_v3 (1100.0:t)) (650.0:t)) /\
-        le (960.0:t) (add RNE (mul RNE caisar_v4 (1200.0:t)) (600.0:t)) ->
-        not (((lt
-               (nnet_classifier
-                %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-               [0]
-               (nnet_classifier
-                %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-               [1] /\
-               lt
-               (nnet_classifier
-                %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-               [0]
-               (nnet_classifier
-                %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-               [2]) /\
-              lt
-              (nnet_classifier
-               %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-              [0]
-              (nnet_classifier
-               %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-              [3]) /\
-             lt
-             (nnet_classifier
-              %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-             [0]
-             (nnet_classifier
-              %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-             [4])
-  nnet_classifier,
-  (Interpretation.Classifier
-     NNet: { Language.nn_inputs = 5; nn_outputs = 5; nn_ty_elt = t;
-             nn_filename =
-             "$TESTCASE_ROOT/TestNetwork.nnet";
-             nn_nier = <opaque> })
-  vector,
-  (Interpretation.Vector 5)
+  [caisar][ERROR]  This expression isn't supported:
+                     not (((lt y y1 /\ lt y y2) /\ lt y y3) /\ lt y y4)
+                   PyRAT: not a base term
diff --git a/tests/interpretation_dataset.t b/tests/interpretation_dataset.t
index f1d9598..bd1b86e 100644
--- a/tests/interpretation_dataset.t
+++ b/tests/interpretation_dataset.t
@@ -4,7 +4,7 @@ Test interpret on dataset
   > 0,1.0,0.0,0.019607843,0.776470588,0.784313725
   > EOF
 
-  $ caisar verify -L . --format whyml --prover Marabou -vv - 2>&1 <<EOF | ./filter_tmpdir.sh
+  $ caisar verify -L . --format whyml --prover Marabou - 2>&1 <<EOF | ./filter_tmpdir.sh
   > theory T
   >   use ieee_float.Float64
   >   use bool.Bool
@@ -46,109 +46,4 @@ Test interpret on dataset
   >     robust classifier dataset eps
   > end
   > EOF
-  G : (forall caisar_v:t, caisar_v1:t, caisar_v2:t, caisar_v3:t, caisar_v4:t.
-        ((((le (0.0:t) caisar_v /\ le caisar_v (1.0:t)) /\
-           le (0.0:t) caisar_v1 /\ le caisar_v1 (1.0:t)) /\
-          le (0.0:t) caisar_v2 /\ le caisar_v2 (1.0:t)) /\
-         le (0.0:t) caisar_v3 /\ le caisar_v3 (1.0:t)) /\
-        le (0.0:t) caisar_v4 /\ le caisar_v4 (1.0:t) ->
-        ((((le (neg (0.375:t)) (sub RNE caisar_v (0.0:t)) /\
-            le (sub RNE caisar_v (0.0:t)) (0.375:t)) /\
-           le (neg (0.375:t)) (sub RNE caisar_v1 (1.0:t)) /\
-           le (sub RNE caisar_v1 (1.0:t)) (0.375:t)) /\
-          le (neg (0.375:t))
-          (sub RNE caisar_v2
-           (0.78431372499999996161790249971090815961360931396484375:t)) /\
-          le
-          (sub RNE caisar_v2
-           (0.78431372499999996161790249971090815961360931396484375:t))
-          (0.375:t)) /\
-         le (neg (0.375:t))
-         (sub RNE caisar_v3
-          (0.01960784299999999980013143385804141871631145477294921875:t)) /\
-         le
-         (sub RNE caisar_v3
-          (0.01960784299999999980013143385804141871631145477294921875:t))
-         (0.375:t)) /\
-        le (neg (0.375:t))
-        (sub RNE caisar_v4
-         (0.776470588000000017103729987866245210170745849609375:t)) /\
-        le
-        (sub RNE caisar_v4
-         (0.776470588000000017103729987866245210170745849609375:t))
-        (0.375:t) ->
-        lt
-        (nnet_classifier
-         %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-        [0]
-        (nnet_classifier
-         %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-        [1] /\
-        lt
-        (nnet_classifier
-         %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-        [2]
-        (nnet_classifier
-         %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-        [1]) /\
-      (forall caisar_v:t, caisar_v1:t, caisar_v2:t, caisar_v3:t, caisar_v4:t.
-        ((((le (0.0:t) caisar_v /\ le caisar_v (1.0:t)) /\
-           le (0.0:t) caisar_v1 /\ le caisar_v1 (1.0:t)) /\
-          le (0.0:t) caisar_v2 /\ le caisar_v2 (1.0:t)) /\
-         le (0.0:t) caisar_v3 /\ le caisar_v3 (1.0:t)) /\
-        le (0.0:t) caisar_v4 /\ le caisar_v4 (1.0:t) ->
-        ((((le (neg (0.375:t)) (sub RNE caisar_v (1.0:t)) /\
-            le (sub RNE caisar_v (1.0:t)) (0.375:t)) /\
-           le (neg (0.375:t)) (sub RNE caisar_v1 (0.0:t)) /\
-           le (sub RNE caisar_v1 (0.0:t)) (0.375:t)) /\
-          le (neg (0.375:t))
-          (sub RNE caisar_v2
-           (0.01960784299999999980013143385804141871631145477294921875:t)) /\
-          le
-          (sub RNE caisar_v2
-           (0.01960784299999999980013143385804141871631145477294921875:t))
-          (0.375:t)) /\
-         le (neg (0.375:t))
-         (sub RNE caisar_v3
-          (0.776470588000000017103729987866245210170745849609375:t)) /\
-         le
-         (sub RNE caisar_v3
-          (0.776470588000000017103729987866245210170745849609375:t))
-         (0.375:t)) /\
-        le (neg (0.375:t))
-        (sub RNE caisar_v4
-         (0.78431372499999996161790249971090815961360931396484375:t)) /\
-        le
-        (sub RNE caisar_v4
-         (0.78431372499999996161790249971090815961360931396484375:t))
-        (0.375:t) ->
-        lt
-        (nnet_classifier
-         %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-        [1]
-        (nnet_classifier
-         %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-        [0] /\
-        lt
-        (nnet_classifier
-         %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-        [2]
-        (nnet_classifier
-         %% vector caisar_v caisar_v1 caisar_v2 caisar_v3 caisar_v4)
-        [0])
-  caisar_op,
-  (Interpretation.Data
-     (Interpretation.D_csv
-        ["1.0"; "0.0"; "0.019607843"; "0.776470588"; "0.784313725"]))
-  vector, (Interpretation.Vector 5)
-  nnet_classifier,
-  (Interpretation.Classifier
-     NNet: { Language.nn_inputs = 5; nn_outputs = 5; nn_ty_elt = t;
-             nn_filename =
-             "$TESTCASE_ROOT/TestNetwork.nnet";
-             nn_nier = <opaque> })
-  caisar_op1, (Interpretation.Dataset <csv>)
-  caisar_op2,
-  (Interpretation.Data
-     (Interpretation.D_csv
-        ["0.0"; "1.0"; "0.784313725"; "0.019607843"; "0.776470588"]))
+  [caisar] Goal G: High failure
-- 
GitLab