def initialize_residual(self): """Creates the array that stores the residual. Also returns the number of edges. """ dgraph = self.derivative_graph() # We need to map any of our edges if they are in a # pseudo-assy comps = dgraph.edge_dict_to_comp_list(self.edge_list()) pa_keys = [name for name in comps if '~' in name] if len(pa_keys) == 0: self._mapped_severed_edges = self._severed_edges else: self._mapped_severed_edges = [] for src, target in self._severed_edges: compname, _, varname = src.partition('.') for pa_key in pa_keys: pseudo = dgraph.node[pa_key]['pa_object'] if src in pseudo.outputs: src = to_PA_var(src, pseudo.name) break compname, _, varname = target.partition('.') for pa_key in pa_keys: pseudo = dgraph.node[pa_key]['pa_object'] flat_inputs = set() for item in pseudo.inputs: subset = set(item) flat_inputs = flat_inputs.union(subset) if target in flat_inputs: target = to_PA_var(target, pseudo.name) break self._mapped_severed_edges.append((src, target)) return super(CyclicWorkflow, self).initialize_residual()
def initialize_residual(self): """Creates the array that stores the residual. Also returns the number of edges. """ dgraph = self.derivative_graph() # We need to map any of our edges if they are in a # pseudo-assy pa_keys = set( [s.split('.', 1)[0] for s in self.edge_list() if '~' in s]) if len(pa_keys) == 0: self._mapped_severed_edges = self._severed_edges else: palist = [dgraph.node[pa_key]['pa_object'] for pa_key in pa_keys] self._mapped_severed_edges = [] for src, target in self._severed_edges: compname, _, varname = src.partition('.') for pseudo in palist: if src in pseudo.outputs: src = to_PA_var(src, pseudo.name) break compname, _, varname = target.partition('.') for pseudo in palist: flat_inputs = set() for item in pseudo.inputs: flat_inputs.update(item) if target in flat_inputs: target = to_PA_var(target, pseudo.name) break self._mapped_severed_edges.append((src, target)) return super(CyclicWorkflow, self).initialize_residual()
def initialize_residual(self): """Creates the array that stores the residual. Also returns the number of edges. """ dgraph = self.derivative_graph() # We need to map any of our edges if they are in a # pseudo-assy pa_keys = set([s.split('.', 1)[0] for s in self.edge_list() if '~' in s]) if len(pa_keys) == 0: self._mapped_severed_edges = self._severed_edges else: palist = [dgraph.node[pa_key]['pa_object'] for pa_key in pa_keys] self._mapped_severed_edges = [] for src, target in self._severed_edges: compname, _, varname = src.partition('.') for pseudo in palist: if src in pseudo.outputs: src = to_PA_var(src, pseudo.name) break compname, _, varname = target.partition('.') for pseudo in palist: flat_inputs = set() for item in pseudo.inputs: flat_inputs.update(item) if target in flat_inputs: target = to_PA_var(target, pseudo.name) break self._mapped_severed_edges.append((src, target)) return super(CyclicWorkflow, self).initialize_residual()
def get_implicit_info(self): """ Return a dict of the form {(residuals) : [states]} """ info = {} dgraph = self.derivative_graph() comps = dgraph.component_graph().nodes() # Full model finite difference = no implcit edges if len(comps) == 1 and '~' in comps[0]: return info # Residuals and states for implicit components for cname in comps: if cname.startswith('~'): continue comp = getattr(self.scope, cname) if has_interface(comp, IImplicitComponent): if not comp.eval_only: key = tuple( ['.'.join([cname, n]) for n in comp.list_residuals()]) info[key] = [ '.'.join([cname, n]) for n in comp.list_states() ] # Nested solvers act implicitly. pa_comps = [ dgraph.node[item]['pa_object'] for item in comps if '~' in item ] for comp in self._parent.iteration_set(solver_only=True): if has_interface(comp, ISolver): key = tuple(comp.list_eq_constraint_targets()) # For cyclic workflows in a solver, the edge is already there. if len(key) == 0: continue unmapped_states = comp.list_param_group_targets() # Need to map the subdriver parameters to any existing # pseudoassemblies value = [] for state_tuple in unmapped_states: value_target = [] for state in state_tuple: if state not in dgraph: for pcomp in pa_comps: if state in pcomp.inputs: value_target.append( to_PA_var(state, pcomp.name)) break else: value_target.append(state) value.append(tuple(value_target)) info[key] = value return info
def get_implicit_info(self): """ Return a dict of the form {(residuals) : [states]} """ info = {} dgraph = self.derivative_graph() comps = dgraph.component_graph().nodes() # Full model finite difference = no implcit edges if len(comps) == 1 and '~' in comps[0]: return info # Residuals and states for implicit components for cname in comps: if cname.startswith('~'): continue comp = getattr(self.scope, cname) if has_interface(comp, IImplicitComponent): if not comp.eval_only: key = tuple(['.'.join([cname, n]) for n in comp.list_residuals()]) info[key] = ['.'.join([cname, n]) for n in comp.list_states()] # Nested solvers act implicitly. pa_comps = [dgraph.node[item]['pa_object'] for item in comps if '~' in item] for comp in self._parent.iteration_set(solver_only=True): if has_interface(comp, ISolver): key = tuple(comp.list_eq_constraint_targets()) # For cyclic workflows in a solver, the edge is already there. if len(key) == 0: continue unmapped_states = comp.list_param_group_targets() # Need to map the subdriver parameters to any existing # pseudoassemblies value = [] for state_tuple in unmapped_states: value_target = [] for state in state_tuple: if state not in dgraph: for pcomp in pa_comps: if state in pcomp.inputs: value_target.append(to_PA_var(state, pcomp.name)) break else: value_target.append(state) value.append(tuple(value_target)) info[key] = value return info