Source code for cli.COMPACTCommand

import sys
from typing import List

from networkx import MultiDiGraph

from utils import config
from core.BooleanFunctionCollection import BooleanFunctionCollection
from core.hardware.Topology import Topology
from core.decision_diagrams.BDD import BDD
from synth.COMPACT import COMPACT
from cli.Command import Command


[docs] class COMPACTCommand(Command): def __init__(self, args: List[str]): """ Command to invoke the COMPACT framework for flow-based computing. The network must be in BDD format. :param args: A list of required and optional arguments. Command usage: compact [-gamma|-g VALUE] [-l VALUE] [-vh] [-io] [-r VALUE] [-c VALUE] [-t VALUE] Optional arguments: -gamma VALUE A value in the interval [0,1]. -g VALUE Shorthand for -gamma. -l VALUE The number of layers. -t VALUE Time limit in seconds. """ super(COMPACTCommand).__init__() if "-gamma" in args: idx = args.index("-gamma") config.gamma = float(args[idx + 1]) else: config.gamma = 1 if "-g" in args: idx = args.index("-g") config.gamma = float(args[idx + 1]) else: config.gamma = 1 if "-l" in args: idx = args.index("-l") self.layers = int(args[idx + 1]) else: self.layers = 1 if "-vh" in args: config.vh_labeling = True else: config.vh_labeling = False if "-io" in args: config.io_constraints = False else: config.io_constraints = True if "-r" in args: idx = args.index("-r") config.max_rows = int(args[idx + 1]) else: config.max_rows = sys.maxsize if "-c" in args: idx = args.index("-c") config.max_columns = int(args[idx + 1]) else: config.max_columns = sys.maxsize if "-t" in args: idx = args.index("-t") config.time_limit = int(args[idx + 1]) else: config.time_limit = None if "-obj" in args: idx = args.index("-obj") config.objective = args[idx + 1] else: config.objective = "semi" if "-keep" in args: config.keep_files = True else: config.keep_files = False if "-in" in args: idx = args.index("-in") config.input_layer = int(args[idx + 1]) else: config.input_layer = None if "-out" in args: idx = args.index("-out") config.output_layer = int(args[idx + 1]) else: config.output_layer = None
[docs] def execute(self) -> bool: """ Executes the COMPACT algorithm on a graph. The graph is obtained from the current context. :return: """ boolean_function_collection = config.context_manager.get_context() graph = MultiDiGraph() for boolean_function in boolean_function_collection.boolean_functions: assert isinstance(boolean_function, BDD) compact = COMPACT(boolean_function, self.layers) memristor_crossbar = compact.map() graph.add_node(memristor_crossbar) topology = Topology(graph) config.context_manager.add_context("topology", BooleanFunctionCollection({topology})) return False