def test_get_inner_connections(self):
        self.assertEqual(len(_get_inner_connections(self.dep, ['b'], ['c'])),
                         6)
        self.assertEqual(
            set(_get_inner_connections(self.dep, ['b'], ['c'])),
            set([('b[3]', 'A.b'), ('A.d.z', 'B.b[4]'), ('A.c[2]', 'B.a.x.y'),
                 ('B.c', 'C.a'), ('B.d', 'C.b'), ('C.c', 'c')]))

        dep, scope = _make_graph(comps=['A', 'B'],
                                 connections=[('A.c', 'B.a'), ('A.d', 'B.b')],
                                 inputs=['a', 'b'],
                                 outputs=['c', 'd'])
        self.assertEqual(len(_get_inner_connections(dep, ['A.a'], ['B.c'])), 2)
        self.assertEqual(set(_get_inner_connections(dep, ['A.a'], ['B.c'])),
                         set([('A.c', 'B.a'), ('A.d', 'B.b')]))

        dep, scope = _make_graph(comps=['A', 'B', 'C'],
                                 connections=[('A.c', 'B.a'), ('A.d', 'B.b'),
                                              ('B.d', 'C.a')],
                                 inputs=['a', 'b'],
                                 outputs=['c', 'd'])
        self.assertEqual(set(_get_inner_connections(dep, ['A.a'], ['C.c'])),
                         set([('A.c', 'B.a'), ('A.d', 'B.b'), ('B.d', 'C.a')]))

        # same output feeding two inputs
        dep, scope = _make_graph(comps=['A', 'B', 'C'],
                                 connections=[('A.d', 'B.a'), ('A.d', 'B.b'),
                                              ('B.d', 'C.a')],
                                 inputs=['a', 'b'],
                                 outputs=['c', 'd'])
        edges = _get_inner_connections(dep, ['A.a'], ['C.c'])
        self.assertEqual(set(edges),
                         set([('A.d', 'B.a'), ('A.d', 'B.b'), ('B.d', 'C.a')]))
        edict = edges_to_dict(edges)
        self.assertEqual(len(edict), 2)
        self.assertEqual(set(edict['A.d']), set(['B.a', 'B.b']))
        self.assertEqual(edict['B.d'], ['C.a'])

        # loop
        dep, scope = _make_graph(comps=['A', 'B', 'C'],
                                 connections=[('A.d', 'B.a'), ('B.d', 'C.a'),
                                              ('C.d', 'A.a')],
                                 inputs=['a', 'b'],
                                 outputs=['c', 'd'])
        self.assertEqual(set(_get_inner_connections(dep, ['A.a'], ['C.d'])),
                         set([('A.d', 'B.a'), ('B.d', 'C.a'), ('C.d', 'A.a')]))
    def test_get_inner_connections(self):
        self.assertEqual(len(_get_inner_connections(self.dep, ['b'], ['c'])), 6)
        self.assertEqual(set(_get_inner_connections(self.dep, ['b'], ['c'])),
                         set([('b[3]','A.b'),('A.d.z','B.b[4]'),('A.c[2]','B.a.x.y'),
                              ('B.c','C.a'),('B.d','C.b'),('C.c','c')]))

        dep, scope = _make_graph(comps=['A','B'],
                                 connections=[('A.c','B.a'),('A.d','B.b')],
                                 inputs=['a','b'],
                                 outputs=['c','d'])
        self.assertEqual(len(_get_inner_connections(dep, ['A.a'], ['B.c'])), 2)
        self.assertEqual(set(_get_inner_connections(dep, ['A.a'], ['B.c'])),
                         set([('A.c','B.a'),('A.d','B.b')]))
        
        dep, scope = _make_graph(comps=['A','B', 'C'],
                                 connections=[('A.c','B.a'),('A.d','B.b'),('B.d','C.a')],
                                 inputs=['a','b'],
                                 outputs=['c','d'])
        self.assertEqual(set(_get_inner_connections(dep, ['A.a'], ['C.c'])),
                         set([('A.c','B.a'),('A.d','B.b'),('B.d','C.a')]))

        # same output feeding two inputs
        dep, scope = _make_graph(comps=['A','B', 'C'],
                                 connections=[('A.d','B.a'),('A.d','B.b'),('B.d','C.a')],
                                 inputs=['a','b'],
                                 outputs=['c','d'])
        edges = _get_inner_connections(dep, ['A.a'], ['C.c'])
        self.assertEqual(set(edges), set([('A.d','B.a'),('A.d','B.b'),('B.d','C.a')]))
        edict = edges_to_dict(edges)
        self.assertEqual(len(edict), 2)
        self.assertEqual(set(edict['A.d']), set(['B.a','B.b']))
        self.assertEqual(edict['B.d'], ['C.a'])

        # loop
        dep, scope = _make_graph(comps=['A','B', 'C'],
                                 connections=[('A.d','B.a'),('B.d','C.a'),('C.d','A.a')],
                                 inputs=['a','b'],
                                 outputs=['c','d'])
        self.assertEqual(set(_get_inner_connections(dep, ['A.a'], ['C.d'])),
                         set([('A.d','B.a'),('B.d','C.a'),('C.d','A.a')]))
