Skip to content

Commit 211b3e8

Browse files
Alexander MazurAlexander Mazur
authored andcommitted
Replaced print debugging by tracing
1 parent faea985 commit 211b3e8

File tree

4 files changed

+29
-20
lines changed

4 files changed

+29
-20
lines changed

src/analyses/loopTermination.ml

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ module SparseVec = SparseVector (Rat)
6464
module VarSet = Set.Make(String)
6565

6666
let string_of_constraints (constraints: Invariant.t) =
67-
"CONSTRAINTS: " ^
6867
match constraints with
6968
| `Top -> "Top"
7069
| `Bot -> "Bot"
@@ -74,7 +73,7 @@ let exp_list_of_constraints (constraints : Invariant.t) =
7473
match constraints with
7574
| `Top -> []
7675
| `Bot -> failwith "Constraints are Bot"
77-
| `Lifted constraints ->
76+
| `Lifted cs ->
7877
(* Split Eq into two Le's and mirror Ge into Le *)
7978
let to_leq acc = function
8079
| BinOp (Le, _, _, _) as e -> e :: acc
@@ -83,9 +82,11 @@ let exp_list_of_constraints (constraints : Invariant.t) =
8382
| BinOp (Ne, _, _, _) -> acc
8483
| _ -> failwith "Found something else, help me" in
8584
let cs =
86-
constraints |> Invariant.Exp.process |> List.map Invariant.Exp.to_cil |> List.fold_left to_leq []
85+
cs |> Invariant.Exp.process |> List.map Invariant.Exp.to_cil |> List.fold_left to_leq []
8786
in
88-
Printf.printf "Number of constraints after conversion to Leq list: %i\n" (List.length cs);
87+
if M.tracing then
88+
(M.trace "termination" "Constraints: %s" (string_of_constraints constraints);
89+
M.trace "termination" "Number of constraints after conversion to Leq list: %i" (List.length cs));
8990
cs
9091

9192
let coeff_in_exp vname e =
@@ -137,7 +138,7 @@ let const_in_exp e =
137138
| None, Some c -> c)
138139
| _ -> failwith "This shouldn't happen"
139140

140-
let rec transposed_matrices_of_exp_list (cs : exp list) =
141+
let transposed_matrices_of_exp_list (cs : exp list) =
141142
let rec vars_from_exp acc = function
142143
| BinOp (_, e1, e2, _) -> VarSet.union (vars_from_exp acc e1) (vars_from_exp acc e2)
143144
| UnOp (_, e, _) -> vars_from_exp acc e
@@ -168,9 +169,10 @@ let termination_provable a_transposed a'_transposed b =
168169
let l1_ri = Matrix.get_row a'_transposed i
169170
|> SparseVec.to_sparse_list
170171
|> List.map (fun (idx, v) -> "x" ^ string_of_int idx, v)
171-
172172
in
173-
l1_ri |> List.map (fun (var, value) -> (Printf.sprintf "(%s * %s)" (Rat.to_string value) var)) |> String.concat " + " |> Printf.printf "l1_r%i: %s\n" i;
173+
if M.tracing then
174+
M.trace "termination" "l1_r%i = %s" i
175+
(l1_ri |> List.map (fun (var, value) -> (Printf.sprintf "(%s * %s)" (Rat.to_string value) var)) |> String.concat " + ");
174176

175177
let sim = fst @@
176178
match l1_ri with
@@ -186,7 +188,7 @@ let termination_provable a_transposed a'_transposed b =
186188
in aux (i + 1) sim
187189
in aux 0 sim
188190
in
189-
let rec ass_l1_minus_l2_atr_eq_zero sim =
191+
let ass_l1_minus_l2_atr_eq_zero sim =
190192
let rec aux i sim =
191193
if i >= Matrix.num_rows a_transposed then sim else
192194
let l1_m_l2_ri = Matrix.get_row a_transposed i
@@ -195,7 +197,9 @@ let termination_provable a_transposed a'_transposed b =
195197
map doesn't work here because we double the number of list elements *)
196198
|> List.fold_left (fun l (idx, v) -> ("x" ^ string_of_int idx, v) :: ("y" ^ string_of_int idx, Rat.mul Rat.m_one v) :: l) []
197199
in
198-
l1_m_l2_ri |> List.map (fun (var, value) -> (Printf.sprintf "(%s * %s)" (Rat.to_string value) var)) |> String.concat " + " |> Printf.printf "l1_m_l2_r%i: %s\n" i;
200+
if M.tracing then
201+
M.trace "termination" "l1_m_l2_r%i = %s" i
202+
(l1_m_l2_ri |> List.map (fun (var, value) -> (Printf.sprintf "(%s * %s)" (Rat.to_string value) var)) |> String.concat " + ");
199203

