From 8007cdabbe9203004a6eb4e0e73f6d41dab2fd2d Mon Sep 17 00:00:00 2001
From: "Gabriel B. Sant'Anna" <baiocchi.gabriel@gmail.com>
Date: Mon, 5 Apr 2021 15:57:43 +0200
Subject: [PATCH] Test multiple actions

---
 coloring/dice5_oracle.lus |  8 ++++----
 coloring/p.lus            | 11 ++++++-----
 coloring/p.ml             |  3 ++-
 coloring/state.ml         |  2 +-
 4 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/coloring/dice5_oracle.lus b/coloring/dice5_oracle.lus
index 356cc51b..f1913087 100644
--- a/coloring/dice5_oracle.lus
+++ b/coloring/dice5_oracle.lus
@@ -3,8 +3,8 @@ include "../../test/lustre/oracle_utils.lus"
 
 node oracle(
 	p0_color:int;p1_color:int;p2_color:int;p3_color:int;p4_color:int;
-	Enab_p0_recolor,Enab_p1_recolor,Enab_p2_recolor,Enab_p3_recolor,Enab_p4_recolor:bool;
-	p0_recolor,p1_recolor,p2_recolor,p3_recolor,p4_recolor:bool)
+	Enab_p0_recolor,Enab_p0_noop,Enab_p1_recolor,Enab_p1_noop,Enab_p2_recolor,Enab_p2_noop,Enab_p3_recolor,Enab_p3_noop,Enab_p4_recolor,Enab_p4_noop:bool;
+	p0_recolor,p0_noop,p1_recolor,p1_noop,p2_recolor,p2_noop,p3_recolor,p3_noop,p4_recolor,p4_noop:bool)
 returns (ok:bool);
 var
 	Acti:bool^actions_number^card;
@@ -13,8 +13,8 @@ var
 	nodes : state^card;
 	enables : bool^actions_number^card;
 let
-	Acti = [[p0_recolor],[p1_recolor],[p2_recolor],[p3_recolor],[p4_recolor]];
-	Enab = [[Enab_p0_recolor],[Enab_p1_recolor],[Enab_p2_recolor],[Enab_p3_recolor],[Enab_p4_recolor]];
+	Acti = [[p0_recolor,p0_noop],[p1_recolor,p1_noop],[p2_recolor,p2_noop],[p3_recolor,p3_noop],[p4_recolor,p4_noop]];
+	Enab = [[Enab_p0_recolor,Enab_p0_noop],[Enab_p1_recolor,Enab_p1_noop],[Enab_p2_recolor,Enab_p2_noop],[Enab_p3_recolor,Enab_p3_noop],[Enab_p4_recolor,Enab_p4_noop]];
 	Stat = [ p0_color, p1_color, p2_color, p3_color, p4_color ];
 
 	nodes, enables = dice5(pre(Acti), Stat);
diff --git a/coloring/p.lus b/coloring/p.lus
index 04c27553..7b69e1d2 100644
--- a/coloring/p.lus
+++ b/coloring/p.lus
@@ -2,13 +2,13 @@ include "bitset.lus"
 
 type state = int;
 
-type action = enum { recolor };
-const actions_number = 1;
+type action = enum { recolor, noop };
+const actions_number = 2;
 
 function action_of_int(i : int) returns (a : action);
 let
 	assert(i >= 0);
-	a = recolor;
+	a = if i = 0 then recolor else noop;
 tel;
 
 const K = max_degree + 1;
@@ -18,12 +18,13 @@ returns (enabled : bool^actions_number);
 	var conflict : bool;
 let
 	conflict = subset<<K>>(one_hot<<K>>(this), bitset_of_list<<K,degree>>(neighbors));
-	enabled = [ conflict ];
+	enabled = [ conflict, not conflict ];
 tel;
 
 function p_step<<const degree:int>>(this : state; neighbors : state^degree; action : action)
 returns (new : state);
 let
-	new = first_set<<K>>(diff<<K>>(true^K, bitset_of_list<<K,degree>>(neighbors)));
+	new = if action = noop then this
+	      else first_set<<K>>(diff<<K>>(true^K, bitset_of_list<<K,degree>>(neighbors)));
 	assert(new >= 0);
 tel;
diff --git a/coloring/p.ml b/coloring/p.ml
index 899115be..869d9bf3 100644
--- a/coloring/p.ml
+++ b/coloring/p.ml
@@ -15,9 +15,10 @@ let init_state : State.t Algo.state_init_fun = fun n _ -> Random.int n
 let enable_f : State.t Algo.enable_fun = fun state neighbors ->
 	if conflict { color = state; neighbors = List.map Algo.state neighbors }
 	then [ "recolor" ]
-	else [ ]
+	else [ "noop" ]
 
 let step_f : State.t Algo.step_fun = fun state neighbors action ->
 	match action with
 	| "recolor" -> color { color = state; neighbors = List.map Algo.state neighbors }
+	| "noop" -> state
 	| _ -> failwith "Invalid action"
diff --git a/coloring/state.ml b/coloring/state.ml
index df321ce1..42413aa1 100644
--- a/coloring/state.ml
+++ b/coloring/state.ml
@@ -2,4 +2,4 @@ type t = int
 let to_string = Printf.sprintf "color=%i"
 let of_string = None
 let copy x = x
-let actions = [ "recolor" ]
+let actions = [ "recolor"; "noop" ]
-- 
GitLab