Пример #1
0
    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()
Пример #2
0
    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()
Пример #4
0
    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