Example #3
0
 def test_inner_connections(self):
     edges = _get_inner_connections(self.dep, ['a'], ['c'])
     self.assertEqual(set(edges), set([('C2.s2', 'c'), ('C1.s1', 'C2.a'), ('a', 'C1.s1')]))
    def configure_recording(self, recording_options=None):
        """Called at start of top-level run to configure case recording.
        Returns set of paths for changing inputs."""

        if recording_options:
            includes = recording_options.includes
            excludes = recording_options.excludes
            save_problem_formulation = recording_options.save_problem_formulation
        else:
            includes = excludes = save_problem_formulation = None

        if not recording_options or not (save_problem_formulation or includes):
            self._rec_required = False
            return (set(), dict())

        driver = self.parent
        scope = driver.parent
        prefix = scope.get_pathname()
        if prefix:
            prefix += '.'
        inputs = []
        outputs = []

        # Parameters
        self._rec_parameters = []
        if hasattr(driver, 'get_parameters'):
            for name, param in driver.get_parameters().items():
                if isinstance(name, tuple):
                    name = name[0]
                path = prefix+name
                if save_problem_formulation or \
                   self._check_path(path, includes, excludes):
                    self._rec_parameters.append(param)
                    inputs.append(name)

        # Objectives
        self._rec_objectives = []
        if hasattr(driver, 'eval_objectives'):
            for key, objective in driver.get_objectives().items():
                name = objective.pcomp_name
                if key != objective.text:
                    name = key

                #name = objective.pcomp_name
                path = prefix+name
                if save_problem_formulation or \
                   self._check_path(path, includes, excludes):
                    self._rec_objectives.append(key)
                    outputs.append(name)

        # Responses
        self._rec_responses = []
        if hasattr(driver, 'get_responses'):
            for key, response in driver.get_responses().items():
                name = response.pcomp_name
                path = prefix+name
                if save_problem_formulation or \
                   self._check_path(path, includes, excludes):
                    self._rec_responses.append(key)
                    outputs.append(name)

        # Constraints
        self._rec_constraints = []
        if hasattr(driver, 'get_eq_constraints'):
            for con in driver.get_eq_constraints().values():
                name = con.pcomp_name
                path = prefix+name
                if save_problem_formulation or \
                   self._check_path(path, includes, excludes):
                    self._rec_constraints.append(con)
                    outputs.append(name)
        if hasattr(driver, 'get_ineq_constraints'):
            for con in driver.get_ineq_constraints().values():
                name = con.pcomp_name
                path = prefix+name
                if save_problem_formulation or \
                   self._check_path(path, includes, excludes):
                    self._rec_constraints.append(con)
                    outputs.append(name)

        # Other outputs.
        self._rec_outputs = []
        srcs = scope.list_inputs()
        if hasattr(driver, 'get_parameters'):
            srcs.extend(param.target
                        for param in driver.get_parameters().values())
        dsts = scope.list_outputs()

        if hasattr(driver, 'get_objectives'):
            dsts.extend(objective.pcomp_name+'.out0'
                        for objective in driver.get_objectives().values())
        if hasattr(driver, 'get_responses'):
            dsts.extend(response.pcomp_name+'.out0'
                        for response in driver.get_responses().values())
        if hasattr(driver, 'get_eq_constraints'):
            dsts.extend(constraint.pcomp_name+'.out0'
                        for constraint in driver.get_eq_constraints().values())
        if hasattr(driver, 'get_ineq_constraints'):
            dsts.extend(constraint.pcomp_name+'.out0'
                        for constraint in driver.get_ineq_constraints().values())

        graph = scope._depgraph
        for src, dst in _get_inner_connections(graph, srcs, dsts):
            if scope.get_metadata(src)['iotype'] == 'in':
                continue
            path = prefix+src
            if src not in inputs and src not in outputs and \
               (save_problem_formulation or self._check_path(path, includes, excludes)):
                self._rec_outputs.append(src)
                outputs.append(src)

        for comp in self.get_components():
            for name in comp.list_outputs():
                src = '%s.%s' % (comp.name, name)
                path = prefix+src
                if src not in outputs and \
                   self._check_path(path, includes, excludes):
                    self._rec_outputs.append(src)
                    outputs.append(src)

        name = '%s.workflow.itername' % driver.name
        path = prefix+name
        if self._check_path(path, includes, excludes):
            self._rec_outputs.append(name)
            outputs.append(name)

        # If recording required, register names in recorders.
        self._rec_required = bool(inputs or outputs)
        if self._rec_required:
            top = scope
            while top.parent is not None:
                top = top.parent
            for recorder in top.recorders:
                recorder.register(driver, inputs, outputs)

        return (set(prefix+name for name in inputs), dict())
