From a81dea06e2f026296df7b045a971fb9f0b287933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Mon, 15 Jul 2019 13:32:48 +0200 Subject: [PATCH] [Eva] Subdivided_evaluation takes the max number of subdivisions as argument. The maximal number of subdivisions is a new field of the context record for the forward evaluation functions, as it is also used when calling the oracle. --- src/plugins/value/engine/evaluation.ml | 19 ++++++++++++++----- .../value/engine/subdivided_evaluation.ml | 3 +-- .../value/engine/subdivided_evaluation.mli | 3 ++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/plugins/value/engine/evaluation.ml b/src/plugins/value/engine/evaluation.ml index f306a61dbef..36e832a57b6 100644 --- a/src/plugins/value/engine/evaluation.ml +++ b/src/plugins/value/engine/evaluation.ml @@ -746,6 +746,9 @@ module Make type context = { (* The abstract domain state in which the evaluation takes place. *) state: Domain.t; + (* Maximum number of subdivisions. See {!Subdivided_evaluation} for + more details. *) + subdivision: int; (* The remaining fuel: maximum number of nested oracle uses, decremented at each call to the oracle. *) remaining_fuel: int; @@ -1093,7 +1096,8 @@ module Make fun expr -> let valuation = !cache in let context = { context with remaining_fuel } in - Subdivided_Evaluation.evaluate context valuation expr + let subdivnb = context.subdivision in + Subdivided_Evaluation.evaluate context valuation ~subdivnb expr >>=: fun (valuation, value) -> cache := valuation; value @@ -1104,15 +1108,20 @@ module Make with maximal precision. *) let root_context state = let remaining_fuel = root_fuel () in - { state; remaining_fuel; oracle } + let subdivision = Value_parameters.LinearLevel.get () in + { state; subdivision; remaining_fuel; oracle } - (* Context for a fast forward evaluation with minimal precision. *) + (* Context for a fast forward evaluation with minimal precision: + no subdivisions and no call to the oracle. *) let low_context state = let remaining_fuel = no_fuel in - { state; remaining_fuel; oracle } + let subdivision = 0 in + { state; subdivision; remaining_fuel; oracle } let subdivided_forward_eval valuation state expr = - Subdivided_Evaluation.evaluate (root_context state) valuation expr + let context = root_context state in + let subdivnb = context.subdivision in + Subdivided_Evaluation.evaluate context valuation ~subdivnb expr (* ------------------------------------------------------------------------ Backward Evaluation diff --git a/src/plugins/value/engine/subdivided_evaluation.ml b/src/plugins/value/engine/subdivided_evaluation.ml index ab59086cbb7..b832e789d36 100644 --- a/src/plugins/value/engine/subdivided_evaluation.ml +++ b/src/plugins/value/engine/subdivided_evaluation.ml @@ -772,8 +772,7 @@ module Make in subdivide_subexpr vars valuation result alarms - let evaluate context valuation expr = - let subdivnb = Value_parameters.LinearLevel.get () in + let evaluate context valuation ~subdivnb expr = if subdivnb = 0 || not activated then Eva.evaluate context valuation expr else subdivide_evaluation context valuation subdivnb expr diff --git a/src/plugins/value/engine/subdivided_evaluation.mli b/src/plugins/value/engine/subdivided_evaluation.mli index 34f7836676c..25ed9703977 100644 --- a/src/plugins/value/engine/subdivided_evaluation.mli +++ b/src/plugins/value/engine/subdivided_evaluation.mli @@ -44,7 +44,8 @@ module Make : sig val evaluate: - Eva.context -> Valuation.t -> exp -> (Valuation.t * Value.t) evaluated + Eva.context -> Valuation.t -> subdivnb:int -> + exp -> (Valuation.t * Value.t) evaluated val reduce_by_enumeration: Eva.context -> Valuation.t -> exp -> bool -> Valuation.t or_bottom -- GitLab