diff --git a/src/workflow.py b/src/workflow.py index da73fd34f4734120d5fae47a075a7fada7844bc3..41444ec7c537d6d0a498617872cda59147b065e2 100644 --- a/src/workflow.py +++ b/src/workflow.py @@ -2,13 +2,14 @@ from .nextflow_file import Nextflow_File from .ro_crate import RO_Crate from . import constant -from .outils_graph import flatten_dico +from .outils_graph import flatten_dico, initia_link_dico_rec, get_number_cycles import os import re import json from pathlib import Path import glob +import ctypes from .bioflowinsighterror import BioFlowInsightError @@ -267,7 +268,7 @@ class Workflow: if(not graph.is_initialised()): graph.initialise() process_dependency_graph = graph.get_process_dependency_graph_dico() - dico_flattened = {"nodes": [], "edges": []} + dico_flattened = {"nodes": [], "edges": [], "subworkflows":[]} def get_node(dico, id): for n in dico['nodes']: @@ -298,16 +299,27 @@ class Workflow: print("prob2") flatten_dico(process_dependency_graph, dico_flattened) + links = initia_link_dico_rec(dico_flattened) + _, edges_create_cycles = get_number_cycles(links) + #If the graph isn't a dag -> we remoce the edges which make it cyclic + for A, B in edges_create_cycles: + #print({"A":A, "B":B}) + #print(dico_flattened["edges"]) + dico_flattened["edges"].remove({"A":A, "B":B, "label":''}) + layers = [] while(dico_flattened["nodes"]!=[]): layer = dico_flattened["nodes"].copy() for edge in dico_flattened["edges"]: - try: - layer.remove(get_node(dico_flattened, edge['B'])) - except: - None + removed = False + node = get_node(dico_flattened, edge['B']) + while(not removed): + try: + layer.remove(node) + except: + removed = True for node in layer: @@ -315,10 +327,15 @@ class Workflow: remove_edge_if_A(dico_flattened, node['id']) layers.append(layer) - - return layers + layers_object = [] + for layer in layers: + tab = [] + for element in layer: + address = int(re.findall(r"\dx\w+", element['id'])[0], base=16) + tab.append(ctypes.cast(address, ctypes.py_object).value) + layers_object.append(tab) + return layers_object - print(flatten_dico(process_dependency_graph, dico_flattened)) def initialise(self, create_rocrate = True): self.nextflow_file.initialise()