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')]))
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())
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())