diff options
Diffstat (limited to 'grc/base/FlowGraph.py')
-rw-r--r-- | grc/base/FlowGraph.py | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/grc/base/FlowGraph.py b/grc/base/FlowGraph.py index 52ec741db8..8f008aa7e3 100644 --- a/grc/base/FlowGraph.py +++ b/grc/base/FlowGraph.py @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ import time +import math from . import odict from Element import Element from .. gui import Messages @@ -63,6 +64,58 @@ class FlowGraph(Element): def __str__(self): return 'FlowGraph - %s(%s)' % (self.get_option('title'), self.get_option('id')) + def get_complexity(self): + """ + Determines the complexity of a flowgraph + """ + dbal = 0 + block_list = self.get_blocks() + for block in block_list: + # Skip options block + if block.get_key() == 'options': + continue + + # Don't worry about optional sinks? + sink_list = filter(lambda c: not c.get_optional(), block.get_sinks()) + source_list = filter(lambda c: not c.get_optional(), block.get_sources()) + 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 + else: + multi = 1 + + # Connection ratio multiplier + sink_multi = max(float(sum(map(lambda c: len(c.get_connections()), sink_list)) / max(sinks, 1.0)), 1.0) + source_multi = max(float(sum(map(lambda c: len(c.get_connections()), source_list)) / max(sources, 1.0)), 1.0) + dbal = dbal + (base * multi * sink_multi * source_multi) + + elements = float(len(self.get_elements())) + connections = float(len(self.get_connections())) + disabled_connections = len(filter(lambda c: not c.get_enabled(), self.get_connections())) + blocks = float(len(block_list)) + variables = elements - blocks - connections + enabled = float(len(self.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 + def rewrite(self): def refactor_bus_structure(): @@ -99,6 +152,8 @@ class FlowGraph(Element): for child in self.get_children(): child.rewrite() refactor_bus_structure(); + # Update the complexity + self._options_block.get_param('complexity').set_value(self.get_complexity()) def get_option(self, key): """ @@ -297,7 +352,7 @@ class FlowGraph(Element): block = self.get_new_block('dummy_block') # Ugly ugly ugly _initialize_dummy_block(block, block_n) - Messages.send_error_load('Block key "%s" not found in %s' % (key, self.get_parent())) + Messages.send_error_msg_load('Block key "%s" not found in %s' % (key, self.get_parent())) block.import_data(block_n) #build the connections |