Example #5
0
    def configure_recording(self, includes, excludes):
        """Called at start of top-level run to configure case recording.
        Returns set of paths for changing inputs."""
        if not includes:
            self._rec_required = False
            return (set(), dict())

        driver = self.parent
        scope = driver.parent
        prefix = scope.get_pathname()
        if prefix:
            prefix += '.'
        inputs = []
        outputs = []

        # Parameters
        self._rec_parameters = []
        if hasattr(driver, 'get_parameters'):
            for name, param in driver.get_parameters().items():
                if isinstance(name, tuple):
                    name = name[0]
                path = prefix + name
                if self._check_path(path, includes, excludes):
                    self._rec_parameters.append(param)
                    inputs.append(name)

        # Objectives
        self._rec_objectives = []
        if hasattr(driver, 'eval_objectives'):
            for key, objective in driver.get_objectives().items():
                name = objective.pcomp_name
                path = prefix + name
                if self._check_path(path, includes, excludes):
                    self._rec_objectives.append(key)
                    outputs.append(name)

        # Responses
        self._rec_responses = []
        if hasattr(driver, 'get_responses'):
            for key, response in driver.get_responses().items():
                name = response.pcomp_name
                path = prefix + name
                if self._check_path(path, includes, excludes):
                    self._rec_responses.append(key)
                    outputs.append(name)

        # Constraints
        self._rec_constraints = []
        if hasattr(driver, 'get_eq_constraints'):
            for con in driver.get_eq_constraints().values():
                name = con.pcomp_name
                path = prefix + name
                if self._check_path(path, includes, excludes):
                    self._rec_constraints.append(con)
                    outputs.append(name)
        if hasattr(driver, 'get_ineq_constraints'):
            for con in driver.get_ineq_constraints().values():
                name = con.pcomp_name
                path = prefix + name
                if self._check_path(path, includes, excludes):
                    self._rec_constraints.append(con)
                    outputs.append(name)

        # Other outputs.
        self._rec_outputs = []
        srcs = scope.list_inputs()
        if hasattr(driver, 'get_parameters'):
            srcs.extend(param.target
                        for param in driver.get_parameters().values())
        dsts = scope.list_outputs()
        if hasattr(driver, 'get_objectives'):
            dsts.extend(objective.pcomp_name + '.out0'
                        for objective in driver.get_objectives().values())
        if hasattr(driver, 'get_responses'):
            dsts.extend(response.pcomp_name + '.out0'
                        for response in driver.get_responses().values())
        if hasattr(driver, 'get_eq_constraints'):
            dsts.extend(constraint.pcomp_name + '.out0'
                        for constraint in driver.get_eq_constraints().values())
        if hasattr(driver, 'get_ineq_constraints'):
            dsts.extend(
                constraint.pcomp_name + '.out0'
                for constraint in driver.get_ineq_constraints().values())

        graph = scope._depgraph
        for src, dst in _get_inner_connections(graph, srcs, dsts):
            if scope.get_metadata(src)['iotype'] == 'in':
                continue
            path = prefix + src
            if src not in inputs and src not in outputs and \
                    self._check_path(path, includes, excludes):
                self._rec_outputs.append(src)
                outputs.append(src)

        for comp in self.get_components():
            for name in comp.list_outputs():
                src = '%s.%s' % (comp.name, name)
                path = prefix + src
                if src not in outputs and \
                        self._check_path(path, includes, excludes):
                    self._rec_outputs.append(src)
                    outputs.append(src)

        name = '%s.workflow.itername' % driver.name
        path = prefix + name
        if self._check_path(path, includes, excludes):
            self._rec_outputs.append(name)
            outputs.append(name)

        # If recording required, register names in recorders.
        self._rec_required = bool(inputs or outputs)
        if self._rec_required:
            top = scope
            while top.parent is not None:
                top = top.parent
            for recorder in top.recorders:
                recorder.register(driver, inputs, outputs)

        return (set(prefix + name for name in inputs), dict())