def map(self, sol: Solution, lam=empty_array, nu=empty_array) -> Solution: # sol.lam = lam if len(sol.nu) == 0: sol.nu = np.ones(self.nu_len) return sol
def inv_map(self, sol: Solution, retain_dual=True) -> Solution: if not retain_dual: sol.lam = empty_array sol.nu = empty_array sol.cost = self.compute_cost(sol.t, sol.y, sol.q, sol.u, sol.p, sol.k) return sol
def scale_sol(sol: Trajectory, scale_factors, inv=False): sol = copy.deepcopy(sol) if inv: op = np.multiply else: op = np.divide sol.t = op(sol.t, scale_factors[0]) sol.y = op(sol.y, scale_factors[1]) sol.q = op(sol.q, scale_factors[2]) if sol.u.size > 0: sol.u = op(sol.u, scale_factors[3]) sol.p = op(sol.p, scale_factors[4]) sol.nu = op(sol.nu, scale_factors[5]) sol.k = op(sol.k, scale_factors[6]) return sol
def inv_map(self, sol: Solution) -> Solution: sol.lam = sol.y[:, self.costate_idxs] sol.y = np.delete(sol.y, self.costate_idxs, axis=1) sol.nu = np.delete(sol.nu, self.constraint_adjoints_idxs) return sol