diff options
author | Seth Hitefield <sdhitefield@gmail.com> | 2017-08-01 16:52:59 -0400 |
---|---|---|
committer | Seth Hitefield <sdhitefield@gmail.com> | 2017-08-01 17:31:14 -0400 |
commit | dbf58fa349002d94c26883b130ed8864ead79ea6 (patch) | |
tree | aac47437d257c747bdf7ecdbaaa7f9cf5d6cf07d /grc | |
parent | 82e2e9eb63ae92ad55a28a8c01564de5045b8056 (diff) |
grc: Bug fixes for flowgraph complexity
Diffstat (limited to 'grc')
-rw-r--r-- | grc/core/FlowGraph.py | 16 | ||||
-rw-r--r-- | grc/core/generator/hier_block.py | 4 | ||||
-rw-r--r-- | grc/core/utils/flow_graph_complexity.py | 97 |
3 files changed, 58 insertions, 59 deletions
diff --git a/grc/core/FlowGraph.py b/grc/core/FlowGraph.py index 481dda5786..3f21ec6a9c 100644 --- a/grc/core/FlowGraph.py +++ b/grc/core/FlowGraph.py @@ -387,9 +387,9 @@ class FlowGraph(Element): had_connect_errors = False _blocks = {block.name: block for block in self.blocks} - # TODO: Crashes if connections section exists without actual connections. - for src_blk_id, src_port_id, snk_blk_id, snk_port_id in data.get('connections', []): - try: + try: + # TODO: Add better error handling if no connections exist in the flowgraph file. + for src_blk_id, src_port_id, snk_blk_id, snk_port_id in data.get('connections', []): source_block = _blocks[src_blk_id] sink_block = _blocks[snk_blk_id] @@ -404,11 +404,11 @@ class FlowGraph(Element): self.connect(source_port, sink_port) - except (KeyError, LookupError) as e: - Messages.send_error_load( - 'Connection between {}({}) and {}({}) could not be made.\n\t{}'.format( - src_blk_id, src_port_id, snk_blk_id, snk_port_id, e)) - had_connect_errors = True + except (KeyError, LookupError) as e: + Messages.send_error_load( + 'Connection between {}({}) and {}({}) could not be made.\n\t{}'.format( + src_blk_id, src_port_id, snk_blk_id, snk_port_id, e)) + had_connect_errors = True self.rewrite() # global rewrite return had_connect_errors diff --git a/grc/core/generator/hier_block.py b/grc/core/generator/hier_block.py index 301562fa4f..237fd71377 100644 --- a/grc/core/generator/hier_block.py +++ b/grc/core/generator/hier_block.py @@ -191,7 +191,3 @@ def get_hier_block_io(flow_graph, direction, domain=None): ports.append(clone) else: ports.append(master) - - if domain is not None: - ports = [p for p in ports if p.domain == domain] - yield ports # TODO: Not sure this fix is correct diff --git a/grc/core/utils/flow_graph_complexity.py b/grc/core/utils/flow_graph_complexity.py index 15ac131d9b..e8962b0ae3 100644 --- a/grc/core/utils/flow_graph_complexity.py +++ b/grc/core/utils/flow_graph_complexity.py @@ -1,51 +1,54 @@ def calculate(flowgraph): """ Determines the complexity of a flowgraph """ - return " *** DISABLED *** " # TODO: Temporarily disabled. - dbal = 0 - for block in flowgraph.blocks: - # Skip options block - if block.key == 'options': - continue - - # Don't worry about optional sinks? - sink_list = [c for c in block.sinks if not c.optional] - source_list = [c for c in block.sources if not c.optional] - sinks = float(len(sink_list)) - sources = float(len(source_list)) - base = max(min(sinks, sources), 1) - - # Port ratio multiplier - if min(sinks, sources) > 0: - multi = sinks / sources - multi = (1 / multi) if multi > 1 else multi + + try: + dbal = 0.0 + for block in flowgraph.blocks: + if block.key == "options": + continue + + # Determine the base value for this block + sinks = sum(1.0 for port in block.sinks if not port.optional) + sources = sum(1.0 for port in block.sources if not port.optional) + base = max(min(sinks, sources), 1) + + # Determine the port multiplier + block_connections = 0.0 + for port in block.sources: + block_connections += sum(1.0 for c in port.connections()) + source_multi = max(block_connections / max(sources, 1.0), 1.0) + + # Port ratio multiplier + multi = 1.0 + if min(sinks, sources) > 0: + multi = float(sinks / sources) + multi = float(1 / multi) if multi > 1 else multi + + dbal += base * multi * source_multi + + blocks = float(len(flowgraph.blocks) - 1) + connections = float(len(flowgraph.connections)) + variables = float(len(flowgraph.get_variables())) + + enabled = float(len(flowgraph.get_enabled_blocks())) + enabled_connections = float(len(flowgraph.get_enabled_connections())) + disabled_connections = connections - enabled_connections + + # Disabled multiplier + if enabled > 0: + disabled_multi = 1 / (max(1 - ((blocks - enabled) / max(blocks, 1)), 0.05)) + else: + disabled_multi = 1 + + # Connection multiplier (How many connections ) + if (connections - disabled_connections) > 0: + conn_multi = 1 / (max(1 - (disabled_connections / max(connections, 1)), 0.05)) else: - multi = 1 - - # Connection ratio multiplier - sink_multi = max(float(sum(len(c.connections()) for c in sink_list) / max(sinks, 1.0)), 1.0) - source_multi = max(float(sum(len(c.connections()) for c in source_list) / max(sources, 1.0)), 1.0) - dbal += base * multi * sink_multi * source_multi - - blocks = float(len(flowgraph.blocks)) - connections = float(len(flowgraph.connections)) - elements = blocks + connections - disabled_connections = sum(not c.enabled for c in flowgraph.connections) - - variables = elements - blocks - connections - enabled = float(len(flowgraph.get_enabled_blocks())) - - # Disabled multiplier - if enabled > 0: - disabled_multi = 1 / (max(1 - ((blocks - enabled) / max(blocks, 1)), 0.05)) - else: - disabled_multi = 1 - - # Connection multiplier (How many connections ) - if (connections - disabled_connections) > 0: - conn_multi = 1 / (max(1 - (disabled_connections / max(connections, 1)), 0.05)) - else: - conn_multi = 1 - - final = round(max((dbal - 1) * disabled_multi * conn_multi * connections, 0.0) / 1000000, 6) - return final + conn_multi = 1 + + final = round(max((dbal - 1) * disabled_multi * conn_multi * connections, 0.0) / 1000000, 6) + return final + + except Exception: + return "<Error>" |