From afa74391fa05ff1a356e78343cc220717d62d710 Mon Sep 17 00:00:00 2001 From: Leandre Lacourt <lacourtl@santel.imag.fr> Date: Wed, 26 Jun 2024 12:30:45 +0200 Subject: [PATCH] ajout de la recuperation de taches et ecriture dans le yml (fonctionnel mais pas fini) --- lib/soc2yaml.ml | 71 +++++++++++++++++++++++++++++------------ lib/socNameC.ml | 85 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 109 insertions(+), 47 deletions(-) diff --git a/lib/soc2yaml.ml b/lib/soc2yaml.ml index 9c76702..fff324d 100644 --- a/lib/soc2yaml.ml +++ b/lib/soc2yaml.ml @@ -8,13 +8,23 @@ open SocNameC let (f : Soc.key -> Soc.tbl -> string -> unit) = fun sk stbl basename -> - let main_soc = SocUtils.find (Lxm.dummy "dfsdf") sk stbl in + let main_soc = SocUtils.find (Lxm.dummy "dfsdf") sk stbl in (*recup tous les autres soc : cf socnamec*) - let nodes = SocNameC.get_nodes main_soc in - let filename = SocNameC.get_filename main_soc in + (*let nodes = SocNameC.get_nodes main_soc in*) + (*let socs = SocNameC.get_all_soc main_soc stbl in*) let variables = (SocNameC.get_inputs main_soc) @ (SocNameC.get_variables main_soc) @ (SocNameC.get_outputs main_soc) in - let instances = SocNameC.get_instances main_soc in - let yaml_file = open_out (filename ^ ".yml") in + (*let instances = SocNameC.get_instances main_soc in*) + let tasks = SocNameC.get_tasks main_soc in + let yaml_file = open_out (basename ^ ".yml") in + + (*let (socs2yaml : task_type -> unit) = fun soc -> + match soc.key with + | (k, _, _) -> let s = k ^ " \naeaea\n" in + fprintf yaml_file "%s" s + |_ -> let s = "XXXXX" in fprintf yaml_file + in + List.iter socs2yaml socs;*) + let (var2yaml : int -> string) = fun i -> let choose_var : int -> variable_type -> bool = fun i var -> i = var.id in @@ -26,15 +36,13 @@ let (f : Soc.key -> Soc.tbl -> string -> unit) = fun sk stbl basename -> s in - (* va y avoir des tâches à la place donc penser à changer pour utiliser les instances avec des tâches - PS : ident = la liste des ids des variables qui vont être utilisées*) - let (tasks2yaml : instance_type -> unit) = fun inst -> - let node = inst.node in - let f1 : node_type -> string = fun node -> node.file_name in - let s_vi = String.concat "" (List.map var2yaml inst.var_in) in - let s_vo = String.concat "" (List.map var2yaml inst.var_out) in + (*PS : ident = la liste des ids des variables qui vont être utilisées*) + (*Attention : 1 tâche pour le start, 1 pour le join donc rassembler les 2 tâches*) + let (tasks2yaml : task_type -> unit) = fun task -> + let s_vi = String.concat "" (List.map var2yaml task.var_in) in + let s_vo = String.concat "" (List.map var2yaml task.var_out) in let s = " - task: " - ^ "\n name: " ^ (f1 (List.nth nodes node)) + ^ "\n name: " ^ task.name ^ "\n var_in:\n" ^ s_vi ^ " var_out:\n" ^ s_vo in @@ -42,22 +50,43 @@ let (f : Soc.key -> Soc.tbl -> string -> unit) = fun sk stbl basename -> in let (main2yaml : unit -> unit) = fun () -> - let s = "main_node: " ^ filename in + let s = "main_node: " ^ basename in fprintf yaml_file "\n%s" s in fprintf yaml_file "tasks:\n"; + (* penser a fusionner les start et join d'une tache + toujours supprimer les duplicatas APRES AVOIR FUSIONNE (sinon risque de perdre join du start)*) let n = ref [] in - let rec (get_one_inst_by_node : instance_type list -> instance_type list) = fun inst_list -> - match inst_list with + let rec (remove_duplicate_task : task_type list -> task_type list) = fun task_list -> + match task_list with |[] -> [] - |h::p -> if Bool.not (List.exists (fun v -> h.node = v) !n) then - (n := (h.node)::!n; - h::(get_one_inst_by_node p)) - else get_one_inst_by_node p + |h::p -> if Bool.not (List.exists (fun v -> h.name = v.name) !n) then + (n := h::!n; + h::(remove_duplicate_task p)) + else remove_duplicate_task p in + + let n = ref [] in + let rec (fuse_start_join_task : task_type list -> task_type list) = fun task_list -> + match task_list with + |[] -> [] + |h::p -> if Bool.not (List.exists (fun v -> h.name = v.name) !n) then (*on trouve un nouveau start*) + (n := h::!n; + h::(fuse_start_join_task p)) + else + let t = List.find (fun v -> h.name = v.name) !n in + if (List.length t.var_out = 0) then (*on check si la tâche est pas complète (on a un start mais pas de join)*) + match (List.length h.var_out) with + |0 -> fuse_start_join_task p + |_ -> + let full_task = {name = t.name; var_in = t.var_in; var_out = h.var_out} in + n := full_task::!n; + full_task::(fuse_start_join_task p) (*Comment actualiser n pour dire qu'on a trouvé ? penser à find_index f list, mais attention ça renvoie un type option*) + else fuse_start_join_task p (*la tâche est déjà complète c'est juste une autre avec le même noeud on en a pas besoin*) + in + - List.iter tasks2yaml (get_one_inst_by_node instances); + List.iter tasks2yaml (remove_duplicate_task (List.rev (fuse_start_join_task tasks))); main2yaml (); diff --git a/lib/socNameC.ml b/lib/socNameC.ml index 764c831..8298239 100644 --- a/lib/socNameC.ml +++ b/lib/socNameC.ml @@ -1,5 +1,7 @@ (** Time-stamp: <modified the 19/06/2024 (at 17:50) by Erwan Jahier> *) + + type variable_type = { id: int; name: string; @@ -20,6 +22,12 @@ type instance_type = { var_out: int list; } +type task_type = { + name: string; + var_in: int list; + var_out: int list +} + let get_filename : Soc.t -> string = fun soc -> Soc2cIdent.get_base_name soc.key @@ -170,33 +178,58 @@ let get_instances : Soc.t -> instance_type list = fun soc -> (* List.iter print_instance_type res; *) res - let get_tasks : Soc.t -> task list = fun soc -> - (*let gaol = get_gaol soc in*) - let task_list = soc.tasks in - task_list - (*let ltbl = Hashtbl.create 2 in - let node_cpt_ref = ref (-1) in - let all_vars = (get_inputs_assoc soc) @ (get_outputs_assoc soc) @ (get_variables_assoc soc) in - let gao_to_tasks i gao = - match gao with - | Call(_,Assign,_,_) -> assert false - | Call(args_out, Method((_,k), _,_), args_in, _) - | Call(args_out, Procedure (k,_) , args_in, _) -> - let node_cpt, _inst_cpt = match Hashtbl.find_opt ltbl k with - | None -> incr node_cpt_ref; Hashtbl.add ltbl k (!node_cpt_ref, 0); !node_cpt_ref, 0 - | Some (node_cpt, inst_cpt) -> - let inst_cpt = inst_cpt+1 in - Hashtbl.add ltbl k (node_cpt, inst_cpt); - node_cpt, inst_cpt - in +let get_tasks : Soc.t -> task_type list = fun soc -> + let gaol = get_gaol soc in + let all_vars = (get_inputs_assoc soc) @ (get_outputs_assoc soc) @ (get_variables_assoc soc) in + let (gao_to_tasks: gao -> task_type option) = fun gao -> + match gao with + | Call(_,Assign,_,_) -> assert false + | Call(args_out, Method(_, _, task), args_in, _) + | Call(args_out, Procedure (_, _, task) , args_in, _) -> + begin + match task with + | None -> let t : task_type option = None in t + | Some (_, (n, _, _)) -> + let x = Str.split (Str.regexp "::") n in + let t = { - id = i+1; - node = node_cpt; + name = List.nth x ((List.length x)-1); var_in = List.map (var_expr_to_index all_vars) args_in; var_out = List.map (var_expr_to_index all_vars) args_out - } - | Case(_, _,_) -> assert false + } in + Some t + end + | Case(_, _,_) -> assert false + in + let (to_list : task_type option -> task_type list) = fun a -> + match a with + | None -> [] + | Some x -> [x] + in + let res = List.concat (List.map to_list (List.map gao_to_tasks gaol)) in + res + +(*faire ça : récup les socs de tous les noeuds +let get_all_soc : Soc.t -> Soc.tbl -> Soc.t list = fun soc stbl -> + let gaol = get_gaol soc in + let rec find_soc gao = fun gao -> + match gao with + | Case(_, [(_, gaoll)], _) -> List.map find_soc gaoll + | Call(_, Method((_, sk), _, _), _, _) + | Call(_, Procedure(sk, _, _), _, _) -> + (SocUtils.find (Lxm.dummy "aeaea") sk stbl) in - let res = List.mapi gao_to_tasks gaol in - (* List.iter print_instance_type res; *) - res*) + let socs = List.map find_soc gaol in + let n = ref [] in + let rec (remove_duplicate : Soc.t list -> Soc.t list) = fun socl -> + match socl with + | [] -> [] + | h::p -> if Bool.not (List.exists n h) then + (n := soc::!n; + h::(remove_duplicate p)) + else + remove_duplicate p + in + let x = List.map remove_duplicate socs in (*supprimer les duplicatas*) + x*) + -- GitLab