Esempio n. 1
0
    def _setup(self, root):
        super(KonaOptimizer, self)._setup(root)
        self.system = root

        self.pmeta = self.get_desvar_metadata()
        self.params = list(iterkeys(self.pmeta))
        self.objs = list(iterkeys(self.get_objectives()))
        self.con_meta = self.get_constraint_metadata()
        self.cons = list(iterkeys(self.con_meta))

        # Size Problem
        s_primal = 0
        for param in itervalues(self.pmeta):
            s_primal += param['size']
        self.size_primal = s_primal

        # set up the mapping between KONA vectors and OpenMDAO variables
        self.pmeta = self.get_desvar_metadata()

        # make a list of state vars
        all_vars = set(self.system.unknowns.keys())
        primal_vars = set(iterkeys(self.pmeta))
        o_vars = set(iterkeys(self.get_objectives()))
        d_vars = set(iterkeys(self.get_constraint_metadata()))

        end=0
        o_var_idx = []
        for o_var in self.objs:
            size = self.system.unknowns.metadata(o_var)['size']
            start = end
            end += size
            o_var_idx.append((start, end))

        self.objective_vars = tuple(zip(o_vars, o_var_idx))

        end = 0
        p_var_idx = []
        for p_var in primal_vars:
            size = self.pmeta[p_var]['size']
            start = end
            end += size
            p_var_idx.append((start, end))

        self.primal_vars = tuple(zip(primal_vars, p_var_idx))
        self.size_primal = end

        s_var_names = list(all_vars - primal_vars - o_vars - d_vars)
        s_var_idx = []
        end = 0
        for s_var in s_var_names:
            meta = self.system.unknowns.metadata(s_var)
            size = meta['size']
            start = end
            end += size
            s_var_idx.append((start, end))

        self.state_vars = tuple(zip(s_var_names, s_var_idx))
        self.size_state = end

        d_vars_lower_ieq = []
        d_var_idx_lower_ieq = []
        d_var_bound_lower_ieq = []

        d_vars_upper_ieq = []
        d_var_idx_upper_ieq = []
        d_var_bound_upper_ieq = []

        d_vars_eq = []
        d_var_idx_eq = []
        d_var_bound_eq = []

        d_vars = []
        d_var_idx = []

        end_eq = 0
        end_ieq_lb = 0
        end_ieq_ub = 0

        self.size_dual_eq = 0
        self.size_dual_ieq_lb = 0
        self.size_dual_ieq_ub = 0
        # user specified constraints
        for d_var, d_meta in iteritems(self.get_constraint_metadata()):
            size = d_meta['size']

            d_vars.append(d_var)
            d_var_idx.append((start,end))
            if d_meta['equals'] is not None:
                start_eq = end_eq
                end_eq += size
                d_vars_eq.append(d_var)
                d_var_idx_eq.append((start_eq, end_eq))
                d_var_bound_eq.append(d_meta['equals'])
                self.size_dual_eq += size

            if d_meta['lower'] is not None:
                start_ieq_lb = end_ieq_lb
                end_ieq_lb += size
                d_vars_lower_ieq.append(d_var)
                d_var_idx_lower_ieq.append((start_ieq_lb, end_ieq_lb))
                d_var_bound_lower_ieq.append(d_meta['lower'])
                self.size_dual_ieq_lb += size
            if d_meta['upper'] is not None:
                start_ieq_ub = end_ieq_ub
                end_ieq_ub += size
                d_vars_upper_ieq.append(d_var)
                d_var_idx_upper_ieq.append((start_ieq_ub, end_ieq_ub))
                d_var_bound_upper_ieq.append(d_meta['upper'])
                self.size_dual_ieq_ub += size

        self.dual_vars_eq = tuple(zip(d_vars_eq, d_var_idx_eq, d_var_bound_eq))
        self.dual_vars_ieq_ub = tuple(zip(d_vars_upper_ieq, d_var_idx_upper_ieq, d_var_bound_upper_ieq))
        self.dual_vars_ieq_lb = tuple(zip(d_vars_lower_ieq, d_var_idx_lower_ieq, d_var_bound_lower_ieq))

        # print(self.dual_vars_ieq_lb)

        p_vars_lb = []
        p_var_idx_lb = []
        p_var_bound_lb = []

        p_vars_ub = []
        p_var_idx_ub = []
        p_var_bound_ub = []

        end_lb = 0
        end_ub = 0

        self.size_primal_lb = 0
        self.size_primal_ub = 0
        # bounds constraints
        for p_var in primal_vars:
            meta_low = self.pmeta[p_var]['lower']
            meta_high = self.pmeta[p_var]['upper']
            size = self.pmeta[p_var]['size']
            if meta_low is not None and np.any(meta_low > -1e99):
                start_lb = end_lb
                end_lb += size
                p_vars_lb.append(p_var)
                p_var_idx_lb.append((start_lb, end_lb))
                p_var_bound_lb.append(meta_low)
                self.size_primal_lb += size
            if meta_high is not None and np.any(meta_high < 1e99):
                start_ub = end_ub
                end_ub += size
                p_vars_ub.append(p_var)
                p_var_idx_ub.append((start_ub, end_ub))
                p_var_bound_ub.append(meta_high)
                self.size_primal_ub += size

        self.primal_vars_lb = tuple(zip(p_vars_lb, p_var_idx_lb, p_var_bound_lb))
        self.primal_vars_ub = tuple(zip(p_vars_ub, p_var_idx_ub, p_var_bound_ub))

        self.allocator = Allocator(self.size_primal, self.size_state, self.size_dual_eq,
                                   self.size_dual_ieq_lb, self.size_dual_ieq_ub,
                                   self.size_primal_lb, self.size_primal_ub)

        # Set up specific data transfers for objective and
        # constraints needed for eval_obj and eval_constraints methods
        obj_cnames, self._obj_comps = self._comps_from_vars(self._objs)
        con_cnames, self._con_comps = self._comps_from_vars(self._cons)

        self._obj_xfers = []
        self._con_xfers = []
        for grp in self.root.subgroups(recurse=True, include_self=True):
            for cname in obj_cnames:
                tup = (name_relative_to(grp.pathname, cname), 'fwd', None)
                if tup in grp._data_xfer:
                    self._obj_xfers.append((grp, grp._data_xfer[tup]))

            for cname in con_cnames:
                tup = (name_relative_to(grp.pathname, cname), 'fwd', None)
                if tup in grp._data_xfer:
                    self._con_xfers.append((grp, grp._data_xfer[tup]))

        self._push_primal_nl = self._build_primal_state_vec_xfer('primal', push=True,
                                                                 nonlinear=True)
        self._pull_primal_nl = self._build_primal_state_vec_xfer('primal', push=False,
                                                                 nonlinear=True)
        self._push_primal_ln = self._build_primal_state_vec_xfer('primal', push=True,
                                                                 nonlinear=False)
        self._pull_primal_ln = self._build_primal_state_vec_xfer('primal', push=False,
                                                                 nonlinear=False)

        self._push_state_nl = self._build_primal_state_vec_xfer('state', push=True,
                                                                nonlinear=True)
        self._pull_state_nl = self._build_primal_state_vec_xfer('state', push=False,
                                                                nonlinear=True)
        self._push_state_ln = self._build_primal_state_vec_xfer('state', push=True,
                                                                nonlinear=False)
        self._pull_state_ln = self._build_primal_state_vec_xfer('state', push=False,
                                                                nonlinear=False)

        self._push_resid_nl = self._build_primal_state_vec_xfer('resid', push=True,
                                                                nonlinear=True)
        self._pull_resid_nl = self._build_primal_state_vec_xfer('resid', push=False,
                                                                nonlinear=True)
        self._push_resid_ln = self._build_primal_state_vec_xfer('resid', push=True,
                                                                nonlinear=False)
        self._pull_resid_ln = self._build_primal_state_vec_xfer('resid', push=False,
                                                                nonlinear=False)

        self._push_dual_nl = self._build_dual_vec_xfer(push=True,
                                                       nonlinear=True)
        self._pull_dual_nl = self._build_dual_vec_xfer(push=False,
                                                       nonlinear=True)
        self._push_dual_ln = self._build_dual_vec_xfer(push=True,
                                                       nonlinear=False)
        self._pull_dual_ln = self._build_dual_vec_xfer(push=False,
                                                       nonlinear=False)