200204
let sim = fst @@
201205
match l1_m_l2_ri with
@@ -208,15 +212,17 @@ let termination_provable a_transposed a'_transposed b =
208212
in aux (i + 1) sim
209213
in aux 0 sim
210214
in
211-
let rec ass_l2_atr_plus_a'tr_eq_zero sim =
215+
let ass_l2_atr_plus_a'tr_eq_zero sim =
212216
let m = Matrix.add a_transposed a'_transposed in
213217
let rec aux i sim =
214218
if i >= Matrix.num_rows m then sim else
215219
let l2_ri = Matrix.get_row m i
216220
|> SparseVec.to_sparse_list
217221
|> List.map (fun (idx, v) -> "y" ^ string_of_int idx, v)
218222
in
219-
l2_ri |> List.map (fun (var, value) -> (Printf.sprintf "(%s * %s)" (Rat.to_string value) var)) |> String.concat " + " |> Printf.printf "l2_r%i: %s\n" i;
223+
if M.tracing then
224+
M.trace "termination" "l2_r%i = %s" i
225+
(l2_ri |> List.map (fun (var, value) -> (Printf.sprintf "(%s * %s)" (Rat.to_string value) var)) |> String.concat " + ");
220226

221227
let sim = fst @@
222228
match l2_ri with
@@ -236,7 +242,9 @@ let termination_provable a_transposed a'_transposed b =
236242
|> SparseVec.to_sparse_list
237243
|> List.map (fun (i, v) -> "y" ^ string_of_int i, v)
238244
in
239-
l2_b |> List.map (fun (var, value) -> (Printf.sprintf "(%s * %s)" (Rat.to_string value) var)) |> String.concat " + " |> Printf.printf "l2_b: %s\n";
245+
if M.tracing then
246+
M.trace "termination" "l2_b = %s"
247+
(l2_b |> List.map (fun (var, value) -> (Printf.sprintf "(%s * %s)" (Rat.to_string value) var)) |> String.concat " + ");
240248

241249
fst @@
242250
match l2_b with
@@ -370,12 +378,11 @@ struct
370378
end
371379
| None ->
372380
(*failwith "Encountered a call to __goblint_bounded with an unknown loop counter variable."*)
373-
Printf.printf "%s\n" (string_of_constraints (man.ask (Queries.Invariant Invariant.default_context)));
374381
let atr, a'tr, b = man.ask (Queries.Invariant Invariant.default_context) |> exp_list_of_constraints |> transposed_matrices_of_exp_list in
375-
if Matrix.is_empty atr then Printf.printf "nothing to see here" else
376-
let term_provable = termination_provable atr a'tr b in
377-
Printf.printf "\n%s\n%s\n%s\nTermination%s provable\n" (Matrix.show atr) (Matrix.show a'tr) (SparseVec.show b) (if term_provable then "" else " not");
378-
382+
let term_provable = termination_provable atr a'tr b in
383+
if term_provable then (M.success ~category:Termination "Loop terminates")
384+
else (M.warn ~category:Termination "The program might not terminate! (Loop analysis)")
385+
379386
end
380387
| "__goblint_bounded", _ ->
381388
failwith "__goblint_bounded call unexpected arguments"

src/cdomains/affineEquality/sparseImplementation/sparseVector.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,8 @@ module SparseVector: SparseVectorFunctor =
377377
| a, [] -> a
378378
| (ix, vx)::xs, (iy, vy)::ys when ix = iy ->
379379
let sum = A.add vx vy in
380-
if A.compare sum A.zero = 0 then aux xs ys
381-
else (ix, A.add vx vy) :: aux xs ys
380+
if sum = A.zero then aux xs ys
381+
else (ix, sum) :: aux xs ys
382382
| (ix, vx)::xs, (iy, _)::_ when ix < iy -> (ix, vx) :: aux xs b
383383
| _, y::ys -> y :: aux a ys
384384
in {entries = aux a.entries b.entries; len = a.len}

src/util/terminationPreprocessing.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ let string_of_loop_info loop_info =
2121
| If _ -> "If"
2222
| _ -> "Something else") loop_info)
2323

24+
let rec exisis_nested_loop = List.exists (fun s -> match s.skind with Loop _ -> true | _ -> false)
25+
2426
class loopCounterVisitor lc (fd : fundec) = object(self)
2527
inherit nopCilVisitor
2628

tests/regression/78-termination/55-synthesis-advantage.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// SKIP TERM PARAM: --set "ana.activated[+]" termination --set ana.activated[+] apron --enable ana.int.interval --set ana.apron.domain polyhedra
22

3-
// Termination only provable by more complex algorithm?
3+
// x is strictly monotonously decreasing, but the classical termination analysis doesn't work
44

55
#include <stdlib.h>
66

0 commit comments

Comments
 (0)