diff --git a/cana/boolean_network.py b/cana/boolean_network.py index 3df7f83..2a1bf8f 100644 --- a/cana/boolean_network.py +++ b/cana/boolean_network.py @@ -6,6 +6,7 @@ Main class for Boolean network objects. """ + # Copyright (C) 2021 by # Rion Brattig Correia # Alex Gates @@ -67,11 +68,12 @@ def __init__( constants=None, Nconstants=None, keep_constants=False, + partial_lut=False, bin2num=None, num2bin=None, - verbose=False, + verbose=False, # Verbose mode for debugging purposes *args, - **kwargs + **kwargs, ): # NOTE: *args and **kwargs don't do anything. I'm not sure why they wre added here, so I'm not going to remove them. @@ -95,6 +97,11 @@ def __init__( ) self.Nstates = 2**Nnodes # Number of possible states in the network 2^N + # + self.partial_lut = ( + partial_lut # Generate with '?' output values a.k.a. partial look up tables + ) + # self.verbose = verbose @@ -147,13 +154,16 @@ def __str__(self): # I/O Methods # @classmethod - def from_file(self, file, type="cnet", keep_constants=True, **kwargs): + def from_file( + self, file, type="cnet", keep_constants=True, partial_lut=False, **kwargs + ): """ Load the Boolean Network from a file. Args: file (string) : The name of a file containing the Boolean Network. type (string) : The type of file, either 'cnet' (default) or 'logical' for Boolean logical rules. + partial_lut (bool) : Generate with '?' output values a.k.a. partial look up tables. Defaults to False. Returns: BooleanNetwork (object) : The boolean network object. @@ -164,7 +174,10 @@ def from_file(self, file, type="cnet", keep_constants=True, **kwargs): with open(file, "r") as infile: if type == "cnet": return self.from_string_cnet( - infile.read(), keep_constants=keep_constants, **kwargs + infile.read(), + keep_constants=keep_constants, + partial_lut=partial_lut, + **kwargs, ) elif type == "logical": return self.from_string_boolean( @@ -172,12 +185,19 @@ def from_file(self, file, type="cnet", keep_constants=True, **kwargs): ) @classmethod - def from_string_cnet(self, string, keep_constants=True, **kwargs): + def from_string_cnet( + self, string, keep_constants=True, partial_lut=False, **kwargs + ): """ Instanciates a Boolean Network from a string in cnet format. + The cnet format is similar to the Berkeley Logic Interchange Format (BLIF). + + This function generates a Logic dictionary from the string and uses the :func:`~cana.boolean_network.BooleanNetwork.from_dict` method to generate the Boolean Network object. Args: string (string): A cnet format representation of a Boolean Network. + partial_lut (bool): Generate with '?' output values a.k.a. partial look up tables. Defaults to False. + Returns: (BooleanNetwork) @@ -220,31 +240,116 @@ def from_string_cnet(self, string, keep_constants=True, **kwargs): for jnode in range(indegree): logic[inode]["in"].append(int(line.split()[3 + jnode]) - 1) - logic[inode]["out"] = [ - 0 for i in range(2**indegree) if indegree > 0 - ] + # to generate with '?' output values a.k.a. partial look up tables. If partial_lut is False, it generates with Prime Implicants(PI)(default) + if partial_lut: + logic[inode]["out"] = [ + "?" for i in range(2**indegree) if indegree > 0 + ] # activate this for '?' output values - logic_line = network_file.readline().strip() + logic_line = network_file.readline().strip() - if indegree <= 0: - if logic_line == "": - logic[inode]["in"] = [inode] - logic[inode]["out"] = [0, 1] + if indegree <= 0: + if logic_line == "": + logic[inode]["in"] = [inode] + logic[inode]["out"] = [0, 1] + else: + logic[inode]["out"] = [int(logic_line)] else: - logic[inode]["out"] = [int(logic_line)] + while ( + logic_line != "\n" + and logic_line != "" + and len(logic_line) > 1 + ): + # Check for clashing entries. + for nlogicline in expand_logic_line(logic_line): + if logic[inode]["out"][ + binstate_to_statenum(nlogicline.split()[0]) + ] in [ + "?", + None, + 2, + "-", + ]: # assigns output value if it is not assigned + logic[inode]["out"][ + binstate_to_statenum(nlogicline.split()[0]) + ] = int(nlogicline.split()[1]) + elif ( + logic[inode]["out"][ + binstate_to_statenum(nlogicline.split()[0]) + ] + == int(nlogicline.split()[1]) + ): # if the output value is already assigned and is the same as the new output value + pass + else: # if the output value is already assigned and is different from the new output value + print( + "Entry clash in node ", + (inode + 1), + " for ", + {nlogicline.split()[0]}, + " i.e. State number: ", + binstate_to_statenum(nlogicline.split()[0]), + ) + logic[inode]["out"][ + binstate_to_statenum(nlogicline.split()[0]) + ] = "!" + + logic_line = network_file.readline().strip() + else: - while ( - logic_line != "\n" - and logic_line != "" - and len(logic_line) > 1 - ): - for nlogicline in expand_logic_line(logic_line): - logic[inode]["out"][ - binstate_to_statenum(nlogicline.split()[0]) - ] = int(nlogicline.split()[1]) - logic_line = network_file.readline().strip() - - # .e = end of file + # to generate with Prime Implicants(PI) + logic[inode]["out"] = [ + "0" for i in range(2**indegree) if indegree > 0 + ] + + logic_line = network_file.readline().strip() + + if indegree <= 0: + if logic_line == "": + logic[inode]["in"] = [inode] + logic[inode]["out"] = [0, 1] + else: + logic[inode]["out"] = [int(logic_line)] + else: + while ( + logic_line != "\n" + and logic_line != "" + and len(logic_line) > 1 + ): + # Check for clashing entries. + for nlogicline in expand_logic_line(logic_line): + if logic[inode]["out"][ + binstate_to_statenum(nlogicline.split()[0]) + ] in [ + "?", + None, + 2, + "-", + "0", + ]: # assigns output value if it is not assigned + logic[inode]["out"][ + binstate_to_statenum(nlogicline.split()[0]) + ] = int(nlogicline.split()[1]) + elif ( + logic[inode]["out"][ + binstate_to_statenum(nlogicline.split()[0]) + ] + == int(nlogicline.split()[1]) + ): # if the output value is already assigned and is the same as the new output value + pass + else: # if the output value is already assigned and is different from the new output value + print( + "Entry clash in node ", + (inode + 1), + " for ", + {nlogicline.split()[0]}, + " i.e. State number: ", + binstate_to_statenum(nlogicline.split()[0]), + ) + logic[inode]["out"][ + binstate_to_statenum(nlogicline.split()[0]) + ] = "1" + + logic_line = network_file.readline().strip() elif ".e" in line: break line = network_file.readline() @@ -254,7 +359,7 @@ def from_string_cnet(self, string, keep_constants=True, **kwargs): @classmethod def from_string_boolean(self, string, keep_constants=True, **kwargs): """ - Instanciates a Boolean Network from a Boolean update rules format. + Instanciates a Boolean Network from a Boolean update rules format. Genetates a Logic dictionary from the string and uses the :func:`~cana.boolean_network.BooleanNetwork.from_dict` method to generate the Boolean Network object. Args: string (string) : A boolean update rules format representation of a Boolean Network. @@ -323,7 +428,7 @@ def from_string_boolean(self, string, keep_constants=True, **kwargs): @classmethod def from_dict(self, logic, keep_constants=True, **kwargs): - """Instanciaets a BooleanNetwork from a logic dictionary. + """Instanciates a BooleanNetwork from a logic dictionary. Args: logic (dict) : The logic dict. @@ -334,6 +439,20 @@ def from_dict(self, logic, keep_constants=True, **kwargs): See also: :func:`from_file` :func:`from_dict` + + Examples: + Logic should be structured as follow: + + .. code-block:: python + + logic = { + 0: {'name': 'A', 'in': [1,0], 'out': [0, 1, 0,1]}, + 1: {'name': 'B', 'in': [0,2], 'out': [0, 1, 0, 1]}, + 2: {'name': 'C', 'in': [0,1,2], 'out': [0, 1, 1, 0, 0, 1, 1, 0]} + } + + # Instanciate the BooleanNetwork + bn = BooleanNetwork.from_dict(logic) """ Nnodes = len(logic) constants = {} @@ -636,9 +755,9 @@ def conditional_effective_graph( # and update the conditional effective graph with the new edge effectiveness values for i in range(newk): - conditional_eg[new_successor_inputs[i]][n][ - "weight" - ] = new_edge_effectiveness[i] + conditional_eg[new_successor_inputs[i]][n]["weight"] = ( + new_edge_effectiveness[i] + ) # now update the conditioned_logic in case these nodes are further modified by additional conditioned variables conditioned_logic[n]["in"] = new_successor_inputs @@ -853,7 +972,7 @@ def trajectory_to_attractor( return trajectory def attractor(self, initial): - """Computes the trajectory starting at ``initial`` until it reaches an attracor (this is garanteed) + """Computes the trajectory starting at ``initial`` until it reaches an attractor (this is guaranteed) Args: initial (string): the initial state. @@ -1191,7 +1310,7 @@ def pinned_step(self, initial, pinned_binstate, pinned_var): return "".join( [ str(node.step("".join(initial[j] for j in self.logic[i]["in"]))) - if not (i in pinned_var) + if i not in pinned_var else initial[i] for i, node in enumerate(self.nodes, start=0) ] @@ -1382,7 +1501,7 @@ def feedback_vertex_set_driver_nodes( max_search=11, keep_self_loops=True, *args, - **kwargs + **kwargs, ): """The minimum set of necessary driver nodes to control the network based on Feedback Vertex Set (FVS) theory. @@ -1582,7 +1701,7 @@ def inv_eff_weight_func(pathlength): Gstr_shortest_dist, Gstr_shortest_paths = nx.single_source_dijkstra( Gstr, source, target=None, cutoff=n_steps ) - Gstr_shortest_dist = {n: int(l) for n, l in Gstr_shortest_dist.items()} + Gstr_shortest_dist = {n: int(m) for n, m in Gstr_shortest_dist.items()} # in the effective graph, calcluate the dijkstra shortest paths from the source to all targets that are shorter than the cufoff # where the edge weight is given by the effective weight function @@ -1593,14 +1712,14 @@ def inv_eff_weight_func(pathlength): for itar, target in enumerate(target_set): # we dont need to worry about a path to iteself (source==target) # and if the target doesnt appear in the shortest path dict, then no path exists that is less than the cutoff - if target != source and not Gstr_shortest_dist.get(target, None) is None: + if target != source and Gstr_shortest_dist.get(target, None) is not None: # the light cone is at least as big as the number of edges in the structural shorest path impact_matrix[ 0, list(range(Gstr_shortest_dist[target], n_steps + 1)), itar ] = Gstr_shortest_dist[target] # if the path exists, then the number of edges (timesteps) is one less than the number of nodes - if not Geff_shortest_paths.get(target, None) is None: + if Geff_shortest_paths.get(target, None) is not None: eff_path_steps = len(Geff_shortest_paths[target]) - 1 else: # or the path doesnt exist @@ -1633,9 +1752,9 @@ def inv_eff_weight_func(pathlength): # once the lightcone includes the target node on the effective shortest path, # then for all other steps the effective path is the best - impact_matrix[ - 1, list(range(eff_path_steps, n_steps + 1)), itar - ] = inv_eff_weight_func(Geff_shortest_dist[target]) + impact_matrix[1, list(range(eff_path_steps, n_steps + 1)), itar] = ( + inv_eff_weight_func(Geff_shortest_dist[target]) + ) return impact_matrix[:, 1:] @@ -1715,7 +1834,7 @@ def dynamics_canalization_map(self, output=None, simplify=True): DCM.add_edge( in_nei[0], out_nei[1], - **{"type": "simplified", "mode": "selfloop"} + **{"type": "simplified", "mode": "selfloop"}, ) # Link variables nodes directly elif not any([DCM.nodes[tn]["type"] == "fusion" for tn in in_nei]): @@ -1723,7 +1842,7 @@ def dynamics_canalization_map(self, output=None, simplify=True): DCM.add_edge( in_nei[0], out_nei[1], - **{"type": "simplified", "mode": "direct"} + **{"type": "simplified", "mode": "direct"}, ) # Remove Isolates isolates = list(nx.isolates(DCM)) diff --git a/cana/boolean_node.py b/cana/boolean_node.py index dd0817e..7da5f27 100644 --- a/cana/boolean_node.py +++ b/cana/boolean_node.py @@ -6,6 +6,7 @@ Main class for Boolean node objects. """ + # Copyright (C) 2021 by # Rion Brattig Correia # Alex Gates @@ -14,7 +15,7 @@ # MIT license. from __future__ import division -from itertools import combinations, compress, product +from itertools import combinations, compress, product, permutations from statistics import mean import networkx as nx @@ -29,7 +30,10 @@ outputs_to_binstates_of_given_type, statenum_to_binstate, ) -from cana.utils import input_monotone, ncr +from cana.utils import input_monotone, ncr, fill_out_lut +import random +import warnings +from math import comb class BooleanNode(object): @@ -47,7 +51,7 @@ def __init__( network=None, verbose=False, *args, - **kwargs + **kwargs, ): self.id = id # the id of the node self.name = name # the name of the node @@ -73,7 +77,7 @@ def __init__( ) # If all outputs are either positive or negative, the node is treated as a constant. - if (len(set(outputs)) == 1) or (constant): + if (len(set(outputs)) == 1 and ("?" not in outputs)) or (constant): self.set_constant(constant=True, state=outputs[0]) else: self.set_constant(constant=False) @@ -110,7 +114,8 @@ def __str__(self): @classmethod def from_output_list(self, outputs=list(), *args, **kwargs): - """Instanciate a Boolean Node from a output transition list. + """ + Instanciate a Boolean Node from a output transition list. Args: outputs (list) : The transition outputs of the node. @@ -119,11 +124,18 @@ def from_output_list(self, outputs=list(), *args, **kwargs): (BooleanNode) : the instanciated object. Example: - >>> BooleanNode.from_output_list(outputs=[0,0,0,1], name="AND") + >>> BooleanNode.from_output_list(outputs=[0,0,0,1], name="EG") """ id = kwargs.pop("id") if "id" in kwargs else 0 name = kwargs.pop("name") if "name" in kwargs else "x" k = int(np.log2(len(outputs))) + + # checking if length of outputs is a power of 2, else raising an error. + if 2**k != len(outputs): + raise ValueError( + "The number of outputs should be a power of 2. The length of the outputs list should be 2^k." + ) + inputs = ( kwargs.pop("inputs") if "inputs" in kwargs else [(x + 1) for x in range(k)] ) @@ -137,7 +149,7 @@ def from_output_list(self, outputs=list(), *args, **kwargs): state=state, outputs=outputs, *args, - **kwargs + **kwargs, ) def set_constant(self, constant=True, state=None): @@ -427,14 +439,14 @@ def look_up_table(self): return df def schemata_look_up_table( - self, type="pi", pi_symbol="#", ts_symbol_list=["\u030A", "\u032F"] + self, type="pi", pi_symbol="#", ts_symbol_list=["\u030a", "\u032f"] ): """Returns the simplified schemata Look Up Table (LUT) Args: type (string) : The type of schemata to return, either Prime Implicants ``pi`` or Two-Symbol ``ts``. Defaults to 'pi'. pi_symbol (str) : The Prime Implicant don't care symbol. Default is ``#``. - ts_symbol_list (list) : A list containing Two Symbol permutable symbols. Default is ``["\u030A", "\u032F"]``. + ts_symbol_list (list) : A list containing Two Symbol permutable symbols. Default is ``["\u030a", "\u032f"]``. Returns: (pandas.DataFrame or Latex): the schemata LUT @@ -449,6 +461,12 @@ def schemata_look_up_table( See also: :func:`look_up_table` """ + # Check if the outputs contain '?' and generate an error message if it does. + if "?" in self.outputs: + raise ValueError( + "The look-up table contains '?' values. The schemata look-up table cannot be generated." + ) + r = [] # Prime Implicant LUT if type == "pi": @@ -576,7 +594,7 @@ def canalizing_map(self, output=None): "value": 0, "constant": self.constant, "group": self.id, - } + }, ) if output is None or output == 1: @@ -589,7 +607,7 @@ def canalizing_map(self, output=None): "value": 1, "constant": self.constant, "group": self.id, - } + }, ) tid = 0 @@ -636,7 +654,7 @@ def canalizing_map(self, output=None): "type": "threshold", "tau": tau, "group": self.id, - } + }, ) # Add Edges from Threshold node to output @@ -666,7 +684,7 @@ def canalizing_map(self, output=None): "mode": "input", "value": iout, "group": self.id, - } + }, ) G.add_edge(iname, tname, **{"type": "literal"}) @@ -696,7 +714,7 @@ def canalizing_map(self, output=None): "mode": "input", "value": 0, "group": self.id, - } + }, ) G.add_edge(iname, fname, **{"type": "fusing"}) G.add_edge(fname, tname, **{"type": "fused"}) @@ -728,7 +746,7 @@ def canalizing_map(self, output=None): "mode": "input", "value": 1, "group": self.id, - } + }, ) G.add_edge(iname, fname, **{"type": "fusing"}) G.add_edge(fname, tname, **{"type": "fused"}) @@ -817,7 +835,7 @@ def _check_compute_canalization_variables(self, **kwargs): raise Exception("Canalization variable name not found. %s" % kwargs) return True - def bias(self): + def bias(self, verbose=True): r"""The node bias. The sum of the boolean output transitions divided by the number of entries (:math:`2^k`) in the LUT. .. math:: @@ -830,7 +848,19 @@ def bias(self): See Also: :func:`~cana.boolean_network.BooleanNetwork.network_bias` """ - return sum(map(int, self.outputs)) / 2**self.k + if verbose: + if "?" in self.outputs: + print( + "Warning: There is a '?' value in the output. It will be treated as zero for the bias calculation." + ) + + outputs = [ + 0 if output == "?" else output for output in self.outputs + ] # added this condition so that bias function plays nice with '?' output values. It will treat missing outputs as 0. + + bias = sum(map(int, outputs)) / 2**self.k + + return bias def c_sensitivity(self, c, mode="default", max_k=0): """Node c-sensitivity. @@ -913,3 +943,263 @@ def input_signs(self): ] return input_sign_list + + def from_partial_lut( + partial_lut, + fill_missing_output_randomly=False, + required_node_bias=None, + required_effective_connectivity=None, + verbose=False, + *args, + **kwargs, + ): + """ + Instantiate a Boolean Node from a partial look-up table. + + Uses the fill_out_lut function to complete the look-up table. Extracts the output list from the completed look-up table. Then instantiates the Boolean Node from the output list using the from_output_list method. + + Args: + partial_lut (list) : A partial look-up table of the node. + fill_missing_output_randomly (bool) : If True, missing output values are filled with random 0 or 1. If False, missing output values are filled with '?'. + verbose (bool) : If True, print additional information. + + Returns: + (BooleanNode) : the instantiated object. + + Example: + >>> BooleanNode.from_partial_lut(partial_lut=[('00', 0), ('01', 1), ('11', 1)], verbose=True, name="EG") + >>> BooleanNode.from_partial_lut(partial_lut=[('00', 0), ('01', 1), ('11', 1)], fill_missing_output_randomly=True, verbose=False, name="EG") + + + Note: + The partial look-up table should be a list of tuples where each tuple contains a binary input state and the corresponding output value. For example, [('00', 0), ('01', 1), ('11', 1)]. + The fill_missing_output_randomly should be a boolean value. + + """ + + generated_lut = fill_out_lut(partial_lut, verbose=False) + output_list = [x[1] for x in generated_lut] + + generated_node = BooleanNode.from_output_list(output_list, *args, **kwargs) + + # Fill missing output values with the specified bias or with specified effective connectivity or randomly + + if fill_missing_output_randomly: + # Replace '?' in generated_node.outputs with 0 or 1 randomly + generated_node.outputs = [ + random.choice(["0", "1"]) if output == "?" else output + for output in generated_node.outputs + ] + + if verbose and "?" in generated_node.outputs: + print( + "The LUT is incomplete. Missing values are represented by '?'." + if verbose + else None + ) + return generated_node + + def generate_with_required_bias( + self, + required_node_bias=None, + verbose=False, + *args, + **kwargs, + ): + """ + Generate a node with the required bias. + This node takes a boolean node with "?" output values and generates all possible nodes with the missing output values filled to achieve the required bias as closely as possible. + + Args: + required_node_bias (float) : The required node bias to fill the missing output values with. + verbose (bool) : If True, print additional information. + + Returns: + A Generator of BooleanNode objects with the required bias. + + Example: + >>> BooleanNode.generate_with_required_bias(required_node_bias=0.5, verbose=True, name="EG") + + Note: + The required node bias should be a float value between 0 and 1. + + """ + generated_node = self + bias = required_node_bias # making a copy for print statement at the end of function + # Checking if more than one out of required_effective_connectivity, requried_node_bias and fill_missing_output_randomly are True, then raise an error. + if required_node_bias is None: + raise ValueError( + "Please specify the required node bias to generate the node with the required bias." + ) + + if ( + required_node_bias is not None + ): # If required node bias is specified, then fill missing output values with the specified bias. + # Checking if required node bias is within the achievable bias range of the node. + + # Calculating max achievable bias + max_achievable_output = [ + "1" if output == "?" else output for output in generated_node.outputs + ] + max_achievable_bias = ( + sum(map(int, max_achievable_output)) / 2**generated_node.k + ) + + # Calculating the number of '1' required to achieve the required bias. + required_ones = int(required_node_bias * 2**generated_node.k) + current_ones = generated_node.outputs.count("1") + + min_achievable_bias = current_ones / 2**generated_node.k + min = False # flag to check if the required bias is less than the minimum achievable bias. + # Checking if the required bias is achievable. + if required_node_bias > max_achievable_bias: + if verbose: + warnings.warn( + f"Required Node Bias is greater than the maximum achievable bias ({max_achievable_bias}) of the node. Generating with the maximum achievable bias." + ) + required_node_bias = max_achievable_bias + + elif required_node_bias < min_achievable_bias: + if verbose: + warnings.warn( + f"Required Node Bias is lower than the minimum achievable bias ({min_achievable_bias}) of the node. Generating with the minimum achievable bias." + ) + required_node_bias = min_achievable_bias + min = True + + # Fill the missing output values to achieve the required bias as closely as possible. + required_ones = int( + required_node_bias * 2**generated_node.k + ) # recalculating in case the required bias was adjusted in the above steps. + ones_to_be_generated = required_ones - current_ones + number_of_missing_values = generated_node.outputs.count("?") + + missing_output_values = ( + ["1"] * ones_to_be_generated + + ["0"] * (number_of_missing_values - ones_to_be_generated) + ) # creating a list of 1 and 0 to replace the '?' with the right ratio required to achieve the required bias. + + combinationsnumber = comb(number_of_missing_values, ones_to_be_generated) + + def unique_permutations_missing_values(elements, n): + """ + Generate n unique permutations of elements. + """ + seen = set() + + while len(seen) < n: + perm = elements.copy() + random.shuffle(perm) + perm_as_str = str(perm) # Convert to string for hashability + if perm_as_str not in seen: + seen.add(perm_as_str) + yield perm + if len(seen) == n: + return + + combinations = unique_permutations_missing_values( + missing_output_values, combinationsnumber + ) + generated_node_permutations = [] + + def node_permutations(combinations, node_outputs, *args, **kwargs): + """ + Applying the generated combinations to the missing output values and generating the BooleanNode objects. + """ + + for combination in combinations: + combination = list(combination) + generated_outputs = node_outputs.copy() + for i, output in enumerate(node_outputs): + if output == "?": + generated_outputs[i] = combination.pop() + yield BooleanNode.from_output_list( + generated_outputs, *args, **kwargs + ) + + generated_node_permutations = node_permutations( + combinations, generated_node.outputs, *args, **kwargs + ) + + output_bias_for_print = ( + ones_to_be_generated + current_ones + ) / 2**generated_node.k # for the print message in the end + if verbose: + if min: + print( + f"{combinationsnumber:.2e} possible permutation(s) with a bias of {output_bias_for_print}. This is the closest achievable bias to the required bias of {bias}." + ) + else: + print( + f"{combinationsnumber:.2e} possible permutation(s) with a bias of {output_bias_for_print}. This is the closest bias less than or equal to the required bias of {bias}." + ) + return generated_node_permutations # returning a generator of BooleanNode objects with the required bias. + + def generate_with_required_effective_connectivity( + self, + required_effective_connectivity=None, + # limit=50, + verbose=False, + *args, + **kwargs, + ): + """ + Generate a node with the required effective connectivity. + This node takes a boolean node with "?" output values and generates all possible nodes with the missing output values filled to achieve the required effective connectivity as closely as possible. + + Args: + required_effective_connectivity (float) : The required effective connectivity to fill the missing output values with. It will generate a node with the closest possible effective connectivity to the required effective connectivity. + verbose (bool) : If True, print additional information. + + Returns: + (BooleanNode) : the instantiated object. + + Example: + >>> BooleanNode.generate_with_required_effective_connectivity(required_effective_connectivity=0.5, verbose=True, name="EG") + + Note: + The required effective connectivity should be a float value between 0 and 1. + + # TODO : [SRI] to cover the entire space of permutations evenly, what if i fill each node randomly and calculate the effective connectivity . then add them to a list of all nodes with sufficiently close effective connectivity? This option will only be activated if the calculated permutation space goes beyond a predecided threshold. + """ + + generated_node = self + if required_effective_connectivity is not None: + generated_outputs = generated_node.outputs.copy() + missing_output_indices = [ + i for i, x in enumerate(generated_outputs) if x == "?" + ] + # print(f"Missing output indices = {missing_output_indices}." if verbose else None) + + missing_output_count = generated_outputs.count("?") + # print(f"No. of '?' in output = {missing_output_count}.") + missing_permutations = list(product(*[("0", "1")] * (missing_output_count))) + # print(permutations) + generated_node_permutations = [None] * len(missing_permutations) + + for count, missing_permutation in enumerate(missing_permutations): + for i, index in enumerate(missing_output_indices): + generated_outputs[index] = missing_permutation[i] + generated_node_permutations[count] = BooleanNode.from_output_list( + generated_outputs, *args, **kwargs + ) # generating a list of nodes with all possible permutations of the missing output values. + + # print(f"Total output permutations generated = {len(generated_node_permutations)}.") + + permutation_effective_connectivity = [ + x.effective_connectivity() for x in generated_node_permutations + ] + closest_value = min( + permutation_effective_connectivity, + key=lambda x: abs(x - required_effective_connectivity), + ) + closest_index = permutation_effective_connectivity.index(closest_value) + + generated_node = generated_node_permutations[closest_index] + print( + f"Generated the node with the closest possible effective connectivity of {generated_node.effective_connectivity()}." + if verbose + else None + ) + + return generated_node diff --git a/cana/canalization/boolean_canalization.py b/cana/canalization/boolean_canalization.py index 5b5f6b4..3711a0d 100644 --- a/cana/canalization/boolean_canalization.py +++ b/cana/canalization/boolean_canalization.py @@ -296,7 +296,7 @@ def _expand_ts_logic(two_symbols, permut_indexes): _implicant = np.copy(implicant) _implicant[idxs] = vals # Insert to list of logics if not already there - if not (_implicant.tolist() in logics): + if _implicant.tolist() not in logics: logics.append(_implicant.tolist()) Q.append(_implicant.tolist()) return logics diff --git a/cana/control/sc.py b/cana/control/sc.py index d8e719e..a3de95e 100644 --- a/cana/control/sc.py +++ b/cana/control/sc.py @@ -210,7 +210,7 @@ def _trim_unnecessary_edges(matching_digraph): def _enumerate_maximum_matchings_iter(G, U, V, M, D, matchings_list): """ """ - if len(G) > 0 and not (D is None): + if len(G) > 0 and D is not None: # find the cycles in the matching digraph cycles = [c for c in nx.simple_cycles(D)] @@ -246,7 +246,7 @@ def _enumerate_maximum_matchings_iter(G, U, V, M, D, matchings_list): elif len(G) > 0: path = _find_path_length_two(G, V, M) - if not (path is None): + if path is not None: # swap edges in the path e, Mprime = _swap_edges_in_path(path, M) # this creates a new maximum matching, see if we already have it or add it diff --git a/cana/datasets/bio.py b/cana/datasets/bio.py index 180ad31..e4cfe4a 100644 --- a/cana/datasets/bio.py +++ b/cana/datasets/bio.py @@ -7,6 +7,7 @@ """ + # Copyright (C) 2021 by # Alex Gates # Rion Brattig Correia diff --git a/cana/drawing/plot_look_up_table.py b/cana/drawing/plot_look_up_table.py new file mode 100644 index 0000000..3982700 --- /dev/null +++ b/cana/drawing/plot_look_up_table.py @@ -0,0 +1,128 @@ +import matplotlib.pyplot as plt +from matplotlib.text import Text +from matplotlib.patches import Rectangle +from matplotlib.collections import PatchCollection +from IPython.display import display + + +def plot_look_up_table(n): + """ + Plot the Look-Up Table of a BooleanNode + + Parameters + ---------- + n : BooleanNode + The BooleanNode to plot the Look-Up Table + + Returns + ------- + None + """ + # Check if n.inputs has any values + if not n.inputs: + return print('No inputs to plot') + + # Init values from BooleanNode + k = n.k if n.k>=1 else 1 + inputs = n.inputs if not n.constant else [n.name] + inputlabels = [n.network.get_node_name(i)[0] if n.network is not None else i for i in inputs] + LUT = n.look_up_table().sort_index(ascending=False) + # Count number of F in the LUT + n_fs = LUT.shape[0] + # Schemata Cell Width and spacing + cwidth = 60. + cxspace = 0 + cyspace = 6 + border = 1 + sepcxspace = 21 + # sepcyspace = 15 + dpi = 150. + # Margins + top, right, bottom, left, hs = 120, 25, 25, 60, 25 + # Axes Width & Height + ax1width = ((k*(cwidth+cxspace))+sepcxspace+(cwidth)) + ax1height = (n_fs*(cwidth+cyspace)-cyspace) + # Figure Width & Height + fwidth = (left + ax1width + hs + right) + fheight = (bottom + ax1height + top) + # Percentages for Axes location + _ax1w = ((ax1width*100) / fwidth) / 100 + _ax1h = ((ax1height*100) / fheight) / 100 + _bottom = ((bottom*100) / fheight) / 100 + _left = ((left*100) / fwidth) / 100 + _hs = ((hs*100) / fwidth) / 100 + # Init Figure + fig = plt.figure(figsize=(fwidth/dpi,fheight/dpi), facecolor='w', dpi=dpi) + ax1 = fig.add_axes((_left,_bottom,_ax1w,_ax1h), aspect=1, label='LUT') + + ### LUT Plot ### + + yticks = [] + patches = [] + x,y = 0.,0. + # + for i,r in LUT.iterrows(): + ins = str(r['In:']) + out = r['Out:'] + x = 0. + xticks = [] + for input in ins: + if input == '0': + facecolor = 'white' + textcolor = 'black' + elif input == '1': + facecolor = 'black' + textcolor = 'white' + text = '{label:s}'.format(label=input) + ax1.add_artist(Text(x+cwidth/2,y+cwidth/10*4, text=text, color=textcolor, va='center', ha='center',fontsize=14,family='serif')) + r = Rectangle((x,y), width=cwidth, height=cwidth, facecolor=facecolor, edgecolor='black') + patches.append(r) + xticks.append(x+cwidth/2) + x += cwidth + cxspace + + x += sepcxspace + r = Rectangle((x,y), width=cwidth, height=cwidth, facecolor='black' if (out==1) else 'white', edgecolor='black') + ax1.add_artist(Text(x-(sepcxspace/2)-(cxspace/2),y+cwidth/10*4, text=':', color='black', va='center', ha='center',fontsize=14,weight='bold',family='serif')) + ax1.add_artist(Text(x+(cwidth/2),y+cwidth/10*4, text=out, color='white' if (out==1) else 'black', va='center', ha='center',fontsize=14,family='serif')) + patches.append(r) + xticks.append(x+cwidth/2) + yticks.append(y+cwidth/2) + y += cwidth + cyspace + + #y += sepcyspace + + ax1.add_collection(PatchCollection(patches, match_original=True)) + # + ax1.set_yticks(yticks) + ax1.set_yticklabels([r"$f_{%d}$"%(i+1) for i in range(n_fs)[::-1]], fontsize=14) + ax1.set_xticks(xticks) + ax1.set_xticklabels(inputlabels + ['%s'%(n.name)], rotation=90, fontsize=14) + # + ax1.xaxis.tick_top() + # Remove Tick + ax1.tick_params(which='major',pad=7) + for tic in ax1.xaxis.get_major_ticks(): + tic.tick1On = tic.tick2On = False + for tic in ax1.yaxis.get_major_ticks(): + tic.tick1On = tic.tick2On = False + # Remove Border + ax1.spines['top'].set_visible(False) + ax1.spines['right'].set_visible(False) + ax1.spines['bottom'].set_visible(False) + ax1.spines['left'].set_visible(False) + # Limits + ax1.set_xlim(-border,ax1width+border) + ax1.set_ylim(-border,ax1height+border) + #ax1.invert_yaxis() + + # FileName + filename = n.name + filename = filename.replace('/','_') + filename = filename.replace(',','_') + + ## Display + display(fig) + + plt.close() + + \ No newline at end of file diff --git a/cana/drawing/schema_vis.py b/cana/drawing/schema_vis.py index f9e3373..82fa142 100644 --- a/cana/drawing/schema_vis.py +++ b/cana/drawing/schema_vis.py @@ -11,6 +11,9 @@ def plot_schemata(n, plotTS=True): # Init values from BooleanNode k = n.k if n.k >= 1 else 1 outputs = np.array(n.outputs) + + if "?" in outputs: # check if there are any '?' in the output. + raise ValueError("Error (plot_schemata()): The output contains '?'") if np.all(outputs[0] == outputs): return False inputs = n.inputs if not n.constant else [n.name] diff --git a/cana/random_boolean_network.py b/cana/random_boolean_network.py index a96dd14..870fadb 100644 --- a/cana/random_boolean_network.py +++ b/cana/random_boolean_network.py @@ -34,7 +34,25 @@ def regular_boolean_network( niter_remove=1000, ): """ - TODO: description + Generate a random regular boolean network. + + Args: + N (int) : Number of nodes in the network. + K (int) : Degree of each node in the network. + bias (float) : Bias for the output transitions. + bias_constraint (str) : Constraint for the bias. Options are 'soft', 'hard', 'soft_no_constant'. + keep_constants (bool) : Keep constant nodes. + remove_multiedges (bool) : Remove multi-edges. + niter_remove (int) : Number of iterations to try to remove duplicate edges. + + Returns: + (BooleanNetwork) : The boolean network object. + + Examples: + A regular boolean network with 10 nodes, each with 2 inputs and a bias of 0.5. + + >>> bn = regular_boolean_network(N=10, K=2, bias=0.5) + """ din = [K] * N # in-degree distrubtion dout = [K] * N # out-degree distrubtion @@ -72,7 +90,24 @@ def er_boolean_network( niter_remove=1000, ): """ - TODO: description + Generate a random Erdos-Renyi boolean network. + + Args: + N (int) : Number of nodes in the network. + p (float) : Probability for edge creation. + bias (float) : Bias for the output transitions. + bias_constraint (str) : Constraint for the bias. Options are 'soft', 'hard', 'soft_no_constant'. + remove_multiedges (bool) : Remove multi-edges. + niter_remove (int) : Number of iterations to try to remove duplicate edges. + + Returns: + (BooleanNetwork) : The boolean network object. + + Examples: + A random Erdos-Renyi boolean network with 10 nodes and a probability of 0.2. + + >>> bn = er_boolean_network(N=10, p=0.2) + """ er_graph = nx.erdos_renyi_graph(N, p, directed=True) @@ -98,7 +133,21 @@ def er_boolean_network( def random_automata_table(indegree, bias, bias_constraint="soft"): """ - TODO: description + Generate a random automata table. + + Args: + indegree (int) : Number of inputs. + bias (float) : Bias for the output transitions. + bias_constraint (str) : Constraint for the bias. Options are 'soft', 'hard', 'soft_no_constant'. + + Returns: + (list) : A list of output transitions. + + Examples: + A random automata table with 2 inputs and a bias of 0.5. + + >>> random_automata_table(indegree=2, bias=0.5) + """ if bias_constraint == "soft": return [int(random.random() < bias) for b in range(2**indegree)] @@ -119,7 +168,15 @@ def random_automata_table(indegree, bias, bias_constraint="soft"): def _remove_duplicate_edges(graph, niter_remove=100): """ - TODO: description + Remove duplicate edges from a graph. + + Args: + graph (nx.DiGraph) : A directed graph. + niter_remove (int) : Number of iterations to try to remove duplicate edges. + + Returns: + (nx.DiGraph) : A directed graph without duplicate edges. + """ edge_list = list(graph.edges()) edge_frequency = Counter(edge_list) diff --git a/cana/utils.py b/cana/utils.py index ec9252c..79fa0de 100644 --- a/cana/utils.py +++ b/cana/utils.py @@ -327,3 +327,84 @@ def input_monotone(outputs, input_idx, activation=1): ) return all(monotone_configs) + + +def fill_out_lut(partial_lut, verbose=False): + """ + Fill out a partial LUT with missing entries. + + Args: + partial_lut (list) : A list of tuples where each tuple is a pair of a binary string and a value. + fill_missing_output (bool) : If True, missing output values are filled with random 0 or 1. If False, missing output values are filled with '?'. + + + + + Returns: + (list) : A list of tuples where each tuple is a pair of a binary string and a value. + + Example: + >>> fill_out_lut([('00', 0), ('01', 0), ('1-', 1), ('11', 1)]) + [('00', 0), ('01', 0), ('10', 1), ('11', 1)] + + # TODO: [SRI] generate LUT from two symbol schemata, with a specified ratio of wildcard symbols + # TODO: [SRI] use examples COSA rule, GKL rule where you fill up LUT based on the annihilation inputs and see if it matches with the rules plus bias. + """ + + # Check if all the input entries of the partial LUT are of the same length. + if len(set([len(x[0]) for x in partial_lut])) != 1: + raise ValueError( + "All the input entries of the partial LUT must be of the same length." + ) + + k = len(partial_lut[0][0]) + + all_states = dict(partial_lut) + + for entry in partial_lut: + if not all([x in ["0", "1", "-", "#", "2", "x"] for x in entry[0]]): + raise ValueError( + "All the input entries of the partial LUT must be valid binary strings." + ) + + elif any([x in ["-", "#", "2", "x"] for x in entry[0]]): + missing_data_indices = [ + i for i, x in enumerate(entry[0]) if x in ["-", "#", "x"] + ] + table = [] + output_list_permutations = [] + + for i in range(2 ** len(missing_data_indices)): + row = [int(x) for x in bin(i)[2:].zfill(len(missing_data_indices))] + table.append(row) + output_list_permutations.append(entry[0]) + for j in range(len(missing_data_indices)): + output_list_permutations[i] = ( + output_list_permutations[i][: missing_data_indices[j]] + + str(table[i][j]) + + output_list_permutations[i][missing_data_indices[j] + 1 :] + ) + del all_states[entry[0]] + + for perm in output_list_permutations: + if perm in all_states and all_states[perm] != entry[1]: + print("Clashing output values for entry:", perm) + all_states[perm] = "!" + else: + all_states[perm] = entry[1] + + for i in range(2**k): + state = bin(i)[2:].zfill(k) + if state not in all_states: + all_states[state] = "?" + + if verbose: + # Print a statement if there are any missing values '?' in the LUT. Else print a statement that the LUT is complete. + if "?" in all_states.values(): + print("The LUT is incomplete. Missing values are represented by '?'") + else: + print("The LUT is complete.") + + all_states = sorted(all_states.items(), key=lambda x: x[0]) + + return all_states diff --git a/docs/Canalization - BioModels - Look Up Table.ipynb b/docs/Canalization - BioModels - Look Up Table.ipynb new file mode 100644 index 0000000..7c76fbe --- /dev/null +++ b/docs/Canalization - BioModels - Look Up Table.ipynb @@ -0,0 +1,226 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# Tutorial - Plotting Look Up Table (LUT)\n", + "This tutorial shows how to plot Prime Implicants (F') and Two-Symbol (F'') schematas" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "from matplotlib.text import Text\n", + "from matplotlib.patches import Circle, Rectangle, RegularPolygon\n", + "from matplotlib.collections import PatchCollection" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from cana.datasets.bio import THALIANA #, DROSOPHILA, BUDDING_YEAST" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "N = THALIANA()\n", + "#N = DROSOPHILA()\n", + "#N = BUDDING_YEAST()\n", + "print(N)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "def plot_look_up_table(n):\n", + " # Init values from BooleanNode\n", + " k = n.k if n.k>=1 else 1\n", + " inputs = n.inputs if not n.constant else [n.name]\n", + " inputlabels = [n.network.get_node_name(i)[0] if n.network is not None else i for i in inputs]\n", + " LUT = n.look_up_table().sort_index(ascending=False)\n", + " # Count number of F in the LUT\n", + " n_fs = LUT.shape[0]\n", + " # Schemata Cell Width and spacing\n", + " cwidth = 60.\n", + " cxspace = 0\n", + " cyspace = 6\n", + " border = 1\n", + " sepcxspace = 21\n", + " sepcyspace = 15\n", + " dpi = 150.\n", + " # Margins\n", + " top, right, bottom, left, hs = 120, 25, 25, 60, 25\n", + " # Axes Width & Height\n", + " ax1width = ((k*(cwidth+cxspace))+sepcxspace+(cwidth))\n", + " ax1height = (n_fs*(cwidth+cyspace)-cyspace)\n", + " # Figure Width & Height\n", + " fwidth = (left + ax1width + hs + right)\n", + " fheight = (bottom + ax1height + top)\n", + " # Percentages for Axes location\n", + " _ax1w = ((ax1width*100) / fwidth) / 100\n", + " _ax1h = ((ax1height*100) / fheight) / 100\n", + " _bottom = ((bottom*100) / fheight) / 100\n", + " _left = ((left*100) / fwidth) / 100\n", + " _hs = ((hs*100) / fwidth) / 100\n", + " # Init Figure\n", + " fig = plt.figure(figsize=(fwidth/dpi,fheight/dpi), facecolor='w', dpi=dpi)\n", + " ax1 = fig.add_axes((_left,_bottom,_ax1w,_ax1h), aspect=1, label='LUT')\n", + "\n", + " ### LUT Plot ###\n", + "\n", + " yticks = []\n", + " patches = []\n", + " x,y = 0.,0.\n", + " #\n", + " for i,r in LUT.iterrows():\n", + " ins = str(r['In:'])\n", + " out = r['Out:']\n", + " x = 0.\n", + " xticks = []\n", + " for input in ins:\n", + " if input == '0':\n", + " facecolor = 'white'\n", + " textcolor = 'black'\n", + " elif input == '1':\n", + " facecolor = 'black'\n", + " textcolor = 'white' \n", + " text = '{label:s}'.format(label=input)\n", + " ax1.add_artist(Text(x+cwidth/2,y+cwidth/10*4, text=text, color=textcolor, va='center', ha='center',fontsize=14,family='serif'))\n", + " r = Rectangle((x,y), width=cwidth, height=cwidth, facecolor=facecolor, edgecolor='black')\n", + " patches.append(r)\n", + " xticks.append(x+cwidth/2)\n", + " x += cwidth + cxspace\n", + "\n", + " x += sepcxspace\n", + " r = Rectangle((x,y), width=cwidth, height=cwidth, facecolor='black' if (out==1) else 'white', edgecolor='black')\n", + " ax1.add_artist(Text(x-(sepcxspace/2)-(cxspace/2),y+cwidth/10*4, text=':', color='black', va='center', ha='center',fontsize=14,weight='bold',family='serif'))\n", + " ax1.add_artist(Text(x+(cwidth/2),y+cwidth/10*4, text=out, color='white' if (out==1) else 'black', va='center', ha='center',fontsize=14,family='serif'))\n", + " patches.append(r)\n", + " xticks.append(x+cwidth/2)\n", + " yticks.append(y+cwidth/2)\n", + " y += cwidth + cyspace\n", + "\n", + " #y += sepcyspace\n", + "\n", + " ax1.add_collection(PatchCollection(patches, match_original=True))\n", + " #\n", + " ax1.set_yticks(yticks)\n", + " ax1.set_yticklabels([r\"$f_{%d}$\"%(i+1) for i in range(n_fs)[::-1]], fontsize=14)\n", + " ax1.set_xticks(xticks)\n", + " ax1.set_xticklabels(inputlabels + ['%s'%(n.name)], rotation=90, fontsize=14)\n", + " #\n", + " ax1.xaxis.tick_top()\n", + " # Remove Tick\n", + " ax1.tick_params(which='major',pad=7)\n", + " for tic in ax1.xaxis.get_major_ticks():\n", + " tic.tick1On = tic.tick2On = False\n", + " for tic in ax1.yaxis.get_major_ticks():\n", + " tic.tick1On = tic.tick2On = False\n", + " # Remove Border\n", + " ax1.spines['top'].set_visible(False)\n", + " ax1.spines['right'].set_visible(False)\n", + " ax1.spines['bottom'].set_visible(False)\n", + " ax1.spines['left'].set_visible(False)\n", + " # Limits\n", + " ax1.set_xlim(-border,ax1width+border)\n", + " ax1.set_ylim(-border,ax1height+border)\n", + " #ax1.invert_yaxis() \n", + "\n", + " # FileName\n", + " filename = n.name\n", + " filename = filename.replace('/','_')\n", + " filename = filename.replace(',','_')\n", + " \n", + " ## Display\n", + " display(fig)\n", + " \n", + " plt.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAARQAAAF6CAYAAADYjqdTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAABcSAAAXEgFnn9JSAAAtAElEQVR4nO3dfVRU550H8O9FUBze5EUgGlQwWJEXQZCQDIZs9di6Sqh71q2l5hCq0cQ1jZucJtmzJ5U052x23Wg42tVYK9g12q2bmvQQYpNqsIvVoIIvo4mFBI3GF2gUhAExIM/+4c4NVGBw5rkvM/P9nDPnXGYe5/nd6+XLfX2uIoQQICKSwM/oAojIezBQiEgaBgoRScNAISJpGChEJA0DhYikYaAQkTQMFCKShoFCRNIwUIhIGgYKEUnDQCEiaRgoRCQNA4WIpGGgEJE0DBQikoaBQkTSMFBINx988AG+/e1vY/bs2UaXQhrxN7oA8h1Xr17FgQMHoCiK0aWQRriFQkTSMFCISBoGChFJw2Mo5NSIESOMLoE8BAOFnOKjm2i4GCg0LIqiICgoCJGRkS5/h91ux7Vr1yRWRWbDQCGnJkyYgIsXLyI3Nxfvv/++y9/zq1/9CsXFxRIrI7PhQVlyKisrC0II1NbWGl0KmRwDhZzKysoCAHz11Ve4ePGiwdWQmTFQyKnMzEx1mlspNBQeQyGnsrKyEBYWBgD49NNP8b3vfc+l70lPT8eaNWskVkZmowieEyQiSbiFYrCTJ0/id7/7HQDgpz/9qcHVELmHWygGc5xKVRQFt2/fNroc8hDNzc04e/YsAOCRRx4xuJpv8KAs6Ybjocizd+9ePProo/j2t79tdCn9cJeHdMPxUOQz2w4Gt1CISBpuobhI1qbm1atXpXwPkRkwUFzETXeiuzFQ3GS2fVgiIzFQXBQREYGWlhZ897vfxebNm13+nrfffhs/+clPJFZGZBwGiosyMzPxhz/8AX/+858xceJEl78nKipKYlVExuJZHhc57sA9f/48WltbjS2GyCQYKC7qewfusWPHDKyEyDy4y+MixxaKY+ChOXPmuPQ9sbGxyMvLk1madP/1X/8l5Xv+9Kc/SfkeT5aQkCDle+x2u5TvkY338rjh1KlTEEIgKioK48ePN7oczfj5+Uk7RS6E8On7lrx9WTJQyCk/P7l7xmb7JdCTty9L7vKQUxwUSZ7e3l6jS9AUt1CISBpuoUhQX1+P999/H+fOncPt27cxfvx4zJkzBzNnzjS6NCJdcQvFDbdv38bKlSuxbdu2AS/Bnzt3Lnbt2oXw8HADqiPSHwPFDU888QR27Ngx6P08iqJg5syZOHTokPSDcURmxEBxUU1NDR566CEoioIRI0bg7//+7/Hwww8jICAAJ0+exI4dO9DR0QFFUbBlyxYsW7bM6JJdFh8fDz8/P3zwwQd44IEHjC7Ho/3oRz+6p/Z9HwGbnp6OvLw8jBkzRpviZBDkkqefflooiiICAwPFgQMH7vq8oaFBxMbGCj8/P5Gbm2tAhfIoiiL8/PzEmTNnBvz8008/FeHh4SIiIkLnyjyPY1m6+ho9erRYuXKlaGtrM3pWBsTtcBcdPnwYiqLgqaeeGvBK1wceeAA/+9nP1CtpzXStgGy3b99Ga2sr72kaJiGEy6+uri68+eabmDlzJpqamoyelbvwLI+LLly4AACYN2/eoG3mz58PALh16xaampowbtw4XWoj86qqqrqn9kIIdHR04PLlyzh69Cj27NmD69evo6GhAT/4wQ/w0UcfaVSpa3gMxUUBAQHo7e3FiRMnkJqaOmCb3t5e+Pv7Q1EUfPLJJ/jWt76lc5VyOC4Xt9lsmDZt2l2fnzlzBqmpqaa7atMbtbe3Y+nSpXj77behKAo+/PBDUz1FgLs8LnL84owYMWLQNn3P7PAXjWQICQnBrl27kJSUBAD47//+b4Mr6o+BQuRh/P398eSTT0IIgcOHDxtdTj8MFCIP5BiP58qVKwZX0h8PyrqpuLgYQUFBbrdTFAX79++XWRp5sdDQUAB3jqmYCQPFTc5Ga3OMfTFUO/H/41qY3aZNmxAdHX3X+83Nzer0z372s2F9Fx8M754bN24AuHNMxUx4lsdF3j6uRV8yBwVyMOu8eorS0lI899xzSE5Ohs1mM7ocFbdQXHTu3DmjS9CVzL87nrA1Zma3b9/G1q1boSgKcnJyjC6nHwaKi9x5dIanKS8vN7oE+n+dnZ148skn8emnn0JRFCxevNjokvrhLo8JfPHFFygvL0dJSYnRpZDG/vd///ee2gsh0NnZiStXrqhXyn711VcAgNzcXPzxj3/UokyXMVAM8vXXX2PPnj0oKyvDRx99BCGEaY8rJCQkQFEU3m0sgbvHoxy/rgkJCaiursZ9990nqzQpuMujsxMnTqCsrAw7d+5Ub6Yz+1me8+fPQ1EUfP3110aX4hXc+Rs+atQoPP7441i7dq0phzFgoOjgxo0b2LlzJ7Zt24YTJ04A6L9SZWZmmm5fmLRRVFR0T+0VRYHFYkFkZCSmT5+ORx99FBERERpV5z7u8mjoo48+wrZt2/DOO+/g1q1b/UIkJSUFixcvxve//31MnjzZwCqdc3ZzIJEDt1Aku3jxIrZv347y8nJ88cUXAPpvjSiKgk2bNmHFihVGlUikGQaKBN3d3Xj33Xexbds27N+/H729vWqIBAQEID8/H8XFxcjPzwcADlrtwxzj6IwfP37IO9U9FQPFDTabDdu2bcPOnTtx/fp1AN9sjUyfPh3FxcX44Q9/iMjISCPLJBOZNGkS/Pz8cOrUqQF3H2/duoU///nPAIC0tDS9y3MbA8VF2dnZqK2tBfBNiERGRqKwsBDFxcVIT083sDptHD16VL0Gwl2PPPKIlO/xREMdtvzss8+Qnp4OPz8/9PT06FiVHAwUFzlu9vP398d3vvMdPPHEE3jssccQEBBgcGXaudcR2wejKIpH/rLoyVPPlTBQ3KAoCgICAhAeHo7w8HCvDhPAc1dy0g8DxUWJiYloaGjAzZs3sXPnTuzcuRMTJkxAUVERioqKEB8fb3SJ0hUUFJjyYioyEW2ezuEbDh48KJ544gkRHBwsFEXp98yVvLw88atf/Up0dHSo7R2f/+Y3vzGw6nvn7Lk8NHzOluXp06fVNp6IQ0C6wWq1ory8HFeuXMGWLVvw4IMPqs9Pqa6uRnFxMWJjY7F06dJ7vimMyBMxUCQIDg7Gk08+icOHD+P06dNYvXo1oqKiIISA3W7H9u3b8Td/8zdq+7a2NgOrJdIOA0WyadOmYf369bh06RLefvttzJs3D4qi9LsBcMWKFcjKysK6devUC52IvAHv5dHBpUuXUF5eju3bt6OxsRFA/1HLcnJy8IMf/ACrVq0yqsQh8V4eeRzLMisra8BByzs6OnD06FEoijLgI27/mtkGN2eg6Kyqqkq9YfDmzZvq+54wpiwDxX0yx+d1bPWaab1hoBjEMaRBWVkZ6urqTLdi9MVAkcfbBzdnoJiAY9ClDRs2GF3KgBx3TY8fPx7+/rx0yR2OZSmTmcY3ZqAQkTQ8y0NE0jBQiEgaBgoRScNAISJpGChEJA0DhYikYaAQkTQMFCKShoFCRNIwUIhIGgYKEUnDQCEiaRgoRCQNA0VHycnJSE5ONroMXfjSvGrBU5cfA4WIpGGgEJE0DBQikoaBQkTSMFCISBoGChHJY8DzlA1ntVoFAL689GW1WkVvb6/b60lvb69PritWq9XlZeaTo97LetASmZfdbh/wyXz3oqOjA8HBwZIq8iyuxoJPP2SlqanJ7ZXOzJqbm5GQkADA++cVuBMAMTExmnw3l9/w+HSgBAUFefVK0nfevH1etcblNzw8KEtE0jBQiEgaBgoRScNAISJpGChEJA0DhYikYaAQkTQMFCKShoFCRNIwUIhIGgYKEUnDQCEiaRgoRCQNA4WIpGGgEJE0DBQikoaBQkTSaB4o58+fx+rVq5GWlobQ0FD4+flBURQkJSVp3TUR6UzTISAPHz6MuXPnwm633/XZ9OnTteyaiAyg2RZKT08PlixZArvdjpCQEKxbtw4HDx6EzWaDzWZDaWmpVl2bSk9PD7Zu3Yq8vDxER0fDYrEgMTERK1euxJkzZ4wuTzpfm1+tnDp1CllZWVAUBY8++qjR5Qyf2w8vGcSePXvU53xs3rxZq25c4qjLbrdr2s+VK1dETk6OACAiIyPFqlWrxJo1a8Ts2bMFADFq1ChNl01TU5Nu8yqE8fNrt9ulzq/s7xuOW7duiZ/+9KciICBA7TsvL0+XvvvOr6s0C5Rly5YJAMLf31+0trZq1Y1L9FhJOjs7xcyZMwUAMW3aNNHc3Nzv840bNwoAQlEUsXv3bk1q0DNQzDC/nh4oR48eFSkpKQKASE9PZ6D0lZycLACIjIwMrbpwmR4rySuvvKL2U1NTM2CbefPmCQAiIiJCk9DVM1DMML+eHCjvvPOOGDFihAgNDRVvvvmmaGxsZKC89NJLTh9zGBERIbNLl2i9kty4cUOEhIQIACInJ2fQdnv37lVrKSkpkV6HXoFilvn15EB54403xLx588SFCxeEEEKcO3fOIwNF6kHZ06dPO22TkpIis0tTeu+999De3g4AeOyxxwZtN2fOHIwePRoAsGvXLl1q04Kvza8WlixZgvfffx9xcXFGl+IWqaeNS0tL8dprr+Hdd9/Fyy+/DAAoLy9HVlaW2mbMmDEyuxxUcnKyLv0MpLKyUp3uO+9/zd/fHxkZGTh06BDq6+vR0NCAxMREPUqUytfmVwtRUVFGlyCF1C2UyZMnIyUlBdeuXVPfKygoQEpKivq6//77ZXZpSidPnlSnJ0+ePGRbx7OHAcBms2lWk5Y8bX5ra2uRmZmJ8PBwLF26FJ2dnYbU4Y00ubCttrYWABAfH4/w8PC7Pv/jH/+Iqqoq1NTUoKamBi0tLcjLy8OBAwek1TDUNQ+Kokjr568JIVBfX6/+PG7cuCHb9/387NmzmtWlFU+b3/b2dixYsABXr14FAJSVlSEoKAgbNmzQvRZvJD1QhBA4ceIEAGDGjBkDtnn22Wf7/VXzJna7Hd3d3QDubOIHBgYO2T44OFidbmlp0bQ2LXja/FZXV6th4rB7924GiiTSA6WhoUE9QJeZmTlgm7lz5+If/uEf8OCDDyIgIAB5eXmyyzCMY94BOP3lAqAepASAtrY2TWrSkjfMb29vr9EleA3pgeLY3QEG30JZu3atOu3YmvFVQgh1WstdMbMwen5zc3MRHR2N5uZm9b1FixbpXoe3kn4vT11dnTo9WKB4s5CQEHW6q6vLafu+bfr+W0/hafMbGhqKiooKpKenIywsDEVFRf3+wJF7pG+hOAIlLi4OY8eOlf31phccHIyAgAB0d3ejp6cHXV1dQ+4K9L0Te6AD2GbnifObnZ2N48ePG9K3t5O+heL4j/LFrRPgzmb8lClT1J8vX748ZPu+n0+dOlWzurTia/NLQ5MaKI2NjeqRe18NFABIS0tTpz///PMh2zY2NqrTqampmtWkJV+bXxqc1EDpe/xksDM8vmD+/Pnq9LFjxwZt19PTo27RJSYmeuxVo542v8eOHeOFbRqRGijDOcPjC/Lz89XrLSoqKgZtt2/fPty8eRMAUFhYqEttWvCk+W1ra0N+fj7q6urQ2tqKsrIyvPjii4bU4o002UKJjY3FfffdJ/OrPUpoaCief/55AHeGwTxy5MiA7RwXU4WHh2P16tV6lSedJ83vwYMHB7ywjeSQGii+fkC2rxdeeEFdDsXFxfjLX/7S7/Of//zn2Lt3LwBg06ZNut00qRVfm18amNTTxn0vFvJ1FosFFRUVWLhwIY4cOYKkpCQUFhYiMjIS1dXV2L9/P0aOHIn169dj8eLFRpfrNk+Z39zcXMTExKCpqUl9zywXtm3duhU3btwA0P+2hIsXL+L1119Xf543b56hd9MPSc7QLK47fvy4roPICKHfmLJCCNHd3S22bNkiZs2aJaKiokRgYKBISEgQK1asEDabTdO+9R5TVghj53e4AyLV1NSIjIwMERYWJoqKigZtq/cQkBMnTnQ6QBkAUV5erkn/MgZYUoTocy20Tn75y1/il7/8JQCgs7MTNpsNISEhmDZtmtrmnXfe0ew4jOOSb7vdjqCgIE36MIPm5mbExMQA8P55BYCOjg714LCM+ZX9fWbXd35djQVNn8szmC+//BI1NTX93mtvb+/33q1bt/Qui4jcZMijSEtKSiDujGc76GvSpElGlEZEbuCzjYlIGgYKEUnDQCEiaRgoRCQNA4WIpGGgEJE0DBQikoaBQkTSMFCISBoGChFJY8i9PGbR0dFhdAma6jt/3j6vgLbzyOU3PIbcbWw0X3iglq+Tfbexr3E1Fnxyl8dqtRpdAmnIarXCYrG4/T0Wi8Un1xV35tknt1CEED4z0rnjv9eXtsosFou0+fWldcXBneXnk4FCRNrwyV0eItKGT57l8aXNWO7yuMeX1hUHt5afy6PRejCr1TqswYD58syX1WoVvb29bq8nvb294uGHHzZ8foxYfq7yyWMovvTX2lfxtLF7XI0Fn9zlcWhqavLqkcybm5uRkJBgdBlewdvXFeBOgDqekuAqnw6UoKAgr15JvHne9Obt64osPMtDRNIwUIhIGgYKEUnDQCEiaRgoRCQNA4WIpGGgEJE0DBQikoaBQkTSMFCISBoGChFJw0AhImkYKEQkDQOFiKRhoBCRNAwUIpKGgUJE0mgeKOfPn8fq1auRlpaG0NBQ+Pn5QVEUJCUlad01EelM0yEgDx8+jLlz58Jut9/12fTp07XsmogMoNkWSk9PD5YsWQK73Y6QkBCsW7cOBw8ehM1mg81mQ2lpqVZdm0pPTw+2bt2KvLw8REdHw2KxIDExEStXrsSZM2eMLk8TqampOHr0KIQQqKqqMrocj+Lx64vbDy8ZxJ49e9TnfGzevFmrblziqMtut2vaz5UrV0ROTo4AICIjI8WqVavEmjVrxOzZswUAMWrUKE2XTVNTk67PcwkICBAlJSXi1q1bag1VVVWGPFtGxv+t3W7XbV0Rwvj1pe/8ukqzQFm2bJkAIPz9/UVra6tW3bhEj5Wks7NTzJw5UwAQ06ZNE83Nzf0+37hxowAgFEURu3fv1qQGPQMlMzNTnDp1SgghRF1dnVoDA2V4zLC+mDpQkpOTBQCRkZGhVRcu02MleeWVV9R+ampqBmwzb948AUBERERoErp6BUpBQYHo7u4Wra2tYvny5WLSpElqDQyU4THD+mK6QHnppZec/kdHRETI7NIlWq8kN27cECEhIQKAyMnJGbTd3r171VpKSkqk16FXoDz77LOisrJS3H///QKAmDhxoloDA8U5s6wvMgJF6kHZ06dPO22TkpIis0tTeu+999De3g4AeOyxxwZtN2fOHIwePRoAsGvXLl1q08Jbb72F+fPn48svvzS6FI/kTeuL1EApLS2FzWbDq6++qr5XXl6untmx2WzYuXOnzC5NqbKyUp3OysoatJ2/vz8yMjIAAPX19WhoaNC8Ni1cu3bN6BI8mjetL1KvQ5k8eTIAYNu2bep7BQUFCA8Pl9nNsCQnJ+vep8PJkyfVaccyGUxCQgIOHToEALDZbEhMTNS0NjIfb1pfNLkOpba2FgAQHx9/V5h0dHTgt7/9LYqKipCSkoLg4GCEhITgoYcewptvvone3l4tStKNEAL19fXqz+PGjRuyfd/Pz549q1ld9I3a2lpkZmYiPDwcS5cuRWdnp2G1eNv6Iv1KWSEETpw4AQCYMWPGXZ/v2LEDTz/9NIA7WxHf+c53cO3aNXz88cf4+OOP8d577+Hdd9+Fv797pQ11EZCiKG5991Dsdju6u7sB3NlEDQwMHLJ9cHCwOt3S0qJZXXRHe3s7FixYgKtXrwIAysrKEBQUhA0bNhhSj7etL9K3UBoaGtQDTJmZmXd9HhAQgKeffhoNDQ04ffo0fvvb3+LAgQOw2WyYMGECKisrsWXLFtll6cYx7wCcrhwA1INsANDW1qZJTfSN6upqNUwcdu/ebVA13re+SA8Ux+4OMPAWyo9+9CNs2rQJDzzwQL/3ExMT8W//9m8AgP/5n/+RXZZpCSHUaS23nGhwnrSbbfb1RXqg1NXVqdMDBcpQC8Fxw+Dly5dll6WbkJAQdbqrq8tp+75t+v5b0kZubi6io6P7vbdo0SKDqvG+9UWzQImLi8PYsWPv6d82NjYCAGJjY2WXpZvg4GAEBAQAuHOjl7OVpO+d2EacDfM1oaGhqKioQHp6OsLCwlBUVIS1a9caVo+3rS/SA+X48eMABt46cWbjxo0AgPz8fKk16UlRFEyZMkX92dnWVt/Pp06dqlld9I3s7GwcP34cra2t2L59O4KCggyrxdvWF6mB0tjYqB55vtdAKSsrw4cffogJEyaoZ4E8VVpamjr9+eefD9nWsVUG3Lntn3yPN60vUgOl7/GTgc7wDObjjz/GqlWrEBAQgB07dvQ7NeaJ5s+fr04fO3Zs0HY9PT3qFl1iYqLpLlIifXjT+iI1UJyd4RlIfX098vPz0dXVhbKyMjzyyCMySzJEfn6+GooVFRWDttu3bx9u3rwJACgsLNSlNrrzS2uWC9sAL1tf5NyneMfcuXMFABEbGzus9pcuXRKTJk0SAMS6detkljIk6HAH6Zo1a4Z9O3p4eLhoaWmRXoPeAyw5Xma+2/jGjRsiNja2X9tVq1YN2FbP4QvMsL6YbviCsWPHCgDib//2b522vX79ukhNTRUAxAsvvCCzDKf0WEk6OjrEjBkzBDD0gDkAxK9//WtNamCg3K2ysvKuttHR0QO21TNQzLC+yAgUqZfeNzc3D6vdzZs3kZ+fD5vNhqKiIvWCNm9isVhQUVGBhQsX4siRI0hKSkJhYSEiIyNRXV2N/fv3Y+TIkVi/fj0WL15sdLluW7ZsGcLCwgD0P50ZFxeH559/Xv157969+OSTT3Svz+y8Zn2RGHDD0t3dLRYsWCAAiAULFoju7m69S9Dtr44Qd+Z3y5YtYtasWSIqKkoEBgaKhIQEsWLFCmGz2TTtW88tlHPnzg2rpqKiIkO3UG7cuCFiYmL6tf3Hf/zHAdvqPaasEMauLzK2UBQh+lzLq4M33ngDzz33HADg7/7u7/rdm9DXW2+9pVkNjqt17Xa7odcgaK25uRkxMTFGl2GIof5vjxw5gqeeegqNjY343ve+h//8z/8csG1HR4d6sNTb1xWg//y6GguaPpdnIDdu3FCn9+zZM2g7LQOFfFt2dna/SxxIHt0fRVpSUgJx52DwkC8i8jx8tjERScNAISJpGChEJA0DhYikYaAQkTQMFCKShoFCRNIwUIhIGgYKEUnDQCEiaXS/l8dMOjo6jC5BU94+f3ryhWUpYx59OlB89U5cundcV4bHJ3d5rFar0SWQhqxWKywWi9vfY7FYfHJdcWeedR8PxQyEEIYPTKwXx3+vGR9bqRWLxSJtfn1pXXFwZ/n5ZKAQkTZ8cpeHiLThkwdlfWkzlrs87vGldcXBreXn8mi0HsxqtRryaAe+9HlZrVbR29vr9nrS29srHn74YcPnx4jl5yqfPIbiS3+tfZWMQaX7Dtrsa1yNBZ/c5fFFTU1NPjFqu1bXi3D5DQ8DxUcEBQV5/S+Elrj8hodneYhIGgYKEUnDQCEiaRgoRCQNA4WIpGGgEJE0DBQikoaBQkTSMFCISBoGChFJw0AhImkYKEQkDQOFiKRhoBCRNAwUIpKGgUJE0jBQiEgaTQPl/PnzWL16NdLS0hAaGgo/Pz8oioKkpCQtuyUig2g2BOThw4cxd+5c2O32uz6bPn26Vt0SkYE0CZSenh4sWbIEdrsdISEhKCkpwYMPPoiwsDAAQFRUlBbdEpHBNNnlqaioQGNjIwBg7dq1eO6552C1WpGSkoKUlBTExsZq0a2ppaam4ujRoxBCoKqqyuhyNNPT04OtW7ciLy8P0dHRsFgsSExMxMqVK3HmzBmjyzM9j19+bj8NaQDLli0TAIS/v79obW3Vogu3QMeHJgUEBIiSkhJx69Yttf+qqirdH95kt9s1X65XrlwROTk5AoCIjIwUq1atEmvWrBGzZ88WAMSoUaPE5s2bNevfbrdLnV/Z3+eMmZafqzQJlOTkZAFAZGRkaPH1btPrlzgzM1OcOnVKCCFEXV2d2r83BkpnZ6eYOXOmACCmTZsmmpub+32+ceNGAUAoiiJ2796tSQ2eHChmW36ukhYoL730ktOVOiIiQlZ3btHjF7igoEB0d3eL1tZWsXz5cjFp0iS1f28MlFdeeUXtq6amZsA28+bNU9cDLbZcPTlQzLb8XCXtGMrp06edtklJSZHVnelNmjQJH374IVJSUvCLX/zC5Uc7eoK2tja8/vrrAICcnBxkZ2cP2O7HP/4xAOD69esoLS3VqzzT86rlJyvdPvvsM2Gz2cSrr76qplx5ebmw2Wzq6+LFi7K6cwsk/MV39oqMjOz388SJE9X+vW0LZefOnWo///qv/zpou+7ubjF69GgBQEyZMkV6HZ66hWLG5ecqaaeNJ0+eDADYtm2b+l5BQQHCw8NldXFPkpOTDenX4dq1a4b2r6fKykp1Oisra9B2/v7+yMjIwKFDh1BfX4+GhgYkJibqUaKpedPyk37auLa2FgAQHx8/YJi89tpryM/PR3x8PIKDgzF69GgkJSXhJz/5iU/9EnqTkydPqtOOPyyDSUhIUKdtNptmNQ2ltrYWmZmZCA8Px9KlS9HZ2WlIHQ6etvyGIvXCNiEETpw4AQCYMWPGgG1efvlljBo1CikpKcjIyEBnZyfq6urw+uuv4ze/+Q3+9Kc/IS4uzu1ahjpnryiK299PdwghUF9fr/48bty4Idv3/fzs2bOa1TWY9vZ2LFiwAFevXgUAlJWVISgoCBs2bNC9FsDzlp8zUrdQGhoa0N7eDgDIzMwcsM2+fftw/fp11NTUYM+ePfj973+PCxcu4PHHH8fFixfxL//yLzJLIo3Z7XZ0d3cDuLNJHhgYOGT74OBgdbqlpUXT2gZSXV2thonD7t27da/DwdOWnzNSA8WxuwMMvoXy6KOPYtSoUf3eCwwMxGuvvQYAOHDggMySSGOOPyAAnP4yAMDo0aPV6ba2Nk1qule9vb2G9e0Ny68vqYFSV1enTg8WKIMZMWIEAGDkyJEySyKTEX1Onxux65mbm4vo6Oh+7y1atEj3Olxl9PJzRpNAiYuLw9ixY4f977q7u1FSUgIAmDdvnsySSGMhISHqdFdXl9P2fdv0/bd6CQ0NRUVFBdLT0xEWFoaioiKsXbtW9zocPG35OSP1oOzx48cBDG/r5J/+6Z/wl7/8BTdu3EBdXR0uX76M3NxcvPrqqzJLIo0FBwcjICAA3d3d6OnpQVdX15Cb7n2HszDqkoLs7Gx1XTWaJy6/oUgLlMbGRvUg0XAC5Z133sEXX3yh/jxr1izs2LEDY8aMkVUS6UBRFEyZMkU9q3b58uV+pzb/2uXLl9XpqVOnal6f2Xnb8pO2y9P3+MlgZ3j6On/+PIQQuHr1Kvbs2YOrV68iNTUVH330kaySSCdpaWnq9Oeffz5kW8ewFsCdIR3Iu5aftEAZzhmegcTExGDhwoX44IMP0Nvbi+LiYnz99deyyiIdzJ8/X50+duzYoO16enrUXY3ExETDrvI8duyYqS5s87TlNxTpWyixsbG477777vnfx8fHIycnBxcuXDDlFYA0uPz8fPX6iIqKikHb7du3Dzdv3gQAFBYW6lLbX2tra0N+fj7q6urQ2tqKsrIyvPjii4bU4uBJy88ZaYFyLwdkB2OxWAAAX331lZSaSB+hoaF4/vnnAdwZS/jIkSMDtnNcjRoeHo7Vq1frVV4/Bw8eNNWFbYBnLT+npNymKEFnZ6eIjY0VAERDQ4OmfUHnO33h5XcbCyFER0eHmDFjhgCGHiAIgPj1r3+tSQ3DuTu4srLyrmUTHR3t8vfJYrbl5yrNRr0fyAcffIDOzk4UFBTAz++bjaNr165h5cqVuHr1Kh566CE88MADepalmWXLlqkDc/c9xRcXF6f+RQKAvXv34pNPPtG9PpksFgsqKiqwcOFCHDlyBElJSSgsLERkZCSqq6uxf/9+jBw5EuvXr8fixYsNqzM3NxcxMTFoampS3zPDhW2esvyckhhwTr3xxhsCgIiJiRHf/e53xaJFi0Rubq4IDg4WAMSECRPEZ599pnkd0Gmr4Ny5c8Oqp6ioyOO3UBy6u7vFli1bxKxZs0RUVJQIDAwUCQkJYsWKFcJms2na93C3KGpqakRGRoYICwsTRUVFg7bVe0xZIcyz/FylCKHfUGL19fXYtm0bqqqq8MUXX+D69esICgrC1KlTkZ+fj2eeeQahoaGa12HGS5a1ZrfbERQUZHQZmuro6FAPbsqYX9nfZ3Z959fVWNA1UMyCgeKdGCjukREofLYxEUnDQCEiaRgoRCQNA4WIpGGgEJE0DBQikoaBQkTSMFCISBoGChFJw0AhImkYKEQkja7DF5BxOjo6jC5Bc1rOI5ff8DBQfERMTIzRJXg0Lr/h8cldHqvVanQJpCGr1aoOJ+oOi8Xik+uKO/Psk8MXCCEMH+lcL47/Xl8assFisUibX19aVxzcWX4+GShEpA2f3OUhIm345EFZX9qM5S6Pe3xpXXFwa/m5Maatx7Jarbo/xoIv/V5Wq1X09va6vZ709vaKhx9+2PD5MWL5uconj6H40l9rXyV7TFlf42os+OQuD9G9ampq8olBqt293oaBQjQMQUFBXh8oMvAsDxFJw0AhImkYKEQkDQOFiKRhoBCRNAwUIpKGgUJE0jBQiEgaBgoRScNAISJpGChEJA0DhYikYaAQkTQMFCKShoFCRNIwUIhIGgYKEUmjaaCcP38eq1evRlpaGkJDQ+Hn5wdFUZCUlKRlt0RkEM2GgDx8+DDmzp0Lu91+12fTp0/XqlsiMpAmWyg9PT1YsmQJ7HY7QkJCsG7dOhw8eBA2mw02mw2lpaVadGtqqampOHr0KIQQqKqqMrocTfnSvMrW09ODrVu3Ii8vD9HR0bBYLEhMTMTKlStx5swZo8tzzu2Hlwxgz5496jM+Nm/erEUXboGOzzgJCAgQJSUl4tatW2r/VVVVhj97xdvn1W63u72e2O12qd/nzJUrV0ROTo4AICIjI8WqVavEmjVrxOzZswUAMWrUKE1/n/rOr6s0CZRly5YJAMLf31+0trZq0YVb9FqpMzMzxalTp4QQQtTV1an9e2OgmG1ePS1QOjs7xcyZMwUAMW3aNNHc3Nzv840bNwoAQlEUsXv3bk1qMG2gJCcnCwAiIyNDi693mx4rdEFBgeju7hatra1i+fLlYtKkSWr/3hYoZpxXTwuUV155Re2rpqZmwDbz5s0TAERERIQmf6hlBIq0Yyj//M//DEVRoCiKuq93/Phx9T1FURAZGSmrO9ObNGkSPvzwQ6SkpOAXv/iFy09i8wS+NK9aaGtrw+uvvw4AyMnJQXZ29oDtfvzjHwMArl+/btrjkNIC5fTp007bpKSkyOrO9N566y3Mnz8fX375pdGlaM6X5lUL7733Htrb2wEAjz322KDt5syZg9GjRwMAdu3apUtt90raaePS0lK89tprePfdd/Hyyy8DAMrLy5GVlaW2GTNmjKzunEpOTtatr4Fcu3bN0P715EvzqoXKykp1uu/vy1/z9/dHRkYGDh06hPr6ejQ0NCAxMVGPEodN2hbK5MmTkZKS0m/lKigoQEpKivq6//77ZXVH5LLa2lpkZmYiPDwcS5cuRWdnp6H1nDx5Up2ePHnykG0TEhLUaZvNpllNrpJ+YVttbS0AID4+HuHh4U7bHz58GFarFUIIPPvss9L2DYc6Z68oipQ+yPO0t7djwYIFuHr1KgCgrKwMQUFB2LBhgyH1CCFQX1+v/jxu3Lgh2/f9/OzZs5rV5SqpF7YJIXDixAkAwIwZM5y27+npwVNPPSWzBKIhVVdXq2HisHv3boOqAex2O7q7uwHc2aUJDAwcsn1wcLA63dLSomltrpAaKA0NDerBpczMTKftS0tLcerUKRQXF8ssg+ie9Pb2Gta34/cFgNMwAaAelAXunB0yG6mB4tjdAZxvoVy8eBElJSV4/PHHMWvWLJllEA0qNzcX0dHR/d5btGiRQdXcu76n5M246y41UOrq6tRpZ4HyzDPPwN/fH//xH/8hswSiIYWGhqKiogLp6ekICwtDUVER1q5da1g9ISEh6nRXV5fT9n3b9P23ZiH1oKwjUOLi4jB27NhB21VUVOB3v/sdNmzYgJiYGJklEDmVnZ2N48ePG10GgDvHRAICAtDd3Y2enh50dXUNuevT9+794Zz00JvULRTHf9JQWyednZ145plnkJ6ejpUrV8rsnsjjKIqCKVOmqD9fvnx5yPZ9P586dapmdblKWqA0NjaqR52HCpSSkhJcuHABmzZtwogRI2R1T+Sx0tLS1OnPP/98yLaNjY3qdGpqqmY1uUpaoPQ9fjLYGZ7Tp0/jjTfewBNPPIGHHnpIVtdE9+TYsWOmurBt/vz56vSxY8cGbdfT06PuBSQmJpruKllAYqA4O8MjhMBTTz2FkJAQ/Pu//7usbonuSVtbG/Lz81FXV4fW1laUlZXhxRdfNLSm/Px89fqSioqKQdvt27cPN2/eBAAUFhbqUts9k3HbsxBCzJ07VwAQsbGxA37e0tIiAIiYmBiRl5fX7/Wtb31LABDjx48XeXl54tlnn5VV1oBgwO30EydOVPv3tuELzDivgw03UFlZeVfb6OjoAdvqOXzBmjVr1L6cDV8QHh4uWlpapNcgY/gCaWd5hnNAFgCamprQ1NQ04GeXLl3CpUuXZJVE5DFeeOEFVFRUoK6uDsXFxThw4EC/M6U///nPsXfvXgDApk2bdL3R9l5IC5Tm5uYhPx8zZsyg42Rs374dxcXFUu/lMYNly5YhLCwMQP9TfHFxcXj++efVn/fu3YtPPvlE9/pk8pR5zc3NRUxMTL8/ama4sM1isaCiogILFy7EkSNHkJSUhMLCQkRGRqK6uhr79+/HyJEjsX79eixevNjocgcnb4PJdeXl5QKA5rs6DtBps/vcuXPDqqeoqMjw3RRvm9ehdlFqampERkaGCAsLE0VFRYO21XtMWSGE6O7uFlu2bBGzZs0SUVFRIjAwUCQkJIgVK1YIm82mad+m2uWhu8XHxxtdgm48aV6zs7P7nZU0E39/fyxfvhzLly83uhSX8MmBRCSNIoTvDQBqxpuqSC673Y6goCC3vqOjo0M9nSvj+8yu7/y6GgvcQiEiaRgoRCQNA4WIpGGgEJE0DBQikoaBQkTSMFCISBoGChFJw0AhImkYKEQkDW8OJBqGjo4Oo0vQnIx5ZKAQDQMf9zI8PrnLY7VajS6BNGS1WmGxWNz+HovF4pPrijvz7JN3GxORNnxyC4WItMFAISJpGChEJA0DhYikYaAQkTQMFCKShoFCRNIwUIhIGgYKEUnDQCEiaRgoRCQNA4WIpGGgEJE0DBQikub/AO7n3ZRUGh/6AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "node = N.nodes[2]\n", + "plot_look_up_table(node)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/helpers/helper.py b/tests/helpers/helper.py index e57a796..396e0dc 100644 --- a/tests/helpers/helper.py +++ b/tests/helpers/helper.py @@ -42,7 +42,7 @@ def expandTs(ts): obsSet = set() # for each schema and its symmetries for t, g in zip(tss, perms): - if type(t) == str: + if isinstance(t, str): t = list(t) # for each subset of indices that can be permuted x = [] diff --git a/tests/test_boolean_canalization.py b/tests/test_boolean_canalization.py index 4fb4083..e374b20 100644 --- a/tests/test_boolean_canalization.py +++ b/tests/test_boolean_canalization.py @@ -4,10 +4,11 @@ # These tests were hand calculated by Luis M. Rocha and implemented by Rion B. Correia. # Checks were made with the online tool: http://www.mathematik.uni-marburg.de/~thormae/lectures/ti1/code/qmc/ # -from cana.canalization.boolean_canalization import * -from cana.canalization.cboolean_canalization import * +# from cana.canalization.boolean_canalization import * +from cana.canalization.cboolean_canalization import find_implicants_qm from cana.cutils import outputs_to_binstates_of_given_type -from helper import * +from helpers.helper import reorderTwoSymbolOutput, randNode, enumerateImplicants, expandPi +from cana.canalization.boolean_canalization import find_two_symbols_v2 def test_AND(): """Test Canalization - AND (k=2, outputs=[0,0,0,1])""" diff --git a/tests/test_boolean_network.py b/tests/test_boolean_network.py index 90f2b94..8590804 100644 --- a/tests/test_boolean_network.py +++ b/tests/test_boolean_network.py @@ -1,5 +1,3 @@ -from cana.boolean_network import BooleanNetwork -import networkx as nx from cana.datasets.bio import THALIANA def test_EG_weight_THALIANA(): diff --git a/tests/test_boolean_node.py b/tests/test_boolean_node.py index 5b9a1ec..f306f3c 100644 --- a/tests/test_boolean_node.py +++ b/tests/test_boolean_node.py @@ -4,42 +4,62 @@ # These tests were manually calculated by Luis M. Rocha and implemented by Rion B. Correia. # from cana.datasets.bools import CONTRADICTION, AND, OR, XOR, COPYx1, RULE90, RULE110 -from cana.utils import * +from cana.utils import isclose, fill_out_lut from cana.boolean_node import BooleanNode -import numpy as np # # Test Input Redundancy # + def test_input_redundancy_constant(): """Test Input Redundancy - constant""" n = BooleanNode(k=1, outputs=list("00")) k_r, true_k_r = n.input_redundancy(norm=False), 1 - assert (k_r == true_k_r), ('Input Redundancy (mean) for CONSTANT node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean) for CONSTANT node does not match. %s != %s" + % (k_r, true_k_r) + ) k_r, true_k_r = n.input_redundancy(norm=True), 1 - assert (k_r == true_k_r), ('Input Redundancy (mean, normed) for CONSTANT node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean, normed) for CONSTANT node does not match. %s != %s" + % (k_r, true_k_r) + ) + def test_input_redundancy_identity(): """Test Input Redundancy - identity""" n = BooleanNode(k=1, outputs=list("01")) k_r, true_k_r = n.input_redundancy(norm=False), 0 - assert (k_r == true_k_r), ('Input Redundancy (mean) for identity node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean) for identity node does not match. %s != %s" + % (k_r, true_k_r) + ) k_r, true_k_r = n.input_redundancy(norm=True), 0 - assert (k_r == true_k_r), ('Input Redundancy (mean, normed) for identity node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean, normed) for identity node does not match. %s != %s" + % (k_r, true_k_r) + ) + # AND def test_input_redundancy_AND(): """Test Input Redundancy - AND""" n = AND() k_r, true_k_r = n.input_redundancy(norm=False), (3 / 4) - assert (k_r == true_k_r), ('Input Redundancy (mean) for AND node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean) for AND node does not match. %s != %s" + % (k_r, true_k_r) + ) k_r, true_k_r = n.input_redundancy(norm=True), (3 / 4) / 2 - assert (k_r == true_k_r), ('Input Redundancy (mean, normed) for AND node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean, normed) for AND node does not match. %s != %s" + % (k_r, true_k_r) + ) # OR @@ -47,10 +67,15 @@ def test_input_redundancy_OR(): """Test Input Redundancy - OR""" n = OR() k_r, true_k_r = n.input_redundancy(norm=False), 3 / 4 - assert (k_r == true_k_r), ('Input Redundancy (mean) for OR node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean) for OR node does not match. %s != %s" % (k_r, true_k_r) + ) k_r, true_k_r = n.input_redundancy(norm=True), (3 / 4) / 2 - assert (k_r == true_k_r), ('Input Redundancy (mean, normed) for OR node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean, normed) for OR node does not match. %s != %s" + % (k_r, true_k_r) + ) # XOR @@ -58,32 +83,50 @@ def test_input_redundancy_XOR(): """Test Input Redundancy - XOR""" n = XOR() k_r, true_k_r = n.input_redundancy(norm=False), 0 - assert (k_r == true_k_r), ('Input Redundancy (mean) for XOR node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean) for XOR node does not match. %s != %s" + % (k_r, true_k_r) + ) k_r, true_k_r = n.input_redundancy(norm=True), 0 - assert (k_r == true_k_r), ('Input Redundancy (mean, normed) for XOR node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (mean, normed) for XOR node does not match. %s != %s" + % (k_r, true_k_r) + ) # CONTRADICTION def test_input_redundancy_CONTRADICTION(): """Test Input Redundancy - CONTRADICTION""" n = CONTRADICTION() - k_r, true_k_r = n.input_redundancy(norm=False), 2. - assert (k_r == true_k_r), ('Input Redundancy (mean) for CONTRADICTION node does not match. %s != %s' % (k_r, true_k_r)) + k_r, true_k_r = n.input_redundancy(norm=False), 2.0 + assert k_r == true_k_r, ( + "Input Redundancy (mean) for CONTRADICTION node does not match. %s != %s" + % (k_r, true_k_r) + ) - k_r, true_k_r = n.input_redundancy(norm=True), 1. - assert (k_r == true_k_r), ('Input Redundancy (mean, normed) for CONTRADICTION node does not match. %s != %s' % (k_r, true_k_r)) + k_r, true_k_r = n.input_redundancy(norm=True), 1.0 + assert k_r == true_k_r, ( + "Input Redundancy (mean, normed) for CONTRADICTION node does not match. %s != %s" + % (k_r, true_k_r) + ) # COPYx1 def test_input_redundancy_COPYx1(): """Test Input Redundancy - COPYx1""" n = COPYx1() - k_r, true_k_r = n.input_redundancy(norm=False), 1. - assert (k_r == true_k_r), ('Input Redundancy (upper) for COPYx1 node does not match. %s != %s' % (k_r, true_k_r)) + k_r, true_k_r = n.input_redundancy(norm=False), 1.0 + assert k_r == true_k_r, ( + "Input Redundancy (upper) for COPYx1 node does not match. %s != %s" + % (k_r, true_k_r) + ) k_r, true_k_r = n.input_redundancy(norm=True), 1 / 2 - assert (k_r == true_k_r), ('Input Redundancy (upper, normed) for COPYx1 node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (upper, normed) for COPYx1 node does not match. %s != %s" + % (k_r, true_k_r) + ) # RULE 90 @@ -91,10 +134,16 @@ def test_input_redundancy_RULE90(): """Test Input Redundancy - RULE90""" n = RULE90() k_r, true_k_r = n.input_redundancy(norm=False), 8 / 8 - assert (k_r == true_k_r), ('Input Redundancy (upper) for RULE90 node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (upper) for RULE90 node does not match. %s != %s" + % (k_r, true_k_r) + ) k_r, true_k_r = n.input_redundancy(norm=True), (8 / 8) / 3 - assert (k_r == true_k_r), ('Input Redundancy (upper, normed) for RULE90 node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (upper, normed) for RULE90 node does not match. %s != %s" + % (k_r, true_k_r) + ) # RULE 110 @@ -102,145 +151,255 @@ def test_input_redundancy_RULE110(): """Test Input Redundancy - RULE110""" n = RULE110() k_r, true_k_r = n.input_redundancy(norm=False), 7 / 8 - assert (k_r == true_k_r), ('Input Redundancy (upper) for RULE110 node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (upper) for RULE110 node does not match. %s != %s" + % (k_r, true_k_r) + ) k_r, true_k_r = n.input_redundancy(norm=True), (7 / 8) / 3 - assert (k_r == true_k_r), ('Input Redundancy (upper, normed) for RULE110 node does not match. %s != %s' % (k_r, true_k_r)) + assert k_r == true_k_r, ( + "Input Redundancy (upper, normed) for RULE110 node does not match. %s != %s" + % (k_r, true_k_r) + ) # # Test Edge Redundancy # + # AND def test_edge_redundancy_AND(): """Test Edge Redundancy - AND""" n = AND() - r_ji, true_r_ji = n.edge_redundancy(bound='upper'), [1 / 2., 1 / 2] - assert (r_ji == true_r_ji), ('Edge Redundancy (upper) for AND node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='mean'), [3 / 8., 3 / 8] - assert (r_ji == true_r_ji), ('Edge Redundancy (mean) for AND node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='lower'), [1 / 4., 1 / 4] - assert (r_ji == true_r_ji), ('Edge Redundancy (lower) for AND node does not match. %s != %s' % (r_ji, true_r_ji)) + r_ji, true_r_ji = n.edge_redundancy(bound="upper"), [1 / 2.0, 1 / 2] + assert r_ji == true_r_ji, ( + "Edge Redundancy (upper) for AND node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="mean"), [3 / 8.0, 3 / 8] + assert r_ji == true_r_ji, ( + "Edge Redundancy (mean) for AND node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="lower"), [1 / 4.0, 1 / 4] + assert r_ji == true_r_ji, ( + "Edge Redundancy (lower) for AND node does not match. %s != %s" + % (r_ji, true_r_ji) + ) # - r_ji, true_r_ji = n.edge_redundancy(bound='tuple'), [(0.25, 0.5), (0.25, 0.5)] - assert (r_ji == true_r_ji), ('Edge Redundancy (tuples) for AND node does not match. %s != %s' % (r_ji, true_r_ji)) + r_ji, true_r_ji = n.edge_redundancy(bound="tuple"), [(0.25, 0.5), (0.25, 0.5)] + assert r_ji == true_r_ji, ( + "Edge Redundancy (tuples) for AND node does not match. %s != %s" + % (r_ji, true_r_ji) + ) # OR def test_edge_redundancy_OR(): """Test Edge Redundancy - OR""" n = OR() - r_ji, true_r_ji = n.edge_redundancy(bound='upper'), [1 / 2., 1 / 2] - assert (r_ji == true_r_ji), ('Edge Redundancy (upper) for OR node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='mean'), [3 / 8., 3 / 8] - assert (r_ji == true_r_ji), ('Edge Redundancy (mean) for OR node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='lower'), [1 / 4., 1 / 4] - assert (r_ji == true_r_ji), ('Edge Redundancy (lower) for OR node does not match. %s != %s' % (r_ji, true_r_ji)) - - r_ji, true_r_ji = n.edge_redundancy(bound='tuple'), [(0.25, 0.5), (0.25, 0.5)] - assert (r_ji == true_r_ji), ('Edge Redundancy (tuples) for OR node does not match. %s != %s' % (r_ji, true_r_ji)) + r_ji, true_r_ji = n.edge_redundancy(bound="upper"), [1 / 2.0, 1 / 2] + assert r_ji == true_r_ji, ( + "Edge Redundancy (upper) for OR node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="mean"), [3 / 8.0, 3 / 8] + assert r_ji == true_r_ji, ( + "Edge Redundancy (mean) for OR node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="lower"), [1 / 4.0, 1 / 4] + assert r_ji == true_r_ji, ( + "Edge Redundancy (lower) for OR node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + + r_ji, true_r_ji = n.edge_redundancy(bound="tuple"), [(0.25, 0.5), (0.25, 0.5)] + assert r_ji == true_r_ji, ( + "Edge Redundancy (tuples) for OR node does not match. %s != %s" + % (r_ji, true_r_ji) + ) # XOR def test_edge_redundancy_XOR(): """Test Edge Redundancy - XOR""" n = XOR() - r_ji, true_r_ji = n.edge_redundancy(bound='upper'), [0, 0] - assert (r_ji == true_r_ji), ('Edge Redundancy (upper) for XOR node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='mean'), [0, 0] - assert (r_ji == true_r_ji), ('Edge Redundancy (mean) for XOR node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='lower'), [0, 0] - assert (r_ji == true_r_ji), ('Edge Redundancy (lower) for XOR node does not match. %s != %s' % (r_ji, true_r_ji)) - - r_ji, true_r_ji = n.edge_redundancy(bound='tuple'), [(0.0, 0.0), (0.0, 0.0)] - assert (r_ji == true_r_ji), ('Edge Redundancy (tuples) for XOR node does not match. %s != %s' % (r_ji, true_r_ji)) + r_ji, true_r_ji = n.edge_redundancy(bound="upper"), [0, 0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (upper) for XOR node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="mean"), [0, 0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (mean) for XOR node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="lower"), [0, 0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (lower) for XOR node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + + r_ji, true_r_ji = n.edge_redundancy(bound="tuple"), [(0.0, 0.0), (0.0, 0.0)] + assert r_ji == true_r_ji, ( + "Edge Redundancy (tuples) for XOR node does not match. %s != %s" + % (r_ji, true_r_ji) + ) # CONTRADICTION def test_edge_redundancy_CONTRADICTION(): """Test Edge Redundancy - CONTRADICTION""" n = CONTRADICTION() - r_ji, true_r_ji = n.edge_redundancy(bound='upper'), [1., 1.] - assert (r_ji == true_r_ji), ('Edge Redundancy (upper) for CONTRADICTION node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='mean'), [1., 1.] - assert (r_ji == true_r_ji), ('Edge Redundancy (mean) for CONTRADICTION node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='lower'), [1., 1.] - assert (r_ji == true_r_ji), ('Edge Redundancy (lower) for CONTRADICTION node does not match. %s != %s' % (r_ji, true_r_ji)) - - r_ji, true_r_ji = n.edge_redundancy(bound='tuple'), [(1.0, 1.0), (1.0, 1.0)] - assert (r_ji == true_r_ji), ('Edge Redundancy (tuples) for CONTRADICTION node does not match. %s != %s' % (r_ji, true_r_ji)) + r_ji, true_r_ji = n.edge_redundancy(bound="upper"), [1.0, 1.0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (upper) for CONTRADICTION node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="mean"), [1.0, 1.0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (mean) for CONTRADICTION node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="lower"), [1.0, 1.0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (lower) for CONTRADICTION node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + + r_ji, true_r_ji = n.edge_redundancy(bound="tuple"), [(1.0, 1.0), (1.0, 1.0)] + assert r_ji == true_r_ji, ( + "Edge Redundancy (tuples) for CONTRADICTION node does not match. %s != %s" + % (r_ji, true_r_ji) + ) # COPYx1 def test_edge_redundancy_COPYx1(): """Test Edge Redundancy - COPYx1""" n = COPYx1() - r_ji, true_r_ji = n.edge_redundancy(bound='upper'), [0., 1.] - assert (r_ji == true_r_ji), ('Edge Redundancy (upper) for COPYx1 node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='mean'), [0., 1.] - assert (r_ji == true_r_ji), ('Edge Redundancy (mean) for COPYx1 node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='lower'), [0., 1.] - assert (r_ji == true_r_ji), ('Edge Redundancy (lower) for COPYx1 node does not match. %s != %s' % (r_ji, true_r_ji)) - - r_ji, true_r_ji = n.edge_redundancy(bound='tuple'), [(0.0, 0.0), (1.0, 1.0)] - assert (r_ji == true_r_ji), ('Edge Redundancy (tuples) for COPYx1 node does not match. %s != %s' % (r_ji, true_r_ji)) + r_ji, true_r_ji = n.edge_redundancy(bound="upper"), [0.0, 1.0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (upper) for COPYx1 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="mean"), [0.0, 1.0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (mean) for COPYx1 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="lower"), [0.0, 1.0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (lower) for COPYx1 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + + r_ji, true_r_ji = n.edge_redundancy(bound="tuple"), [(0.0, 0.0), (1.0, 1.0)] + assert r_ji == true_r_ji, ( + "Edge Redundancy (tuples) for COPYx1 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) # RULE 90 def test_edge_redundancy_RULE90(): """Test Edge Redundancy - RULE90""" n = RULE90() - r_ji, true_r_ji = n.edge_redundancy(bound='upper'), [0., 1., 0.] - assert (r_ji == true_r_ji), ('Edge Redundancy (upper bound) for RULE90 node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='mean'), [0., 1., 0.] - assert (r_ji == true_r_ji), ('Edge Redundancy (mean) for RULE90 node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='lower'), [0., 1., 0.] - assert (r_ji == true_r_ji), ('Edge Redundancy (lower bound) for RULE90 node does not match. %s != %s' % (r_ji, true_r_ji)) - - r_ji, true_r_ji = n.edge_redundancy(bound='tuple'), [(0.0, 0.0), (1.0, 1.0), (0.0, 0.0)] - assert (r_ji == true_r_ji), ('Edge Redundancy (tuples) for RULE90 node does not match. %s != %s' % (r_ji, true_r_ji)) + r_ji, true_r_ji = n.edge_redundancy(bound="upper"), [0.0, 1.0, 0.0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (upper bound) for RULE90 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="mean"), [0.0, 1.0, 0.0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (mean) for RULE90 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="lower"), [0.0, 1.0, 0.0] + assert r_ji == true_r_ji, ( + "Edge Redundancy (lower bound) for RULE90 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + + r_ji, true_r_ji = ( + n.edge_redundancy(bound="tuple"), + [(0.0, 0.0), (1.0, 1.0), (0.0, 0.0)], + ) + assert r_ji == true_r_ji, ( + "Edge Redundancy (tuples) for RULE90 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) # RULE 110 def test_edge_redundancy_RULE110(): """Test Edge Redundancy - RULE110""" n = RULE110() - r_ji, true_r_ji = n.edge_redundancy(bound='upper'), [6 / 8, 2 / 8, 2 / 8] - assert (r_ji == true_r_ji), ('Edge Redundancy (upper) for RULE110 node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='mean'), [5 / 8, 1 / 8, 1 / 8] - assert (r_ji == true_r_ji), ('Edge Redundancy (mean) for RULE110 node does not match. %s != %s' % (r_ji, true_r_ji)) - r_ji, true_r_ji = n.edge_redundancy(bound='lower'), [4 / 8., 0 / 8, 0 / 8] - assert (r_ji == true_r_ji), ('Edge Redundancy (lower) for RULE110 node does not match. %s != %s' % (r_ji, true_r_ji)) - - r_ji, true_r_ji = n.edge_redundancy(bound='tuple'), [(0.5, 0.75), (0.0, 0.25), (0.0, 0.25)] - assert (r_ji == true_r_ji), ('Edge Redundancy (tuples) for RULE110 node does not match. %s != %s' % (r_ji, true_r_ji)) + r_ji, true_r_ji = n.edge_redundancy(bound="upper"), [6 / 8, 2 / 8, 2 / 8] + assert r_ji == true_r_ji, ( + "Edge Redundancy (upper) for RULE110 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="mean"), [5 / 8, 1 / 8, 1 / 8] + assert r_ji == true_r_ji, ( + "Edge Redundancy (mean) for RULE110 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + r_ji, true_r_ji = n.edge_redundancy(bound="lower"), [4 / 8.0, 0 / 8, 0 / 8] + assert r_ji == true_r_ji, ( + "Edge Redundancy (lower) for RULE110 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) + + r_ji, true_r_ji = ( + n.edge_redundancy(bound="tuple"), + [(0.5, 0.75), (0.0, 0.25), (0.0, 0.25)], + ) + assert r_ji == true_r_ji, ( + "Edge Redundancy (tuples) for RULE110 node does not match. %s != %s" + % (r_ji, true_r_ji) + ) # # Test Effective Connectivity # + # AND def test_effective_connectivity_AND(): """Test Effective Connectivity - AND""" n = AND() k_e, true_k_e = n.effective_connectivity(norm=False), 5 / 4 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound) for AND node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound) for AND node does not match. %s != %s" + % (k_e, true_k_e) + ) k_e, true_k_e = n.effective_connectivity(norm=True), (5 / 4) / 2 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound,normed) for AND node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound,normed) for AND node does not match. %s != %s" + % (k_e, true_k_e) + ) # XOR def test_effective_connectivity_XOR(): """Test Effective Connectivity - XOR""" n = XOR() - k_e, true_k_e = n.effective_connectivity(norm=False), 2. - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound) for XOR node does not match. %s != %s' % (k_e, true_k_e)) + k_e, true_k_e = n.effective_connectivity(norm=False), 2.0 + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound) for XOR node does not match. %s != %s" + % (k_e, true_k_e) + ) - k_e, true_k_e = n.effective_connectivity(norm=True), 2. / 2 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound,normed) for XOR node does not match. %s != %s' % (k_e, true_k_e)) + k_e, true_k_e = n.effective_connectivity(norm=True), 2.0 / 2 + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound,normed) for XOR node does not match. %s != %s" + % (k_e, true_k_e) + ) # CONTRADICTION @@ -248,10 +407,16 @@ def test_effective_connectivity_CONTRADICTION(): """Test Effective Connectivity - CONTRADICTION""" n = CONTRADICTION() k_e, true_k_e = n.effective_connectivity(norm=False), 0 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound) for CONTRADICTION node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound) for CONTRADICTION node does not match. %s != %s" + % (k_e, true_k_e) + ) k_e, true_k_e = n.effective_connectivity(norm=True), 0 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound,normed) for CONTRADICTION node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound,normed) for CONTRADICTION node does not match. %s != %s" + % (k_e, true_k_e) + ) # COPYx1 @@ -259,10 +424,16 @@ def test_effective_connectivity_COPYx1(): """Test Effective Connectivity - COPYx1""" n = COPYx1() k_e, true_k_e = n.effective_connectivity(norm=False), 1 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound) for COPYx1 node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound) for COPYx1 node does not match. %s != %s" + % (k_e, true_k_e) + ) k_e, true_k_e = n.effective_connectivity(norm=True), 1 / 2 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound,normed) for COPYx1 node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound,normed) for COPYx1 node does not match. %s != %s" + % (k_e, true_k_e) + ) # RULE90 @@ -270,10 +441,16 @@ def test_effective_connectivity_RULE90(): """Test Effective Connectivity - RULE90""" n = RULE90() k_e, true_k_e = n.effective_connectivity(norm=False), 3 - 1 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound) for RULE90 node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound) for RULE90 node does not match. %s != %s" + % (k_e, true_k_e) + ) k_e, true_k_e = n.effective_connectivity(norm=True), (3 - 1) / 3 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound,normed) for RULE90 node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound,normed) for RULE90 node does not match. %s != %s" + % (k_e, true_k_e) + ) # RULE110 @@ -281,86 +458,148 @@ def test_effective_connectivity_RULE110(): """Test Effective Connectivity - RULE110""" n = RULE110() k_e, true_k_e = n.effective_connectivity(norm=False), 3 - (7 / 8) - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound) for RULE110 node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound) for RULE110 node does not match. %s != %s" + % (k_e, true_k_e) + ) k_e, true_k_e = n.effective_connectivity(norm=True), (3 - (7 / 8)) / 3 - assert (k_e == true_k_e), ('Effective Connectivity (node,upper bound,normed) for RULE110 node does not match. %s != %s' % (k_e, true_k_e)) + assert k_e == true_k_e, ( + "Effective Connectivity (node,upper bound,normed) for RULE110 node does not match. %s != %s" + % (k_e, true_k_e) + ) # # Test Edge Effectiveness # + # AND def test_edge_effectiveness_AND(): """Test Edge Effectiveness - AND""" n = AND() - e_ji, true_e_ji = n.edge_effectiveness(bound='upper'), [1 - (2 / 4), 1 - (2 / 4)] - assert (e_ji == true_e_ji), ('Input Redundancy (input,upper bound) for AND node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='mean'), [1 - (3 / 8), 1 - (3 / 8)] - assert (e_ji == true_e_ji), ('Input Redundancy (input,mean) for AND node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='lower'), [1 - (1 / 4), 1 - (1 / 4)] - assert (e_ji == true_e_ji), ('Input Redundancy (input,lower bound) for AND node does not match. %s != %s' % (e_ji, true_e_ji)) + e_ji, true_e_ji = n.edge_effectiveness(bound="upper"), [1 - (2 / 4), 1 - (2 / 4)] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,upper bound) for AND node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="mean"), [1 - (3 / 8), 1 - (3 / 8)] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,mean) for AND node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="lower"), [1 - (1 / 4), 1 - (1 / 4)] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,lower bound) for AND node does not match. %s != %s" + % (e_ji, true_e_ji) + ) # XOR def test_edge_effectiveness_XOR(): """Test Edge Effectiveness - XOR""" n = XOR() - e_ji, true_e_ji = n.edge_effectiveness(bound='upper'), [1 - (0), 1 - (0)] - assert (e_ji == true_e_ji), ('Input Redundancy (input,upper bound) for XOR node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='mean'), [1 - (0), 1 - (0)] - assert (e_ji == true_e_ji), ('Input Redundancy (input,mean) for XOR node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='lower'), [1 - (0), 1 - (0)] - assert (e_ji == true_e_ji), ('Input Redundancy (input,lower bound) for XOR node does not match. %s != %s' % (e_ji, true_e_ji)) + e_ji, true_e_ji = n.edge_effectiveness(bound="upper"), [1 - (0), 1 - (0)] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,upper bound) for XOR node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="mean"), [1 - (0), 1 - (0)] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,mean) for XOR node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="lower"), [1 - (0), 1 - (0)] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,lower bound) for XOR node does not match. %s != %s" + % (e_ji, true_e_ji) + ) # CONTRADICTION def test_edge_effectiveness_CONTRADICTION(): """Test Edge Effectiveness - CONTRADICTION""" n = CONTRADICTION() - e_ji, true_e_ji = n.edge_effectiveness(bound='upper'), [0, 0] - assert (e_ji == true_e_ji), ('Input Redundancy (input,upper bound) for CONTRADICTION node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='mean'), [0, 0] - assert (e_ji == true_e_ji), ('Input Redundancy (input,mean) for CONTRADICTION node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='lower'), [0, 0] - assert (e_ji == true_e_ji), ('Input Redundancy (input,lower bound) for CONTRADICTION node does not match. %s != %s' % (e_ji, true_e_ji)) + e_ji, true_e_ji = n.edge_effectiveness(bound="upper"), [0, 0] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,upper bound) for CONTRADICTION node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="mean"), [0, 0] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,mean) for CONTRADICTION node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="lower"), [0, 0] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,lower bound) for CONTRADICTION node does not match. %s != %s" + % (e_ji, true_e_ji) + ) # COPYx1 def test_edge_effectiveness_COPYx1(): """Test Edge Effectiveness - COPYx1""" n = COPYx1() - e_ji, true_e_ji = n.edge_effectiveness(bound='upper'), [1, 0] - assert (e_ji == true_e_ji), ('Input Redundancy (input,upper bound) for COPYx1 node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='mean'), [1, 0] - assert (e_ji == true_e_ji), ('Input Redundancy (input,mean) for COPYx1 node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='lower'), [1, 0] - assert (e_ji == true_e_ji), ('Input Redundancy (input,lower bound) for COPYx1 node does not match. %s != %s' % (e_ji, true_e_ji)) + e_ji, true_e_ji = n.edge_effectiveness(bound="upper"), [1, 0] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,upper bound) for COPYx1 node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="mean"), [1, 0] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,mean) for COPYx1 node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="lower"), [1, 0] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,lower bound) for COPYx1 node does not match. %s != %s" + % (e_ji, true_e_ji) + ) # RULE90 def test_edge_effectiveness_RULE90(): """Test Edge Effectiveness - RULE90""" n = RULE90() - e_ji, true_e_ji = n.edge_effectiveness(bound='upper'), [1, 0, 1] - assert (e_ji == true_e_ji), ('Input Redundancy (input,upper bound) for RULE90 node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='mean'), [1, 0, 1] - assert (e_ji == true_e_ji), ('Input Redundancy (input,mean) for RULE90 node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='lower'), [1, 0, 1] - assert (e_ji == true_e_ji), ('Input Redundancy (input,lower bound) for RULE90 node does not match. %s != %s' % (e_ji, true_e_ji)) + e_ji, true_e_ji = n.edge_effectiveness(bound="upper"), [1, 0, 1] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,upper bound) for RULE90 node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="mean"), [1, 0, 1] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,mean) for RULE90 node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="lower"), [1, 0, 1] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,lower bound) for RULE90 node does not match. %s != %s" + % (e_ji, true_e_ji) + ) # RULE110 def test_edge_effectiveness_RULE110(): """Test Edge Effectiveness - RULE110""" n = RULE110() - e_ji, true_e_ji = n.edge_effectiveness(bound='upper'), [0.25, 0.75, 0.75] - assert (e_ji == true_e_ji), ('Input Redundancy (input,upper bound) for RULE110 node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='mean'), [0.375, 0.875, 0.875] - assert (e_ji == true_e_ji), ('Input Redundancy (input,mean) for RULE110 node does not match. %s != %s' % (e_ji, true_e_ji)) - e_ji, true_e_ji = n.edge_effectiveness(bound='lower'), [0.5, 1., 1.] - assert (e_ji == true_e_ji), ('Input Redundancy (input,lower bound) for RULE110 node does not match. %s != %s' % (e_ji, true_e_ji)) + e_ji, true_e_ji = n.edge_effectiveness(bound="upper"), [0.25, 0.75, 0.75] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,upper bound) for RULE110 node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="mean"), [0.375, 0.875, 0.875] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,mean) for RULE110 node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + e_ji, true_e_ji = n.edge_effectiveness(bound="lower"), [0.5, 1.0, 1.0] + assert e_ji == true_e_ji, ( + "Input Redundancy (input,lower bound) for RULE110 node does not match. %s != %s" + % (e_ji, true_e_ji) + ) + # # Test Sensitivity @@ -369,50 +608,84 @@ def test_sensitivity_AND(): """Test Sensitivity - AND""" n = AND() s, true_s = n.c_sensitivity(1), 1 / 2 - assert isclose(s, true_s), ('c-sensitivity(1) for AND does not match, %s != %s' % (s, true_s)) + assert isclose(s, true_s), "c-sensitivity(1) for AND does not match, %s != %s" % ( + s, + true_s, + ) s, true_s = n.c_sensitivity(2), 1 / 2 - assert isclose(s, true_s), ('c-sensitivity(2) for AND does not match, %s != %s' % (s, true_s)) - s, true_s = n.c_sensitivity(1, 'forceK', 3), 1 / 3 - assert isclose(s, true_s), ("c-sensitivity(1,'forceK',3) for AND does not match, %s != %s" % (s, true_s)) - s, true_s = n.c_sensitivity(2, 'forceK', 3), 1 / 2 - assert isclose(s, true_s), ("c-sensitivity(2,'forceK',3) for AND does not match, %s != %s" % (s, true_s)) + assert isclose(s, true_s), "c-sensitivity(2) for AND does not match, %s != %s" % ( + s, + true_s, + ) + s, true_s = n.c_sensitivity(1, "forceK", 3), 1 / 3 + assert isclose(s, true_s), ( + "c-sensitivity(1,'forceK',3) for AND does not match, %s != %s" % (s, true_s) + ) + s, true_s = n.c_sensitivity(2, "forceK", 3), 1 / 2 + assert isclose(s, true_s), ( + "c-sensitivity(2,'forceK',3) for AND does not match, %s != %s" % (s, true_s) + ) def test_sensitivity_XOR(): """Test Sensitivity - XOR""" n = XOR() - s, true_s = n.c_sensitivity(1), 1. - assert isclose(s, true_s), ('c-sensitivity(1) for XOR does not match, %s != %s' % (s, true_s)) - s, true_s = n.c_sensitivity(2), 0. - assert isclose(s, true_s), ('c-sensitivity(2) for XOR does not match, %s != %s' % (s, true_s)) - s, true_s = n.c_sensitivity(1, 'forceK', 3), 2 / 3 - assert isclose(s, true_s), ("c-sensitivity(1,'forceK',3) for XOR does not match, %s != %s" % (s, true_s)) - s, true_s = n.c_sensitivity(2, 'forceK', 3), 2 / 3 - assert isclose(s, true_s), ("c-sensitivity(2,'forceK',3) for XOR does not match, %s != %s" % (s, true_s)) + s, true_s = n.c_sensitivity(1), 1.0 + assert isclose(s, true_s), "c-sensitivity(1) for XOR does not match, %s != %s" % ( + s, + true_s, + ) + s, true_s = n.c_sensitivity(2), 0.0 + assert isclose(s, true_s), "c-sensitivity(2) for XOR does not match, %s != %s" % ( + s, + true_s, + ) + s, true_s = n.c_sensitivity(1, "forceK", 3), 2 / 3 + assert isclose(s, true_s), ( + "c-sensitivity(1,'forceK',3) for XOR does not match, %s != %s" % (s, true_s) + ) + s, true_s = n.c_sensitivity(2, "forceK", 3), 2 / 3 + assert isclose(s, true_s), ( + "c-sensitivity(2,'forceK',3) for XOR does not match, %s != %s" % (s, true_s) + ) + # input symmetry tests (new) def test_input_symmetry_AND(): n = AND() - k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots"), 3.0/2 - assert (k_s == true_k_s), f"Input symmetry: AND (mean): returned {k_s}, true value is {true_k_s}" - k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots"), 3.0/2 - assert (k_s == true_k_s), f"Input symmetry: AND (max): returned {k_s}, true value is {true_k_s}" - k_s, true_k_s = n.input_symmetry_mean(), 3.0/2 - assert (k_s == true_k_s), f"Input symmetry simp: AND (mean): returned {k_s}, true value is {true_k_s}" + k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots"), 3.0 / 2 + assert ( + k_s == true_k_s + ), f"Input symmetry: AND (mean): returned {k_s}, true value is {true_k_s}" + k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots"), 3.0 / 2 + assert ( + k_s == true_k_s + ), f"Input symmetry: AND (max): returned {k_s}, true value is {true_k_s}" + k_s, true_k_s = n.input_symmetry_mean(), 3.0 / 2 + assert ( + k_s == true_k_s + ), f"Input symmetry simp: AND (mean): returned {k_s}, true value is {true_k_s}" # k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots", sameSymbol=True), 2.0 # assert (k_s == true_k_s), f"Input symmetry: AND (mean, sameSymbol): returned {k_s}, true value is {true_k_s}" # k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots", sameSymbol=True), 2.0 # assert (k_s == true_k_s), f"Input symmetry: AND (max, sameSymbol): returned {k_s}, true value is {true_k_s}" + def test_input_symmetry_XOR(): n = XOR() k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots"), 1.0 - assert (k_s == true_k_s), f"Input symmetry: XOR (mean): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry: XOR (mean): returned {k_s}, true value is {true_k_s}" k_s, true_k_s = n.input_symmetry_mean(), 1.0 - assert (k_s == true_k_s), f"Input symmetry simp: XOR (mean): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry simp: XOR (mean): returned {k_s}, true value is {true_k_s}" k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots"), 1.0 - assert (k_s == true_k_s), f"Input symmetry: XOR (max): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry: XOR (max): returned {k_s}, true value is {true_k_s}" # k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots", sameSymbol=True), 2.0 # assert (k_s == true_k_s), f"Input symmetry: XOR (mean, sameSymbol): returned {k_s}, true value is {true_k_s}" @@ -421,14 +694,21 @@ def test_input_symmetry_XOR(): # k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots", sameSymbol=True), 2.0 # assert (k_s == true_k_s), f"Input symmetry: XOR (max, sameSymbol): returned {k_s}, true value is {true_k_s}" + def test_input_symmetry_COPYx1(): n = COPYx1() k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots"), 0 - assert (k_s == true_k_s), f"Input symmetry: COPYx1 (mean): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry: COPYx1 (mean): returned {k_s}, true value is {true_k_s}" k_s, true_k_s = n.input_symmetry_mean(), 0 - assert (k_s == true_k_s), f"Input symmetry simp: COPYx1 (mean): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry simp: COPYx1 (mean): returned {k_s}, true value is {true_k_s}" k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots"), 0 - assert (k_s == true_k_s), f"Input symmetry: COPYx1 (max): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry: COPYx1 (max): returned {k_s}, true value is {true_k_s}" # k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots", sameSymbol=True), 0.0 # assert (k_s == true_k_s), f"Input symmetry: COPYx1 (mean, sameSymbol): returned {k_s}, true value is {true_k_s}" @@ -437,14 +717,21 @@ def test_input_symmetry_COPYx1(): # k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots", sameSymbol=True), 0.0 # assert (k_s == true_k_s), f"Input symmetry: COPYx1 (max, sameSymbol): returned {k_s}, true value is {true_k_s}" + def test_input_symmetry_RULE90(): n = RULE90() k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots"), 1.0 - assert (k_s == true_k_s), f"Input symmetry: RULE90 (mean): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry: RULE90 (mean): returned {k_s}, true value is {true_k_s}" k_s, true_k_s = n.input_symmetry_mean(), 1.0 - assert (k_s == true_k_s), f"Input symmetry simp: RULE90 (mean): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry simp: RULE90 (mean): returned {k_s}, true value is {true_k_s}" # k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots", sameSymbol=True), 1.0 - assert (k_s == true_k_s), f"Input symmetry: RULE90 (max): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry: RULE90 (max): returned {k_s}, true value is {true_k_s}" # k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots", sameSymbol=True), 2.0 # assert (k_s == true_k_s), f"Input symmetry: RULE90 (mean, sameSymbol): returned {k_s}, true value is {true_k_s}" @@ -453,14 +740,21 @@ def test_input_symmetry_RULE90(): # k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots", sameSymbol=True), 2.0 # assert (k_s == true_k_s), f"Input symmetry: RULE90 (max, sameSymbol): returned {k_s}, true value is {true_k_s}" + def test_input_symmetry_SBF(): - n = BooleanNode(outputs=list("0111" + "0"*12), k=4) + n = BooleanNode(outputs=list("0111" + "0" * 12), k=4) k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots"), 1.6875 - assert (k_s == true_k_s), f"Input symmetry: SBF (mean): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry: SBF (mean): returned {k_s}, true value is {true_k_s}" k_s, true_k_s = n.input_symmetry_mean(), 1.6875 - assert (k_s == true_k_s), f"Input symmetry simp: SBF (mean): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry simp: SBF (mean): returned {k_s}, true value is {true_k_s}" k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots"), 1.875 - assert (k_s == true_k_s), f"Input symmetry: SBF (max): returned {k_s}, true value is {true_k_s}" + assert ( + k_s == true_k_s + ), f"Input symmetry: SBF (max): returned {k_s}, true value is {true_k_s}" # k_s, true_k_s = n.input_symmetry(aggOp="mean", kernel="numDots", sameSymbol=True), 4.0 # assert (k_s == true_k_s), f"Input symmetry: SBF (mean, sameSymbol): returned {k_s}, true value is {true_k_s}" @@ -468,3 +762,161 @@ def test_input_symmetry_SBF(): # assert (k_s == true_k_s), f"Input symmetry simp: SBF (mean, sameSymbol): returned {k_s}, true value is {true_k_s}" # k_s, true_k_s = n.input_symmetry(aggOp="max", kernel="numDots", sameSymbol=True), 4.0 # assert (k_s == true_k_s), f"Input symmetry: SBF (max, sameSymbol): returned {k_s}, true value is {true_k_s}" + + +# Tests for partially-specified functions +def test_fill_out_lut(): + partial_lut = [ + [("00", "1"), ("01", "1")], + [("0-", "1"), ("10", "1")], + [("001", "1"), ("01-", "1"), ("1-1", "0")], + [ + ("00--", "0"), + ("1--1", "1"), + ("11--", "0"), + ], # Checking for Contradictory values. Should be marked with '!'. + ] + expected_filled = [ + [("00", "1"), ("01", "1"), ("10", "?"), ("11", "?")], + [("00", "1"), ("01", "1"), ("10", "1"), ("11", "?")], + [ + ("000", "?"), + ("001", "1"), + ("010", "1"), + ("011", "1"), + ("100", "?"), + ("101", "0"), + ("110", "?"), + ("111", "0"), + ], + [ + ("0000", "0"), + ("0001", "0"), + ("0010", "0"), + ("0011", "0"), + ("0100", "?"), + ("0101", "?"), + ("0110", "?"), + ("0111", "?"), + ("1000", "?"), + ("1001", "1"), + ("1010", "?"), + ("1011", "1"), + ("1100", "0"), + ("1101", "!"), + ("1110", "0"), + ("1111", "!"), + ], + ] + for i, partial in enumerate(partial_lut): + filled = fill_out_lut(partial) + expected = expected_filled[i] + assert ( + filled == expected + ), f"Fill out LUT filling failed: {filled} != {expected}" + + +def test_from_partial_lut(): + + # Test cases for BooleanNode.from_partial_lut() + partial_luts = [ + [("001-", "0"), ("1--1", "1"), ("11--", "1")], + [("00--", "0"), ("1--1", "1"), ("110-", "1")], + [("1--", "1"), ("101", "0"), ("011", "0"), ("01-", "1")], # will have clashes + [("0--0", "0"), ("1--1", "0"), ("0111", "1"), ("0011", "1")], + [("1-01", "1"), ("1-1-", "0"), ("0110", "0"), ("01-1", "1")], + [("1-01", "1"), ("1-1-", "0"), ("0110", "0"), ("01-1", "?")], + [("-1--", "0")], + [("-1--", "1")], + [("-1--", "?")], + ] + expected_output_lists = [ + ['?', '?', '0', '0', '?', '?', '?', '?', '?', '1', '?', '1', '1', '1', '1', '1'], + ['0', '0', '0', '0', '?', '?', '?', '?', '?', '1', '?', '1', '1', '1', '?', '1'], + ['?', '?', '1', '!', '1', '!', '1', '1'], # with clashes + ['0', '?', '0', '1', '0', '?', '0', '1', '?', '0', '?', '0', '?', '0', '?', '0'], + ['?', '?', '?', '?', '?', '1', '0', '1', '?', '1', '0', '0', '?', '1', '0', '0'], + ['?', '?', '?', '?', '?', '?', '0', '?', '?', '1', '0', '0', '?', '1', '0', '0'], + ['?', '?', '?', '?', '0', '0', '0', '0', '?', '?', '?', '?', '0', '0', '0', '0'], + ['?', '?', '?', '?', '1', '1', '1', '1', '?', '?', '?', '?', '1', '1', '1', '1'], + ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?'], + ] + + for i, partial_lut in enumerate(partial_luts): + generated_node = BooleanNode.from_partial_lut(partial_lut) + expected_output_list = expected_output_lists[i] + + assert ( + generated_node.outputs == expected_output_list + ), f"from_partial_lut failed: {generated_node.outputs} != {expected_output_list}" + + +def test_generate_with_required_node_bias(): + # removing some effective graph inputs to make them incomplete + incomplete_automata = { + "GKL": [["##0#0#0", 0],["###10#0", 0],["##00###", 0],["0##0###", 0],["###1##1", 1],["1#10###", 1],["1#1#1##", 1], ["1#1###1", 1],], # ["0###0#0", 0], ["###11##", 1], is missing + "GP": [["0#01###", 0],["0##10##", 0],["0#####0", 0],["###0##0", 0],["1#####1", 1],["1##1###", 1],["##10##1", 1],["###01#1", 1],], # ["0#0#00#", 0], is missing + "ABK": [["0#01###", 0],["0##10##", 0],["0#####0", 0],["###0##0", 0],["##1#1#1", 1],["1#####1", 1],["1##1###", 1],["##10##1", 1],], # ["0#0#0##", 0],["###01#1", 1], is missing + + } + automata = { + "GKL": [ + ["0###0#0", 0], + ["##0#0#0", 0], + ["###10#0", 0], + ["##00###", 0], + ["0##0###", 0], + ["1#1###1", 1], + ["###1##1", 1], + ["###11##", 1], + ["1#10###", 1], + ["1#1#1##", 1], + ], + "GP": [ + ["0#01###", 0], + ["0##10##", 0], + ["0#####0", 0], + ["###0##0", 0], + ["0#0#0##", 0], + ["##1#1#1", 1], + ["1#####1", 1], + ["1##1###", 1], + ["##10##1", 1], + ["###01#1", 1], + ], + "ABK": [ + ["0#01###", 0], + ["0##10##", 0], + ["0#####0", 0], + ["###0##0", 0], + ["0#0#0##", 0], + ["##1#1#1", 1], + ["1#####1", 1], + ["1##1###", 1], + ["##10##1", 1], + ["###01#1", 1], + ], + } + automata_output_list = { + 'GKL' : ['0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '1', '1', '1', '1'], + 'GP' : ['0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '0', '1', '0', '1', '0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '0', '1', '0', '1', '0', '0', '0', '0', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1'], + + 'ABK' : ['0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '0', '1', '0', '1', '0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '0', '1', '0', '1', '0', '0', '0', '0', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1'], + + } + + for automata in incomplete_automata: + node = None + generated_node_permuations = None + node = BooleanNode.from_partial_lut(incomplete_automata[automata]) + + generated_node_permuations = BooleanNode.generate_with_required_bias( node, required_node_bias=0.5, verbose=True) + list_of_output_lists = [node.outputs for node in generated_node_permuations] + + # print(automata) + # if automata_output_list[automata] in list_of_output_lists: + # print("Found a match") + # else: + # print("No match found") + + assert automata_output_list[automata] in list_of_output_lists, "No match found" diff --git a/tests/test_two_symbol_symmetry.py b/tests/test_two_symbol_symmetry.py index 795f02a..05c83af 100644 --- a/tests/test_two_symbol_symmetry.py +++ b/tests/test_two_symbol_symmetry.py @@ -3,9 +3,6 @@ import helpers.helper as helper from cana.boolean_node import BooleanNode -from cana.canalization.boolean_canalization import * # WARNING: some functions here differ from the file below! -from cana.canalization.cboolean_canalization import * -from cana.cutils import outputs_to_binstates_of_given_type # WARNING: ignoring detection of same-symbol symmetry for now. Complicating issues. diff --git a/tutorials/Canalization - BioModels - Look Up Table.ipynb b/tutorials/Canalization - BioModels - Look Up Table.ipynb index 7c76fbe..7e27ecb 100644 --- a/tutorials/Canalization - BioModels - Look Up Table.ipynb +++ b/tutorials/Canalization - BioModels - Look Up Table.ipynb @@ -27,7 +27,7 @@ "source": [ "import matplotlib.pyplot as plt\n", "from matplotlib.text import Text\n", - "from matplotlib.patches import Circle, Rectangle, RegularPolygon\n", + "from matplotlib.patches import Rectangle\n", "from matplotlib.collections import PatchCollection" ] }, @@ -180,7 +180,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -218,7 +218,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Canalization - BioModels - Schematas.ipynb b/tutorials/Canalization - BioModels - Schematas.ipynb index 0f7aa9f..6c3f108 100644 --- a/tutorials/Canalization - BioModels - Schematas.ipynb +++ b/tutorials/Canalization - BioModels - Schematas.ipynb @@ -10,15 +10,6 @@ "This tutorial shows how to plot Prime Implicants (F') and Two-Symbol (F'') schematas" ] }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "code", "execution_count": 2, @@ -42,6 +33,15 @@ "from cana.datasets.bio import THALIANA #, DROSOPHILA, BUDDING_YEAST" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, { "cell_type": "code", "execution_count": 4, @@ -224,10 +224,7 @@ " ax2.add_artist(Text(x+(cwidth/2),y+cwidth/10*4, text=out, color='white' if (out==1) else 'black', va='center', ha='center',fontsize=14,family='serif'))\n", " boxes.append(r)\n", " xticks.append(x+cwidth/2)\n", - " yticks.append(y+cwidth/2)\n", - " y += cwidth + cyspace\n", - " t += 1\n", - " y += sepcyspace\n", + " yticks.append(y+cwidth/2)TODO\n", "\n", " if len(boxes):\n", " ax2.add_collection(PatchCollection(boxes,match_original=True))\n", @@ -272,7 +269,7 @@ "outputs": [ { "data": { - "image/png": "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jNvKOjk5yRWSatzd3bFw4UIAzZvFHT58uM1yxgWgPDw8MH/+fHOFJytrq+v169cRHR2NI0eO4OrVq0hLS8Obb76pWjxERLZMtiSjKzNLbt++jeTkZADAs88+K1dIqlq0aJH0OsTGxuKXX34xOb927VpkZmYCANatW4f77rvP3CHKxprqeuDAAS7GRURkJrItK25syfD29kbfvn3vWP73v/89fvnlF1y7dg1HjhxBRUUFwsPDTfY+sWZarRYZGRmYOnUqDh8+DH9/f8ycOROenp7Izc3Fvn374OTkhA8++ADTp09XO9wusae6KmXevHno2bMnANPpvT4+PlJLEQBkZmbihx9+MHt8RESdIsrk/vvvFwGIzz333F2VHzRokAhA+jdu3DixvLxcrnDaZbyfXq9X/F6iKIq3b98WP/74Y3HcuHFi7969xe7du4u+vr5ifHy8WFxcrOi9L126ZNb6qllXvV5/V3W9du2a2KdPH5P33m9/+9s7XlPpf2fPnr2res6ePVvxWIiI5CKIYou1nlVw6dIlHDx4EG+++SYqKyvxxRdfYMKECYrdz7ictV6vt/n1EaqqqtCnTx8Atl/furo6aQDqnep6+PBhJCQkoKysDFOmTMHf/va3Nsu3vKY9UflPAhHZENWTDKOzZ88iKCgInp6eKC0tVWwAKJMM23QvSUZnrmlPLORPAhHZANl3Ye2sIUOGYPTo0fj5559RXFysdjhERETURRaTZADNAwgB4PLlyypHQkRERF1lMUlGfX09CgoKAABDhw5VORoiIiLqKrMmGXv37sXnn3+OpqYmk+NXrlzBnDlzUFlZicceewwPPPCAOcMiIiIiBci2TsbdOHXqFH7/+9+jT58+CAkJgZubGy5evIijR49Cr9dj4MCB2LJlizlDIiIiIoWYNcl47rnncPHiRezfvx9HjhxBdXU1XFxcMGzYMERHR+P111+Hu7u7OUMiIiIihZg1yXjwwQexYsUKc96SiIiIVGIxAz+JiIjItjDJICIiIkUwySAiIiJFMMkgIiIiRTDJICIiIkWYdXaJJamrq1M7BMW1rKOt19fW60dEZI3sNskw7k5qL+ytvkREpD676y4ZO3as2iGQgsaOHStttNdVWq3W7t4v9lZfIlKWIIqiqHYQREREZHvsriWDiIiIzINJBhERESmCSQYREREpgkkGERERKYJJBhERESmCSQYREREpgkkGERERKYJJBhERESmCSQYREREpgkkGERERKYJJBhERESmCSQYREREpgkkGERERKYJJBhERESni/wOA0OLezqw8BQAAAABJRU5ErkJggg==\n", + "image/png": "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jNvKOjk5yRWSatzd3bFw4UIAzZvFHT58uM1yxgWgPDw8MH/+fHOFJytrq+v169cRHR2NI0eO4OrVq0hLS8Obb76pWjxERLZMtiSjKzNLbt++jeTkZADAs88+K1dIqlq0aJH0OsTGxuKXX34xOb927VpkZmYCANatW4f77rvP3CHKxprqeuDAAS7GRURkJrItK25syfD29kbfvn3vWP73v/89fvnlF1y7dg1HjhxBRUUFwsPDTfY+sWZarRYZGRmYOnUqDh8+DH9/f8ycOROenp7Izc3Fvn374OTkhA8++ADTp09XO9wusae6KmXevHno2bMnANPpvT4+PlJLEQBkZmbihx9+MHt8RESdIsrk/vvvFwGIzz333F2VHzRokAhA+jdu3DixvLxcrnDaZbyfXq9X/F6iKIq3b98WP/74Y3HcuHFi7969xe7du4u+vr5ifHy8WFxcrOi9L126ZNb6qllXvV5/V3W9du2a2KdPH5P33m9/+9s7XlPpf2fPnr2res6ePVvxWIiI5CKIYou1nlVw6dIlHDx4EG+++SYqKyvxxRdfYMKECYrdz7ictV6vt/n1EaqqqtCnTx8Atl/furo6aQDqnep6+PBhJCQkoKysDFOmTMHf/va3Nsu3vKY9UflPAhHZENWTDKOzZ88iKCgInp6eKC0tVWwAKJMM23QvSUZnrmlPLORPAhHZANl3Ye2sIUOGYPTo0fj5559RXFysdjhERETURRaTZADNAwgB4PLlyypHQkRERF1lMUlGfX09CgoKAABDhw5VORoiIiLqKrMmGXv37sXnn3+OpqYmk+NXrlzBnDlzUFlZicceewwPPPCAOcMiIiIiBci2TsbdOHXqFH7/+9+jT58+CAkJgZubGy5evIijR49Cr9dj4MCB2LJlizlDIiIiIoWYNcl47rnncPHiRezfvx9HjhxBdXU1XFxcMGzYMERHR+P111+Hu7u7OUMiIiIihZg1yXjwwQexYsUKc96SiIiIVGIxAz+JiIjItjDJICIiIkUwySAiIiJFMMkgIiIiRTDJICIiIkWYdXaJJamrq1M7BMW1rKOt19fW60dEZI3sNskw7k5qL+ytvkREpD676y4ZO3as2iGQgsaOHStttNdVWq3W7t4v9lZfIlKWIIqiqHYQREREZHvsriWDiIiIzINJBhERESmCSQYREREpgkkGERERKYJJBhERESmCSQYREREpgkkGERERKYJJBhERESmCSQYREREpgkkGERERKYJJBhERESmCSQYREREpgkkGERERKYJJBhERESni/wOA0OLezqw8BQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -314,7 +311,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Canalization - BioModels.ipynb b/tutorials/Canalization - BioModels.ipynb index d3e57dc..dc0b0d1 100644 --- a/tutorials/Canalization - BioModels.ipynb +++ b/tutorials/Canalization - BioModels.ipynb @@ -13,29 +13,29 @@ "execution_count": 1, "metadata": {}, "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], "source": [ "import math\n", "import numpy as np\n", "import pandas as pd\n", - "pd.options.display.float_format = '{:.2g}'.format\n", - "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import random\n", "import graphviz\n", "from IPython.display import HTML\n", + "\n", "#\n", - "import cana\n", - "from cana.datasets.bio import THALIANA, DROSOPHILA, BUDDING_YEAST\n", - "from cana.drawing.canalizing_map import draw_canalizing_map_graphviz" + "from cana.datasets.bio import THALIANA # DROSOPHILA, BUDDING_YEAST\n", + "from cana.drawing.canalizing_map import draw_canalizing_map_graphviz\n", + "\n", + "pd.options.display.float_format = '{:.2g}'.format\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" ] }, { @@ -47,7 +47,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n" + "\n" ] } ], @@ -155,373 +155,373 @@ "\n", "\n", - "\n", "\n", - "\n", - "\n", + "\n", + "\n", "Interaction Graph\n", - "\n", + "\n", "\n", "\n", "0\n", - "\n", - "AP3\n", + "\n", + "AP3\n", "\n", "\n", "\n", "0->0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "13\n", - "\n", - "PI\n", + "\n", + "PI\n", "\n", "\n", "\n", "0->13\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "1\n", - "\n", - "UFO\n", + "\n", + "UFO\n", "\n", "\n", "\n", "1->0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "1->1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "2\n", - "\n", - "FUL\n", + "\n", + "FUL\n", "\n", "\n", "\n", "6\n", - "\n", - "LFY\n", + "\n", + "LFY\n", "\n", "\n", "\n", "2->6\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "3\n", - "\n", - "FT\n", + "\n", + "FT\n", "\n", "\n", "\n", "4\n", - "\n", - "AP1\n", + "\n", + "AP1\n", "\n", "\n", "\n", "3->4\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "4->0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "4->2\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "4->6\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "9\n", - "\n", - "AG\n", + "\n", + "AG\n", "\n", "\n", "\n", "4->9\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "12\n", - "\n", - "TFL1\n", + "\n", + "TFL1\n", "\n", "\n", "\n", "4->12\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "4->13\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "5\n", - "\n", - "EMF1\n", + "\n", + "EMF1\n", "\n", "\n", "\n", "5->3\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "5->6\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "5->12\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "6->0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "6->4\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "6->5\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "6->9\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "6->12\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "6->13\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "14\n", - "\n", - "SEP\n", + "\n", + "SEP\n", "\n", "\n", "\n", "6->14\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "7\n", - "\n", - "AP2\n", + "\n", + "AP2\n", "\n", "\n", "\n", "7->9\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "7->12\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "8\n", - "\n", - "WUS\n", + "\n", + "WUS\n", "\n", "\n", "\n", "8->8\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "8->9\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "9->0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "9->4\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "9->8\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "9->9\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "9->13\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "10\n", - "\n", - "LUG\n", + "\n", + "LUG\n", "\n", "\n", "\n", "10->9\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "11\n", - "\n", - "CLF\n", + "\n", + "CLF\n", "\n", "\n", "\n", "11->9\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "12->2\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "12->4\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "12->6\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "12->7\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "12->9\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "13->0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "13->13\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "14->0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "14->8\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "14->9\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "14->13\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -583,361 +583,55 @@ "Nodes: 15 | Edges: 41\n" ] }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Error: node 0, position false, expected two doubles\n", + "Error: node 1, position false, expected two doubles\n", + "Error: node 2, position false, expected two doubles\n", + "Error: node 3, position false, expected two doubles\n", + "Error: node 4, position false, expected two doubles\n", + "Error: node 5, position false, expected two doubles\n", + "Error: node 6, position false, expected two doubles\n", + "Error: node 7, position false, expected two doubles\n", + "Error: node 8, position false, expected two doubles\n", + "Error: node 9, position false, expected two doubles\n", + "Error: node 10, position false, expected two doubles\n", + "Error: node 11, position false, expected two doubles\n", + "Error: node 12, position false, expected two doubles\n", + "Error: node 13, position false, expected two doubles\n", + "Error: node 14, position false, expected two doubles\n" + ] + }, + { + "ename": "CalledProcessError", + "evalue": "Command '[PosixPath('dot'), '-Kneato', '-Tsvg']' returned non-zero exit status 1. [stderr: 'Error: node 0, position false, expected two doubles\\nError: node 1, position false, expected two doubles\\nError: node 2, position false, expected two doubles\\nError: node 3, position false, expected two doubles\\nError: node 4, position false, expected two doubles\\nError: node 5, position false, expected two doubles\\nError: node 6, position false, expected two doubles\\nError: node 7, position false, expected two doubles\\nError: node 8, position false, expected two doubles\\nError: node 9, position false, expected two doubles\\nError: node 10, position false, expected two doubles\\nError: node 11, position false, expected two doubles\\nError: node 12, position false, expected two doubles\\nError: node 13, position false, expected two doubles\\nError: node 14, position false, expected two doubles\\n']", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCalledProcessError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/backend/execute.py:88\u001b[0m, in \u001b[0;36mrun_check\u001b[0;34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 88\u001b[0m \u001b[43mproc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcheck_returncode\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m subprocess\u001b[38;5;241m.\u001b[39mCalledProcessError \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m/usr/lib/python3.12/subprocess.py:502\u001b[0m, in \u001b[0;36mCompletedProcess.check_returncode\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 501\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturncode:\n\u001b[0;32m--> 502\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CalledProcessError(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturncode, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstdout,\n\u001b[1;32m 503\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr)\n", + "\u001b[0;31mCalledProcessError\u001b[0m: Command '[PosixPath('dot'), '-Kneato', '-Tsvg']' returned non-zero exit status 1.", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mCalledProcessError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/IPython/core/formatters.py:977\u001b[0m, in \u001b[0;36mMimeBundleFormatter.__call__\u001b[0;34m(self, obj, include, exclude)\u001b[0m\n\u001b[1;32m 974\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n\u001b[1;32m 976\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 977\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43minclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minclude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexclude\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 978\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 979\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/jupyter_integration.py:98\u001b[0m, in \u001b[0;36mJupyterIntegration._repr_mimebundle_\u001b[0;34m(self, include, exclude, **_)\u001b[0m\n\u001b[1;32m 96\u001b[0m include \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(include) \u001b[38;5;28;01mif\u001b[39;00m include \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jupyter_mimetype}\n\u001b[1;32m 97\u001b[0m include \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(exclude \u001b[38;5;129;01mor\u001b[39;00m [])\n\u001b[0;32m---> 98\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {mimetype: \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod_name\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m mimetype, method_name \u001b[38;5;129;01min\u001b[39;00m MIME_TYPES\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 100\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m mimetype \u001b[38;5;129;01min\u001b[39;00m include}\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/jupyter_integration.py:112\u001b[0m, in \u001b[0;36mJupyterIntegration._repr_image_svg_xml\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_repr_image_svg_xml\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mstr\u001b[39m:\n\u001b[1;32m 111\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the rendered graph as SVG string.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 112\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpipe\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msvg\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mSVG_ENCODING\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/piping.py:104\u001b[0m, in \u001b[0;36mPipe.pipe\u001b[0;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpipe\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 56\u001b[0m \u001b[38;5;28mformat\u001b[39m: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 57\u001b[0m renderer: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 61\u001b[0m engine: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 62\u001b[0m encoding: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mUnion[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[1;32m 63\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the source piped through the Graphviz layout command.\u001b[39;00m\n\u001b[1;32m 64\u001b[0m \n\u001b[1;32m 65\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[38;5;124;03m ' 104\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_legacy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 105\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 107\u001b[0m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 108\u001b[0m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 109\u001b[0m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 110\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/_tools.py:171\u001b[0m, in \u001b[0;36mdeprecate_positional_args..decorator..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 162\u001b[0m wanted \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 163\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, value \u001b[38;5;129;01min\u001b[39;00m deprecated\u001b[38;5;241m.\u001b[39mitems())\n\u001b[1;32m 164\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe signature of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m will be reduced\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 165\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msupported_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m positional args\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 166\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(supported)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: pass \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mwanted\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 167\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m as keyword arg(s)\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 168\u001b[0m stacklevel\u001b[38;5;241m=\u001b[39mstacklevel,\n\u001b[1;32m 169\u001b[0m category\u001b[38;5;241m=\u001b[39mcategory)\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/piping.py:121\u001b[0m, in \u001b[0;36mPipe._pipe_legacy\u001b[0;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[38;5;129m@_tools\u001b[39m\u001b[38;5;241m.\u001b[39mdeprecate_positional_args(supported_number\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_pipe_legacy\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28mformat\u001b[39m: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 119\u001b[0m engine: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 120\u001b[0m encoding: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mUnion[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[0;32m--> 121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_future\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 122\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 123\u001b[0m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 124\u001b[0m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 125\u001b[0m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 126\u001b[0m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 127\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/piping.py:149\u001b[0m, in \u001b[0;36mPipe._pipe_future\u001b[0;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[1;32m 146\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m encoding \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 147\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m codecs\u001b[38;5;241m.\u001b[39mlookup(encoding) \u001b[38;5;129;01mis\u001b[39;00m codecs\u001b[38;5;241m.\u001b[39mlookup(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding):\n\u001b[1;32m 148\u001b[0m \u001b[38;5;66;03m# common case: both stdin and stdout need the same encoding\u001b[39;00m\n\u001b[0;32m--> 149\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_lines_string\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 150\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 151\u001b[0m raw \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_pipe_lines(\u001b[38;5;241m*\u001b[39margs, input_encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/backend/piping.py:212\u001b[0m, in \u001b[0;36mpipe_lines_string\u001b[0;34m(engine, format, input_lines, encoding, renderer, formatter, neato_no_op, quiet)\u001b[0m\n\u001b[1;32m 206\u001b[0m cmd \u001b[38;5;241m=\u001b[39m dot_command\u001b[38;5;241m.\u001b[39mcommand(engine, \u001b[38;5;28mformat\u001b[39m,\n\u001b[1;32m 207\u001b[0m renderer\u001b[38;5;241m=\u001b[39mrenderer,\n\u001b[1;32m 208\u001b[0m formatter\u001b[38;5;241m=\u001b[39mformatter,\n\u001b[1;32m 209\u001b[0m neato_no_op\u001b[38;5;241m=\u001b[39mneato_no_op)\n\u001b[1;32m 210\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minput_lines\u001b[39m\u001b[38;5;124m'\u001b[39m: input_lines, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mencoding\u001b[39m\u001b[38;5;124m'\u001b[39m: encoding}\n\u001b[0;32m--> 212\u001b[0m proc \u001b[38;5;241m=\u001b[39m \u001b[43mexecute\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcapture_output\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m proc\u001b[38;5;241m.\u001b[39mstdout\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/backend/execute.py:90\u001b[0m, in \u001b[0;36mrun_check\u001b[0;34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[0m\n\u001b[1;32m 88\u001b[0m proc\u001b[38;5;241m.\u001b[39mcheck_returncode()\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m subprocess\u001b[38;5;241m.\u001b[39mCalledProcessError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m---> 90\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CalledProcessError(\u001b[38;5;241m*\u001b[39me\u001b[38;5;241m.\u001b[39margs)\n\u001b[1;32m 92\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m proc\n", + "\u001b[0;31mCalledProcessError\u001b[0m: Command '[PosixPath('dot'), '-Kneato', '-Tsvg']' returned non-zero exit status 1. [stderr: 'Error: node 0, position false, expected two doubles\\nError: node 1, position false, expected two doubles\\nError: node 2, position false, expected two doubles\\nError: node 3, position false, expected two doubles\\nError: node 4, position false, expected two doubles\\nError: node 5, position false, expected two doubles\\nError: node 6, position false, expected two doubles\\nError: node 7, position false, expected two doubles\\nError: node 8, position false, expected two doubles\\nError: node 9, position false, expected two doubles\\nError: node 10, position false, expected two doubles\\nError: node 11, position false, expected two doubles\\nError: node 12, position false, expected two doubles\\nError: node 13, position false, expected two doubles\\nError: node 14, position false, expected two doubles\\n']" + ] + }, { "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Effective Graph\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "AP3\n", - "\n", - "\n", - "\n", - "0->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "13\n", - "\n", - "PI\n", - "\n", - "\n", - "\n", - "0->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "1\n", - "\n", - "UFO\n", - "\n", - "\n", - "\n", - "1->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "1->1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "2\n", - "\n", - "FUL\n", - "\n", - "\n", - "\n", - "3\n", - "\n", - "FT\n", - "\n", - "\n", - "\n", - "4\n", - "\n", - "AP1\n", - "\n", - "\n", - "\n", - "3->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9\n", - "\n", - "AG\n", - "\n", - "\n", - "\n", - "4->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12\n", - "\n", - "TFL1\n", - "\n", - "\n", - "\n", - "4->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "5\n", - "\n", - "EMF1\n", - "\n", - "\n", - "\n", - "5->3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6\n", - "\n", - "LFY\n", - "\n", - "\n", - "\n", - "5->6\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "5->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->5\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14\n", - "\n", - "SEP\n", - "\n", - "\n", - "\n", - "6->14\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "7\n", - "\n", - "AP2\n", - "\n", - "\n", - "\n", - "7->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "8\n", - "\n", - "WUS\n", - "\n", - "\n", - "\n", - "8->8\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "8->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->8\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "10\n", - "\n", - "LUG\n", - "\n", - "\n", - "\n", - "10->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "11\n", - "\n", - "CLF\n", - "\n", - "\n", - "\n", - "11->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->6\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->7\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "13->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "13->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->8\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->13\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -983,291 +677,15 @@ }, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
kk_rk_ek_sk_r*k_e*k_s*k^{out}k_e^{out}k_e^{out} / k^{out}
node
AG96.92.13.50.770.230.3951.50.29
AP374.72.33.50.680.320.4920.480.24
PI63.82.22.50.640.360.4220.230.12
AP142.41.61.90.590.410.4750.850.17
LFY42.81.220.690.310.574.20.6
TFL142.81.220.690.310.552.40.47
WUS31.41.61.30.480.520.4420.770.39
FUL20.751.220.380.62100nan
UFO101001021.50.73
FT101001010.120.12
EMF1101001031.80.58
AP2101001010.270.27
SEP101001040.490.12
LUG000000010.0230.023
CLF000000010.0230.023
\n", - "
" - ], - "text/plain": [ - " k k_r k_e k_s k_r* k_e* k_s* k^{out} k_e^{out} \\\n", - "node \n", - "AG 9 6.9 2.1 3.5 0.77 0.23 0.39 5 1.5 \n", - "AP3 7 4.7 2.3 3.5 0.68 0.32 0.49 2 0.48 \n", - "PI 6 3.8 2.2 2.5 0.64 0.36 0.42 2 0.23 \n", - "AP1 4 2.4 1.6 1.9 0.59 0.41 0.47 5 0.85 \n", - "LFY 4 2.8 1.2 2 0.69 0.31 0.5 7 4.2 \n", - "TFL1 4 2.8 1.2 2 0.69 0.31 0.5 5 2.4 \n", - "WUS 3 1.4 1.6 1.3 0.48 0.52 0.44 2 0.77 \n", - "FUL 2 0.75 1.2 2 0.38 0.62 1 0 0 \n", - "UFO 1 0 1 0 0 1 0 2 1.5 \n", - "FT 1 0 1 0 0 1 0 1 0.12 \n", - "EMF1 1 0 1 0 0 1 0 3 1.8 \n", - "AP2 1 0 1 0 0 1 0 1 0.27 \n", - "SEP 1 0 1 0 0 1 0 4 0.49 \n", - "LUG 0 0 0 0 0 0 0 1 0.023 \n", - "CLF 0 0 0 0 0 0 0 1 0.023 \n", - "\n", - " k_e^{out} / k^{out} \n", - "node \n", - "AG 0.29 \n", - "AP3 0.24 \n", - "PI 0.12 \n", - "AP1 0.17 \n", - "LFY 0.6 \n", - "TFL1 0.47 \n", - "WUS 0.39 \n", - "FUL nan \n", - "UFO 0.73 \n", - "FT 0.12 \n", - "EMF1 0.58 \n", - "AP2 0.27 \n", - "SEP 0.12 \n", - "LUG 0.023 \n", - "CLF 0.023 " - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "TypeError", + "evalue": "BooleanNode.input_symmetry() got an unexpected keyword argument 'norm'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[9], line 6\u001b[0m\n\u001b[1;32m 1\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame({\n\u001b[1;32m 2\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnode\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39mname \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m N\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 3\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39mk \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m N\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 4\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_r\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39minput_redundancy(norm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m N\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 5\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39meffective_connectivity(norm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m N\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[0;32m----> 6\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_s\u001b[39m\u001b[38;5;124m'\u001b[39m:[\u001b[43mn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minput_symmetry\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnorm\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m N\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 7\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_r*\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39minput_redundancy(norm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;241m/\u001b[39m n\u001b[38;5;241m.\u001b[39mk \u001b[38;5;28;01mif\u001b[39;00m n\u001b[38;5;241m.\u001b[39mk \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;241m0\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m N\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 8\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e*\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39meffective_connectivity(norm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;241m/\u001b[39m n\u001b[38;5;241m.\u001b[39mk \u001b[38;5;28;01mif\u001b[39;00m n\u001b[38;5;241m.\u001b[39mk \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;241m0\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m N\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 9\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_s*\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39minput_symmetry(norm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m) \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m N\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 10\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m:[v \u001b[38;5;28;01mfor\u001b[39;00m n,v \u001b[38;5;129;01min\u001b[39;00m Neg\u001b[38;5;241m.\u001b[39mout_degree()],\n\u001b[1;32m 11\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m:[v \u001b[38;5;28;01mfor\u001b[39;00m n,v \u001b[38;5;129;01min\u001b[39;00m Neg\u001b[38;5;241m.\u001b[39mout_degree(weight\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweight\u001b[39m\u001b[38;5;124m'\u001b[39m)],\n\u001b[1;32m 12\u001b[0m })\u001b[38;5;241m.\u001b[39mset_index(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnode\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 13\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m / k^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m/\u001b[39m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 14\u001b[0m df\u001b[38;5;241m.\u001b[39msort_values(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk\u001b[39m\u001b[38;5;124m'\u001b[39m,ascending\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,inplace\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "\u001b[0;31mTypeError\u001b[0m: BooleanNode.input_symmetry() got an unexpected keyword argument 'norm'" + ] } ], "source": [ @@ -1290,14 +708,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": { "scrolled": false }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1327,7 +745,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": { "scrolled": false }, @@ -1890,7 +1308,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Canalization - Marques-Pita.ipynb b/tutorials/Canalization - Marques-Pita.ipynb index 484c22b..cf36817 100644 --- a/tutorials/Canalization - Marques-Pita.ipynb +++ b/tutorials/Canalization - Marques-Pita.ipynb @@ -29,14 +29,12 @@ "metadata": {}, "outputs": [], "source": [ - "import networkx as nx\n", "import pandas as pd\n", - "pd.set_option('display.width',200)\n", - "import cana\n", "from cana.datasets.bio import MARQUESPITA\n", "from cana.drawing.canalizing_map import draw_canalizing_map_graphviz\n", - "import matplotlib.pylab as plt\n", - "from IPython.display import Image, display" + "from IPython.display import Image, display\n", + "\n", + "pd.set_option('display.width',200)\n" ] }, { @@ -89,7 +87,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "metadata": { "scrolled": false }, @@ -98,12 +96,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "['0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']\n", "k_r: 0.69\n", - "k_e: 0.89\n", - "r_ji: [0.817708333333333, 0.4270833333333333, 0.4270833333333333, 0.817708333333333, 0.817708333333333, 0.817708333333333] (mean)\n", - "e_ji: [0.18229166666666696, 0.5729166666666667, 0.5729166666666667, 0.18229166666666696, 0.18229166666666696, 0.18229166666666696] (mean)\n" + "k_e: 0.31\n", + "r_ji: [0.8177083333333334, 0.4270833333333333, 0.4270833333333333, 0.8177083333333334, 0.8177083333333334, 0.8177083333333334] (mean)\n", + "e_ji: [0.18229166666666663, 0.5729166666666667, 0.5729166666666667, 0.18229166666666663, 0.18229166666666663, 0.18229166666666663] (mean)\n" ] } ], @@ -120,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -245,7 +243,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -276,89 +274,89 @@ " \n", " \n", " \n", - " In:\n", - " Out:\n", + " Input\n", + " Output\n", " \n", " \n", " \n", " \n", " 0\n", - " ##0###\n", + " 1##111\n", " 0\n", " \n", " \n", " 1\n", - " 0##000\n", + " ##0###\n", " 0\n", " \n", " \n", " 2\n", - " 1##111\n", + " #1####\n", " 0\n", " \n", " \n", " 3\n", - " #1####\n", + " 0##000\n", " 0\n", " \n", " \n", " 4\n", - " #011#0\n", + " 101#0#\n", " 1\n", " \n", " \n", " 5\n", - " 0011##\n", + " #011#0\n", " 1\n", " \n", " \n", " 6\n", - " 101#0#\n", + " 001##1\n", " 1\n", " \n", " \n", " 7\n", - " 001##1\n", + " #0101#\n", " 1\n", " \n", " \n", " 8\n", - " #0110#\n", + " 0011##\n", " 1\n", " \n", " \n", " 9\n", - " #010#1\n", + " #01#10\n", " 1\n", " \n", " \n", " 10\n", - " #01#10\n", + " 1010##\n", " 1\n", " \n", " \n", " 11\n", - " #0101#\n", + " #01#01\n", " 1\n", " \n", " \n", " 12\n", - " 001#1#\n", + " #0110#\n", " 1\n", " \n", " \n", " 13\n", - " #01#01\n", + " #010#1\n", " 1\n", " \n", " \n", " 14\n", - " 1010##\n", + " 101##0\n", " 1\n", " \n", " \n", " 15\n", - " 101##0\n", + " 001#1#\n", " 1\n", " \n", " \n", @@ -366,23 +364,23 @@ "" ], "text/plain": [ - " In: Out:\n", - "0 ##0### 0\n", - "1 0##000 0\n", - "2 1##111 0\n", - "3 #1#### 0\n", - "4 #011#0 1\n", - "5 0011## 1\n", - "6 101#0# 1\n", - "7 001##1 1\n", - "8 #0110# 1\n", - "9 #010#1 1\n", - "10 #01#10 1\n", - "11 #0101# 1\n", - "12 001#1# 1\n", - "13 #01#01 1\n", - "14 1010## 1\n", - "15 101##0 1" + " Input Output\n", + "0 1##111 0\n", + "1 ##0### 0\n", + "2 #1#### 0\n", + "3 0##000 0\n", + "4 101#0# 1\n", + "5 #011#0 1\n", + "6 001##1 1\n", + "7 #0101# 1\n", + "8 0011## 1\n", + "9 #01#10 1\n", + "10 1010## 1\n", + "11 #01#01 1\n", + "12 #0110# 1\n", + "13 #010#1 1\n", + "14 101##0 1\n", + "15 001#1# 1" ] }, "metadata": {}, @@ -397,7 +395,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -408,71 +406,16 @@ ] }, { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
In:Out:
01##1110
1#1####0
2##0###0
30##0000
41ÌŠ010ÌŠ#ÌŠ#ÌŠ1
\n", - "
" - ], - "text/plain": [ - " In: Out:\n", - "0 1##111 0\n", - "1 #1#### 0\n", - "2 ##0### 0\n", - "3 0##000 0\n", - "4 1ÌŠ010ÌŠ#ÌŠ#ÌŠ 1" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[8], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTW Schema\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m----> 2\u001b[0m dfTW \u001b[38;5;241m=\u001b[39m \u001b[43mn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mschemata_look_up_table\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mtype\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mts\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m display(dfTW)\n", + "File \u001b[0;32m/data/siyer/CANA/cana/boolean_node.py:498\u001b[0m, in \u001b[0;36mBooleanNode.schemata_look_up_table\u001b[0;34m(self, type, pi_symbol, ts_symbol_list)\u001b[0m\n\u001b[1;32m 496\u001b[0m \u001b[38;5;66;03m# Same Symbol\u001b[39;00m\n\u001b[1;32m 497\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m j, samesymbol \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(samesymbols):\n\u001b[0;32m--> 498\u001b[0m ts_symbol_unicode \u001b[38;5;241m=\u001b[39m \u001b[43mts_symbol_list\u001b[49m\u001b[43m[\u001b[49m\u001b[43mj\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 499\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m j \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 500\u001b[0m string \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m | \u001b[39m\u001b[38;5;124m\"\u001b[39m\n", + "\u001b[0;31mIndexError\u001b[0m: list index out of range" + ] } ], "source": [ @@ -483,7 +426,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -514,7 +457,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -858,7 +801,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Canalization - Node Schematas.ipynb b/tutorials/Canalization - Node Schematas.ipynb index 42984df..4aacc98 100644 --- a/tutorials/Canalization - Node Schematas.ipynb +++ b/tutorials/Canalization - Node Schematas.ipynb @@ -14,9 +14,11 @@ "metadata": {}, "outputs": [], "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "%matplotlib inline" + "from __future__ import division\n", + "import pandas as pd\n", + "from IPython.display import display\n", + "from cana.datasets.bools import OR, AND, XOR, CONTRADICTION, COPYx1, RULE110, RULE90\n", + "from cana.drawing.canalizing_map import draw_canalizing_map_graphviz" ] }, { @@ -25,13 +27,9 @@ "metadata": {}, "outputs": [], "source": [ - "from __future__ import division\n", - "import numpy as np\n", - "import pandas as pd\n", - "from IPython.display import Image, display\n", - "import cana\n", - "from cana.datasets.bools import *\n", - "from cana.drawing.canalizing_map import draw_canalizing_map_graphviz" + "%load_ext autoreload\n", + "%autoreload 2\n", + "%matplotlib inline" ] }, { @@ -43,9 +41,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "k_r: 0.38\n", - "k_e: 0.81\n", + "k_e: 0.62\n", "r_ji: [0.375, 0.375] (mean)\n", "e_ji: [0.625, 0.625] (mean)\n" ] @@ -79,10 +77,10 @@ " \n", " In:\n", " Out:\n", - " In:\n", - " Out:\n", - " In:\n", - " Out:\n", + " Input\n", + " Output\n", + " Input\n", + " Output\n", " \n", " \n", " \n", @@ -91,25 +89,25 @@ " 00\n", " 0\n", " 00\n", - " 0\n", - " 00\n", - " 0\n", + " 0.0\n", + " (00) | (0ÌŠ0ÌŠ)\n", + " 0.0\n", " \n", " \n", " 1\n", " 01\n", " 1\n", " 1#\n", - " 1\n", - " #ÌŠ1ÌŠ\n", - " 1\n", + " 1.0\n", + " (1ÌŠ#ÌŠ)\n", + " 1.0\n", " \n", " \n", " 2\n", " 10\n", " 1\n", " #1\n", - " 1\n", + " 1.0\n", " -\n", " -\n", " \n", @@ -127,12 +125,12 @@ "" ], "text/plain": [ - " Original LUT PI Schema TS Schema \n", - " In: Out: In: Out: In: Out:\n", - "0 00 0 00 0 00 0\n", - "1 01 1 1# 1 #ÌŠ1ÌŠ 1\n", - "2 10 1 #1 1 - -\n", - "3 11 1 - - - -" + " Original LUT PI Schema TS Schema \n", + " In: Out: Input Output Input Output\n", + "0 00 0 00 0.0 (00) | (0ÌŠ0ÌŠ) 0.0\n", + "1 01 1 1# 1.0 (1ÌŠ#ÌŠ) 1.0\n", + "2 10 1 #1 1.0 - -\n", + "3 11 1 - - - -" ] }, "metadata": {}, @@ -144,12 +142,13 @@ "\n", "\n", - "\n", - "\n", + "\n", "\n", "\n", + "%3\n", "\n", "\n", "\n", @@ -248,7 +247,7 @@ "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -281,9 +280,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "k_r: 1.00\n", - "k_e: 0.50\n", + "k_e: 0.00\n", "r_ji: [1.0, 1.0] (mean)\n", "e_ji: [0.0, 0.0] (mean)\n" ] @@ -317,10 +316,10 @@ " \n", " In:\n", " Out:\n", - " In:\n", - " Out:\n", - " In:\n", - " Out:\n", + " Input\n", + " Output\n", + " Input\n", + " Output\n", " \n", " \n", " \n", @@ -329,9 +328,9 @@ " 00\n", " 0\n", " ##\n", - " 0\n", - " ##\n", - " 0\n", + " 0.0\n", + " (##) | (#ÌŠ#ÌŠ)\n", + " 0.0\n", " \n", " \n", " 1\n", @@ -365,12 +364,12 @@ "" ], "text/plain": [ - " Original LUT PI Schema TS Schema \n", - " In: Out: In: Out: In: Out:\n", - "0 00 0 ## 0 ## 0\n", - "1 01 0 - - - -\n", - "2 10 0 - - - -\n", - "3 11 0 - - - -" + " Original LUT PI Schema TS Schema \n", + " In: Out: Input Output Input Output\n", + "0 00 0 ## 0.0 (##) | (#ÌŠ#ÌŠ) 0.0\n", + "1 01 0 - - - -\n", + "2 10 0 - - - -\n", + "3 11 0 - - - -" ] }, "metadata": {}, @@ -382,12 +381,13 @@ "\n", "\n", - "\n", - "\n", + "\n", "\n", "\n", + "%3\n", "\n", "\n", "\n", @@ -417,7 +417,7 @@ "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -451,13 +451,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "k_r: 0.00\n", "k_e: 1.00\n", "r_ji: [0.0, 0.0] (mean)\n", "e_ji: [1.0, 1.0] (mean)\n", - "TS: 11 | PermIdx: [] | SameIdx: [[0, 1]]\n", "TS: 00 | PermIdx: [] | SameIdx: [[0, 1]]\n", + "TS: 11 | PermIdx: [] | SameIdx: [[0, 1]]\n", "TS: 01 | PermIdx: [[0, 1]] | SameIdx: []\n" ] }, @@ -490,10 +490,10 @@ " \n", " In:\n", " Out:\n", - " In:\n", - " Out:\n", - " In:\n", - " Out:\n", + " Input\n", + " Output\n", + " Input\n", + " Output\n", " \n", " \n", " \n", @@ -501,19 +501,19 @@ " 0\n", " 00\n", " 0\n", - " 11\n", - " 0\n", - " 11\n", + " 00\n", " 0\n", + " (00) | (0ÌŠ0ÌŠ)\n", + " 0.0\n", " \n", " \n", " 1\n", " 01\n", " 1\n", - " 00\n", - " 0\n", - " 00\n", + " 11\n", " 0\n", + " (11) | (1ÌŠ1ÌŠ)\n", + " 0.0\n", " \n", " \n", " 2\n", @@ -521,8 +521,8 @@ " 1\n", " 01\n", " 1\n", - " 0ÌŠ1ÌŠ\n", - " 1\n", + " (0ÌŠ1ÌŠ)\n", + " 1.0\n", " \n", " \n", " 3\n", @@ -538,12 +538,12 @@ "" ], "text/plain": [ - " Original LUT PI Schema TS Schema \n", - " In: Out: In: Out: In: Out:\n", - "0 00 0 11 0 11 0\n", - "1 01 1 00 0 00 0\n", - "2 10 1 01 1 0ÌŠ1ÌŠ 1\n", - "3 11 0 10 1 - -" + " Original LUT PI Schema TS Schema \n", + " In: Out: Input Output Input Output\n", + "0 00 0 00 0 (00) | (0ÌŠ0ÌŠ) 0.0\n", + "1 01 1 11 0 (11) | (1ÌŠ1ÌŠ) 0.0\n", + "2 10 1 01 1 (0ÌŠ1ÌŠ) 1.0\n", + "3 11 0 10 1 - -" ] }, "metadata": {}, @@ -555,156 +555,157 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", "\n", "\n", "var-0-out-0\n", - "\n", - "XOR\n", + "\n", + "XOR\n", "\n", "\n", "\n", "var-0-out-1\n", - "\n", - "XOR\n", + "\n", + "XOR\n", "\n", "\n", "\n", "thr-0-var-0-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "thr-0-var-0-out-0->var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-1\n", - "\n", - "1\n", + "var-1-out-0\n", + "\n", + "1\n", "\n", - "\n", + "\n", "\n", - "var-1-out-1->thr-0-var-0-out-0\n", - "\n", - "\n", + "var-1-out-0->thr-0-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-0-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-0-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-1->fus-0-thr-2-var-0-out-1\n", - "\n", + "var-1-out-0->fus-0-thr-2-var-0-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-2-out-1\n", - "\n", - "2\n", + "var-2-out-0\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-2-out-1->thr-0-var-0-out-0\n", - "\n", - "\n", + "var-2-out-0->thr-0-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-2-out-1->fus-0-thr-2-var-0-out-1\n", - "\n", + "var-2-out-0->fus-0-thr-2-var-0-out-0\n", + "\n", "\n", "\n", "\n", "thr-1-var-0-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "thr-1-var-0-out-0->var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0\n", - "\n", - "1\n", + "var-1-out-1\n", + "\n", + "1\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0->thr-1-var-0-out-0\n", - "\n", - "\n", + "var-1-out-1->thr-1-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-0-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-0-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0->fus-0-thr-2-var-0-out-0\n", - "\n", + "var-1-out-1->fus-0-thr-2-var-0-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-2-out-0\n", - "\n", - "2\n", + "var-2-out-1\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-2-out-0->thr-1-var-0-out-0\n", - "\n", - "\n", + "var-2-out-1->thr-1-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-2-out-0->fus-0-thr-2-var-0-out-0\n", - "\n", + "var-2-out-1->fus-0-thr-2-var-0-out-1\n", + "\n", "\n", "\n", "\n", "thr-2-var-0-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "thr-2-var-0-out-1->var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-2-var-0-out-0->thr-2-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-2-var-0-out-1->thr-2-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -741,9 +742,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "k_r: 0.38\n", - "k_e: 0.81\n", + "k_e: 0.62\n", "r_ji: [0.375, 0.375] (mean)\n", "e_ji: [0.625, 0.625] (mean)\n" ] @@ -777,10 +778,10 @@ " \n", " In:\n", " Out:\n", - " In:\n", - " Out:\n", - " In:\n", - " Out:\n", + " Input\n", + " Output\n", + " Input\n", + " Output\n", " \n", " \n", " \n", @@ -788,26 +789,26 @@ " 0\n", " 00\n", " 0\n", - " 0#\n", - " 0\n", - " 0ÌŠ#ÌŠ\n", - " 0\n", + " #0\n", + " 0.0\n", + " (0ÌŠ#ÌŠ)\n", + " 0.0\n", " \n", "
\n", " 1\n", " 01\n", " 0\n", - " #0\n", - " 0\n", - " 11\n", - " 1\n", + " 0#\n", + " 0.0\n", + " (11) | (1ÌŠ1ÌŠ)\n", + " 1.0\n", "
\n", "
\n", " 2\n", " 10\n", " 0\n", " 11\n", - " 1\n", + " 1.0\n", " -\n", " -\n", "
\n", @@ -825,12 +826,12 @@ "" ], "text/plain": [ - " Original LUT PI Schema TS Schema \n", - " In: Out: In: Out: In: Out:\n", - "0 00 0 0# 0 0ÌŠ#ÌŠ 0\n", - "1 01 0 #0 0 11 1\n", - "2 10 0 11 1 - -\n", - "3 11 1 - - - -" + " Original LUT PI Schema TS Schema \n", + " In: Out: Input Output Input Output\n", + "0 00 0 #0 0.0 (0ÌŠ#ÌŠ) 0.0\n", + "1 01 0 0# 0.0 (11) | (1ÌŠ1ÌŠ) 1.0\n", + "2 10 0 11 1.0 - -\n", + "3 11 1 - - - -" ] }, "metadata": {}, @@ -842,12 +843,13 @@ "\n", "\n", - "\n", - "\n", + "\n", "\n", "\n", + "%3\n", "\n", "\n", "\n", @@ -946,7 +948,7 @@ "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 6, @@ -977,9 +979,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "k_r: 0.50\n", - "k_e: 0.75\n", + "k_e: 0.50\n", "r_ji: [0.0, 1.0] (mean)\n", "e_ji: [1.0, 0.0] (mean)\n" ] @@ -1013,10 +1015,10 @@ " \n", " In:\n", " Out:\n", - " In:\n", - " Out:\n", - " In:\n", - " Out:\n", + " Input\n", + " Output\n", + " Input\n", + " Output\n", " \n", " \n", " \n", @@ -1025,18 +1027,18 @@ " 00\n", " 0\n", " 0#\n", - " 0\n", - " 0#\n", - " 0\n", + " 0.0\n", + " (0#)\n", + " 0.0\n", " \n", "
\n", " 1\n", " 01\n", " 0\n", " 1#\n", - " 1\n", - " 1#\n", - " 1\n", + " 1.0\n", + " (1#)\n", + " 1.0\n", "
\n", "
\n", " 2\n", @@ -1061,12 +1063,12 @@ "" ], "text/plain": [ - " Original LUT PI Schema TS Schema \n", - " In: Out: In: Out: In: Out:\n", - "0 00 0 0# 0 0# 0\n", - "1 01 0 1# 1 1# 1\n", - "2 10 1 - - - -\n", - "3 11 1 - - - -" + " Original LUT PI Schema TS Schema \n", + " In: Out: Input Output Input Output\n", + "0 00 0 0# 0.0 (0#) 0.0\n", + "1 01 0 1# 1.0 (1#) 1.0\n", + "2 10 1 - - - -\n", + "3 11 1 - - - -" ] }, "metadata": {}, @@ -1078,12 +1080,13 @@ "\n", "\n", - "\n", - "\n", + "\n", "\n", "\n", + "%3\n", "\n", "\n", "\n", @@ -1149,7 +1152,7 @@ "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -1181,9 +1184,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "k_r: 0.33\n", - "k_e: 0.89\n", + "k_e: 0.67\n", "r_ji: [0.0, 1.0, 0.0] (mean)\n", "e_ji: [1.0, 0.0, 1.0] (mean)\n" ] @@ -1217,10 +1220,10 @@ " \n", " In:\n", " Out:\n", - " In:\n", - " Out:\n", - " In:\n", - " Out:\n", + " Input\n", + " Output\n", + " Input\n", + " Output\n", "
\n", " \n", " \n", @@ -1228,35 +1231,35 @@ " 0\n", " 000\n", " 0\n", - " 0#0\n", - " 0\n", - " 0#0\n", - " 0\n", + " 1#1\n", + " 0.0\n", + " (1#1) | (1ÌŠ#1ÌŠ)\n", + " 0.0\n", " \n", "
\n", " 1\n", " 001\n", " 1\n", - " 1#1\n", - " 0\n", - " 1#1\n", - " 0\n", + " 0#0\n", + " 0.0\n", + " (0#0) | (0ÌŠ#0ÌŠ)\n", + " 0.0\n", "
\n", "
\n", " 2\n", " 010\n", " 0\n", - " 1#0\n", - " 1\n", - " 0ÌŠ#1ÌŠ\n", - " 1\n", + " 0#1\n", + " 1.0\n", + " (0ÌŠ#1ÌŠ)\n", + " 1.0\n", "
\n", "
\n", " 3\n", " 011\n", " 1\n", - " 0#1\n", - " 1\n", + " 1#0\n", + " 1.0\n", " -\n", " -\n", "
\n", @@ -1301,16 +1304,16 @@ "" ], "text/plain": [ - " Original LUT PI Schema TS Schema \n", - " In: Out: In: Out: In: Out:\n", - "0 000 0 0#0 0 0#0 0\n", - "1 001 1 1#1 0 1#1 0\n", - "2 010 0 1#0 1 0ÌŠ#1ÌŠ 1\n", - "3 011 1 0#1 1 - -\n", - "4 100 1 - - - -\n", - "5 101 0 - - - -\n", - "6 110 1 - - - -\n", - "7 111 0 - - - -" + " Original LUT PI Schema TS Schema \n", + " In: Out: Input Output Input Output\n", + "0 000 0 1#1 0.0 (1#1) | (1ÌŠ#1ÌŠ) 0.0\n", + "1 001 1 0#0 0.0 (0#0) | (0ÌŠ#0ÌŠ) 0.0\n", + "2 010 0 0#1 1.0 (0ÌŠ#1ÌŠ) 1.0\n", + "3 011 1 1#0 1.0 - -\n", + "4 100 1 - - - -\n", + "5 101 0 - - - -\n", + "6 110 1 - - - -\n", + "7 111 0 - - - -" ] }, "metadata": {}, @@ -1322,156 +1325,157 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", "\n", "\n", "var-0-out-0\n", - "\n", - "R90\n", + "\n", + "R90\n", "\n", "\n", "\n", "var-0-out-1\n", - "\n", - "R90\n", + "\n", + "R90\n", "\n", "\n", "\n", "thr-0-var-0-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "thr-0-var-0-out-0->var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0\n", - "\n", - "1\n", + "var-1-out-1\n", + "\n", + "1\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0->thr-0-var-0-out-0\n", - "\n", - "\n", + "var-1-out-1->thr-0-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-0-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-0-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0->fus-0-thr-2-var-0-out-0\n", - "\n", + "var-1-out-1->fus-0-thr-2-var-0-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-3-out-0\n", - "\n", - "3\n", + "var-3-out-1\n", + "\n", + "3\n", "\n", - "\n", + "\n", "\n", - "var-3-out-0->thr-0-var-0-out-0\n", - "\n", - "\n", + "var-3-out-1->thr-0-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-3-out-0->fus-0-thr-2-var-0-out-0\n", - "\n", + "var-3-out-1->fus-0-thr-2-var-0-out-1\n", + "\n", "\n", "\n", "\n", "thr-1-var-0-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "thr-1-var-0-out-0->var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-1\n", - "\n", - "1\n", + "var-1-out-0\n", + "\n", + "1\n", "\n", - "\n", + "\n", "\n", - "var-1-out-1->thr-1-var-0-out-0\n", - "\n", - "\n", + "var-1-out-0->thr-1-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-0-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-0-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-1->fus-0-thr-2-var-0-out-1\n", - "\n", + "var-1-out-0->fus-0-thr-2-var-0-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-3-out-1\n", - "\n", - "3\n", + "var-3-out-0\n", + "\n", + "3\n", "\n", - "\n", + "\n", "\n", - "var-3-out-1->thr-1-var-0-out-0\n", - "\n", - "\n", + "var-3-out-0->thr-1-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-3-out-1->fus-0-thr-2-var-0-out-1\n", - "\n", + "var-3-out-0->fus-0-thr-2-var-0-out-0\n", + "\n", "\n", "\n", "\n", "thr-2-var-0-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "thr-2-var-0-out-1->var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-2-var-0-out-0->thr-2-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-2-var-0-out-1->thr-2-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 8, @@ -1503,9 +1507,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "k_r: 0.29\n", - "k_e: 0.90\n", + "k_e: 0.71\n", "r_ji: [0.625, 0.125, 0.125] (mean)\n", "e_ji: [0.375, 0.875, 0.875] (mean)\n" ] @@ -1539,10 +1543,10 @@ " \n", " In:\n", " Out:\n", - " In:\n", - " Out:\n", - " In:\n", - " Out:\n", + " Input\n", + " Output\n", + " Input\n", + " Output\n", " \n", " \n", " \n", @@ -1551,54 +1555,54 @@ " 000\n", " 0\n", " #00\n", - " 0\n", - " #00\n", - " 0\n", + " 0.0\n", + " (#00) | (#0ÌŠ0ÌŠ)\n", + " 0.0\n", " \n", "
\n", " 1\n", " 001\n", " 1\n", " 111\n", - " 0\n", - " 111\n", - " 0\n", + " 0.0\n", + " (111) | (1ÌŠ1ÌŠ1ÌŠ)\n", + " 0.0\n", "
\n", "
\n", " 2\n", " 010\n", " 1\n", - " #01\n", - " 1\n", - " 0#ÌŠ1ÌŠ\n", - " 1\n", + " 01#\n", + " 1.0\n", + " (0ÌŠ#ÌŠ1)\n", + " 1.0\n", "
\n", "
\n", " 3\n", " 011\n", " 1\n", - " #10\n", - " 1\n", - " #ÌŠ10ÌŠ\n", - " 1\n", + " #01\n", + " 1.0\n", + " (#0ÌŠ1ÌŠ)\n", + " 1.0\n", "
\n", "
\n", " 4\n", " 100\n", " 0\n", " 0#1\n", - " 1\n", - " 0ÌŠ#ÌŠ1\n", - " 1\n", + " 1.0\n", + " (01ÌŠ#ÌŠ)\n", + " 1.0\n", "
\n", "
\n", " 5\n", " 101\n", " 1\n", - " 01#\n", - " 1\n", - " #1ÌŠ0ÌŠ\n", - " 1\n", + " #10\n", + " 1.0\n", + " (0ÌŠ1#ÌŠ)\n", + " 1.0\n", "
\n", "
\n", " 6\n", @@ -1623,312 +1627,321 @@ "" ], "text/plain": [ - " Original LUT PI Schema TS Schema \n", - " In: Out: In: Out: In: Out:\n", - "0 000 0 #00 0 #00 0\n", - "1 001 1 111 0 111 0\n", - "2 010 1 #01 1 0#ÌŠ1ÌŠ 1\n", - "3 011 1 #10 1 #ÌŠ10ÌŠ 1\n", - "4 100 0 0#1 1 0ÌŠ#ÌŠ1 1\n", - "5 101 1 01# 1 #1ÌŠ0ÌŠ 1\n", - "6 110 1 - - - -\n", - "7 111 0 - - - -" + " Original LUT PI Schema TS Schema \n", + " In: Out: Input Output Input Output\n", + "0 000 0 #00 0.0 (#00) | (#0ÌŠ0ÌŠ) 0.0\n", + "1 001 1 111 0.0 (111) | (1ÌŠ1ÌŠ1ÌŠ) 0.0\n", + "2 010 1 01# 1.0 (0ÌŠ#ÌŠ1) 1.0\n", + "3 011 1 #01 1.0 (#0ÌŠ1ÌŠ) 1.0\n", + "4 100 0 0#1 1.0 (01ÌŠ#ÌŠ) 1.0\n", + "5 101 1 #10 1.0 (0ÌŠ1#ÌŠ) 1.0\n", + "6 110 1 - - - -\n", + "7 111 0 - - - -" ] }, "metadata": {}, "output_type": "display_data" }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: node 'var-0-out-0', graph '%3' size too small for label\n", + "Warning: node 'var-0-out-1', graph '%3' size too small for label\n" + ] + }, { "data": { "image/svg+xml": [ "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", "\n", "\n", "var-0-out-0\n", - "\n", - "R110\n", + "\n", + "R110\n", "\n", "\n", "\n", "var-0-out-1\n", - "\n", - "R110\n", + "\n", + "R110\n", "\n", "\n", "\n", "thr-0-var-0-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "thr-0-var-0-out-0->var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-2-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-2-out-0->thr-0-var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-4-var-0-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-0-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-2-out-0->fus-0-thr-4-var-0-out-0\n", - "\n", + "var-2-out-0->fus-0-thr-2-var-0-out-0\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-5-var-0-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-0-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-2-out-0->fus-0-thr-5-var-0-out-0\n", - "\n", + "var-2-out-0->fus-0-thr-3-var-0-out-0\n", + "\n", "\n", "\n", "\n", "var-3-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-3-out-0->thr-0-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-3-var-0-out-0\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-3-out-0->fus-0-thr-3-var-0-out-0\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-5-var-0-out-0\n", + "\n", "\n", "\n", "\n", "var-3-out-0->fus-0-thr-5-var-0-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "thr-1-var-0-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "thr-1-var-0-out-0->var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-1-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", "\n", "var-1-out-1->thr-1-var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-2-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-2-out-1->thr-1-var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-0-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-0-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-2-out-1->fus-0-thr-2-var-0-out-1\n", - "\n", + "var-2-out-1->fus-0-thr-3-var-0-out-1\n", + "\n", "\n", - "\n", - "\n", - "thr-3-var-0-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "fus-0-thr-4-var-0-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-2-out-1->thr-3-var-0-out-1\n", - "\n", - "\n", + "var-2-out-1->fus-0-thr-4-var-0-out-1\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-5-var-0-out-1\n", - "\n", + "\n", + "\n", + "thr-5-var-0-out-1\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-2-out-1->fus-0-thr-5-var-0-out-1\n", - "\n", + "var-2-out-1->thr-5-var-0-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "var-3-out-1\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-3-out-1->thr-1-var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-3-out-1->fus-0-thr-2-var-0-out-1\n", - "\n", + "\n", + "\n", + "thr-2-var-0-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "thr-4-var-0-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "var-3-out-1->thr-2-var-0-out-1\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-3-out-1->thr-4-var-0-out-1\n", - "\n", - "\n", + "var-3-out-1->fus-0-thr-3-var-0-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-3-out-1->fus-0-thr-5-var-0-out-1\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-0-out-1\n", - "\n", - "2\n", + "var-3-out-1->fus-0-thr-4-var-0-out-1\n", + "\n", "\n", "\n", "\n", "thr-2-var-0-out-1->var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-2-var-0-out-0->thr-2-var-0-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-1-out-0\n", - "\n", - "1\n", - "\n", - "\n", - "\n", - "var-1-out-0->thr-2-var-0-out-1\n", - "\n", - "\n", + "\n", + "1\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0->fus-0-thr-3-var-0-out-0\n", - "\n", + "var-1-out-0->fus-0-thr-2-var-0-out-0\n", + "\n", "\n", - "\n", + "\n", + "\n", + "thr-4-var-0-out-1\n", + "\n", + "2\n", + "\n", + "\n", "\n", - "var-1-out-0->fus-0-thr-4-var-0-out-0\n", - "\n", + "var-1-out-0->thr-4-var-0-out-1\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "fus-0-thr-2-var-0-out-1->thr-2-var-0-out-1\n", - "\n", - "\n", + "var-1-out-0->fus-0-thr-5-var-0-out-0\n", + "\n", + "\n", + "\n", + "\n", + "thr-3-var-0-out-1\n", + "\n", + "2\n", "\n", "\n", "\n", "thr-3-var-0-out-1->var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-3-var-0-out-0->thr-3-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "thr-4-var-0-out-1->var-0-out-1\n", - "\n", - "\n", + "fus-0-thr-3-var-0-out-1->thr-3-var-0-out-1\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "fus-0-thr-4-var-0-out-0->thr-4-var-0-out-1\n", - "\n", - "\n", + "thr-4-var-0-out-1->var-0-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-5-var-0-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "fus-0-thr-4-var-0-out-1->thr-4-var-0-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-5-var-0-out-1->var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", - "fus-0-thr-5-var-0-out-0->thr-5-var-0-out-1\n", - "\n", - "\n", - "\n", - "\n", "\n", - "fus-0-thr-5-var-0-out-1->thr-5-var-0-out-1\n", - "\n", - "\n", + "fus-0-thr-5-var-0-out-0->thr-5-var-0-out-1\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 9, @@ -1975,7 +1988,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Control - BioModels - Driver Variables.ipynb b/tutorials/Control - BioModels - Driver Variables.ipynb index a633ca2..8922ec0 100644 --- a/tutorials/Control - BioModels - Driver Variables.ipynb +++ b/tutorials/Control - BioModels - Driver Variables.ipynb @@ -16,9 +16,7 @@ "source": [ "import graphviz\n", "import math\n", - "import matplotlib.pyplot as plt\n", "#\n", - "import cana\n", "from cana.datasets.bio import THALIANA #, DROSOPHILA, BUDDING_YEAST" ] }, @@ -31,7 +29,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n" + "\n" ] } ], @@ -49,7 +47,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "STG: Arabidopsis Thaliana\n", + "DiGraph named 'STG: Arabidopsis thaliana' with 8192 nodes and 8192 edges\n", "[[1643], [865], [132], [148], [7787], [7011], [2180], [2196], [5739], [4963]]\n", "Nodes: 8192 | Edges: 8192\n" ] @@ -73,17 +71,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "/Users/rionbr/Sites/CANA/cana/boolean_network.py:848: UserWarning: Cannot control a constant variable 'LUG'! Skipping\n", - " warnings.warn(\"Cannot control a constant variable '%s'! Skipping\" % self.nodes[dv].name )\n", - "/Users/rionbr/Sites/CANA/cana/boolean_network.py:848: UserWarning: Cannot control a constant variable 'CLF'! Skipping\n", - " warnings.warn(\"Cannot control a constant variable '%s'! Skipping\" % self.nodes[dv].name )\n" + "/data/siyer/CANA/cana/boolean_network.py:1065: UserWarning: Cannot control a constant variable 'LUG'! Skipping\n", + " warnings.warn(\n", + "/data/siyer/CANA/cana/boolean_network.py:1065: UserWarning: Cannot control a constant variable 'CLF'! Skipping\n", + " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "C-STG: Arabidopsis Thaliana (UFO,LUG,CLF,TFL1,SEP)\n", + "DiGraph named 'C-STG: Arabidopsis thaliana (UFO,LUG,CLF,TFL1,SEP)' with 8192 nodes and 73701 edges\n", "Nodes: 8192 | Edges: 73701\n" ] } @@ -107,9 +105,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "CAG: C-STG: Arabidopsis Thaliana Att(UFO,LUG,CLF,TFL1,SEP)\n", + "DiGraph named 'CAG: C-STG: Arabidopsis thaliana Att(UFO,LUG,CLF,TFL1,SEP)' with 10 nodes and 37 edges\n", "Nodes: 10 | Edges: 37\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/data/siyer/CANA/cana/boolean_network.py:1216: UserWarning: Cannot control a constant variable 'LUG'! Skipping\n", + " warnings.warn(\n", + "/data/siyer/CANA/cana/boolean_network.py:1216: UserWarning: Cannot control a constant variable 'CLF'! Skipping\n", + " warnings.warn(\n" + ] } ], "source": [ @@ -155,7 +163,7 @@ "\n", "\n", - "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -458,379 +466,41 @@ "execution_count": 9, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "free(): invalid next size (normal)\n" + ] + }, + { + "ename": "CalledProcessError", + "evalue": "Command '[PosixPath('dot'), '-Kneato', '-Tsvg']' died with . [stderr: 'free(): invalid next size (normal)\\n']", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCalledProcessError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/backend/execute.py:88\u001b[0m, in \u001b[0;36mrun_check\u001b[0;34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 88\u001b[0m \u001b[43mproc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcheck_returncode\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m subprocess\u001b[38;5;241m.\u001b[39mCalledProcessError \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m/usr/lib/python3.12/subprocess.py:502\u001b[0m, in \u001b[0;36mCompletedProcess.check_returncode\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 501\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturncode:\n\u001b[0;32m--> 502\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CalledProcessError(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturncode, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstdout,\n\u001b[1;32m 503\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr)\n", + "\u001b[0;31mCalledProcessError\u001b[0m: Command '[PosixPath('dot'), '-Kneato', '-Tsvg']' died with .", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mCalledProcessError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/IPython/core/formatters.py:977\u001b[0m, in \u001b[0;36mMimeBundleFormatter.__call__\u001b[0;34m(self, obj, include, exclude)\u001b[0m\n\u001b[1;32m 974\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n\u001b[1;32m 976\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 977\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43minclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minclude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexclude\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 978\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 979\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/jupyter_integration.py:98\u001b[0m, in \u001b[0;36mJupyterIntegration._repr_mimebundle_\u001b[0;34m(self, include, exclude, **_)\u001b[0m\n\u001b[1;32m 96\u001b[0m include \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(include) \u001b[38;5;28;01mif\u001b[39;00m include \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jupyter_mimetype}\n\u001b[1;32m 97\u001b[0m include \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(exclude \u001b[38;5;129;01mor\u001b[39;00m [])\n\u001b[0;32m---> 98\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {mimetype: \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod_name\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m mimetype, method_name \u001b[38;5;129;01min\u001b[39;00m MIME_TYPES\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 100\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m mimetype \u001b[38;5;129;01min\u001b[39;00m include}\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/jupyter_integration.py:112\u001b[0m, in \u001b[0;36mJupyterIntegration._repr_image_svg_xml\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_repr_image_svg_xml\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mstr\u001b[39m:\n\u001b[1;32m 111\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the rendered graph as SVG string.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 112\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpipe\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msvg\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mSVG_ENCODING\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/piping.py:104\u001b[0m, in \u001b[0;36mPipe.pipe\u001b[0;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpipe\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 56\u001b[0m \u001b[38;5;28mformat\u001b[39m: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 57\u001b[0m renderer: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 61\u001b[0m engine: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 62\u001b[0m encoding: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mUnion[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[1;32m 63\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the source piped through the Graphviz layout command.\u001b[39;00m\n\u001b[1;32m 64\u001b[0m \n\u001b[1;32m 65\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[38;5;124;03m ' 104\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_legacy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 105\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 107\u001b[0m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 108\u001b[0m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 109\u001b[0m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 110\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/_tools.py:171\u001b[0m, in \u001b[0;36mdeprecate_positional_args..decorator..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 162\u001b[0m wanted \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 163\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, value \u001b[38;5;129;01min\u001b[39;00m deprecated\u001b[38;5;241m.\u001b[39mitems())\n\u001b[1;32m 164\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe signature of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m will be reduced\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 165\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msupported_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m positional args\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 166\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(supported)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: pass \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mwanted\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 167\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m as keyword arg(s)\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 168\u001b[0m stacklevel\u001b[38;5;241m=\u001b[39mstacklevel,\n\u001b[1;32m 169\u001b[0m category\u001b[38;5;241m=\u001b[39mcategory)\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/piping.py:121\u001b[0m, in \u001b[0;36mPipe._pipe_legacy\u001b[0;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[38;5;129m@_tools\u001b[39m\u001b[38;5;241m.\u001b[39mdeprecate_positional_args(supported_number\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_pipe_legacy\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28mformat\u001b[39m: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 119\u001b[0m engine: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 120\u001b[0m encoding: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mUnion[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[0;32m--> 121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_future\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 122\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 123\u001b[0m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 124\u001b[0m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 125\u001b[0m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 126\u001b[0m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 127\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/piping.py:149\u001b[0m, in \u001b[0;36mPipe._pipe_future\u001b[0;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[1;32m 146\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m encoding \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 147\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m codecs\u001b[38;5;241m.\u001b[39mlookup(encoding) \u001b[38;5;129;01mis\u001b[39;00m codecs\u001b[38;5;241m.\u001b[39mlookup(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding):\n\u001b[1;32m 148\u001b[0m \u001b[38;5;66;03m# common case: both stdin and stdout need the same encoding\u001b[39;00m\n\u001b[0;32m--> 149\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_lines_string\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 150\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 151\u001b[0m raw \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_pipe_lines(\u001b[38;5;241m*\u001b[39margs, input_encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/backend/piping.py:212\u001b[0m, in \u001b[0;36mpipe_lines_string\u001b[0;34m(engine, format, input_lines, encoding, renderer, formatter, neato_no_op, quiet)\u001b[0m\n\u001b[1;32m 206\u001b[0m cmd \u001b[38;5;241m=\u001b[39m dot_command\u001b[38;5;241m.\u001b[39mcommand(engine, \u001b[38;5;28mformat\u001b[39m,\n\u001b[1;32m 207\u001b[0m renderer\u001b[38;5;241m=\u001b[39mrenderer,\n\u001b[1;32m 208\u001b[0m formatter\u001b[38;5;241m=\u001b[39mformatter,\n\u001b[1;32m 209\u001b[0m neato_no_op\u001b[38;5;241m=\u001b[39mneato_no_op)\n\u001b[1;32m 210\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minput_lines\u001b[39m\u001b[38;5;124m'\u001b[39m: input_lines, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mencoding\u001b[39m\u001b[38;5;124m'\u001b[39m: encoding}\n\u001b[0;32m--> 212\u001b[0m proc \u001b[38;5;241m=\u001b[39m \u001b[43mexecute\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcapture_output\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m proc\u001b[38;5;241m.\u001b[39mstdout\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/backend/execute.py:90\u001b[0m, in \u001b[0;36mrun_check\u001b[0;34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[0m\n\u001b[1;32m 88\u001b[0m proc\u001b[38;5;241m.\u001b[39mcheck_returncode()\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m subprocess\u001b[38;5;241m.\u001b[39mCalledProcessError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m---> 90\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CalledProcessError(\u001b[38;5;241m*\u001b[39me\u001b[38;5;241m.\u001b[39margs)\n\u001b[1;32m 92\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m proc\n", + "\u001b[0;31mCalledProcessError\u001b[0m: Command '[PosixPath('dot'), '-Kneato', '-Tsvg']' died with . [stderr: 'free(): invalid next size (normal)\\n']" + ] + }, { "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Structural Graph\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "AP3\n", - "\n", - "\n", - "\n", - "0->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "13\n", - "\n", - "PI\n", - "\n", - "\n", - "\n", - "0->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "1\n", - "\n", - "UFO\n", - "\n", - "\n", - "\n", - "1->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "1->1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "2\n", - "\n", - "FUL\n", - "\n", - "\n", - "\n", - "6\n", - "\n", - "LFY\n", - "\n", - "\n", - "\n", - "2->6\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "3\n", - "\n", - "FT\n", - "\n", - "\n", - "\n", - "4\n", - "\n", - "AP1\n", - "\n", - "\n", - "\n", - "3->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->6\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9\n", - "\n", - "AG\n", - "\n", - "\n", - "\n", - "4->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12\n", - "\n", - "TFL1\n", - "\n", - "\n", - "\n", - "4->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "5\n", - "\n", - "EMF1\n", - "\n", - "\n", - "\n", - "5->3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "5->6\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "5->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->5\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14\n", - "\n", - "SEP\n", - "\n", - "\n", - "\n", - "6->14\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "7\n", - "\n", - "AP2\n", - "\n", - "\n", - "\n", - "7->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "7->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "8\n", - "\n", - "WUS\n", - "\n", - "\n", - "\n", - "8->8\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "8->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->8\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "10\n", - "\n", - "LUG\n", - "\n", - "\n", - "\n", - "10->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "11\n", - "\n", - "CLF\n", - "\n", - "\n", - "\n", - "11->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->6\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->7\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "13->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "13->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->8\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->13\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -893,361 +563,41 @@ "execution_count": 11, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "double free or corruption (!prev)\n" + ] + }, + { + "ename": "CalledProcessError", + "evalue": "Command '[PosixPath('dot'), '-Kneato', '-Tsvg']' died with . [stderr: 'double free or corruption (!prev)\\n']", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCalledProcessError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/backend/execute.py:88\u001b[0m, in \u001b[0;36mrun_check\u001b[0;34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 88\u001b[0m \u001b[43mproc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcheck_returncode\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m subprocess\u001b[38;5;241m.\u001b[39mCalledProcessError \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m/usr/lib/python3.12/subprocess.py:502\u001b[0m, in \u001b[0;36mCompletedProcess.check_returncode\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 501\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturncode:\n\u001b[0;32m--> 502\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CalledProcessError(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturncode, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstdout,\n\u001b[1;32m 503\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr)\n", + "\u001b[0;31mCalledProcessError\u001b[0m: Command '[PosixPath('dot'), '-Kneato', '-Tsvg']' died with .", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mCalledProcessError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/IPython/core/formatters.py:977\u001b[0m, in \u001b[0;36mMimeBundleFormatter.__call__\u001b[0;34m(self, obj, include, exclude)\u001b[0m\n\u001b[1;32m 974\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n\u001b[1;32m 976\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 977\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43minclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minclude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexclude\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 978\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 979\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/jupyter_integration.py:98\u001b[0m, in \u001b[0;36mJupyterIntegration._repr_mimebundle_\u001b[0;34m(self, include, exclude, **_)\u001b[0m\n\u001b[1;32m 96\u001b[0m include \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(include) \u001b[38;5;28;01mif\u001b[39;00m include \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jupyter_mimetype}\n\u001b[1;32m 97\u001b[0m include \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m(exclude \u001b[38;5;129;01mor\u001b[39;00m [])\n\u001b[0;32m---> 98\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {mimetype: \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod_name\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m mimetype, method_name \u001b[38;5;129;01min\u001b[39;00m MIME_TYPES\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 100\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m mimetype \u001b[38;5;129;01min\u001b[39;00m include}\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/jupyter_integration.py:112\u001b[0m, in \u001b[0;36mJupyterIntegration._repr_image_svg_xml\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_repr_image_svg_xml\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mstr\u001b[39m:\n\u001b[1;32m 111\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the rendered graph as SVG string.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 112\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpipe\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msvg\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mSVG_ENCODING\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/piping.py:104\u001b[0m, in \u001b[0;36mPipe.pipe\u001b[0;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpipe\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 56\u001b[0m \u001b[38;5;28mformat\u001b[39m: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 57\u001b[0m renderer: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 61\u001b[0m engine: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 62\u001b[0m encoding: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mUnion[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[1;32m 63\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return the source piped through the Graphviz layout command.\u001b[39;00m\n\u001b[1;32m 64\u001b[0m \n\u001b[1;32m 65\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[38;5;124;03m ' 104\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_legacy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 105\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 107\u001b[0m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 108\u001b[0m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 109\u001b[0m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 110\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/_tools.py:171\u001b[0m, in \u001b[0;36mdeprecate_positional_args..decorator..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 162\u001b[0m wanted \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 163\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, value \u001b[38;5;129;01min\u001b[39;00m deprecated\u001b[38;5;241m.\u001b[39mitems())\n\u001b[1;32m 164\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe signature of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m will be reduced\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 165\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msupported_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m positional args\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 166\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(supported)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: pass \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mwanted\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 167\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m as keyword arg(s)\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 168\u001b[0m stacklevel\u001b[38;5;241m=\u001b[39mstacklevel,\n\u001b[1;32m 169\u001b[0m category\u001b[38;5;241m=\u001b[39mcategory)\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/piping.py:121\u001b[0m, in \u001b[0;36mPipe._pipe_legacy\u001b[0;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[38;5;129m@_tools\u001b[39m\u001b[38;5;241m.\u001b[39mdeprecate_positional_args(supported_number\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_pipe_legacy\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28mformat\u001b[39m: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 119\u001b[0m engine: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 120\u001b[0m encoding: typing\u001b[38;5;241m.\u001b[39mOptional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mUnion[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[0;32m--> 121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_future\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 122\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 123\u001b[0m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 124\u001b[0m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 125\u001b[0m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 126\u001b[0m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 127\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/piping.py:149\u001b[0m, in \u001b[0;36mPipe._pipe_future\u001b[0;34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[0m\n\u001b[1;32m 146\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m encoding \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 147\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m codecs\u001b[38;5;241m.\u001b[39mlookup(encoding) \u001b[38;5;129;01mis\u001b[39;00m codecs\u001b[38;5;241m.\u001b[39mlookup(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding):\n\u001b[1;32m 148\u001b[0m \u001b[38;5;66;03m# common case: both stdin and stdout need the same encoding\u001b[39;00m\n\u001b[0;32m--> 149\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipe_lines_string\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 150\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 151\u001b[0m raw \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_pipe_lines(\u001b[38;5;241m*\u001b[39margs, input_encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/backend/piping.py:212\u001b[0m, in \u001b[0;36mpipe_lines_string\u001b[0;34m(engine, format, input_lines, encoding, renderer, formatter, neato_no_op, quiet)\u001b[0m\n\u001b[1;32m 206\u001b[0m cmd \u001b[38;5;241m=\u001b[39m dot_command\u001b[38;5;241m.\u001b[39mcommand(engine, \u001b[38;5;28mformat\u001b[39m,\n\u001b[1;32m 207\u001b[0m renderer\u001b[38;5;241m=\u001b[39mrenderer,\n\u001b[1;32m 208\u001b[0m formatter\u001b[38;5;241m=\u001b[39mformatter,\n\u001b[1;32m 209\u001b[0m neato_no_op\u001b[38;5;241m=\u001b[39mneato_no_op)\n\u001b[1;32m 210\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minput_lines\u001b[39m\u001b[38;5;124m'\u001b[39m: input_lines, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mencoding\u001b[39m\u001b[38;5;124m'\u001b[39m: encoding}\n\u001b[0;32m--> 212\u001b[0m proc \u001b[38;5;241m=\u001b[39m \u001b[43mexecute\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcapture_output\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m proc\u001b[38;5;241m.\u001b[39mstdout\n", + "File \u001b[0;32m/data/siyer/CANA/.venv/lib/python3.12/site-packages/graphviz/backend/execute.py:90\u001b[0m, in \u001b[0;36mrun_check\u001b[0;34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[0m\n\u001b[1;32m 88\u001b[0m proc\u001b[38;5;241m.\u001b[39mcheck_returncode()\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m subprocess\u001b[38;5;241m.\u001b[39mCalledProcessError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m---> 90\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CalledProcessError(\u001b[38;5;241m*\u001b[39me\u001b[38;5;241m.\u001b[39margs)\n\u001b[1;32m 92\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m proc\n", + "\u001b[0;31mCalledProcessError\u001b[0m: Command '[PosixPath('dot'), '-Kneato', '-Tsvg']' died with . [stderr: 'double free or corruption (!prev)\\n']" + ] + }, { "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Structural Graph\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "AP3\n", - "\n", - "\n", - "\n", - "0->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "13\n", - "\n", - "PI\n", - "\n", - "\n", - "\n", - "0->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "1\n", - "\n", - "UFO\n", - "\n", - "\n", - "\n", - "1->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "1->1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "2\n", - "\n", - "FUL\n", - "\n", - "\n", - "\n", - "3\n", - "\n", - "FT\n", - "\n", - "\n", - "\n", - "4\n", - "\n", - "AP1\n", - "\n", - "\n", - "\n", - "3->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9\n", - "\n", - "AG\n", - "\n", - "\n", - "\n", - "4->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12\n", - "\n", - "TFL1\n", - "\n", - "\n", - "\n", - "4->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "4->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "5\n", - "\n", - "EMF1\n", - "\n", - "\n", - "\n", - "5->3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6\n", - "\n", - "LFY\n", - "\n", - "\n", - "\n", - "5->6\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "5->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->5\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->12\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "6->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14\n", - "\n", - "SEP\n", - "\n", - "\n", - "\n", - "6->14\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "7\n", - "\n", - "AP2\n", - "\n", - "\n", - "\n", - "7->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "8\n", - "\n", - "WUS\n", - "\n", - "\n", - "\n", - "8->8\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "8->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->8\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "9->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "10\n", - "\n", - "LUG\n", - "\n", - "\n", - "\n", - "10->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "11\n", - "\n", - "CLF\n", - "\n", - "\n", - "\n", - "11->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->6\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->7\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "12->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "13->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "13->13\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->8\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->9\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "14->13\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1318,7 +668,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Control - State Transition Graph.ipynb b/tutorials/Control - State Transition Graph.ipynb index c80b511..9640acd 100644 --- a/tutorials/Control - State Transition Graph.ipynb +++ b/tutorials/Control - State Transition Graph.ipynb @@ -20,7 +20,9 @@ "metadata": {}, "outputs": [], "source": [ - "%matplotlib inline" + "import graphviz\n", + "#\n", + "from cana.datasets.bio import MARQUESPITA" ] }, { @@ -29,12 +31,7 @@ "metadata": {}, "outputs": [], "source": [ - "import networkx as nx\n", - "import graphviz\n", - "import matplotlib.pyplot as plt\n", - "#\n", - "import cana\n", - "from cana.datasets.bio import MARQUESPITA" + "%matplotlib inline" ] }, { @@ -47,13 +44,13 @@ "output_type": "stream", "text": [ "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] } ], @@ -77,7 +74,8 @@ "text": [ "[(0, {'label': '1111110'}), (1, {'label': '1111111'})]\n", "STG: [[0]]\n", - "BNS: [[126]]\n" + "'BNS' could not be found! You must have it compiled or download the binary for your system from the 'bns' website (https://people.kth.se/~dubrova/bns.html).\n", + "BNS: []\n" ] } ], @@ -110,7 +108,7 @@ "\n", "\n", - "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -199,7 +197,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Control - Thaliana.ipynb b/tutorials/Control - Thaliana.ipynb index be696f5..9e85060 100644 --- a/tutorials/Control - Thaliana.ipynb +++ b/tutorials/Control - Thaliana.ipynb @@ -14,9 +14,11 @@ "metadata": {}, "outputs": [], "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "%matplotlib inline" + "from __future__ import division\n", + "from itertools import product\n", + "from cana.datasets.bio import THALIANA\n", + "from IPython.display import display\n", + "from IPython.core.display import HTML" ] }, { @@ -25,13 +27,9 @@ "metadata": {}, "outputs": [], "source": [ - "from __future__ import division\n", - "import numpy as np\n", - "from itertools import product\n", - "from cana.control import fvs, mds, sc\n", - "from cana.datasets.bio import THALIANA\n", - "from IPython.display import display\n", - "from IPython.core.display import HTML" + "%load_ext autoreload\n", + "%autoreload 2\n", + "%matplotlib inline" ] }, { @@ -74,27 +72,11 @@ "output_type": "stream", "text": [ "Trying with 1 Driver Nodes\n", - "Trying with 2 Driver Nodes\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHTML\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'

Control State Transition Graph (CSTG)

'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;31m# THIS MIGHT TAKE A LONG TIME, it is here for demo purposes.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mdriver_nodes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mattractor_driver_nodes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmin_dvs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_dvs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mN\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_node_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdriver_nodes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m#> ['AP2', 'EMF1', 'LFY', 'TFL1', 'UFO', 'WUS'], ['AG', 'EMF1', 'LFY', 'TFL1', 'UFO', 'WUS']\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Sites/CANA/cana/boolean_network.py\u001b[0m in \u001b[0;36mattractor_driver_nodes\u001b[0;34m(self, min_dvs, max_dvs, verbose)\u001b[0m\n\u001b[1;32m 814\u001b[0m \u001b[0mdvs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdvs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 815\u001b[0m \u001b[0;31m# cstg = self.controlled_state_transition_graph(dvs)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 816\u001b[0;31m \u001b[0mcag\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontrolled_attractor_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdvs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 817\u001b[0m \u001b[0matt_reachable_from\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean_reachable_attractors\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 818\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Sites/CANA/cana/boolean_network.py\u001b[0m in \u001b[0;36mcontrolled_attractor_graph\u001b[0;34m(self, driver_nodes)\u001b[0m\n\u001b[1;32m 947\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 948\u001b[0m \u001b[0mattractor_states\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0matt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_attractors\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0matt\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 949\u001b[0;31m \u001b[0mcstg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdeepcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_stg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 950\u001b[0m \u001b[0mcstg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'C-'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mcstg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m' Att('\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m','\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnodes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdv\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mdv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdriver_nodes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m')'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 951\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/anaconda3/lib/python3.7/copy.py\u001b[0m in \u001b[0;36mdeepcopy\u001b[0;34m(x, memo, _nil)\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 180\u001b[0;31m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_reconstruct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mrv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 181\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 182\u001b[0m \u001b[0;31m# If is its own copy, don't memoize.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/anaconda3/lib/python3.7/copy.py\u001b[0m in \u001b[0;36m_reconstruct\u001b[0;34m(x, memo, func, args, state, listiter, dictiter, deepcopy)\u001b[0m\n\u001b[1;32m 279\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 280\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdeep\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 281\u001b[0;31m \u001b[0mstate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdeepcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 282\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'__setstate__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 283\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__setstate__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/anaconda3/lib/python3.7/copy.py\u001b[0m in \u001b[0;36mdeepcopy\u001b[0;34m(x, memo, _nil)\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[0mcopier\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_deepcopy_dispatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcopier\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 150\u001b[0;31m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcopier\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 151\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 152\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/anaconda3/lib/python3.7/copy.py\u001b[0m in \u001b[0;36m_deepcopy_dict\u001b[0;34m(x, memo, deepcopy)\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 241\u001b[0;31m \u001b[0my\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdeepcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdeepcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 242\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 243\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_deepcopy_dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/anaconda3/lib/python3.7/copy.py\u001b[0m in \u001b[0;36mdeepcopy\u001b[0;34m(x, memo, _nil)\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[0mcopier\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_deepcopy_dispatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcopier\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 150\u001b[0;31m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcopier\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 151\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 152\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/anaconda3/lib/python3.7/copy.py\u001b[0m in \u001b[0;36m_deepcopy_dict\u001b[0;34m(x, memo, deepcopy)\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 241\u001b[0;31m \u001b[0my\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdeepcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdeepcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 242\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 243\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_deepcopy_dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/anaconda3/lib/python3.7/copy.py\u001b[0m in \u001b[0;36mdeepcopy\u001b[0;34m(x, memo, _nil)\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 142\u001b[0;31m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_nil\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 143\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0my\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0m_nil\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 144\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "Trying with 2 Driver Nodes\n", + "Trying with 3 Driver Nodes\n", + "Trying with 4 Driver Nodes\n", + "Trying with 5 Driver Nodes\n", + "Trying with 6 Driver Nodes\n" ] } ], @@ -108,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -139,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -170,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -204,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -221,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -268,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -278,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": { "scrolled": true }, @@ -455,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": { "scrolled": true }, @@ -607,7 +589,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Dynamics Canalization Map - Breast Cancer.ipynb b/tutorials/Dynamics Canalization Map - Breast Cancer.ipynb index 1571c52..0b06d9c 100644 --- a/tutorials/Dynamics Canalization Map - Breast Cancer.ipynb +++ b/tutorials/Dynamics Canalization Map - Breast Cancer.ipynb @@ -24,7 +24,6 @@ "metadata": {}, "outputs": [], "source": [ - "import os\n", "from cana.datasets.bio import BREAST_CANCER\n", "from cana.drawing.canalizing_map import draw_canalizing_map_graphviz\n", "from IPython.display import display" @@ -44,44 +43,44 @@ "execution_count": 4, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "var-2-out-0 {'label': 'IGF1R_2', 'type': 'variable', 'mode': 'output', 'value': 0, 'constant': False, 'group': 2}\n", - "var-2-out-1 {'label': 'IGF1R_2', 'type': 'variable', 'mode': 'output', 'value': 1, 'constant': False, 'group': 2}\n", - "thr-0-var-2-out-0 {'label': '2', 'type': 'threshold', 'tau': 2, 'group': 2}\n", - "var-0-out-0 {'label': 'IGF1R_T', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", - "fus-0-thr-0-var-2-out-0 {'type': 'fusion', 'group': 2}\n", - "var-10-out-0 {'label': 'HER2', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", - "var-42-out-0 {'label': 'FOXO3', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", - "thr-1-var-2-out-0 {'label': '1', 'type': 'threshold', 'tau': 1, 'group': 2}\n", - "var-50-out-1 {'label': 'S6K', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n", - "thr-2-var-2-out-0 {'label': '1', 'type': 'threshold', 'tau': 1, 'group': 2}\n", - "var-1-out-0 {'label': 'IGF1R', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", - "thr-3-var-2-out-1 {'label': '3', 'type': 'threshold', 'tau': 3, 'group': 2}\n", - "var-0-out-1 {'label': 'IGF1R_T', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n", - "var-1-out-1 {'label': 'IGF1R', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n", - "var-50-out-0 {'label': 'S6K', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", - "thr-4-var-2-out-1 {'label': '4', 'type': 'threshold', 'tau': 4, 'group': 2}\n", - "var-10-out-1 {'label': 'HER2', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n", - "var-42-out-1 {'label': 'FOXO3', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ "Warning: node 'var-2-out-0', graph '%3' size too small for label\n", "Warning: node 'var-2-out-1', graph '%3' size too small for label\n", + "Warning: node 'var-1-out-0', graph '%3' size too small for label\n", "Warning: node 'var-0-out-0', graph '%3' size too small for label\n", "Warning: node 'var-10-out-0', graph '%3' size too small for label\n", "Warning: node 'var-42-out-0', graph '%3' size too small for label\n", - "Warning: node 'var-1-out-0', graph '%3' size too small for label\n", - "Warning: node 'var-0-out-1', graph '%3' size too small for label\n", "Warning: node 'var-1-out-1', graph '%3' size too small for label\n", "Warning: node 'var-10-out-1', graph '%3' size too small for label\n", - "Warning: node 'var-42-out-1', graph '%3' size too small for label\n" + "Warning: node 'var-42-out-1', graph '%3' size too small for label\n", + "Warning: node 'var-0-out-1', graph '%3' size too small for label\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "var-2-out-0 {'label': 'IGF1R_2', 'type': 'variable', 'mode': 'output', 'value': 0, 'constant': False, 'group': 2}\n", + "var-2-out-1 {'label': 'IGF1R_2', 'type': 'variable', 'mode': 'output', 'value': 1, 'constant': False, 'group': 2}\n", + "thr-0-var-2-out-0 {'label': '1', 'type': 'threshold', 'tau': 1, 'group': 2}\n", + "var-1-out-0 {'label': 'IGF1R', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", + "thr-1-var-2-out-0 {'label': '1', 'type': 'threshold', 'tau': 1, 'group': 2}\n", + "var-50-out-1 {'label': 'S6K', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n", + "thr-2-var-2-out-0 {'label': '2', 'type': 'threshold', 'tau': 2, 'group': 2}\n", + "var-0-out-0 {'label': 'IGF1R_T', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", + "fus-0-thr-2-var-2-out-0 {'type': 'fusion', 'group': 2}\n", + "var-10-out-0 {'label': 'HER2', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", + "var-42-out-0 {'label': 'FOXO3', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", + "thr-3-var-2-out-1 {'label': '4', 'type': 'threshold', 'tau': 4, 'group': 2}\n", + "var-1-out-1 {'label': 'IGF1R', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n", + "var-10-out-1 {'label': 'HER2', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n", + "var-42-out-1 {'label': 'FOXO3', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n", + "var-50-out-0 {'label': 'S6K', 'type': 'variable', 'mode': 'input', 'value': 0, 'group': 2}\n", + "thr-4-var-2-out-1 {'label': '3', 'type': 'threshold', 'tau': 3, 'group': 2}\n", + "var-0-out-1 {'label': 'IGF1R_T', 'type': 'variable', 'mode': 'input', 'value': 1, 'group': 2}\n" ] }, { @@ -90,231 +89,232 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", "\n", "\n", "var-2-out-0\n", - "\n", - "IGF1R_2\n", + "\n", + "IGF1R_2\n", "\n", "\n", "\n", "var-2-out-1\n", - "\n", - "IGF1R_2\n", + "\n", + "IGF1R_2\n", "\n", "\n", "\n", "thr-0-var-2-out-0\n", - "\n", - "2\n", + "\n", + "1\n", "\n", "\n", "\n", "thr-0-var-2-out-0->var-2-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-0-out-0\n", - "\n", - "IGF1R_T\n", + "var-1-out-0\n", + "\n", + "IGF1R\n", "\n", - "\n", + "\n", "\n", - "var-0-out-0->thr-0-var-2-out-0\n", - "\n", - "\n", + "var-1-out-0->thr-0-var-2-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "fus-0-thr-0-var-2-out-0\n", - "\n", + "thr-1-var-2-out-0\n", + "\n", + "1\n", "\n", - "\n", + "\n", "\n", - "fus-0-thr-0-var-2-out-0->thr-0-var-2-out-0\n", - "\n", - "\n", + "thr-1-var-2-out-0->var-2-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-10-out-0\n", - "\n", - "HER2\n", + "var-50-out-1\n", + "\n", + "S6K\n", "\n", - "\n", + "\n", "\n", - "var-10-out-0->fus-0-thr-0-var-2-out-0\n", - "\n", + "var-50-out-1->thr-1-var-2-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-42-out-0\n", - "\n", - "FOXO3\n", + "thr-2-var-2-out-0\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-42-out-0->fus-0-thr-0-var-2-out-0\n", - "\n", + "thr-2-var-2-out-0->var-2-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "thr-1-var-2-out-0\n", - "\n", - "1\n", + "var-0-out-0\n", + "\n", + "IGF1R_T\n", "\n", - "\n", + "\n", "\n", - "thr-1-var-2-out-0->var-2-out-0\n", - "\n", - "\n", + "var-0-out-0->thr-2-var-2-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-50-out-1\n", - "\n", - "S6K\n", + "fus-0-thr-2-var-2-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-50-out-1->thr-1-var-2-out-0\n", - "\n", - "\n", + "fus-0-thr-2-var-2-out-0->thr-2-var-2-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "thr-2-var-2-out-0\n", - "\n", - "1\n", + "var-10-out-0\n", + "\n", + "HER2\n", "\n", - "\n", + "\n", "\n", - "thr-2-var-2-out-0->var-2-out-0\n", - "\n", - "\n", + "var-10-out-0->fus-0-thr-2-var-2-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0\n", - "\n", - "IGF1R\n", + "var-42-out-0\n", + "\n", + "FOXO3\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0->thr-2-var-2-out-0\n", - "\n", - "\n", + "var-42-out-0->fus-0-thr-2-var-2-out-0\n", + "\n", "\n", "\n", "\n", "thr-3-var-2-out-1\n", - "\n", - "3\n", + "\n", + "4\n", "\n", "\n", "\n", "thr-3-var-2-out-1->var-2-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-0-out-1\n", - "\n", - "IGF1R_T\n", - "\n", - "\n", - "\n", - "var-0-out-1->thr-3-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-1-out-1\n", - "\n", - "IGF1R\n", + "\n", + "IGF1R\n", "\n", "\n", - "\n", + "\n", "var-1-out-1->thr-3-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-4-var-2-out-1\n", - "\n", - "4\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-1-out-1->thr-4-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", + "\n", + "var-10-out-1\n", + "\n", + "HER2\n", + "\n", + "\n", + "\n", + "var-10-out-1->thr-3-var-2-out-1\n", + "\n", + "\n", + "\n", + "\n", "\n", + "var-42-out-1\n", + "\n", + "FOXO3\n", + "\n", + "\n", + "\n", + "var-42-out-1->thr-3-var-2-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", "var-50-out-0\n", - "\n", - "S6K\n", + "\n", + "S6K\n", "\n", "\n", - "\n", + "\n", "var-50-out-0->thr-3-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-50-out-0->thr-4-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", - "thr-4-var-2-out-1->var-2-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-10-out-1\n", - "\n", - "HER2\n", - "\n", - "\n", "\n", - "var-10-out-1->thr-4-var-2-out-1\n", - "\n", - "\n", + "thr-4-var-2-out-1->var-2-out-1\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-42-out-1\n", - "\n", - "FOXO3\n", + "var-0-out-1\n", + "\n", + "IGF1R_T\n", "\n", - "\n", + "\n", "\n", - "var-42-out-1->thr-4-var-2-out-1\n", - "\n", - "\n", + "var-0-out-1->thr-4-var-2-out-1\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -350,9 +350,9 @@ "Warning: node 'var-2-out-0', graph '%3' size too small for label\n", "Warning: node 'var-10-out-0', graph '%3' size too small for label\n", "Warning: node 'var-42-out-0', graph '%3' size too small for label\n", - "Warning: node 'var-2-out-1', graph '%3' size too small for label\n", "Warning: node 'var-10-out-1', graph '%3' size too small for label\n", "Warning: node 'var-42-out-1', graph '%3' size too small for label\n", + "Warning: node 'var-2-out-1', graph '%3' size too small for label\n", "Warning: node 'var-3-out-0', graph '%3' size too small for label\n", "Warning: node 'var-3-out-1', graph '%3' size too small for label\n", "Warning: node 'var-4-out-0', graph '%3' size too small for label\n", @@ -485,6247 +485,6176 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", "\n", "\n", "var-0-out-0\n", - "\n", - "IGF1R_T\n", + "\n", + "IGF1R_T\n", "\n", "\n", "\n", "var-0-out-0->var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-0-var-1-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-0-out-0->thr-0-var-1-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-0-var-2-out-0\n", - "\n", - "2\n", + "\n", + "\n", + "thr-2-var-2-out-0\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-0-out-0->thr-0-var-2-out-0\n", - "\n", - "\n", + "var-0-out-0->thr-2-var-2-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-0-out-1\n", - "\n", - "IGF1R_T\n", + "\n", + "IGF1R_T\n", "\n", "\n", "\n", "var-0-out-1->var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-1-var-1-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-1-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-0-out-1->fus-0-thr-1-var-1-out-1\n", - "\n", + "var-0-out-1->fus-0-thr-2-var-1-out-1\n", + "\n", "\n", - "\n", - "\n", - "thr-3-var-2-out-1\n", - "\n", - "3\n", + "\n", + "\n", + "thr-4-var-2-out-1\n", + "\n", + "3\n", "\n", - "\n", + "\n", "\n", - "var-0-out-1->thr-3-var-2-out-1\n", - "\n", - "\n", + "var-0-out-1->thr-4-var-2-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "var-1-out-0\n", - "\n", - "IGF1R\n", + "\n", + "IGF1R\n", "\n", "\n", "\n", "var-2-out-0\n", - "\n", - "IGF1R_2\n", + "\n", + "IGF1R_2\n", "\n", "\n", "\n", "var-1-out-0->var-2-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-0-var-21-out-0\n", - "\n", - "6\n", + "\n", + "6\n", "\n", "\n", "\n", "var-1-out-0->thr-0-var-21-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-26-out-0\n", - "\n", - "8\n", + "\n", + "\n", + "thr-0-var-26-out-0\n", + "\n", + "8\n", "\n", - "\n", + "\n", "\n", - "var-1-out-0->thr-1-var-26-out-0\n", - "\n", - "\n", + "var-1-out-0->thr-0-var-26-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-1-out-1\n", - "\n", - "IGF1R\n", + "\n", + "IGF1R\n", + "\n", + "\n", + "\n", + "thr-3-var-2-out-1\n", + "\n", + "4\n", "\n", "\n", "\n", "var-1-out-1->thr-3-var-2-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-4-var-2-out-1\n", - "\n", - "4\n", + "\n", + "\n", "\n", "\n", "\n", "var-1-out-1->thr-4-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-1-var-21-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-1-out-1->fus-0-thr-1-var-21-out-1\n", - "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-26-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-26-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-1-out-1->fus-0-thr-2-var-26-out-1\n", - "\n", + "var-1-out-1->fus-0-thr-3-var-26-out-1\n", + "\n", "\n", "\n", "\n", "thr-0-var-1-out-0->var-1-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-2-out-0->thr-0-var-1-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-2-out-0->thr-0-var-21-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-2-out-0->thr-1-var-26-out-0\n", - "\n", - "\n", + "var-2-out-0->thr-0-var-26-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-0-var-1-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-0-var-1-out-0->thr-0-var-1-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-10-out-0\n", - "\n", - "HER2\n", + "\n", + "HER2\n", "\n", "\n", "\n", "var-10-out-0->fus-0-thr-0-var-1-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-10-out-0->var-10-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-0-var-2-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-2-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-10-out-0->fus-0-thr-0-var-2-out-0\n", - "\n", + "var-10-out-0->fus-0-thr-2-var-2-out-0\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-19-out-0\n", - "\n", - "2\n", + "\n", + "\n", + "thr-2-var-19-out-0\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-10-out-0->thr-1-var-19-out-0\n", - "\n", - "\n", + "var-10-out-0->thr-2-var-19-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-0-var-20-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-20-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-10-out-0->fus-0-thr-0-var-20-out-0\n", - "\n", + "var-10-out-0->fus-0-thr-2-var-20-out-0\n", + "\n", "\n", "\n", "\n", "var-42-out-0\n", - "\n", - "FOXO3\n", + "\n", + "FOXO3\n", "\n", "\n", "\n", "var-42-out-0->fus-0-thr-0-var-1-out-0\n", - "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-42-out-0->fus-0-thr-0-var-2-out-0\n", - "\n", + "var-42-out-0->fus-0-thr-2-var-2-out-0\n", + "\n", "\n", "\n", "\n", "thr-0-var-12-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-42-out-0->thr-0-var-12-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-0-var-13-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-42-out-0->fus-0-thr-0-var-13-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-34-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-42-out-0->thr-0-var-34-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-46-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-42-out-0->thr-0-var-46-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-53-out-0\n", - "\n", - "3\n", + "\n", + "\n", + "thr-0-var-53-out-0\n", + "\n", + "3\n", "\n", - "\n", + "\n", "\n", - "var-42-out-0->thr-1-var-53-out-0\n", - "\n", - "\n", + "var-42-out-0->thr-0-var-53-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-0-var-54-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-1-var-54-out-0\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-42-out-0->fus-0-thr-0-var-54-out-0\n", - "\n", + "var-42-out-0->fus-0-thr-1-var-54-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "var-55-out-0\n", - "\n", - "FOXA1\n", + "\n", + "FOXA1\n", "\n", "\n", "\n", "var-42-out-0->var-55-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-1-var-1-out-1\n", - "\n", - "1\n", + "\n", + "2\n", "\n", "\n", "\n", "thr-1-var-1-out-1->var-1-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-1-var-1-out-1->thr-1-var-1-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-2-out-1\n", - "\n", - "IGF1R_2\n", - "\n", - "\n", - "\n", - "var-2-out-1->fus-0-thr-1-var-1-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-2-out-1->fus-0-thr-1-var-21-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-2-out-1->fus-0-thr-2-var-26-out-1\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-1-out-1\n", - "\n", - "2\n", - "\n", - "\n", - "\n", - "thr-2-var-1-out-1->var-1-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-10-out-1\n", - "\n", - "HER2\n", + "\n", + "HER2\n", "\n", - "\n", - "\n", - "var-10-out-1->thr-2-var-1-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-10-out-1->thr-1-var-1-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-10-out-1->var-10-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-10-out-1->thr-4-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-10-out-1->thr-3-var-2-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "thr-3-var-19-out-1\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-10-out-1->thr-3-var-19-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-4-var-20-out-1\n", - "\n", - "5\n", + "\n", + "5\n", "\n", "\n", - "\n", + "\n", "var-10-out-1->thr-4-var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-5-var-20-out-1\n", - "\n", - "4\n", + "\n", + "4\n", "\n", "\n", - "\n", + "\n", "var-10-out-1->thr-5-var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-42-out-1\n", - "\n", - "FOXO3\n", + "\n", + "FOXO3\n", "\n", - "\n", - "\n", - "var-42-out-1->thr-2-var-1-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-42-out-1->thr-1-var-1-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-42-out-1->thr-4-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-42-out-1->thr-3-var-2-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-1-var-12-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-42-out-1->fus-0-thr-1-var-12-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "thr-1-var-13-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-42-out-1->thr-1-var-13-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-34-out-1\n", - "\n", - "p21_p27_T\n", + "\n", + "p21_p27_T\n", "\n", "\n", - "\n", + "\n", "var-42-out-1->var-34-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-46-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-3-var-46-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-42-out-1->thr-2-var-46-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-42-out-1->thr-3-var-46-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-2-var-53-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-42-out-1->fus-0-thr-2-var-53-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-54-out-1\n", - "\n", - "4\n", + "\n", + "4\n", "\n", "\n", - "\n", + "\n", "var-42-out-1->thr-2-var-54-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-55-out-1\n", - "\n", - "FOXA1\n", + "\n", + "FOXA1\n", "\n", "\n", - "\n", + "\n", "var-42-out-1->var-55-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-0-var-2-out-0->var-2-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-0-var-2-out-0->thr-0-var-2-out-0\n", - "\n", - "\n", + "\n", + "\n", + "thr-2-var-1-out-1\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "thr-2-var-1-out-1->var-1-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-2-var-1-out-1->thr-2-var-1-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var-2-out-1\n", + "\n", + "IGF1R_2\n", + "\n", + "\n", + "\n", + "var-2-out-1->fus-0-thr-2-var-1-out-1\n", + "\n", + "\n", + "\n", + "\n", + "var-2-out-1->fus-0-thr-1-var-21-out-1\n", + "\n", + "\n", + "\n", + "\n", + "var-2-out-1->fus-0-thr-3-var-26-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "var-50-out-1\n", - "\n", - "S6K\n", + "\n", + "S6K\n", "\n", "\n", - "\n", + "\n", "var-50-out-1->var-2-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-51-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-50-out-1->thr-1-var-51-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-2-var-2-out-0->var-2-out-0\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-2-var-2-out-0->thr-2-var-2-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "thr-3-var-2-out-1->var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-50-out-0\n", - "\n", - "S6K\n", + "\n", + "S6K\n", "\n", "\n", "\n", "var-50-out-0->thr-3-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-50-out-0->thr-4-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-51-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-50-out-0->fus-0-thr-0-var-51-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "thr-4-var-2-out-1->var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-3-out-0\n", - "\n", - "Fulvestrant\n", + "\n", + "Fulvestrant\n", "\n", "\n", "\n", "var-3-out-0->var-3-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-53-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-3-out-0->thr-2-var-53-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-3-out-0->thr-2-var-54-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-3-out-1\n", - "\n", - "Fulvestrant\n", + "\n", + "Fulvestrant\n", "\n", "\n", "\n", "var-3-out-1->var-3-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-0-var-53-out-0\n", - "\n", - "2\n", - "\n", - "\n", - "\n", - "var-3-out-1->thr-0-var-53-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-54-out-0\n", - "\n", - "ESR1_2\n", + "\n", + "ESR1_2\n", "\n", "\n", "\n", "var-3-out-1->var-54-out-0\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-1-var-53-out-0\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "var-3-out-1->thr-1-var-53-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-4-out-0\n", - "\n", - "Alpelisib\n", + "\n", + "Alpelisib\n", "\n", "\n", "\n", "var-4-out-0->var-4-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-26-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-3-var-26-out-1\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-4-out-0->thr-2-var-26-out-1\n", - "\n", - "\n", + "var-4-out-0->thr-3-var-26-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-27-out-1\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-4-out-0->thr-2-var-27-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-4-out-1\n", - "\n", - "Alpelisib\n", + "\n", + "Alpelisib\n", "\n", "\n", "\n", "var-4-out-1->var-4-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-0-var-26-out-0\n", - "\n", - "3\n", - "\n", - "\n", - "\n", - "var-4-out-1->thr-0-var-26-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-27-out-0\n", - "\n", - "PI3K_2\n", + "\n", + "PI3K_2\n", "\n", "\n", "\n", "var-4-out-1->var-27-out-0\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-1-var-26-out-0\n", + "\n", + "3\n", + "\n", + "\n", + "\n", + "var-4-out-1->thr-1-var-26-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-5-out-0\n", - "\n", - "Everolimus\n", + "\n", + "Everolimus\n", "\n", "\n", "\n", "var-5-out-0->var-5-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-2-var-15-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-5-out-0->thr-2-var-15-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-32-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-5-out-0->thr-2-var-32-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-41-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-5-out-0->thr-2-var-41-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-5-out-1\n", - "\n", - "Everolimus\n", + "\n", + "Everolimus\n", "\n", "\n", "\n", "var-5-out-1->var-5-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-15-out-0\n", - "\n", - "mTORC2\n", + "\n", + "mTORC2\n", "\n", "\n", "\n", "var-5-out-1->var-15-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-32-out-0\n", - "\n", - "mTORC2_pm\n", + "\n", + "mTORC2_pm\n", "\n", "\n", "\n", "var-5-out-1->var-32-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-41-out-0\n", - "\n", - "mTORC1\n", + "\n", + "mTORC1\n", "\n", "\n", "\n", "var-5-out-1->var-41-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-6-out-0\n", - "\n", - "Trametinib\n", + "\n", + "Trametinib\n", "\n", "\n", "\n", "var-6-out-0->var-6-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-3-var-24-out-1\n", - "\n", - "3\n", + "\n", + "\n", + "thr-4-var-24-out-1\n", + "\n", + "3\n", "\n", - "\n", + "\n", "\n", - "var-6-out-0->thr-3-var-24-out-1\n", - "\n", - "\n", + "var-6-out-0->thr-4-var-24-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-4-var-25-out-1\n", - "\n", - "4\n", + "\n", + "\n", + "thr-5-var-25-out-1\n", + "\n", + "4\n", "\n", - "\n", + "\n", "\n", - "var-6-out-0->thr-4-var-25-out-1\n", - "\n", - "\n", + "var-6-out-0->thr-5-var-25-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "var-6-out-1\n", - "\n", - "Trametinib\n", + "\n", + "Trametinib\n", "\n", "\n", "\n", "var-6-out-1->var-6-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-0-var-24-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-6-out-1->thr-0-var-24-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-25-out-0\n", - "\n", - "2\n", + "\n", + "\n", + "thr-3-var-25-out-0\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-6-out-1->thr-2-var-25-out-0\n", - "\n", - "\n", + "var-6-out-1->thr-3-var-25-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-7-out-0\n", - "\n", - "Ipatasertib\n", + "\n", + "Ipatasertib\n", "\n", "\n", "\n", "var-7-out-0->var-7-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-3-var-33-out-1\n", - "\n", - "3\n", + "\n", + "\n", + "thr-4-var-33-out-1\n", + "\n", + "3\n", "\n", - "\n", + "\n", "\n", - "var-7-out-0->thr-3-var-33-out-1\n", - "\n", - "\n", + "var-7-out-0->thr-4-var-33-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "var-7-out-1\n", - "\n", - "Ipatasertib\n", + "\n", + "Ipatasertib\n", "\n", "\n", "\n", "var-7-out-1->var-7-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-33-out-0\n", - "\n", - "2\n", + "\n", + "\n", + "thr-0-var-33-out-0\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-7-out-1->thr-1-var-33-out-0\n", - "\n", - "\n", + "var-7-out-1->thr-0-var-33-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-8-out-0\n", - "\n", - "Palbociclib\n", + "\n", + "Palbociclib\n", "\n", "\n", "\n", "var-8-out-0->var-8-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-64-out-1\n", - "\n", - "CDK46\n", + "\n", + "CDK46\n", "\n", "\n", "\n", "var-8-out-0->var-64-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-8-out-1\n", - "\n", - "Palbociclib\n", + "\n", + "Palbociclib\n", "\n", "\n", "\n", "var-8-out-1->var-8-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-64-out-0\n", - "\n", - "CDK46\n", + "\n", + "CDK46\n", "\n", "\n", "\n", "var-8-out-1->var-64-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-9-out-0\n", - "\n", - "Neratinib\n", + "\n", + "Neratinib\n", "\n", "\n", "\n", "var-9-out-0->var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-9-out-0->thr-3-var-19-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-9-out-0->thr-4-var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-9-out-0->thr-5-var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-9-out-1\n", - "\n", - "Neratinib\n", + "\n", + "Neratinib\n", "\n", "\n", "\n", "var-9-out-1->var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-0-var-19-out-0\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "var-9-out-1->thr-0-var-19-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-20-out-0\n", - "\n", - "HER2_3_2\n", + "\n", + "HER2_3_2\n", "\n", "\n", "\n", "var-9-out-1->var-20-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-19-out-0\n", - "\n", - "2\n", - "\n", - "\n", - "\n", - "var-9-out-1->thr-2-var-19-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-11-out-0\n", - "\n", - "HER3_T\n", + "\n", + "HER3_T\n", "\n", "\n", "\n", "var-11-out-0->var-11-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-11-out-0->thr-0-var-12-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-11-out-1\n", - "\n", - "HER3_T\n", + "\n", + "HER3_T\n", "\n", "\n", "\n", "var-11-out-1->var-11-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-11-out-1->fus-0-thr-1-var-12-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-12-out-0\n", - "\n", - "HER3\n", + "\n", + "HER3\n", "\n", "\n", "\n", "var-12-out-0->fus-0-thr-0-var-13-out-0\n", - "\n", + "\n", "\n", - "\n", - "\n", - "thr-0-var-19-out-0\n", - "\n", - "3\n", + "\n", + "\n", + "thr-1-var-19-out-0\n", + "\n", + "3\n", "\n", - "\n", + "\n", "\n", - "var-12-out-0->thr-0-var-19-out-0\n", - "\n", - "\n", + "var-12-out-0->thr-1-var-19-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-20-out-0\n", - "\n", - "2\n", + "\n", + "\n", + "thr-0-var-20-out-0\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-12-out-0->thr-2-var-20-out-0\n", - "\n", - "\n", + "var-12-out-0->thr-0-var-20-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-12-out-1\n", - "\n", - "HER3\n", + "\n", + "HER3\n", "\n", "\n", "\n", "var-12-out-1->thr-1-var-13-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-3-var-19-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-12-out-1->fus-0-thr-3-var-19-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-12-out-1->thr-4-var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-0-var-12-out-0->var-12-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-13-out-0\n", - "\n", - "HER3_2\n", + "\n", + "HER3_2\n", "\n", "\n", "\n", "var-13-out-0->thr-0-var-12-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-13-out-0->thr-0-var-19-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-1-var-20-out-0\n", - "\n", - "2\n", + "var-13-out-0->thr-1-var-19-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-13-out-0->thr-1-var-20-out-0\n", - "\n", - "\n", + "var-13-out-0->thr-0-var-20-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", + "\n", + "thr-3-var-20-out-0\n", + "\n", + "2\n", + "\n", + "\n", "\n", - "var-13-out-0->thr-2-var-20-out-0\n", - "\n", - "\n", + "var-13-out-0->thr-3-var-20-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "thr-1-var-12-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", "\n", "thr-1-var-12-out-1->var-12-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-1-var-12-out-1->thr-1-var-12-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-13-out-1\n", - "\n", - "HER3_2\n", + "\n", + "HER3_2\n", "\n", "\n", "\n", "var-13-out-1->fus-0-thr-1-var-12-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-13-out-1->fus-0-thr-3-var-19-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-13-out-1->thr-5-var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-0-var-13-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", "\n", "thr-0-var-13-out-0->var-13-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-0-var-13-out-0->thr-0-var-13-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-1-var-13-out-1->var-13-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-14-out-0\n", - "\n", - "PDK1\n", + "\n", + "PDK1\n", "\n", "\n", "\n", "var-14-out-0->var-14-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-0-var-17-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-14-out-0->fus-0-thr-0-var-17-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-14-out-1\n", - "\n", - "PDK1\n", + "\n", + "PDK1\n", "\n", "\n", "\n", "var-14-out-1->var-14-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-1-var-17-out-1\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-14-out-1->thr-1-var-17-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-15-out-0->var-15-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-15-out-0->fus-0-thr-0-var-17-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-15-out-1\n", - "\n", - "mTORC2\n", + "\n", + "mTORC2\n", "\n", "\n", "\n", "var-15-out-1->thr-2-var-15-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-15-out-1->thr-1-var-17-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-2-var-15-out-1->var-15-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-16-out-0\n", - "\n", - "SGK1_T\n", + "\n", + "SGK1_T\n", "\n", "\n", "\n", "var-16-out-0->var-16-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-16-out-0->fus-0-thr-0-var-17-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-16-out-1\n", - "\n", - "SGK1_T\n", + "\n", + "SGK1_T\n", "\n", "\n", "\n", "var-16-out-1->var-16-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-16-out-1->thr-1-var-17-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-17-out-0\n", - "\n", - "SGK1\n", + "\n", + "SGK1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-39-out-1\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-17-out-0->thr-1-var-39-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-42-out-1\n", - "\n", - "4\n", + "\n", + "4\n", "\n", "\n", "\n", "var-17-out-0->thr-1-var-42-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-17-out-1\n", - "\n", - "SGK1\n", + "\n", + "SGK1\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-39-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-17-out-1->fus-0-thr-0-var-39-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-42-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-17-out-1->fus-0-thr-0-var-42-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "thr-0-var-17-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", "\n", "thr-0-var-17-out-0->var-17-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-0-var-17-out-0->thr-0-var-17-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-1-var-17-out-1->var-17-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-18-out-0\n", - "\n", - "PIM\n", + "\n", + "PIM\n", "\n", "\n", "\n", "var-18-out-0->var-18-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-35-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-18-out-0->thr-2-var-35-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-40-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-18-out-0->thr-1-var-40-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-18-out-0->thr-1-var-42-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-47-out-1\n", - "\n", - "4\n", + "\n", + "4\n", "\n", "\n", "\n", "var-18-out-0->thr-1-var-47-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-18-out-1\n", - "\n", - "PIM\n", + "\n", + "PIM\n", "\n", "\n", "\n", "var-18-out-1->var-18-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-35-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-18-out-1->fus-0-thr-0-var-35-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-40-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-18-out-1->fus-0-thr-0-var-40-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-18-out-1->fus-0-thr-0-var-42-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-47-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-18-out-1->fus-0-thr-0-var-47-out-1\n", - "\n", + "\n", "\n", "\n", "\n", "var-19-out-0\n", - "\n", - "HER2_3\n", + "\n", + "HER2_3\n", "\n", - "\n", + "\n", "\n", - "var-19-out-0->fus-0-thr-0-var-20-out-0\n", - "\n", + "var-19-out-0->fus-0-thr-2-var-20-out-0\n", + "\n", "\n", "\n", "\n", "var-19-out-0->thr-0-var-21-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-1-var-22-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-19-out-0->thr-1-var-22-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-19-out-0->thr-1-var-26-out-0\n", - "\n", - "\n", + "var-19-out-0->thr-0-var-26-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-19-out-1\n", - "\n", - "HER2_3\n", + "\n", + "HER2_3\n", "\n", "\n", "\n", "var-19-out-1->thr-4-var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-19-out-1->thr-5-var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-19-out-1->fus-0-thr-1-var-21-out-1\n", - "\n", + "\n", "\n", - "\n", + "\n", "\n", - "fus-0-thr-2-var-22-out-1\n", - "\n", + "fus-0-thr-3-var-22-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-19-out-1->fus-0-thr-2-var-22-out-1\n", - "\n", + "var-19-out-1->fus-0-thr-3-var-22-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-19-out-1->fus-0-thr-2-var-26-out-1\n", - "\n", + "var-19-out-1->fus-0-thr-3-var-26-out-1\n", + "\n", "\n", "\n", "\n", "thr-0-var-19-out-0->var-19-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-20-out-0->thr-0-var-19-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-20-out-0->thr-1-var-19-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-20-out-0->thr-2-var-19-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-20-out-0->thr-0-var-21-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-20-out-0->thr-1-var-22-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-0-var-23-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-20-out-0->fus-0-thr-0-var-23-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-20-out-0->thr-0-var-26-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-20-out-0->thr-1-var-26-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-27-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-20-out-0->fus-0-thr-0-var-27-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "thr-1-var-19-out-0->var-19-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-2-var-19-out-0->var-19-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-3-var-19-out-1->var-19-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "fus-0-thr-3-var-19-out-1->thr-3-var-19-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-20-out-1\n", - "\n", - "HER2_3_2\n", + "\n", + "HER2_3_2\n", "\n", "\n", "\n", "var-20-out-1->var-19-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-20-out-1->fus-0-thr-1-var-21-out-1\n", - "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-20-out-1->fus-0-thr-2-var-22-out-1\n", - "\n", + "var-20-out-1->fus-0-thr-3-var-22-out-1\n", + "\n", "\n", "\n", "\n", "thr-1-var-23-out-1\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", "\n", "var-20-out-1->thr-1-var-23-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-3-var-26-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-26-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-20-out-1->fus-0-thr-3-var-26-out-1\n", - "\n", + "var-20-out-1->fus-0-thr-2-var-26-out-1\n", + "\n", "\n", "\n", "\n", "var-20-out-1->thr-2-var-27-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-0-var-20-out-0\n", - "\n", - "1\n", + "\n", + "\n", "\n", "\n", "\n", "thr-0-var-20-out-0->var-20-out-0\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-2-var-20-out-0\n", + "\n", + "1\n", "\n", - "\n", + "\n", "\n", - "fus-0-thr-0-var-20-out-0->thr-0-var-20-out-0\n", - "\n", - "\n", + "thr-2-var-20-out-0->var-20-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "thr-1-var-20-out-0->var-20-out-0\n", - "\n", - "\n", + "fus-0-thr-2-var-20-out-0->thr-2-var-20-out-0\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-3-var-20-out-0->var-20-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-25-out-1\n", - "\n", - "MAPK_2\n", + "\n", + "MAPK_2\n", "\n", - "\n", - "\n", - "var-25-out-1->thr-1-var-20-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-25-out-1->thr-3-var-20-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-24-out-1\n", - "\n", - "MAPK\n", + "\n", + "MAPK\n", "\n", "\n", - "\n", + "\n", "var-25-out-1->var-24-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-25-out-1->fus-0-thr-0-var-39-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-43-out-1\n", - "\n", - "FOXO3_Ub\n", + "\n", + "FOXO3_Ub\n", "\n", "\n", - "\n", + "\n", "var-25-out-1->var-43-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-46-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-25-out-1->thr-1-var-46-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-25-out-1->fus-0-thr-0-var-47-out-1\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-20-out-0->var-20-out-0\n", - "\n", - "\n", + "\n", "\n", "\n", "\n", "thr-4-var-20-out-1->var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-25-out-0\n", - "\n", - "MAPK_2\n", + "\n", + "MAPK_2\n", "\n", "\n", "\n", "var-25-out-0->thr-4-var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-25-out-0->thr-0-var-24-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-1-var-24-out-0\n", - "\n", - "3\n", + "\n", + "4\n", "\n", "\n", "\n", "var-25-out-0->thr-1-var-24-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-24-out-0\n", - "\n", - "4\n", + "\n", + "3\n", "\n", "\n", "\n", "var-25-out-0->thr-2-var-24-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-25-out-0->thr-1-var-39-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-43-out-0\n", - "\n", - "FOXO3_Ub\n", + "\n", + "FOXO3_Ub\n", "\n", "\n", "\n", "var-25-out-0->var-43-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-25-out-0->thr-2-var-46-out-1\n", - "\n", - "\n", + "var-25-out-0->thr-3-var-46-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "var-25-out-0->thr-1-var-47-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-5-var-20-out-1->var-20-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-21-out-0\n", - "\n", - "RAS\n", + "\n", + "RAS\n", "\n", "\n", "\n", "thr-0-var-22-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "var-21-out-0->thr-0-var-22-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-21-out-0->fus-0-thr-0-var-23-out-0\n", - "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-21-out-0->thr-2-var-24-out-0\n", - "\n", - "\n", + "var-21-out-0->thr-1-var-24-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-21-out-0->thr-1-var-26-out-0\n", - "\n", - "\n", + "var-21-out-0->thr-0-var-26-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-21-out-1\n", - "\n", - "RAS\n", + "\n", + "RAS\n", "\n", - "\n", + "\n", "\n", - "thr-2-var-22-out-1\n", - "\n", - "2\n", + "thr-3-var-22-out-1\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-21-out-1->thr-2-var-22-out-1\n", - "\n", - "\n", + "var-21-out-1->thr-3-var-22-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "var-21-out-1->thr-1-var-23-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-3-var-24-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-4-var-24-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-21-out-1->fus-0-thr-3-var-24-out-1\n", - "\n", + "var-21-out-1->fus-0-thr-4-var-24-out-1\n", + "\n", "\n", - "\n", - "\n", - "fus-1-thr-3-var-24-out-1\n", - "\n", + "\n", + "\n", + "fus-1-thr-4-var-24-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-21-out-1->fus-1-thr-3-var-24-out-1\n", - "\n", + "var-21-out-1->fus-1-thr-4-var-24-out-1\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-21-out-1->fus-0-thr-2-var-26-out-1\n", - "\n", + "var-21-out-1->fus-0-thr-3-var-26-out-1\n", + "\n", "\n", "\n", "\n", "thr-0-var-21-out-0->var-21-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-22-out-0\n", - "\n", - "RAS_2\n", + "\n", + "RAS_2\n", "\n", "\n", "\n", "var-22-out-0->thr-0-var-21-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-22-out-0->fus-0-thr-0-var-23-out-0\n", - "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-22-out-0->thr-2-var-24-out-0\n", - "\n", - "\n", + "var-22-out-0->thr-1-var-24-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-0-var-25-out-0\n", - "\n", + "\n", + "\n", + "thr-0-var-25-out-0\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "var-22-out-0->fus-0-thr-0-var-25-out-0\n", - "\n", + "var-22-out-0->thr-0-var-25-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-1-thr-0-var-25-out-0\n", - "\n", - "\n", - "\n", + "\n", "\n", - "var-22-out-0->fus-1-thr-0-var-25-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-22-out-0->thr-1-var-26-out-0\n", - "\n", - "\n", + "var-22-out-0->thr-0-var-26-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "var-23-out-0\n", - "\n", - "RAS_3\n", + "\n", + "RAS_3\n", "\n", "\n", - "\n", + "\n", "var-23-out-0->thr-0-var-21-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-23-out-0->thr-0-var-22-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-23-out-0->thr-1-var-22-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-23-out-0->thr-0-var-24-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", + "\n", + "var-23-out-0->thr-1-var-24-out-0\n", + "\n", + "\n", + "\n", + "\n", "\n", - "var-23-out-0->thr-2-var-24-out-0\n", - "\n", - "\n", + "var-23-out-0->thr-0-var-25-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-23-out-0->fus-0-thr-0-var-25-out-0\n", - "\n", + "var-23-out-0->thr-3-var-25-out-0\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "var-23-out-0->fus-1-thr-0-var-25-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-23-out-0->thr-2-var-25-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-23-out-0->thr-1-var-26-out-0\n", - "\n", - "\n", + "var-23-out-0->thr-0-var-26-out-0\n", + "\n", + "\n", "\n", "\n", "\n", "thr-1-var-21-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-21-out-1->var-21-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-21-out-1->thr-1-var-21-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-22-out-1\n", - "\n", - "RAS_2\n", + "\n", + "RAS_2\n", "\n", "\n", - "\n", + "\n", "var-22-out-1->fus-0-thr-1-var-21-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-22-out-1->thr-1-var-23-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-22-out-1->fus-0-thr-3-var-24-out-1\n", - "\n", + "\n", + "\n", + "var-22-out-1->fus-0-thr-4-var-24-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-22-out-1->fus-1-thr-3-var-24-out-1\n", - "\n", + "\n", + "\n", + "var-22-out-1->fus-1-thr-4-var-24-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-22-out-1->thr-4-var-25-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-22-out-1->thr-5-var-25-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-22-out-1->fus-0-thr-2-var-26-out-1\n", - "\n", + "\n", + "\n", + "var-22-out-1->fus-0-thr-3-var-26-out-1\n", + "\n", "\n", "\n", "\n", "var-23-out-1\n", - "\n", - "RAS_3\n", + "\n", + "RAS_3\n", "\n", "\n", - "\n", + "\n", "var-23-out-1->fus-0-thr-1-var-21-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-23-out-1->var-22-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-4-var-24-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-3-var-24-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-23-out-1->thr-4-var-24-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-23-out-1->thr-3-var-24-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-3-var-25-out-1\n", - "\n", - "3\n", + "\n", + "\n", + "thr-4-var-25-out-1\n", + "\n", + "3\n", "\n", - "\n", - "\n", - "var-23-out-1->thr-3-var-25-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-23-out-1->thr-4-var-25-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-23-out-1->fus-0-thr-2-var-26-out-1\n", - "\n", + "\n", + "\n", + "var-23-out-1->fus-0-thr-3-var-26-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-22-out-0->var-22-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-22-out-0->var-22-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-22-out-1->var-22-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-3-var-22-out-1->var-22-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-22-out-1->thr-2-var-22-out-1\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-22-out-1->thr-3-var-22-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "thr-0-var-23-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-23-out-0->var-23-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-23-out-0->thr-0-var-23-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-23-out-1->var-23-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-24-out-0\n", - "\n", - "MAPK\n", + "\n", + "MAPK\n", "\n", "\n", - "\n", + "\n", "var-24-out-0->var-25-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-24-out-0->thr-1-var-47-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-24-out-1->thr-3-var-25-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-24-out-1->thr-4-var-25-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var-24-out-1->thr-5-var-25-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-24-out-1->fus-0-thr-0-var-47-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-24-out-0->var-24-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-24-out-0->var-24-out-0\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-2-var-24-out-0->var-24-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-29-out-0\n", - "\n", - "PIP3\n", + "\n", + "PIP3\n", "\n", - "\n", - "\n", - "var-29-out-0->thr-1-var-24-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-29-out-0->thr-2-var-24-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-29-out-0->fus-0-thr-0-var-25-out-0\n", - "\n", + "\n", + "\n", + "thr-1-var-25-out-0\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-29-out-0->fus-1-thr-0-var-25-out-0\n", - "\n", + "\n", + "\n", + "var-29-out-0->thr-1-var-25-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-30-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-29-out-0->fus-0-thr-0-var-30-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-31-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-29-out-0->thr-0-var-31-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-32-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-29-out-0->thr-0-var-32-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-0-var-33-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-29-out-0->fus-0-thr-0-var-33-out-0\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-1-thr-0-var-33-out-0\n", - "\n", + "\n", + "\n", + "thr-1-var-33-out-0\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-29-out-0->fus-1-thr-0-var-33-out-0\n", - "\n", + "\n", + "\n", + "var-29-out-0->thr-1-var-33-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-30-out-0\n", - "\n", - "PIP3_2\n", - "\n", - "\n", - "\n", - "var-30-out-0->thr-1-var-24-out-0\n", - "\n", - "\n", + "\n", + "PIP3_2\n", "\n", - "\n", - "\n", - "var-30-out-0->fus-0-thr-0-var-25-out-0\n", - "\n", + "\n", + "\n", + "var-30-out-0->thr-2-var-24-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-30-out-0->fus-1-thr-0-var-25-out-0\n", - "\n", + "\n", + "\n", + "var-30-out-0->thr-1-var-25-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-29-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-30-out-0->thr-0-var-29-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-29-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-30-out-0->thr-1-var-29-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-30-out-0->thr-0-var-31-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-30-out-0->thr-0-var-32-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-30-out-0->fus-0-thr-0-var-33-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-30-out-0->fus-1-thr-0-var-33-out-0\n", - "\n", + "\n", + "\n", + "var-30-out-0->thr-0-var-33-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-30-out-0->thr-1-var-33-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-24-out-0->var-24-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-3-var-24-out-1->var-24-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-3-var-24-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-3-var-24-out-1->thr-3-var-24-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "var-29-out-1\n", - "\n", - "PIP3\n", + "\n", + "PIP3\n", "\n", "\n", - "\n", + "\n", "var-29-out-1->fus-0-thr-3-var-24-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-29-out-1->fus-1-thr-3-var-24-out-1\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-4-var-24-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-29-out-1->fus-0-thr-4-var-24-out-1\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-3-var-25-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-29-out-1->fus-0-thr-3-var-25-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-4-var-25-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-29-out-1->fus-0-thr-4-var-25-out-1\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-5-var-25-out-1\n", + "\n", + "\n", + "\n", + "\n", + "var-29-out-1->fus-0-thr-5-var-25-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-30-out-1\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-29-out-1->thr-2-var-30-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-31-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-29-out-1->fus-0-thr-1-var-31-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-2-var-32-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-29-out-1->fus-0-thr-2-var-32-out-1\n", - "\n", + "\n", "\n", - "\n", - "\n", - "var-29-out-1->thr-3-var-33-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-29-out-1->thr-4-var-33-out-1\n", + "\n", + "\n", "\n", "\n", "\n", "var-30-out-1\n", - "\n", - "PIP3_2\n", + "\n", + "PIP3_2\n", "\n", "\n", - "\n", + "\n", "var-30-out-1->fus-0-thr-3-var-24-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-30-out-1->var-29-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-30-out-1->fus-1-thr-3-var-24-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-30-out-1->fus-0-thr-4-var-24-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-30-out-1->fus-0-thr-3-var-25-out-1\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-30-out-1->fus-0-thr-4-var-25-out-1\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "var-30-out-1->fus-0-thr-5-var-25-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "var-30-out-1->fus-0-thr-1-var-31-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-30-out-1->fus-0-thr-2-var-32-out-1\n", - "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-33-out-1\n", - "\n", - "2\n", - "\n", - "\n", - "\n", - "var-30-out-1->thr-2-var-33-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-3-var-33-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "fus-1-thr-3-var-24-out-1->thr-3-var-24-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-30-out-1->thr-3-var-33-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-4-var-24-out-1->var-24-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-4-var-24-out-1->thr-4-var-24-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-0-var-25-out-0\n", - "\n", - "2\n", + "\n", + "\n", + "fus-1-thr-4-var-24-out-1->thr-4-var-24-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-25-out-0->var-25-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-0-var-25-out-0->thr-0-var-25-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-0-var-25-out-0->thr-0-var-25-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-25-out-0->var-25-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-3-var-25-out-1->var-25-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-1-var-25-out-0->var-25-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-3-var-25-out-1->thr-3-var-25-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-3-var-25-out-0->var-25-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-4-var-25-out-1->var-25-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-4-var-25-out-1->thr-4-var-25-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-5-var-25-out-1->var-25-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-5-var-25-out-1->thr-5-var-25-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-26-out-0\n", - "\n", - "PI3K\n", + "\n", + "PI3K\n", "\n", "\n", - "\n", + "\n", "var-26-out-0->fus-0-thr-0-var-27-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-26-out-0->thr-0-var-29-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-26-out-1\n", - "\n", - "PI3K\n", + "\n", + "PI3K\n", "\n", "\n", - "\n", + "\n", "var-26-out-1->thr-2-var-27-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-29-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-29-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-26-out-1->fus-0-thr-2-var-29-out-1\n", - "\n", + "\n", + "\n", + "var-26-out-1->fus-0-thr-3-var-29-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-26-out-0->var-26-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-27-out-0->thr-0-var-26-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-27-out-0->thr-1-var-26-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-27-out-0->thr-0-var-29-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-27-out-0->fus-0-thr-0-var-30-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-26-out-0->var-26-out-0\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-2-var-26-out-1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-2-var-26-out-1->var-26-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-2-var-26-out-1->thr-2-var-26-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-3-var-26-out-1\n", - "\n", - "1\n", - "\n", - "\n", - "\n", - "thr-3-var-26-out-1->var-26-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-3-var-26-out-1->thr-3-var-26-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-27-out-1\n", - "\n", - "PI3K_2\n", + "\n", + "PI3K_2\n", "\n", - "\n", - "\n", - "var-27-out-1->fus-0-thr-3-var-26-out-1\n", - "\n", + "\n", + "\n", + "var-27-out-1->fus-0-thr-2-var-26-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-27-out-1->fus-0-thr-2-var-29-out-1\n", - "\n", + "\n", + "\n", + "var-27-out-1->fus-0-thr-3-var-29-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "var-27-out-1->thr-2-var-30-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-3-var-26-out-1->var-26-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-3-var-26-out-1->thr-3-var-26-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-27-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-27-out-0->var-27-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-27-out-0->thr-0-var-27-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-27-out-1->var-27-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-28-out-0\n", - "\n", - "PTEN\n", + "\n", + "PTEN\n", "\n", "\n", - "\n", + "\n", "var-28-out-0->var-28-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-29-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-3-var-29-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-28-out-0->thr-2-var-29-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-28-out-0->thr-3-var-29-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-28-out-0->thr-2-var-30-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-28-out-1\n", - "\n", - "PTEN\n", + "\n", + "PTEN\n", "\n", "\n", - "\n", + "\n", "var-28-out-1->var-30-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-28-out-1->var-28-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-28-out-1->thr-1-var-29-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-29-out-0->var-29-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-29-out-0->var-29-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-29-out-1->var-29-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-3-var-29-out-1->var-29-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-29-out-1->thr-2-var-29-out-1\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-29-out-1->thr-3-var-29-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-30-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-30-out-0->var-30-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-30-out-0->thr-0-var-30-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-30-out-1->var-30-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-31-out-0\n", - "\n", - "PDK1_pm\n", + "\n", + "PDK1_pm\n", "\n", - "\n", - "\n", - "var-31-out-0->fus-0-thr-0-var-33-out-0\n", - "\n", + "\n", + "\n", + "thr-2-var-33-out-0\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-31-out-0->fus-1-thr-0-var-33-out-0\n", - "\n", + "\n", + "\n", + "var-31-out-0->thr-2-var-33-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-31-out-1\n", - "\n", - "PDK1_pm\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-33-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-31-out-1->fus-0-thr-2-var-33-out-1\n", - "\n", + "\n", + "PDK1_pm\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-3-var-33-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-31-out-1->fus-0-thr-3-var-33-out-1\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-4-var-33-out-1\n", + "\n", + "\n", + "\n", + "\n", + "var-31-out-1->fus-0-thr-4-var-33-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-31-out-0->var-31-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-31-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-31-out-1->var-31-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-31-out-1->thr-1-var-31-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-32-out-0->fus-0-thr-0-var-33-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-32-out-0->fus-1-thr-0-var-33-out-0\n", - "\n", + "\n", + "\n", + "var-32-out-0->thr-2-var-33-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-32-out-1\n", - "\n", - "mTORC2_pm\n", - "\n", - "\n", - "\n", - "var-32-out-1->fus-0-thr-2-var-33-out-1\n", - "\n", + "\n", + "mTORC2_pm\n", "\n", "\n", - "\n", + "\n", "var-32-out-1->fus-0-thr-3-var-33-out-1\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "var-32-out-1->fus-0-thr-4-var-33-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-32-out-0->var-32-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-32-out-1->var-32-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-2-var-32-out-1->thr-2-var-32-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-0\n", - "\n", - "AKT\n", + "\n", + "AKT\n", "\n", "\n", - "\n", + "\n", "var-33-out-0->thr-2-var-35-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-38-out-1\n", - "\n", - "KMT2D\n", + "\n", + "KMT2D\n", "\n", "\n", - "\n", + "\n", "var-33-out-0->var-38-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-0->thr-1-var-39-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-0->thr-1-var-40-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-0->thr-1-var-42-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-0->thr-1-var-47-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-1\n", - "\n", - "AKT\n", + "\n", + "AKT\n", "\n", "\n", - "\n", + "\n", "var-33-out-1->fus-0-thr-0-var-35-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-38-out-0\n", - "\n", - "KMT2D\n", + "\n", + "KMT2D\n", "\n", "\n", - "\n", + "\n", "var-33-out-1->var-38-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-1->fus-0-thr-0-var-39-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-1->fus-0-thr-0-var-40-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-1->fus-0-thr-0-var-42-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-33-out-1->fus-0-thr-0-var-47-out-1\n", - "\n", - "\n", - "\n", - "\n", - "thr-0-var-33-out-0\n", - "\n", - "2\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-33-out-0->var-33-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-0-var-33-out-0->thr-0-var-33-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-0-var-33-out-0->thr-0-var-33-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-33-out-0->var-33-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-33-out-1->var-33-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-33-out-1->thr-2-var-33-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-2-var-33-out-0->var-33-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-3-var-33-out-1->var-33-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-3-var-33-out-1->thr-3-var-33-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-4-var-33-out-1->var-33-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-4-var-33-out-1->thr-4-var-33-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-34-out-0\n", - "\n", - "p21_p27_T\n", + "\n", + "p21_p27_T\n", "\n", "\n", - "\n", + "\n", "thr-0-var-35-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-34-out-0->thr-0-var-35-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-35-out-1\n", - "\n", - "p21_p27\n", + "\n", + "p21_p27\n", "\n", "\n", - "\n", + "\n", "var-34-out-1->var-35-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-34-out-0->var-34-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-34-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-34-out-1->thr-0-var-34-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-59-out-1\n", - "\n", - "MYC\n", + "\n", + "MYC\n", "\n", "\n", - "\n", + "\n", "var-59-out-1->fus-0-thr-0-var-34-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-60-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-59-out-1->thr-1-var-60-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-61-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-59-out-1->fus-0-thr-1-var-61-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-60-out-1\n", - "\n", - "MYC_2\n", + "\n", + "MYC_2\n", "\n", "\n", - "\n", + "\n", "var-60-out-1->fus-0-thr-0-var-34-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-59-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-60-out-1->fus-0-thr-1-var-59-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-62-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-60-out-1->thr-1-var-62-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-34-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-2-var-34-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "thr-1-var-34-out-1->var-34-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-2-var-34-out-1->var-34-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-59-out-0\n", - "\n", - "MYC\n", + "\n", + "MYC\n", "\n", - "\n", - "\n", - "var-59-out-0->thr-1-var-34-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-59-out-0->thr-2-var-34-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-60-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-59-out-0->fus-0-thr-0-var-60-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-61-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-59-out-0->thr-0-var-61-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-60-out-0\n", - "\n", - "MYC_2\n", + "\n", + "MYC_2\n", "\n", - "\n", - "\n", - "var-60-out-0->thr-1-var-34-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-60-out-0->thr-2-var-34-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-59-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-60-out-0->thr-0-var-59-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-62-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-60-out-0->fus-0-thr-0-var-62-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-35-out-0\n", - "\n", - "p21_p27\n", + "\n", + "p21_p27\n", "\n", "\n", - "\n", + "\n", "thr-2-var-37-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-35-out-0->thr-2-var-37-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-37-out-0\n", - "\n", - "cycE_CDK2\n", + "\n", + "cycE_CDK2\n", "\n", "\n", - "\n", + "\n", "var-35-out-1->var-37-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-35-out-0->var-35-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-35-out-1->thr-0-var-35-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-35-out-1->var-35-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-36-out-0\n", - "\n", - "cycE_CDK2_T\n", + "\n", + "cycE_CDK2_T\n", "\n", "\n", - "\n", + "\n", "var-36-out-0->var-37-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-36-out-1\n", - "\n", - "cycE_CDK2_T\n", + "\n", + "cycE_CDK2_T\n", "\n", "\n", - "\n", + "\n", "var-36-out-1->thr-2-var-37-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-36-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "thr-0-var-36-out-0->var-36-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-70-out-0\n", - "\n", - "E2F\n", + "\n", + "E2F\n", "\n", "\n", - "\n", + "\n", "var-70-out-0->thr-0-var-36-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-71-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-70-out-0->fus-0-thr-0-var-71-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-72-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-70-out-0->fus-0-thr-1-var-72-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-73-out-0\n", - "\n", - "4\n", + "\n", + "4\n", "\n", "\n", - "\n", + "\n", "var-70-out-0->thr-0-var-73-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-0\n", - "\n", - "E2F_2\n", + "\n", + "E2F_2\n", "\n", "\n", - "\n", + "\n", "var-71-out-0->thr-0-var-36-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-70-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-71-out-0->thr-0-var-70-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-0->fus-0-thr-1-var-72-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-0->thr-0-var-73-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-74-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-71-out-0->thr-0-var-74-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-75-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-0->fus-0-thr-0-var-75-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-0\n", - "\n", - "E2F_3\n", + "\n", + "E2F_3\n", "\n", "\n", - "\n", + "\n", "var-72-out-0->thr-0-var-36-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-0->thr-0-var-70-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-71-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-72-out-0->thr-0-var-71-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-72-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-0->fus-0-thr-0-var-72-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-0->thr-0-var-73-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-0->thr-0-var-74-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-75-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-72-out-0->thr-0-var-75-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-76-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-0->fus-0-thr-0-var-76-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-36-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-36-out-1->var-36-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-36-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-36-out-1->thr-1-var-36-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-70-out-1\n", - "\n", - "E2F\n", + "\n", + "E2F\n", "\n", "\n", - "\n", + "\n", "var-70-out-1->fus-0-thr-1-var-36-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-71-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-70-out-1->thr-2-var-71-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-72-out-1\n", - "\n", - "3\n", + "\n", + "4\n", "\n", "\n", - "\n", + "\n", "var-70-out-1->thr-2-var-72-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-3-var-72-out-1\n", - "\n", - "4\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-70-out-1->thr-3-var-72-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-73-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-70-out-1->fus-0-thr-1-var-73-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-1\n", - "\n", - "E2F_2\n", + "\n", + "E2F_2\n", "\n", "\n", - "\n", + "\n", "var-71-out-1->fus-0-thr-1-var-36-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-70-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-1->fus-0-thr-1-var-70-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-1->thr-2-var-72-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-1->thr-3-var-72-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-1->fus-0-thr-1-var-73-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-74-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-71-out-1->fus-0-thr-1-var-74-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-75-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-71-out-1->thr-2-var-75-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-1\n", - "\n", - "E2F_3\n", + "\n", + "E2F_3\n", "\n", "\n", - "\n", + "\n", "var-72-out-1->fus-0-thr-1-var-36-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-1->var-71-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-1->fus-0-thr-1-var-70-out-1\n", - "\n", + "\n", "\n", - "\n", - "\n", - "var-72-out-1->thr-3-var-72-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-72-out-1->thr-2-var-72-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-1->fus-0-thr-1-var-73-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-72-out-1->fus-0-thr-1-var-74-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-75-out-1\n", - "\n", - "Proliferation_3\n", + "\n", + "Proliferation_3\n", "\n", "\n", - "\n", + "\n", "var-72-out-1->var-75-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-76-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-72-out-1->thr-1-var-76-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-67-out-0\n", - "\n", - "5\n", + "\n", + "5\n", "\n", "\n", - "\n", + "\n", "var-37-out-0->thr-0-var-67-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-0-var-68-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-1-var-68-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-37-out-0->fus-0-thr-0-var-68-out-0\n", - "\n", + "\n", + "\n", + "var-37-out-0->fus-0-thr-1-var-68-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-69-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-37-out-0->fus-0-thr-0-var-69-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-37-out-1\n", - "\n", - "cycE_CDK2\n", + "\n", + "cycE_CDK2\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-67-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-37-out-1->fus-0-thr-1-var-67-out-1\n", - "\n", + "\n", "\n", - "\n", - "\n", - "thr-4-var-68-out-1\n", - "\n", - "3\n", + "\n", + "\n", + "thr-3-var-68-out-1\n", + "\n", + "3\n", "\n", - "\n", - "\n", - "var-37-out-1->thr-4-var-68-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-37-out-1->thr-3-var-68-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-69-out-1\n", - "\n", - "4\n", + "\n", + "4\n", "\n", "\n", - "\n", + "\n", "var-37-out-1->thr-1-var-69-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-37-out-1->var-37-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-58-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-38-out-0->fus-0-thr-0-var-58-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-58-out-1\n", - "\n", - "6\n", + "\n", + "6\n", "\n", "\n", - "\n", + "\n", "var-38-out-1->thr-1-var-58-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-39-out-0\n", - "\n", - "TSC\n", + "\n", + "TSC\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-2-var-41-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-39-out-0->fus-0-thr-2-var-41-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-39-out-1\n", - "\n", - "TSC\n", + "\n", + "TSC\n", "\n", "\n", - "\n", + "\n", "thr-1-var-41-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-39-out-1->thr-1-var-41-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-39-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-39-out-0->var-39-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-39-out-1->thr-0-var-39-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-39-out-1->var-39-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-40-out-0\n", - "\n", - "PRAS40\n", + "\n", + "PRAS40\n", "\n", "\n", - "\n", + "\n", "var-40-out-0->fus-0-thr-2-var-41-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-40-out-1\n", - "\n", - "PRAS40\n", + "\n", + "PRAS40\n", "\n", "\n", - "\n", + "\n", "var-40-out-1->thr-1-var-41-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-40-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-40-out-0->var-40-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-40-out-1->thr-0-var-40-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-40-out-1->var-40-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-41-out-0->var-50-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-49-out-0\n", - "\n", - "EIF4F\n", + "\n", + "EIF4F\n", "\n", "\n", - "\n", + "\n", "var-41-out-0->var-49-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-41-out-1\n", - "\n", - "mTORC1\n", + "\n", + "mTORC1\n", "\n", "\n", - "\n", + "\n", "var-41-out-1->var-50-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-49-out-1\n", - "\n", - "EIF4F\n", + "\n", + "EIF4F\n", "\n", "\n", - "\n", + "\n", "var-41-out-1->var-49-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-41-out-0->var-41-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-41-out-1->var-41-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-2-var-41-out-0->thr-2-var-41-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-42-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-42-out-0->var-42-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-42-out-1->thr-0-var-42-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-43-out-1->fus-0-thr-0-var-42-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-42-out-1->var-42-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-43-out-0->thr-1-var-42-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-44-out-0\n", - "\n", - "BIM_T\n", + "\n", + "BIM_T\n", "\n", "\n", - "\n", + "\n", "var-44-out-0->var-44-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-44-out-0->thr-0-var-46-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-44-out-0->thr-1-var-46-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-44-out-1\n", - "\n", - "BIM_T\n", + "\n", + "BIM_T\n", "\n", "\n", - "\n", + "\n", "var-44-out-1->var-44-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-46-out-1\n", - "\n", - "BIM\n", + "\n", + "BIM\n", "\n", "\n", - "\n", + "\n", "var-44-out-1->var-46-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-45-out-0\n", - "\n", - "BCL2_T\n", + "\n", + "BCL2_T\n", "\n", "\n", - "\n", + "\n", "var-45-out-0->var-45-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-63-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-45-out-0->thr-0-var-63-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-45-out-1\n", - "\n", - "BCL2_T\n", + "\n", + "BCL2_T\n", "\n", "\n", - "\n", + "\n", "var-45-out-1->var-45-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-63-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-45-out-1->fus-0-thr-1-var-63-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-46-out-0\n", - "\n", - "BIM\n", + "\n", + "BIM\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-77-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-46-out-0->fus-0-thr-0-var-77-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-77-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-46-out-0->thr-1-var-77-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-77-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-4-var-77-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-46-out-0->fus-0-thr-2-var-77-out-0\n", - "\n", + "\n", + "\n", + "var-46-out-0->fus-0-thr-4-var-77-out-0\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-0-var-78-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-1-var-78-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-46-out-0->fus-0-thr-0-var-78-out-0\n", - "\n", + "\n", + "\n", + "var-46-out-0->fus-0-thr-1-var-78-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-79-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-46-out-0->fus-0-thr-0-var-79-out-0\n", - "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-77-out-1\n", - "\n", + "\n", + "\n", + "thr-3-var-77-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-46-out-1->fus-0-thr-2-var-77-out-1\n", - "\n", + "\n", + "\n", + "var-46-out-1->thr-3-var-77-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-4-var-77-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "fus-0-thr-4-var-77-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-46-out-1->thr-4-var-77-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-46-out-1->fus-0-thr-4-var-77-out-1\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-78-out-1\n", - "\n", - "3\n", + "\n", + "\n", + "thr-3-var-78-out-1\n", + "\n", + "3\n", "\n", - "\n", - "\n", - "var-46-out-1->thr-2-var-78-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-46-out-1->thr-3-var-78-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-3-var-79-out-1\n", - "\n", - "4\n", + "\n", + "4\n", "\n", "\n", - "\n", + "\n", "var-46-out-1->thr-3-var-79-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-46-out-0->var-46-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-46-out-0->var-46-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-46-out-1->var-46-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-3-var-46-out-1->var-46-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-47-out-0\n", - "\n", - "BAD\n", + "\n", + "BAD\n", "\n", "\n", - "\n", + "\n", "var-47-out-0->fus-0-thr-0-var-77-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-47-out-0->thr-1-var-77-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-47-out-0->fus-0-thr-2-var-77-out-0\n", - "\n", + "\n", + "\n", + "var-47-out-0->fus-0-thr-4-var-77-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-47-out-0->fus-0-thr-0-var-78-out-0\n", - "\n", + "\n", + "\n", + "var-47-out-0->fus-0-thr-1-var-78-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "var-47-out-0->fus-0-thr-0-var-79-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-47-out-1\n", - "\n", - "BAD\n", + "\n", + "BAD\n", "\n", - "\n", - "\n", - "var-47-out-1->fus-0-thr-2-var-77-out-1\n", - "\n", + "\n", + "\n", + "var-47-out-1->thr-3-var-77-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-47-out-1->thr-4-var-77-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-47-out-1->fus-0-thr-4-var-77-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-47-out-1->thr-2-var-78-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-47-out-1->thr-3-var-78-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-47-out-1->thr-3-var-79-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-47-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-47-out-0->var-47-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-47-out-1->thr-0-var-47-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-47-out-1->var-47-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-48-out-0\n", - "\n", - "MCL1\n", + "\n", + "MCL1\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-78-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-78-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-48-out-0->fus-0-thr-2-var-78-out-0\n", - "\n", + "\n", + "\n", + "var-48-out-0->fus-0-thr-3-var-78-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "var-48-out-0->thr-3-var-79-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-48-out-1\n", - "\n", - "MCL1\n", + "\n", + "MCL1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-77-out-0\n", - "\n", - "4\n", + "\n", + "4\n", "\n", "\n", - "\n", + "\n", "var-48-out-1->thr-0-var-77-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-78-out-0\n", - "\n", - "3\n", + "\n", + "\n", + "thr-0-var-78-out-0\n", + "\n", + "3\n", "\n", - "\n", - "\n", - "var-48-out-1->thr-1-var-78-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-48-out-1->thr-0-var-78-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-79-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-48-out-1->fus-0-thr-1-var-79-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-0\n", - "\n", - "Translation\n", + "\n", + "Translation\n", "\n", "\n", - "\n", + "\n", "var-51-out-0->var-48-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-0->thr-0-var-73-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-0->thr-0-var-74-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-0->fus-0-thr-0-var-75-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-0->fus-0-thr-0-var-76-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-1\n", - "\n", - "Translation\n", + "\n", + "Translation\n", "\n", "\n", - "\n", + "\n", "var-51-out-1->var-48-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-1->fus-0-thr-1-var-73-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-1->fus-0-thr-1-var-74-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-1->thr-2-var-75-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-51-out-1->thr-1-var-76-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-49-out-0->fus-0-thr-0-var-51-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-49-out-1->thr-1-var-51-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-51-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-51-out-0->var-51-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-51-out-0->thr-0-var-51-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-51-out-1->var-51-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-52-out-0\n", - "\n", - "ER\n", + "\n", + "ER\n", "\n", "\n", - "\n", + "\n", "var-52-out-0->var-52-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-52-out-0->thr-1-var-53-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-52-out-0->thr-0-var-53-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-52-out-0->fus-0-thr-0-var-54-out-0\n", - "\n", + "\n", + "\n", + "var-52-out-0->fus-0-thr-1-var-54-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-57-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-52-out-0->thr-0-var-57-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-52-out-0->fus-0-thr-0-var-58-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-52-out-1\n", - "\n", - "ER\n", + "\n", + "ER\n", "\n", "\n", - "\n", + "\n", "var-52-out-1->var-52-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-52-out-1->fus-0-thr-2-var-53-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-52-out-1->thr-2-var-54-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-57-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-3-var-57-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-52-out-1->thr-2-var-57-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-52-out-1->thr-3-var-57-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-52-out-1->thr-1-var-58-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-53-out-0\n", - "\n", - "ESR1\n", + "\n", + "ESR1\n", "\n", - "\n", - "\n", - "var-53-out-0->fus-0-thr-0-var-54-out-0\n", - "\n", + "\n", + "\n", + "var-53-out-0->fus-0-thr-1-var-54-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-57-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-53-out-0->thr-1-var-57-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-53-out-1\n", - "\n", - "ESR1\n", + "\n", + "ESR1\n", "\n", "\n", - "\n", + "\n", "var-53-out-1->thr-2-var-54-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-57-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-57-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-53-out-1->fus-0-thr-2-var-57-out-1\n", - "\n", + "\n", + "\n", + "var-53-out-1->fus-0-thr-3-var-57-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-53-out-0->var-53-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-54-out-0->thr-0-var-53-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-54-out-0->thr-1-var-53-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-54-out-0->thr-1-var-57-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-54-out-0->fus-0-thr-0-var-58-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-53-out-0->var-53-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-53-out-1->var-53-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-2-var-53-out-1->thr-2-var-53-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-54-out-1\n", - "\n", - "ESR1_2\n", + "\n", + "ESR1_2\n", "\n", "\n", - "\n", + "\n", "var-54-out-1->var-53-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-54-out-1->fus-0-thr-2-var-57-out-1\n", - "\n", + "\n", + "\n", + "var-54-out-1->fus-0-thr-3-var-57-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "var-54-out-1->thr-1-var-58-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-0-var-54-out-0\n", - "\n", - "1\n", + "\n", + "\n", + "thr-1-var-54-out-0\n", + "\n", + "1\n", "\n", - "\n", - "\n", - "thr-0-var-54-out-0->var-54-out-0\n", - "\n", - "\n", + "\n", + "\n", + "thr-1-var-54-out-0->var-54-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-0-var-54-out-0->thr-0-var-54-out-0\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-1-var-54-out-0->thr-1-var-54-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-54-out-1->var-54-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-55-out-0->fus-0-thr-0-var-58-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-55-out-1->thr-1-var-58-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-56-out-0\n", - "\n", - "PBX1\n", + "\n", + "PBX1\n", "\n", "\n", - "\n", + "\n", "var-56-out-0->var-56-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-56-out-0->fus-0-thr-0-var-58-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-56-out-1\n", - "\n", - "PBX1\n", + "\n", + "PBX1\n", "\n", "\n", - "\n", + "\n", "var-56-out-1->var-56-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-56-out-1->thr-1-var-58-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-57-out-0\n", - "\n", - "ER_transcription\n", + "\n", + "ER_transcription\n", "\n", "\n", - "\n", + "\n", "var-57-out-0->fus-0-thr-0-var-58-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-57-out-0->thr-0-var-59-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-57-out-1\n", - "\n", - "ER_transcription\n", + "\n", + "ER_transcription\n", "\n", "\n", - "\n", + "\n", "var-57-out-1->thr-1-var-58-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-57-out-1->fus-0-thr-1-var-59-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-57-out-0->var-57-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-58-out-0\n", - "\n", - "ER_transcription_2\n", + "\n", + "ER_transcription_2\n", "\n", "\n", - "\n", + "\n", "var-58-out-0->thr-0-var-57-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-58-out-0->thr-1-var-57-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-58-out-0->fus-0-thr-0-var-60-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-58-out-0->thr-0-var-63-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-57-out-0->var-57-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-57-out-1->var-57-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-57-out-1->thr-2-var-57-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-58-out-1\n", - "\n", - "ER_transcription_2\n", + "\n", + "ER_transcription_2\n", "\n", "\n", - "\n", + "\n", "var-58-out-1->var-57-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-58-out-1->thr-1-var-60-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-58-out-1->fus-0-thr-1-var-63-out-1\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "thr-3-var-57-out-1->var-57-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-3-var-57-out-1->thr-3-var-57-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-58-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-58-out-0->var-58-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-58-out-0->thr-0-var-58-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-58-out-1->var-58-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-59-out-0->var-59-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-59-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-59-out-1->var-59-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-59-out-1->thr-1-var-59-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-60-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-60-out-0->var-60-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-60-out-0->thr-0-var-60-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-60-out-1->var-60-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-61-out-0\n", - "\n", - "cyclinD\n", + "\n", + "cyclinD\n", "\n", "\n", - "\n", + "\n", "var-61-out-0->fus-0-thr-0-var-62-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-65-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-61-out-0->thr-1-var-65-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-61-out-1\n", - "\n", - "cyclinD\n", + "\n", + "cyclinD\n", "\n", "\n", - "\n", + "\n", "var-61-out-1->thr-1-var-62-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-65-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-65-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-61-out-1->fus-0-thr-2-var-65-out-1\n", - "\n", + "\n", + "\n", + "var-61-out-1->fus-0-thr-3-var-65-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-61-out-0->var-61-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-62-out-0\n", - "\n", - "cyclinD_2\n", + "\n", + "cyclinD_2\n", "\n", "\n", - "\n", + "\n", "var-62-out-0->thr-0-var-61-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-62-out-0->thr-1-var-65-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-66-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-62-out-0->fus-0-thr-0-var-66-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-61-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-61-out-1->var-61-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-61-out-1->thr-1-var-61-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-62-out-1\n", - "\n", - "cyclinD_2\n", + "\n", + "cyclinD_2\n", "\n", "\n", - "\n", + "\n", "var-62-out-1->fus-0-thr-1-var-61-out-1\n", - "\n", + "\n", "\n", - "\n", - "\n", - "var-62-out-1->fus-0-thr-2-var-65-out-1\n", - "\n", + "\n", + "\n", + "var-62-out-1->fus-0-thr-3-var-65-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-66-out-1\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-62-out-1->thr-1-var-66-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-62-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-62-out-0->var-62-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-62-out-0->thr-0-var-62-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-62-out-1->var-62-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-63-out-0\n", - "\n", - "BCL2\n", + "\n", + "BCL2\n", "\n", - "\n", - "\n", - "var-63-out-0->fus-0-thr-2-var-78-out-0\n", - "\n", + "\n", + "\n", + "var-63-out-0->fus-0-thr-3-var-78-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "var-63-out-0->thr-3-var-79-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-63-out-1\n", - "\n", - "BCL2\n", + "\n", + "BCL2\n", "\n", "\n", - "\n", + "\n", "var-63-out-1->thr-0-var-77-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-63-out-1->thr-1-var-78-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-63-out-1->thr-0-var-78-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-63-out-1->fus-0-thr-1-var-79-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-63-out-0->var-63-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-63-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-63-out-1->var-63-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-63-out-1->thr-1-var-63-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-65-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-64-out-0->thr-0-var-65-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-64-out-0->fus-0-thr-0-var-66-out-0\n", - "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-65-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-3-var-65-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-64-out-1->thr-2-var-65-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-64-out-1->thr-3-var-65-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-64-out-1->thr-1-var-66-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-65-out-0\n", - "\n", - "cycD_CDK46\n", + "\n", + "cycD_CDK46\n", "\n", "\n", - "\n", + "\n", "var-65-out-0->fus-0-thr-0-var-66-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-65-out-0->thr-0-var-67-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-65-out-0->fus-0-thr-0-var-68-out-0\n", - "\n", + "\n", + "\n", + "var-65-out-0->fus-0-thr-1-var-68-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "var-65-out-1\n", - "\n", - "cycD_CDK46\n", + "\n", + "cycD_CDK46\n", "\n", "\n", - "\n", + "\n", "var-65-out-1->thr-1-var-66-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-65-out-1->fus-0-thr-1-var-67-out-1\n", - "\n", + "\n", "\n", - "\n", - "\n", - "var-65-out-1->thr-4-var-68-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-65-out-1->thr-3-var-68-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-65-out-0->var-65-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-66-out-0\n", - "\n", - "cycD_CDK46_2\n", + "\n", + "cycD_CDK46_2\n", "\n", "\n", - "\n", + "\n", "var-66-out-0->thr-0-var-65-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-66-out-0->thr-1-var-65-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-66-out-0->thr-0-var-67-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-0-var-68-out-0\n", - "\n", - "3\n", + "\n", + "\n", + "thr-1-var-68-out-0\n", + "\n", + "3\n", "\n", - "\n", - "\n", - "var-66-out-0->thr-0-var-68-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-66-out-0->thr-1-var-68-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-66-out-0->fus-0-thr-0-var-69-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-65-out-0->var-65-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-65-out-1->var-65-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-65-out-1->thr-2-var-65-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-66-out-1\n", - "\n", - "cycD_CDK46_2\n", + "\n", + "cycD_CDK46_2\n", "\n", "\n", - "\n", + "\n", "var-66-out-1->var-65-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-66-out-1->fus-0-thr-1-var-67-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-68-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-66-out-1->thr-2-var-68-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-66-out-1->thr-1-var-69-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-3-var-65-out-1->var-65-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-3-var-65-out-1->thr-3-var-65-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-66-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-66-out-0->var-66-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-66-out-0->thr-0-var-66-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-66-out-1->var-66-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-67-out-0\n", - "\n", - "pRb\n", + "\n", + "pRb\n", "\n", - "\n", - "\n", - "thr-1-var-68-out-0\n", - "\n", - "2\n", + "\n", + "\n", + "thr-0-var-68-out-0\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-67-out-0->thr-1-var-68-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-67-out-0->thr-0-var-68-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-67-out-0->fus-0-thr-0-var-69-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-67-out-0->thr-0-var-70-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-67-out-1\n", - "\n", - "pRb\n", + "\n", + "pRb\n", "\n", "\n", - "\n", + "\n", "var-67-out-1->thr-2-var-68-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-67-out-1->thr-4-var-68-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-67-out-1->thr-3-var-68-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-67-out-1->thr-1-var-69-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-67-out-1->fus-0-thr-1-var-70-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-67-out-0->var-67-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-68-out-0\n", - "\n", - "pRb_2\n", + "\n", + "pRb_2\n", "\n", "\n", - "\n", + "\n", "var-68-out-0->thr-0-var-67-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-68-out-0->fus-0-thr-0-var-69-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-68-out-0->fus-0-thr-0-var-71-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-68-out-0->fus-0-thr-0-var-72-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-69-out-0\n", - "\n", - "pRb_3\n", + "\n", + "pRb_3\n", "\n", "\n", - "\n", + "\n", "var-69-out-0->thr-0-var-67-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-69-out-0->thr-0-var-68-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-69-out-0->thr-1-var-68-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-72-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-69-out-0->thr-0-var-72-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-67-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-67-out-1->var-67-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-67-out-1->thr-1-var-67-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-68-out-1\n", - "\n", - "pRb_2\n", + "\n", + "pRb_2\n", "\n", "\n", - "\n", + "\n", "var-68-out-1->fus-0-thr-1-var-67-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-68-out-1->thr-1-var-69-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-68-out-1->thr-2-var-71-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-68-out-1->thr-3-var-72-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-68-out-1->thr-2-var-72-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-69-out-1\n", - "\n", - "pRb_3\n", + "\n", + "pRb_3\n", "\n", "\n", - "\n", + "\n", "var-69-out-1->fus-0-thr-1-var-67-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-69-out-1->var-68-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-69-out-1->thr-2-var-72-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-69-out-1->thr-3-var-72-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-68-out-0->var-68-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-0-var-68-out-0->thr-0-var-68-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-68-out-0->var-68-out-0\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-1-var-68-out-0->thr-1-var-68-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-68-out-1->var-68-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-4-var-68-out-1->var-68-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-3-var-68-out-1->var-68-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-69-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-69-out-0->var-69-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-69-out-0->thr-0-var-69-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-69-out-1->var-69-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-70-out-0->var-70-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-70-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-70-out-1->var-70-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-70-out-1->thr-1-var-70-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-71-out-0->var-71-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-71-out-0->thr-0-var-71-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-71-out-1->var-71-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-72-out-0->var-72-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-72-out-0->thr-0-var-72-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-72-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-72-out-0->var-72-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-72-out-0->thr-1-var-72-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-72-out-1->var-72-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-3-var-72-out-1->var-72-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-73-out-0\n", - "\n", - "Proliferation\n", + "\n", + "Proliferation\n", "\n", "\n", - "\n", + "\n", "var-73-out-1\n", - "\n", - "Proliferation\n", + "\n", + "Proliferation\n", "\n", "\n", - "\n", + "\n", "thr-0-var-73-out-0->var-73-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-73-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-73-out-1->var-73-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-73-out-1->thr-1-var-73-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-74-out-0\n", - "\n", - "Proliferation_2\n", + "\n", + "Proliferation_2\n", "\n", "\n", - "\n", + "\n", "var-74-out-1\n", - "\n", - "Proliferation_2\n", + "\n", + "Proliferation_2\n", "\n", "\n", - "\n", + "\n", "thr-0-var-74-out-0->var-74-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-74-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-74-out-1->var-74-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-74-out-1->thr-1-var-74-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-75-out-0\n", - "\n", - "Proliferation_3\n", + "\n", + "Proliferation_3\n", "\n", "\n", - "\n", + "\n", "thr-0-var-75-out-0->var-75-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-75-out-0->thr-0-var-75-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-75-out-1->var-75-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-76-out-0\n", - "\n", - "Proliferation_4\n", + "\n", + "Proliferation_4\n", "\n", "\n", - "\n", + "\n", "var-76-out-1\n", - "\n", - "Proliferation_4\n", + "\n", + "Proliferation_4\n", "\n", "\n", - "\n", + "\n", "thr-0-var-76-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-76-out-0->var-76-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-76-out-0->thr-0-var-76-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-76-out-1->var-76-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-77-out-0\n", - "\n", - "Apoptosis\n", + "\n", + "Apoptosis\n", "\n", "\n", - "\n", + "\n", "var-77-out-0->thr-0-var-77-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-77-out-0->thr-1-var-77-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-77-out-1\n", - "\n", - "Apoptosis\n", + "\n", + "Apoptosis\n", "\n", "\n", - "\n", + "\n", "var-77-out-1->var-77-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-77-out-0->var-77-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-77-out-0->thr-0-var-77-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-77-out-0->var-77-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-77-out-1\n", - "\n", - "2\n", - "\n", - "\n", - "\n", - "thr-2-var-77-out-1->var-77-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-77-out-0->thr-2-var-77-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-3-var-77-out-1->var-77-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-77-out-1->thr-2-var-77-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-4-var-77-out-1\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "thr-4-var-77-out-1->var-77-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-4-var-77-out-0->thr-4-var-77-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-4-var-77-out-1->thr-4-var-77-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-78-out-0\n", - "\n", - "Apoptosis_2\n", - "\n", - "\n", - "\n", - "thr-0-var-78-out-0\n", - "\n", - "2\n", + "\n", + "Apoptosis_2\n", "\n", "\n", - "\n", + "\n", "var-78-out-0->thr-0-var-78-out-0\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-1-var-78-out-0\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-78-out-0->thr-1-var-78-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-78-out-1\n", - "\n", - "Apoptosis_2\n", + "\n", + "Apoptosis_2\n", "\n", "\n", - "\n", + "\n", "var-78-out-1->var-78-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-78-out-0->var-78-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-0-var-78-out-0->thr-0-var-78-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-78-out-0->var-78-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-78-out-1->var-78-out-1\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-1-var-78-out-0->thr-1-var-78-out-0\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-3-var-78-out-1->var-78-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-78-out-0->thr-2-var-78-out-1\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-78-out-0->thr-3-var-78-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-79-out-0\n", - "\n", - "Apoptosis_3\n", + "\n", + "Apoptosis_3\n", "\n", "\n", - "\n", + "\n", "thr-0-var-79-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-79-out-0->thr-0-var-79-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-79-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-79-out-0->thr-1-var-79-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-79-out-1\n", - "\n", - "Apoptosis_3\n", + "\n", + "Apoptosis_3\n", "\n", "\n", - "\n", + "\n", "var-79-out-1->var-79-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-79-out-0->var-79-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-79-out-0->thr-0-var-79-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-79-out-0->var-79-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-79-out-1->thr-1-var-79-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-3-var-79-out-1->var-79-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -6767,7 +6696,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Dynamics Canalization Map.ipynb b/tutorials/Dynamics Canalization Map.ipynb index 34de982..a5b3118 100644 --- a/tutorials/Dynamics Canalization Map.ipynb +++ b/tutorials/Dynamics Canalization Map.ipynb @@ -24,7 +24,6 @@ "metadata": {}, "outputs": [], "source": [ - "import os\n", "from cana.datasets.bio import THALIANA\n", "from cana.drawing.canalizing_map import draw_canalizing_map_graphviz\n", "from IPython.display import display" @@ -50,12 +49,13 @@ "\n", "\n", - "\n", - "\n", + "\n", "\n", "\n", + "%3\n", "\n", "\n", "\n", @@ -154,7 +154,7 @@ "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -191,1556 +191,1226 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", "\n", "\n", "var-0-out-0\n", - "\n", - "AP3\n", - "\n", - "\n", - "\n", - "fus-0-thr-0-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-0-out-0->fus-0-thr-0-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-0-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-0-out-0->fus-1-thr-0-var-0-out-0\n", - "\n", + "\n", + "AP3\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-0-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-0-out-0->fus-0-thr-1-var-0-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-1-thr-1-var-0-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-0-out-0->fus-1-thr-1-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-3-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-0-out-0->fus-0-thr-3-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-3-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-0-out-0->fus-1-thr-3-var-0-out-0\n", - "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-0-var-13-out-0\n", - "\n", + "\n", + "\n", + "thr-0-var-13-out-0\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-0-out-0->fus-0-thr-0-var-13-out-0\n", - "\n", + "\n", + "\n", + "var-0-out-0->thr-0-var-13-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-13-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-0-out-0->fus-0-thr-1-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-1-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-0-out-0->fus-1-thr-1-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-0-out-0->fus-0-thr-2-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-2-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-0-out-0->fus-1-thr-2-var-13-out-0\n", - "\n", + "\n", "\n", "\n", "\n", "var-0-out-1\n", - "\n", - "AP3\n", + "\n", + "AP3\n", "\n", - "\n", - "\n", - "thr-5-var-0-out-1\n", - "\n", - "4\n", + "\n", + "\n", + "thr-2-var-0-out-1\n", + "\n", + "4\n", "\n", - "\n", - "\n", - "var-0-out-1->thr-5-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-0-out-1->thr-2-var-0-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-3-var-13-out-1\n", + "\n", + "\n", + "\n", + "\n", + "var-0-out-1->fus-0-thr-3-var-13-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-4-var-13-out-1\n", - "\n", - "4\n", + "\n", + "4\n", "\n", "\n", - "\n", + "\n", "var-0-out-1->thr-4-var-13-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-5-var-13-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-0-out-1->fus-0-thr-5-var-13-out-1\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "thr-0-var-0-out-0\n", - "\n", - "2\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "thr-0-var-0-out-0->var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-0-var-0-out-0->thr-0-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-13-out-0\n", - "\n", - "PI\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-13-out-0->fus-0-thr-0-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-13-out-0->fus-1-thr-0-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-13-out-0->fus-0-thr-1-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-4-out-0\n", + "\n", + "AP1\n", "\n", - "\n", - "\n", - "var-13-out-0->fus-1-thr-1-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-4-out-0->thr-0-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-0-out-0\n", - "\n", + "\n", + "\n", + "thr-1-var-2-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-13-out-0->fus-0-thr-2-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-4-out-0->thr-1-var-2-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-1-thr-2-var-0-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-9-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-13-out-0->fus-1-thr-2-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-4-out-0->fus-0-thr-3-var-9-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-13-out-0->fus-0-thr-0-var-13-out-0\n", - "\n", + "\n", + "\n", + "thr-2-var-12-out-1\n", + "\n", + "3\n", "\n", - "\n", - "\n", - "var-13-out-0->fus-0-thr-1-var-13-out-0\n", - "\n", + "\n", + "\n", + "var-4-out-0->thr-2-var-12-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-13-out-0->fus-1-thr-1-var-13-out-0\n", - "\n", + "\n", + "\n", + "thr-2-var-13-out-0\n", + "\n", + "3\n", "\n", - "\n", - "\n", - "var-14-out-0\n", - "\n", - "SEP\n", + "\n", + "\n", + "var-4-out-0->thr-2-var-13-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-14-out-0->fus-0-thr-0-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-9-out-0\n", + "\n", + "AG\n", "\n", - "\n", - "\n", - "var-14-out-0->fus-1-thr-0-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-9-out-0->thr-0-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-14-out-0->fus-0-thr-2-var-0-out-0\n", - "\n", + "\n", + "\n", + "thr-2-var-4-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-14-out-0->fus-1-thr-2-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-9-out-0->thr-2-var-4-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-14-out-0->fus-0-thr-3-var-0-out-0\n", - "\n", + "\n", + "\n", + "thr-3-var-4-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-14-out-0->fus-1-thr-3-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-9-out-0->thr-3-var-4-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-2-var-8-out-0\n", - "\n", + "\n", "\n", - "\n", - "\n", - "var-14-out-0->fus-0-thr-2-var-8-out-0\n", - "\n", + "\n", + "\n", + "var-9-out-0->fus-0-thr-2-var-8-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-9-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-14-out-0->fus-0-thr-1-var-9-out-0\n", - "\n", + "\n", "\n", - "\n", - "\n", - "var-14-out-0->fus-0-thr-0-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-14-out-0->fus-0-thr-2-var-13-out-0\n", - "\n", + "\n", + "\n", + "var-9-out-0->fus-0-thr-1-var-9-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-14-out-0->fus-1-thr-2-var-13-out-0\n", - "\n", + "\n", + "\n", + "fus-0-thr-0-var-13-out-0\n", + "\n", "\n", - "\n", - "\n", - "fus-1-thr-0-var-0-out-0->thr-0-var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-9-out-0->fus-0-thr-0-var-13-out-0\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-0-out-0\n", - "\n", - "2\n", + "\n", + "\n", + "var-9-out-0->thr-2-var-13-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-0-out-0->var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-0-var-0-out-0\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-1-var-0-out-0->thr-1-var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-0-var-0-out-0->thr-0-var-0-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-1-out-0\n", - "\n", - "UFO\n", + "\n", + "UFO\n", "\n", - "\n", - "\n", - "var-1-out-0->fus-0-thr-1-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-1-out-0->fus-0-thr-0-var-0-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "var-1-out-0->var-1-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-1-out-0->fus-1-thr-1-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-1-out-0->fus-0-thr-2-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-1-out-0->fus-1-thr-2-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-1-out-0->fus-0-thr-3-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-1-out-0->fus-1-thr-3-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-4-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-1-out-0->fus-0-thr-4-var-0-out-0\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-6-out-0\n", - "\n", - "LFY\n", - "\n", - "\n", - "\n", - "var-6-out-0->var-14-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-6-out-0->fus-0-thr-1-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-6-out-0->fus-1-thr-1-var-0-out-0\n", - "\n", + "\n", + "LFY\n", "\n", - "\n", - "\n", - "var-6-out-0->fus-0-thr-2-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-6-out-0->fus-1-thr-2-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-6-out-0->fus-0-thr-3-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-6-out-0->fus-0-thr-0-var-0-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-6-out-0->fus-1-thr-3-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-14-out-0\n", + "\n", + "SEP\n", "\n", - "\n", - "\n", - "var-6-out-0->fus-0-thr-4-var-0-out-0\n", - "\n", + "\n", + "\n", + "var-6-out-0->var-14-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-5-out-1\n", - "\n", - "EMF1\n", + "\n", + "EMF1\n", "\n", "\n", - "\n", + "\n", "var-6-out-0->var-5-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-4-out-0\n", - "\n", - "3\n", + "\n", + "3\n", "\n", "\n", - "\n", + "\n", "var-6-out-0->thr-0-var-4-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-9-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-6-out-0->thr-0-var-9-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-12-out-1\n", - "\n", - "3\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-6-out-0->thr-2-var-12-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-0-var-13-out-0\n", - "\n", - "2\n", - "\n", - "\n", - "\n", - "var-6-out-0->thr-0-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-6-out-0->fus-0-thr-1-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-6-out-0->fus-1-thr-1-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-6-out-0->fus-0-thr-2-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-6-out-0->fus-1-thr-2-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "thr-3-var-13-out-0\n", - "\n", - "3\n", - "\n", - "\n", - "\n", - "var-6-out-0->thr-3-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-1-var-0-out-0->thr-1-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-0-out-0\n", - "\n", - "2\n", - "\n", - "\n", - "\n", - "thr-2-var-0-out-0->var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-0-out-0->thr-2-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-2-var-0-out-0->thr-2-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-3-var-0-out-0\n", - "\n", - "2\n", - "\n", - "\n", - "\n", - "thr-3-var-0-out-0->var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-3-var-0-out-0->thr-3-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-3-var-0-out-0->thr-3-var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-4-var-0-out-0\n", - "\n", - "3\n", - "\n", - "\n", - "\n", - "thr-4-var-0-out-0->var-0-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "var-4-out-0\n", - "\n", - "AP1\n", - "\n", - "\n", - "\n", - "var-4-out-0->thr-4-var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-2-out-1\n", - "\n", - "2\n", - "\n", - "\n", - "\n", - "var-4-out-0->thr-1-var-2-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-9-out-0\n", - "\n", - "\n", - "\n", - "\n", - "var-4-out-0->fus-0-thr-2-var-9-out-0\n", - "\n", + "\n", + "\n", + "var-6-out-0->fus-0-thr-0-var-13-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-4-out-0->thr-2-var-12-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-1-var-13-out-0\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-4-out-0->thr-3-var-13-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-6-out-0->thr-1-var-13-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0\n", - "\n", - "AG\n", + "\n", + "\n", + "var-6-out-0->thr-2-var-13-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0->thr-4-var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", + "thr-1-var-0-out-0\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "thr-2-var-4-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-1-var-0-out-0->var-0-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0->thr-2-var-4-out-1\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-1-var-0-out-0->thr-1-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-3-var-4-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "var-13-out-0\n", + "\n", + "PI\n", "\n", - "\n", - "\n", - "var-9-out-0->thr-3-var-4-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-13-out-0->fus-0-thr-1-var-0-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0->fus-0-thr-2-var-8-out-0\n", - "\n", + "\n", + "\n", + "var-13-out-0->fus-1-thr-1-var-0-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0->fus-0-thr-1-var-9-out-0\n", - "\n", + "\n", + "\n", + "var-13-out-0->fus-0-thr-1-var-13-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0->fus-0-thr-1-var-13-out-0\n", - "\n", + "\n", + "\n", + "var-14-out-0->fus-0-thr-1-var-0-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0->fus-1-thr-1-var-13-out-0\n", - "\n", + "\n", + "\n", + "var-14-out-0->fus-1-thr-1-var-0-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0->fus-0-thr-2-var-13-out-0\n", - "\n", + "\n", + "\n", + "var-14-out-0->fus-0-thr-2-var-8-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0->fus-1-thr-2-var-13-out-0\n", - "\n", + "\n", + "\n", + "var-14-out-0->fus-0-thr-1-var-9-out-0\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-0->thr-3-var-13-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-14-out-0->fus-0-thr-1-var-13-out-0\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-4-var-0-out-0->thr-4-var-0-out-0\n", - "\n", - "\n", + "\n", + "\n", + "fus-1-thr-1-var-0-out-0->thr-1-var-0-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-5-var-0-out-1->var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-2-var-0-out-1->var-0-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-13-out-1\n", - "\n", - "PI\n", + "\n", + "PI\n", "\n", - "\n", - "\n", - "var-13-out-1->thr-5-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-13-out-1->thr-2-var-0-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-13-out-1->thr-4-var-13-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-14-out-1\n", - "\n", - "SEP\n", + "\n", + "SEP\n", "\n", - "\n", - "\n", - "var-14-out-1->thr-5-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-14-out-1->thr-2-var-0-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-8-out-0\n", - "\n", - "2\n", + "\n", + "\n", + "thr-0-var-8-out-0\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-14-out-1->thr-1-var-8-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-14-out-1->thr-0-var-8-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-3-var-9-out-1\n", - "\n", - "3\n", + "\n", + "\n", + "thr-2-var-9-out-1\n", + "\n", + "3\n", "\n", - "\n", - "\n", - "var-14-out-1->thr-3-var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-14-out-1->thr-2-var-9-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-14-out-1->thr-4-var-13-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-5-var-0-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-0-out-1\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-5-var-0-out-1->thr-5-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-2-var-0-out-1->thr-2-var-0-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-4-out-1\n", - "\n", - "AP1\n", + "\n", + "AP1\n", "\n", - "\n", - "\n", - "var-4-out-1->fus-0-thr-5-var-0-out-1\n", - "\n", + "\n", + "\n", + "var-4-out-1->fus-0-thr-2-var-0-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-2-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-4-out-1->fus-0-thr-0-var-2-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-9-out-0\n", - "\n", - "6\n", + "\n", + "6\n", "\n", "\n", - "\n", + "\n", "var-4-out-1->thr-1-var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-0-var-12-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-1-var-12-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-4-out-1->fus-0-thr-0-var-12-out-1\n", - "\n", + "\n", + "\n", + "var-4-out-1->fus-0-thr-1-var-12-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-4-var-13-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-4-out-1->fus-0-thr-4-var-13-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-9-out-1\n", - "\n", - "AG\n", + "\n", + "AG\n", "\n", "\n", - "\n", + "\n", "var-9-out-1->var-4-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-1->fus-0-thr-5-var-0-out-1\n", - "\n", + "\n", + "\n", + "var-9-out-1->fus-0-thr-2-var-0-out-1\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-1->thr-1-var-8-out-0\n", - "\n", - "\n", + "\n", + "\n", + "var-9-out-1->thr-0-var-8-out-0\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-9-out-1->thr-3-var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-9-out-1->thr-2-var-9-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "var-9-out-1->fus-0-thr-3-var-13-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "var-9-out-1->fus-0-thr-4-var-13-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-9-out-1->fus-0-thr-5-var-13-out-1\n", - "\n", + "\n", "\n", - "\n", - "\n", - "thr-6-var-0-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-3-var-0-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "thr-6-var-0-out-1->var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", + "thr-3-var-0-out-1->var-0-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-1-out-1\n", - "\n", - "UFO\n", + "\n", + "UFO\n", "\n", - "\n", - "\n", - "var-1-out-1->thr-6-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-1-out-1->thr-3-var-0-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-1-out-1->var-1-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-6-out-1\n", - "\n", - "LFY\n", + "\n", + "LFY\n", "\n", "\n", - "\n", + "\n", "var-6-out-1->var-14-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-6-out-1->thr-6-var-0-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-6-out-1->thr-3-var-0-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-5-out-0\n", - "\n", - "EMF1\n", + "\n", + "EMF1\n", "\n", "\n", - "\n", + "\n", "var-6-out-1->var-5-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-4-out-1\n", - "\n", - "\n", - "\n", - "\n", - "var-6-out-1->fus-0-thr-2-var-4-out-1\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-4-out-1\n", + "\n", "\n", - "\n", - "\n", - "thr-2-var-9-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "var-6-out-1->fus-0-thr-3-var-4-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "var-6-out-1->thr-2-var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-3-var-9-out-1\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-6-out-1->thr-3-var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-5-var-9-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-6-out-1->thr-5-var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-6-out-1->fus-0-thr-0-var-12-out-1\n", - "\n", + "\n", + "\n", + "var-6-out-1->fus-0-thr-1-var-12-out-1\n", + "\n", "\n", - "\n", - "\n", - "thr-5-var-13-out-1\n", - "\n", - "2\n", + "\n", + "\n", + "thr-3-var-13-out-1\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "var-6-out-1->thr-5-var-13-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-6-out-1->thr-3-var-13-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-2-out-0\n", - "\n", - "FUL\n", + "\n", + "FUL\n", "\n", "\n", - "\n", + "\n", "var-2-out-1\n", - "\n", - "FUL\n", + "\n", + "FUL\n", "\n", "\n", - "\n", + "\n", "thr-0-var-2-out-0\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-0-var-2-out-0->var-2-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-2-out-1->thr-0-var-2-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-12-out-1\n", - "\n", - "TFL1\n", + "\n", + "TFL1\n", "\n", "\n", - "\n", + "\n", "var-12-out-1->fus-0-thr-0-var-2-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-12-out-1->thr-0-var-4-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-6-out-0\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-12-out-1->thr-0-var-6-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-7-out-0\n", - "\n", - "AP2\n", + "\n", + "AP2\n", "\n", "\n", - "\n", + "\n", "var-12-out-1->var-7-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-9-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-12-out-1->fus-0-thr-0-var-9-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-2-out-1->var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-12-out-0\n", - "\n", - "TFL1\n", + "\n", + "TFL1\n", "\n", "\n", - "\n", + "\n", "var-12-out-0->thr-1-var-2-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-12-out-0->thr-3-var-4-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-12-out-0->thr-2-var-4-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-6-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-12-out-0->fus-0-thr-1-var-6-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-7-out-1\n", - "\n", - "AP2\n", + "\n", + "AP2\n", "\n", "\n", - "\n", + "\n", "var-12-out-0->var-7-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-4-var-9-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-12-out-0->thr-4-var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-3-out-0\n", - "\n", - "FT\n", + "\n", + "FT\n", "\n", "\n", - "\n", + "\n", "var-3-out-0->thr-0-var-4-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-3-out-1\n", - "\n", - "FT\n", + "\n", + "FT\n", "\n", - "\n", - "\n", - "var-3-out-1->fus-0-thr-2-var-4-out-1\n", - "\n", + "\n", + "\n", + "var-3-out-1->fus-0-thr-3-var-4-out-1\n", + "\n", "\n", "\n", - "\n", + "\n", "var-5-out-1->var-3-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-5-out-1->thr-0-var-6-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-5-out-1->thr-2-var-12-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-5-out-0->var-12-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-5-out-0->var-3-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-5-out-0->fus-0-thr-1-var-6-out-0\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-4-out-0->var-4-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-4-out-1->var-4-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-4-out-1->thr-2-var-4-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-3-var-4-out-1->var-4-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-3-var-4-out-1->thr-3-var-4-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-6-out-0->var-6-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-6-out-1\n", - "\n", - "1\n", + "\n", + "1\n", "\n", "\n", - "\n", + "\n", "thr-1-var-6-out-1->var-6-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-6-out-0->thr-1-var-6-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "var-7-out-0->fus-0-thr-2-var-9-out-0\n", - "\n", + "\n", + "\n", + "var-7-out-0->fus-0-thr-3-var-9-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "var-7-out-0->thr-4-var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-7-out-1->fus-0-thr-0-var-9-out-1\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-7-out-1->thr-1-var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-8-out-0\n", - "\n", - "WUS\n", + "\n", + "WUS\n", "\n", "\n", - "\n", + "\n", "var-8-out-0->var-8-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-8-out-0->thr-1-var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-8-out-1\n", - "\n", - "WUS\n", + "\n", + "WUS\n", "\n", "\n", - "\n", + "\n", "thr-2-var-8-out-1\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", - "\n", + "\n", "var-8-out-1->thr-2-var-8-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-8-out-1->thr-5-var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-1-var-8-out-0->var-8-out-0\n", - "\n", - "\n", + "\n", + "\n", + "thr-0-var-8-out-0->var-8-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-8-out-1->var-8-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-2-var-8-out-0->thr-2-var-8-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-9-out-0->var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-9-out-1->thr-0-var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-9-out-0->var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-10-out-1\n", - "\n", - "LUG\n", + "\n", + "LUG\n", "\n", "\n", - "\n", + "\n", "var-10-out-1->thr-1-var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-11-out-1\n", - "\n", - "CLF\n", + "\n", + "CLF\n", "\n", "\n", - "\n", + "\n", "var-11-out-1->thr-1-var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-9-out-0->thr-1-var-9-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-9-out-1->var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-3-var-9-out-1->var-9-out-1\n", + "\n", + "\n", "\n", - "\n", - "\n", - "fus-0-thr-2-var-9-out-0->thr-2-var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", + "fus-0-thr-3-var-9-out-0->thr-3-var-9-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "var-10-out-0\n", - "\n", - "LUG\n", + "\n", + "LUG\n", "\n", - "\n", - "\n", - "var-10-out-0->fus-0-thr-2-var-9-out-0\n", - "\n", + "\n", + "\n", + "var-10-out-0->fus-0-thr-3-var-9-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "var-11-out-0\n", - "\n", - "CLF\n", - "\n", - "\n", - "\n", - "var-11-out-0->fus-0-thr-2-var-9-out-0\n", - "\n", + "\n", + "CLF\n", "\n", - "\n", - "\n", - "thr-3-var-9-out-1->var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", + "var-11-out-0->fus-0-thr-3-var-9-out-0\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-4-var-9-out-1->var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-5-var-9-out-1->var-9-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "thr-0-var-12-out-0\n", - "\n", - "1\n", - "\n", - "\n", - "\n", - "thr-0-var-12-out-0->var-12-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-0-var-12-out-1->thr-0-var-12-out-0\n", - "\n", - "\n", + "\n", + "\n", + "thr-1-var-12-out-0\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "thr-1-var-12-out-0->var-12-out-0\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-1-var-12-out-1->thr-1-var-12-out-0\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-12-out-1->var-12-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-0-var-13-out-0->var-13-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-0-var-13-out-0->thr-0-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-1-var-13-out-0\n", - "\n", - "2\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-1-var-13-out-0->var-13-out-0\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-1-var-13-out-0->thr-1-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-1-var-13-out-0->thr-1-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-2-var-13-out-0\n", - "\n", - "2\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-2-var-13-out-0->var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-2-var-13-out-0->thr-2-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-1-thr-2-var-13-out-0->thr-2-var-13-out-0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-3-var-13-out-0->var-13-out-0\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "thr-3-var-13-out-1->var-13-out-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fus-0-thr-3-var-13-out-1->thr-3-var-13-out-1\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "thr-4-var-13-out-1->var-13-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "fus-0-thr-4-var-13-out-1->thr-4-var-13-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "thr-5-var-13-out-1->var-13-out-1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "fus-0-thr-5-var-13-out-1->thr-5-var-13-out-1\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1780,7 +1450,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/Generating from Partial LUTs.ipynb b/tutorials/Generating from Partial LUTs.ipynb new file mode 100644 index 0000000..f598c4a --- /dev/null +++ b/tutorials/Generating from Partial LUTs.ipynb @@ -0,0 +1,569 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Demo for generating complete LUTs from partial input\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from cana.drawing.schema_vis import plot_schemata\n", + "from cana.drawing.plot_look_up_table import plot_look_up_table\n", + "from cana.utils import fill_out_lut\n", + "\n", + "from cana.boolean_network import BooleanNetwork\n", + "from cana.boolean_node import BooleanNode" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
In:Out:
000000000
100000010
200000100
300000110
400001000
.........
12311110111
12411111001
12511111011
12611111101
12711111111
\n", + "

128 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " In: Out:\n", + "0 0000000 0\n", + "1 0000001 0\n", + "2 0000010 0\n", + "3 0000011 0\n", + "4 0000100 0\n", + ".. ... ...\n", + "123 1111011 1\n", + "124 1111100 1\n", + "125 1111101 1\n", + "126 1111110 1\n", + "127 1111111 1\n", + "\n", + "[128 rows x 2 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from cana.datasets.bio import THALIANA\n", + "\n", + "thaliana = THALIANA()\n", + "\n", + "thaliana.nodes[0].look_up_table()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Partial LUTs\n", + "\n", + "These are incomplete effective graphs with '-' signifying the wildcard symbol. Visually inspecting an effective graph doesn't allow us to infer its status of completeness or identify any inherent contradictions within the inputs.\n", + "\n", + "The fill_out_lut() function enables us to check for contradictory output data. The contradictory outputs are marked by '!'\n", + "\n", + "The fill_out_lut() function also checks for missing rules in the LUT, allowing us to correct out data infered from sources and explore state spaces yet to be understood. These outputs are marked by '?'." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('0000', '?'),\n", + " ('0001', '?'),\n", + " ('0010', '?'),\n", + " ('0011', '?'),\n", + " ('0100', '?'),\n", + " ('0101', '?'),\n", + " ('0110', '?'),\n", + " ('0111', '?'),\n", + " ('1000', '0'),\n", + " ('1001', '0'),\n", + " ('1010', '0'),\n", + " ('1011', '0'),\n", + " ('1100', '0'),\n", + " ('1101', '0'),\n", + " ('1110', '0'),\n", + " ('1111', '0')]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Using the fill_out_lut function found in utils.py\n", + "\n", + "# example look up tables\n", + "partial_luts = [\n", + " [(\"00--\", \"0\"), (\"1--1\", \"1\"), (\"11--\", \"1\")],\n", + " [(\"1--\", \"1\"), (\"101\", \"0\"), (\"011\", \"0\"), (\"01-\", \"1\")],\n", + " [(\"0--0\", \"0\"), (\"1--1\", \"0\"), (\"0111\", \"1\"), (\"0011\", \"1\")],\n", + " [(\"1---\", \"0\")],\n", + "]\n", + "generated_lut = fill_out_lut(partial_luts[3])\n", + "generated_lut" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Partial LUTs in BNS (.cnet) format\n", + "\n", + "BNS is a software tool for computing attractors in Boolean Networks with Synchronous update. Synchronous Boolean networks are used for the modeling of genetic regulatory networks.\n", + "\n", + "BNS reads in a Boolean network description represented in a .cnet format similar to the Berkeley Logic Interchange Format (BLIF) format commonly used in synthesis and verification tools and prints out the set of network's attractors.\n", + "\n", + "Check: " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " In: Out:\n", + "0 00 1\n", + "1 01 ?\n", + "2 10 ?\n", + "3 11 ?\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "partial_luts_network = BooleanNetwork.from_file(\n", + " \"partial_LUT_demo_nodes.txt\", # loading example network with partial LUTs in the nodes\n", + " name=\"Partial LUTs Demo\",\n", + " keep_constants=True,\n", + " partial_lut=True, # specifying that the LUTs are partial, because the default assumes that all LUTs are complete\n", + ")\n", + "\n", + "\n", + "node = partial_luts_network.nodes[2]\n", + "\n", + "print(node)\n", + "print(node.look_up_table())\n", + "# print(node.schemata_look_up_table()) # This will throw an error as the presence of '?' makes it impossible to generate a schemata look up table.\n", + "\n", + "plot_look_up_table(node)\n", + "# plot_schemata(node) # This will throw an error as the presence of '?' makes it impossible to generate a schemata look up table." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Instantiating a BooleanNode object using partial LUT\n", + "\n", + "Incorporating the fill_out_lut() function into the instantiation of a single boolean node object under the class BooleanNode, this object will now contain '?' for unspecified output values in the LUT entry. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['?', '?', '0', '0', '?', '?', '?', '?', '?', '1', '?', '1', '1', '1', '1', '1']\n", + "['0', '0', '0', '0', '?', '?', '?', '?', '?', '1', '?', '1', '1', '1', '?', '1']\n", + "Clashing output values for entry: 101\n", + "Clashing output values for entry: 011\n", + "['?', '?', '1', '!', '1', '!', '1', '1']\n", + "['0', '?', '0', '1', '0', '?', '0', '1', '?', '0', '?', '0', '?', '0', '?', '0']\n", + "['?', '?', '?', '?', '?', '1', '0', '1', '?', '1', '0', '0', '?', '1', '0', '0']\n", + "['?', '?', '?', '?', '?', '?', '0', '?', '?', '1', '0', '0', '?', '1', '0', '0']\n", + "['?', '?', '?', '?', '0', '0', '0', '0', '?', '?', '?', '?', '0', '0', '0', '0']\n", + "['?', '?', '?', '?', '1', '1', '1', '1', '?', '?', '?', '?', '1', '1', '1', '1']\n", + "['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?']\n" + ] + } + ], + "source": [ + "# example partial look up tables\n", + "partial_luts = [\n", + " [(\"001-\", \"0\"), (\"1--1\", \"1\"), (\"11--\", \"1\")],\n", + " [(\"00--\", \"0\"), (\"1--1\", \"1\"), (\"110-\", \"1\")],\n", + " [(\"1--\", \"1\"), (\"101\", \"0\"), (\"011\", \"0\"), (\"01-\", \"1\")], # will have clashes\n", + " [(\"0--0\", \"0\"), (\"1--1\", \"0\"), (\"0111\", \"1\"), (\"0011\", \"1\")],\n", + " [(\"1-01\", \"1\"), (\"1-1-\", \"0\"), (\"0110\", \"0\"), (\"01-1\", \"1\")],\n", + " [(\"1-01\", \"1\"), (\"1-1-\", \"0\"), (\"0110\", \"0\"), (\"01-1\", \"?\")],\n", + " [(\"-1--\", \"0\")],\n", + " [(\"-1--\", \"1\")],\n", + " [(\"-1--\", \"?\")],\n", + "]\n", + "\n", + "# using the from_partial_lut function found in BooleanNode class\n", + "for partial_lut in partial_luts:\n", + " generated_node = BooleanNode.from_partial_lut(partial_lut)\n", + " # print(generated_node)\n", + " print(generated_node.outputs)\n", + " # plot_look_up_table(generated_node)\n", + " # plot_schemata(generated_node) # This will throw an error as the presence of '?' makes it impossible to generate a schemata look up table." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generating missing output values randomly" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "['0', '1', '1', '0', '0', '0', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0']\n" + ] + } + ], + "source": [ + "# filling missing output values randomly with 1 or 0 instead of '?'\n", + "partial_lut = [(\"1-01\", \"1\"), (\"1-1-\", \"0\"), (\"01--\", \"0\")]\n", + "generated_node = BooleanNode.from_partial_lut(\n", + " partial_lut, fill_missing_output_randomly=True\n", + ")\n", + "print(generated_node)\n", + "print(generated_node.outputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generating LUT with specified Node Bias\n", + "\n", + "The BooleanNode object calculates the node bias using the .bias() function. \n", + "\n", + "```python\n", + "generated_node.bias()\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "28 possible permutation(s) with a bias of 0.5. This is the closest bias less than or equal to the required bias of 0.5.\n", + "35 possible permutation(s) with a bias of 0.5. This is the closest bias less than or equal to the required bias of 0.5.\n", + "1 possible permutation(s) with a bias of 0.5. This is the closest bias less than or equal to the required bias of 0.5.\n", + "35 possible permutation(s) with a bias of 0.5. This is the closest bias less than or equal to the required bias of 0.5.\n", + "84 possible permutation(s) with a bias of 0.5. This is the closest bias less than or equal to the required bias of 0.5.\n", + "1 possible permutation(s) with a bias of 0.5. This is the closest bias less than or equal to the required bias of 0.5.\n", + "495 possible permutation(s) with a bias of 0.5. This is the closest bias less than or equal to the required bias of 0.5.\n", + "70 possible permutation(s) with a bias of 0.5. This is the closest bias less than or equal to the required bias of 0.5.\n" + ] + } + ], + "source": [ + "partial_luts = [\n", + " [(\"001-\", \"0\"), (\"1--1\", \"1\"), (\"11--\", \"1\")],\n", + " [(\"00--\", \"0\"), (\"1--1\", \"1\"), (\"110-\", \"1\")],\n", + " # [(\"1--\", \"1\"), (\"101\", \"0\"), (\"011\", \"0\"), (\"01-\", \"1\")], # will have clashes\n", + " [(\"0--0\", \"0\"), (\"1--1\", \"0\"), (\"0111\", \"1\"), (\"0011\", \"1\")],\n", + " [(\"1-01\", \"1\"), (\"1-1-\", \"0\"), (\"0110\", \"0\"), (\"01-1\", \"1\")],\n", + " [(\"1-01\", \"1\"), (\"1-1-\", \"0\"), (\"0110\", \"0\"), (\"01-1\", \"?\")],\n", + " [(\"-1--\", \"0\")],\n", + " [(\"-10-\", \"1\")],\n", + " [(\"11-\", \"?\")],\n", + "]\n", + "\n", + "\n", + "for lut in partial_luts:\n", + " node = None\n", + " # generated_node_permutations = None\n", + " node = BooleanNode.from_partial_lut(lut)\n", + " # print(node.outputs)\n", + "\n", + " generated_node_permutations = node.generate_with_required_bias(\n", + " required_node_bias=0.5, limit=50, verbose=True\n", + " )\n", + " # print(generated_node_permuations[0].outputs, \"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['1', '1', '0', '0', '0', '0', '1', '1']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "node = next(generated_node_permutations)\n", + "node.outputs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generating LUT with specified Effective connectivity\n", + "\n", + "The BooleanNode object calculates effective connectivity using the .effective_connectivity() function.\n", + "\n", + "```python\n", + "\n", + "generated_node.effective_connectivity()\n", + "\n", + "```\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generating a Look Up Table for a node with a specified effective connectivity. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Partial LUT: ['?', '?', '0', '0', '?', '?', '?', '?', '?', '1', '?', '1', '1', '1', '1', '1']\n", + "Generated the node with the closest possible effective connectivity of 0.484375.\n", + "['0', '0', '0', '0', '0', '1', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1'] \n", + "\n", + "Partial LUT: ['0', '0', '0', '0', '?', '?', '?', '?', '?', '1', '?', '1', '1', '1', '?', '1']\n", + "Generated the node with the closest possible effective connectivity of 0.484375.\n", + "['0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '0', '1'] \n", + "\n", + "Partial LUT: ['0', '?', '0', '1', '0', '?', '0', '1', '?', '0', '?', '0', '?', '0', '?', '0']\n", + "Generated the node with the closest possible effective connectivity of 0.484375.\n", + "['0', '0', '0', '1', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '1', '0'] \n", + "\n", + "Partial LUT: ['?', '?', '?', '?', '?', '1', '0', '1', '?', '1', '0', '0', '?', '1', '0', '0']\n", + "Generated the node with the closest possible effective connectivity of 0.484375.\n", + "['1', '1', '1', '0', '1', '1', '0', '1', '1', '1', '0', '0', '1', '1', '0', '0'] \n", + "\n", + "Partial LUT: ['?', '?', '?', '?', '?', '?', '0', '?', '?', '1', '0', '0', '?', '1', '0', '0']\n", + "Generated the node with the closest possible effective connectivity of 0.484375.\n", + "['0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '1', '0', '0'] \n", + "\n", + "Partial LUT: ['?', '?', '?', '?', '0', '0', '0', '0', '?', '?', '?', '?', '0', '0', '0', '0']\n", + "Generated the node with the closest possible effective connectivity of 0.484375.\n", + "['0', '0', '0', '1', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '0'] \n", + "\n", + "Partial LUT: ['?', '?', '?', '?', '1', '1', '1', '1', '?', '?', '?', '?', '1', '1', '1', '1']\n", + "Generated the node with the closest possible effective connectivity of 0.484375.\n", + "['0', '0', '0', '0', '1', '1', '1', '1', '0', '1', '1', '0', '1', '1', '1', '1'] \n", + "\n" + ] + } + ], + "source": [ + "partial_luts = [\n", + " [(\"001-\", \"0\"), (\"1--1\", \"1\"), (\"11--\", \"1\")],\n", + " [(\"00--\", \"0\"), (\"1--1\", \"1\"), (\"110-\", \"1\")],\n", + " # [(\"1--\", \"1\"), (\"101\", \"0\"), (\"011\", \"0\"), (\"01-\", \"1\")], # will have clashes\n", + " [(\"0--0\", \"0\"), (\"1--1\", \"0\"), (\"0111\", \"1\"), (\"0011\", \"1\")],\n", + " [(\"1-01\", \"1\"), (\"1-1-\", \"0\"), (\"0110\", \"0\"), (\"01-1\", \"1\")],\n", + " [(\"1-01\", \"1\"), (\"1-1-\", \"0\"), (\"0110\", \"0\"), (\"01-1\", \"?\")],\n", + " [(\"-1--\", \"0\")],\n", + " [(\"-1--\", \"1\")],\n", + " # [(\"-1--\",\"?\")]\n", + "]\n", + "partial_lut = partial_luts[0]\n", + "\n", + "for partial_lut in partial_luts:\n", + " generated_nodes = BooleanNode.from_partial_lut(partial_lut)\n", + " print(f\"Partial LUT: {generated_nodes.outputs}\")\n", + " generated_node_permuations = (\n", + " generated_nodes.generate_with_required_effective_connectivity(\n", + " required_effective_connectivity=0.49, verbose=True\n", + " )\n", + " )\n", + " print(generated_node_permuations.outputs, \"\\n\")\n", + "\n", + "\n", + "# # Incorporating the above functions into the from_partial_lut() under BooleanNode class\n", + "# generated_node = BooleanNode.from_partial_lut(\n", + "# partial_lut, required_effective_connectivity=0.45\n", + "# )\n", + "\n", + "# plot_look_up_table(generated_node)\n", + "# plot_schemata(generated_node)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Note: \n", + "\n", + "from_partial_lut() will throw an error if there are mutliple kwargs inputted. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```python\n", + "generated_node = BooleanNode.from_partial_lut(partial_lut, fill_missing_output_randomly= True, required_effective_connectivity=0.7, required_node_bias=0.5)\n", + "\n", + "ValueError: Only one of required_effective_connectvity, required_node_bias and fill_missing_output_randomly can be True. Please set the rest to False.\n", + "```" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/PNAS 2021 - Arabidopsis thaliana.ipynb b/tutorials/PNAS 2021 - Arabidopsis thaliana.ipynb index 8e53e37..cf5ba72 100644 --- a/tutorials/PNAS 2021 - Arabidopsis thaliana.ipynb +++ b/tutorials/PNAS 2021 - Arabidopsis thaliana.ipynb @@ -25,7 +25,6 @@ "import matplotlib.pyplot as plt\n", "from matplotlib.colors import LinearSegmentedColormap\n", "# Cana\n", - "import cana\n", "from cana.datasets.bio import THALIANA\n", "# Networkx\n", "import networkx as nx" @@ -67,7 +66,7 @@ "{'label': 'AG'}\n", "{'label': 'WUS'}\n", "{'weight': 0.375}\n", - "{'weight': 0.10249255952380942}\n" + "{'weight': 0.10249255952380953}\n" ] } ], @@ -116,239 +115,16 @@ "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
kk_rk_ek_r*k_e*k^{out}k_e^{out}k_e^{out} / k^{out}
node
AG96.92.10.770.2351.90.38
AP374.72.30.680.3220.80.4
PI63.82.20.640.3620.470.24
AP142.41.60.590.4161.40.23
LFY42.81.20.690.3174.80.69
TFL142.81.20.690.3152.80.57
WUS31.41.60.480.5220.910.46
FUL20.751.20.380.62100
UFO1000021.60.79
FT1000010.240.24
EMF110000320.68
AP21000020.430.22
SEP1000040.90.22
LUG0000010.10.1
CLF0000010.10.1
\n", - "
" - ], - "text/plain": [ - " k k_r k_e k_r* k_e* k^{out} k_e^{out} k_e^{out} / k^{out}\n", - "node \n", - "AG 9 6.9 2.1 0.77 0.23 5 1.9 0.38\n", - "AP3 7 4.7 2.3 0.68 0.32 2 0.8 0.4\n", - "PI 6 3.8 2.2 0.64 0.36 2 0.47 0.24\n", - "AP1 4 2.4 1.6 0.59 0.41 6 1.4 0.23\n", - "LFY 4 2.8 1.2 0.69 0.31 7 4.8 0.69\n", - "TFL1 4 2.8 1.2 0.69 0.31 5 2.8 0.57\n", - "WUS 3 1.4 1.6 0.48 0.52 2 0.91 0.46\n", - "FUL 2 0.75 1.2 0.38 0.62 1 0 0\n", - "UFO 1 0 0 0 0 2 1.6 0.79\n", - "FT 1 0 0 0 0 1 0.24 0.24\n", - "EMF1 1 0 0 0 0 3 2 0.68\n", - "AP2 1 0 0 0 0 2 0.43 0.22\n", - "SEP 1 0 0 0 0 4 0.9 0.22\n", - "LUG 0 0 0 0 0 1 0.1 0.1\n", - "CLF 0 0 0 0 0 1 0.1 0.1" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "ZeroDivisionError", + "evalue": "float division by zero", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[6], line 8\u001b[0m\n\u001b[1;32m 1\u001b[0m pd\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mdisplay\u001b[38;5;241m.\u001b[39mfloat_format \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{:.2g}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mformat\n\u001b[1;32m 2\u001b[0m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m 3\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame({\n\u001b[1;32m 4\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnode\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39mname \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m T\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 5\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39mk \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m T\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 6\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_r\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39minput_redundancy(norm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m T\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 7\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39meffective_connectivity(norm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m T\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[0;32m----> 8\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_r*\u001b[39m\u001b[38;5;124m'\u001b[39m:[\u001b[43mn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minput_redundancy\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnorm\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m T\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 9\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e*\u001b[39m\u001b[38;5;124m'\u001b[39m:[n\u001b[38;5;241m.\u001b[39meffective_connectivity(norm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m) \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m T\u001b[38;5;241m.\u001b[39mnodes],\n\u001b[1;32m 10\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m:[v \u001b[38;5;28;01mfor\u001b[39;00m n,v \u001b[38;5;129;01min\u001b[39;00m EG\u001b[38;5;241m.\u001b[39mout_degree()],\n\u001b[1;32m 11\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m:[v \u001b[38;5;28;01mfor\u001b[39;00m n,v \u001b[38;5;129;01min\u001b[39;00m EG\u001b[38;5;241m.\u001b[39mout_degree(weight\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweight\u001b[39m\u001b[38;5;124m'\u001b[39m)],\n\u001b[1;32m 12\u001b[0m })\u001b[38;5;241m.\u001b[39mset_index(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnode\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 13\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m / k^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk_e^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m/\u001b[39m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk^\u001b[39m\u001b[38;5;132;01m{out}\u001b[39;00m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 14\u001b[0m df\u001b[38;5;241m.\u001b[39msort_values(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk\u001b[39m\u001b[38;5;124m'\u001b[39m,ascending\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,inplace\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "File \u001b[0;32m/data/siyer/CANA/cana/boolean_node.py:222\u001b[0m, in \u001b[0;36mBooleanNode.input_redundancy\u001b[0;34m(self, operator, norm)\u001b[0m\n\u001b[1;32m 218\u001b[0m k_r \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msum\u001b[39m(redundancy) \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m2\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mk\n\u001b[1;32m 220\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m norm:\n\u001b[1;32m 221\u001b[0m \u001b[38;5;66;03m# Normalizes\u001b[39;00m\n\u001b[0;32m--> 222\u001b[0m k_r \u001b[38;5;241m=\u001b[39m \u001b[43mk_r\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m/\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mk\u001b[49m\n\u001b[1;32m 224\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m k_r\n", + "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" + ] } ], "source": [ @@ -371,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -416,7 +192,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -439,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -451,14 +227,14 @@ " scc = [len(cc) for cc in nx.strongly_connected_components(G)]\n", " return len(scc), scc\n", "#\n", - "def SortedCounter(l):\n", - " c = dict(sorted(Counter(l).most_common(), reverse=True)) \n", + "def SortedCounter(L):\n", + " c = dict(sorted(Counter(L).most_common(), reverse=True)) \n", " return c" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -492,7 +268,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -504,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -533,7 +309,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -949,14 +725,14 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": { "scrolled": false }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1411,7 +1187,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1721,7 +1497,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/PNAS 2021 - ER+ Breast Cancer.ipynb b/tutorials/PNAS 2021 - ER+ Breast Cancer.ipynb index 53d2e2e..4f1db0a 100644 --- a/tutorials/PNAS 2021 - ER+ Breast Cancer.ipynb +++ b/tutorials/PNAS 2021 - ER+ Breast Cancer.ipynb @@ -22,8 +22,6 @@ "from collections import Counter\n", "import graphviz\n", "# Cana\n", - "import cana\n", - "from cana.boolean_network import BooleanNetwork\n", "from cana.datasets.bio import BREAST_CANCER\n", "# Matplotlib\n", "import matplotlib as mpl\n", @@ -296,8 +294,8 @@ " scc = [len(cc) for cc in nx.strongly_connected_components(G)]\n", " return len(scc), scc\n", "#\n", - "def SortedCounter(l):\n", - " c = dict(sorted(Counter(l).most_common(), reverse=True)) \n", + "def SortedCounter(L):\n", + " c = dict(sorted(Counter(L).most_common(), reverse=True)) \n", " return c" ] }, @@ -7478,7 +7476,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -7535,7 +7533,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/tutorials/partial_LUT_demo_nodes.txt b/tutorials/partial_LUT_demo_nodes.txt new file mode 100644 index 0000000..e2c1875 --- /dev/null +++ b/tutorials/partial_LUT_demo_nodes.txt @@ -0,0 +1,127 @@ +# A sample network with partial input data for nodes. Modified form Thaliana. + +#total number of nodes +.v 15 + +# labels of nodes and name of corresponding genes +# 1 = AP3 +# 2 = UFO +# 3 = FUL +# 4 = FT +# 5 = AP1 +# 6 = EMF1 +# 7 = LFY +# 8 = AP2 +# 9 = WUS +# 10 = AG +# 11 = LUG +# 12 = CLF +# 13 = TFL1 +# 14 = PI +# 15 = SEP + +.l 1 AP3 +.l 2 UFO +.l 3 FUL +.l 4 FT +.l 5 AP1 +.l 6 EMF1 +.l 7 LFY +.l 8 AP2 +.l 9 WUS +.l 10 AG +.l 11 LUG +.l 12 CLF +.l 13 TFL1 +.l 14 PI +.l 15 SEP + + +# As a result of simulation, we get the following 10 single-point attractors: +# 101100110111011 +# 110110110011011 +# 100110110011011 +# 111100110111011 +# 010001000011100 +# 010001001011100 +# 001100110111011 +# 000110110011001 +# 000001000011100 +# 000001001011100 + +# 1 = AP3 +.n 1 7 1 2 5 7 10 14 15 +1-1--11 1 +-1-1--- 1 + +# 2 = UFO +.n 2 1 2 +1 1 + +# 3 = FUL +.n 3 2 5 13 +00 1 + +# 4 = FT +.n 4 1 6 +0 1 + +# 5 = AP1 +.n 5 4 4 7 10 13 +--00 1 +1-0- 1 +-10- 1 + +# 6 = EMF1 +.n 6 1 7 +0 1 + +# 7 = LFY +.n 7 4 3 5 6 13 +---0 1 +--0- 1 + +# 8 = AP2 +.n 8 1 13 +0 1 + +# 9 = WUS +.n 9 3 9 10 15 +1-0 1 +10- 1 + +# 10 = AG +.n 10 9 5 7 8 9 10 11 12 13 15 +--0----0- 1 +-1--1---1 1 +-1----0-- 1 +-1---0--- 1 +01------- 1 +-1-1----- 1 +-10------ 1 + +# 11 = LUG +.n 11 0 +1 + +# 12 = CLF +.n 12 0 +1 + +# 13 = TFL1 +.n 13 4 5 6 7 8 +010- 1 + +# 14 = PI +.n 14 6 1 5 7 10 14 15 +11--11 1 +1--111 1 +--11-- 1 +1-1--- 1 + +# 15 = SEP +.n 15 1 7 +1 1 + +.e end of file +