Exemplo n.º 1
0
Arquivo: ls.py Projeto: 2xR/legacy
 def __init__(self, log=None, steepest_descent=None):
     Solver.__init__(self, log)
     self.current_solution = None
     self.current_neighbors = None
     self.neighbors_checked = None
     self.best_neighbor = None
     self.steepest_descent = (steepest_descent if steepest_descent is not None 
                              else self.default_steepest_descent)
     self.cpu_limit = None
     self.init_params = None
Exemplo n.º 2
0
    def __init__(self, hl_params = None, hl_actions=None):
        if hl_params is None:
            self.hl_params = []
        else:
            self.hl_params = hl_params

        if hl_actions is None:
            self.hl_actions = []
        else:
            self.hl_actions = hl_actions

        self.solver = Solver()
Exemplo n.º 3
0
Arquivo: solver.py Projeto: 2xR/legacy
 def __init__(self, **params):
     Solver.__init__(self, **params)
     self.status.fields.append(Field.TreeDims)
     self.root = None
Exemplo n.º 4
0
    def solve_at_priority_regular(self, priority, fix_sampled_params=False, recently_sampled=None):
        # initialize gurobi Model object
        prob = OptProb()
        self.recently_converged_vio_fluent = None
        if recently_sampled is None:
            recently_sampled = []

        params = set()
        for hla in self.hlas:
            params.update(hla.get_params())
            prob.add_hla(hla)

        # check whether there are duplicate parameters (prob shouldn't add variables into the problem multiple times)
        param_to_var = {}
        for param in params:
            if param in param_to_var:
                continue
            if param.is_resampled and fix_sampled_params:
                print param.name, "is fixed."
                const = Constant(param)
                param_to_var[param] = const
            elif not param.is_var:
                print param.name, "is not a var."
                const = Constant(param)
                param_to_var[param] = const
            else: # param.is_var
                var = Variable(param, recently_sampled=(param in recently_sampled))
                param_to_var[param] = var
                prob.add_var(var)
        prob.update()

        # max(priority, 0) because priority = -1 used for straight-line init
        self.add_cnts_to_opt_prob(prob, param_to_var=param_to_var, priority=max(priority, 0))
        
        # Re-sampled params need to update their corresponding variables
        for param, var in param_to_var.items():
            var.set_val(param.get_value())

        for hla in self.hlas:
            if hla.cost != 0.0:
                hla.cost.to_gurobi_fn(prob, param_to_var)
                prob.inc_obj(hla.cost)

        solver = Solver()

        if priority == -1 or priority == 0:
            # for initialization only because problem should be QP
            solver.initial_trust_box_size = 1e5
            solver.max_merit_coeff_increases = 1
        if priority == -1:
            # initialize straight-line trajectories
            success = prob.initialize_traj(mode="straight")
        elif priority == 0:
            # initialize from adapted previous trajectories
            success = prob.initialize_traj(mode=settings.INIT_MODE)
        else:
            if settings.DO_SQP or settings.BACKTRACKING_REFINEMENT or settings.BTSMOOTH_REFINEMENT:
                do_early_converge = False
            elif settings.DO_EARLY_CONVERGE:
                do_early_converge = True
            else:
                raise NotImplementedError
            success, converged_vio_fluent = solver.penalty_sqp(prob, do_early_converge=do_early_converge)
            if not do_early_converge:
                assert converged_vio_fluent is None
            self.recently_converged_vio_fluent = converged_vio_fluent

        for param, var in param_to_var.items():
            var.update_hl_param()

        self.traj_cost = sum(prob.val(0)[0])
        return success
Exemplo n.º 5
0
    def solve_at_priority_admm(self, priority, fix_sampled_params=False, recently_sampled=None):
        # initialize gurobi Model object
        if recently_sampled is None:
            recently_sampled = []

        hla_to_prob = {}
        param_to_var = {}
        # construct opt probs for each action and create variables for each parameter
        for hla in self.hlas:
            prob = OptProb()
            prob.add_hla(hla)
            hla_to_prob[hla] = prob

            params = hla.get_params()
            for param in params:
                if param.is_resampled and fix_sampled_params:
                    if param not in param_to_var:
                        # print param.name, "is fixed."
                        const = Constant(param)
                        param_to_var[param] = const
                elif not param.is_var:
                    if param not in param_to_var:
                        # print param.name, "is not a var."
                        const = Constant(param)
                        param_to_var[param] = const
                else: # param.is_var
                    if param in param_to_var:
                        var = param_to_var[param]
                    else:
                        if param.is_resampled:
                            # print param.name, "is a global var."
                            var = GlobalVariable(param, recently_sampled=(param in recently_sampled))
                            param_to_var[param] = var
                        else:
                            # print param.name, "is a var."
                            var = Variable(param, recently_sampled=(param in recently_sampled))
                        param_to_var[param] = var

                    prob.add_var(var)
            prob.update()
            self.add_cnts_to_opt_prob(prob, param_to_var=param_to_var, priority=max(priority, 0))

        for hla, prob in hla_to_prob.items():
            if hla.cost != 0.0:
                hla.cost.to_gurobi_fn(prob, param_to_var)
                prob.inc_obj(hla.cost)

        solver = Solver()

        if priority == -1 or priority == 0:
            # for initialization only because problem should be QP
            solver.initial_trust_box_size = 1e5
            solver.max_merit_coeff_increases = 1
        if priority == -1:
            # initialize straight-line trajectories
            for prob in hla_to_prob.values():
                success = prob.initialize_traj(mode="straight")
        elif priority == 0:
            # initialize from adapted previous trajectories
            for prob in hla_to_prob.values():
                success = prob.initialize_traj(mode="adapt")
        else:
            success = solver.sqp_qp_admm(hla_to_prob.values(), param_to_var.values())

        for param, var in param_to_var.items():
            var.update_hl_param()

        self.traj_cost = 0
        for prob in hla_to_prob.values():
            self.traj_cost += sum(prob.val(0)[0])
        return success
Exemplo n.º 6
0
class LLPlan(object):
    def __init__(self, hl_params = None, hl_actions=None):
        if hl_params is None:
            self.hl_params = []
        else:
            self.hl_params = hl_params

        if hl_actions is None:
            self.hl_actions = []
        else:
            self.hl_actions = hl_actions

        self.solver = Solver()

    def add_hl_param(self, hl_param):
        self.hl_params.append(hl_param)

    def solve(self):
        opt_probs = []
        for hl_action in self.hl_actions:
            opt_probs.append(hl_action.opt_prob)
        self.sqp_convexify_admm(opt_probs)
        # self.sqp_admm(opt_probs)
        # self.admm_sqp(opt_probs)
        # self.big_sqp(opt_probs)

    def sqp_convexify_admm(self, opt_probs):
        for opt_prob in opt_probs:
            opt_prob.augment_lagrangian()
        solver = self.solver
        solver.improve_ratio_threshold = .25
        # solver.min_trust_box_size = 1e-5
        solver.min_trust_box_size = 1e-4
        # solver.min_trust_box_size = 1e-3
        # solver.min_trust_box_size = 1e-2
        # solver.min_approx_improve = 1e-5
        solver.min_approx_improve = 1e-4
        # solver.min_approx_improve = 1e-3
        # solver.min_approx_improve = 1e-2
        # solver.min_approx_improve = 3e-2
        # solver.min_approx_improve = 1e-1
        # solver.min_approx_improve = 3e-1
        solver.max_iter = 50
        solver.trust_shrink_ratio = .1
        solver.trust_expand_ratio = 1.5
        # solver.cnt_tolerance = 1e-2
        solver.cnt_tolerance = 1e-3
        # solver.cnt_tolerance = 1e-4
        # solver.max_merit_coeff_increases = 5
        # solver.max_merit_coeff_increases = 4
        solver.max_merit_coeff_increases = 3
        # solver.max_merit_coeff_increases = 2
        solver.merit_coeff_increase_ratio = 10
        solver.initial_trust_box_size = 0.1
        # solver.initial_trust_box_size = 0.3
        # solver.initial_trust_box_size = 1
        # solver.initial_trust_box_size = 2
        # solver.initial_trust_box_size = 3
        # solver.initial_trust_box_size = 10
        # solver.initial_penalty_coeff = 1.
        solver.initial_penalty_coeff = 10
        # solver.initial_penalty_coeff = 0.3
        # solver.initial_penalty_coeff = 0.2
        # solver.initial_penalty_coeff = 0.1
        # solver.initial_penalty_coeff = 0.03
        # solver.initial_penalty_coeff = 0.01
        solver.callback = []

        # solver.epsilon = 5e-3
        solver.epsilon = 1e-2
        # solver.epsilon = 2e-2
        # solver.epsilon = 2.5e-2
        # solver.epsilon = 3e-2
        # solver.epsilon = 1e-1
        solver.sqp_iters = 0
        self.solver.sqp_convexify_admm(opt_probs, self.hl_params)

    def sqp_admm(self, opt_probs):
        for opt_prob in opt_probs:
            opt_prob.augment_lagrangian()
        solver = self.solver
        solver.improve_ratio_threshold = .25
        # solver.min_trust_box_size = 1e-4
        solver.min_trust_box_size = 1e-3
        # solver.min_trust_box_size = 1e-2
        # solver.min_approx_improve = 1e-5
        solver.min_approx_improve = 1e-4
        # solver.min_approx_improve = 1e-3
        # solver.min_approx_improve = 1e-2
        # solver.min_approx_improve = 3e-2
        # solver.min_approx_improve = 1e-1
        # solver.min_approx_improve = 3e-1
        solver.max_iter = 50
        solver.trust_shrink_ratio = .1
        solver.trust_expand_ratio = 1.5
        solver.cnt_tolerance = 1e-2
        # solver.cnt_tolerance = 1e-4
        solver.max_merit_coeff_increases = 5
        # solver.max_merit_coeff_increases = 2
        solver.merit_coeff_increase_ratio = 10
        # solver.initial_trust_box_size = 1
        # solver.initial_trust_box_size = 2
        solver.initial_trust_box_size = 3
        # solver.initial_trust_box_size = 10
        # solver.initial_penalty_coeff = 1.
        # solver.initial_penalty_coeff = 10
        # solver.initial_penalty_coeff = 0.3
        # solver.initial_penalty_coeff = 0.2
        solver.initial_penalty_coeff = 0.1
        # solver.initial_penalty_coeff = 0.03
        # solver.initial_penalty_coeff = 0.01
        solver.callback = []

        # self.epsilon = 5e-3
        # solver.epsilon = 1e-2
        solver.epsilon = 2e-2
        # solver.epsilon = 3e-2
        # solver.epsilon = 1e-1
        solver.sqp_iters = 0
        self.solver.sqp_admm(opt_probs, self.hl_params)

    def admm_sqp(self, opt_probs):
        for opt_prob in opt_probs:
            opt_prob.augment_lagrangian()
        solver = self.solver
        solver.improve_ratio_threshold = .25
        # solver.min_trust_box_size = 1e-4
        solver.min_trust_box_size = 1e-2
        # solver.min_approx_improve = 1e-4
        # solver.min_approx_improve = 1e-2
        solver.min_approx_improve = 1e-1
        # solver.min_approx_improve = 3e-1
        solver.max_iter = 50
        solver.trust_shrink_ratio = .1
        solver.trust_expand_ratio = 1.5
        solver.cnt_tolerance = 1e-4
        solver.max_merit_coeff_increases = 5
        solver.merit_coeff_increase_ratio = 10
        # solver.initial_trust_box_size = 1
        # solver.initial_trust_box_size = 2
        solver.initial_trust_box_size = 3
        # solver.initial_trust_box_size = 10
        # solver.initial_penalty_coeff = 1.
        # solver.initial_penalty_coeff = 10
        # solver.initial_penalty_coeff = 0.3
        solver.initial_penalty_coeff = 0.1
        # solver.initial_penalty_coeff = 0.01
        # solver.max_penalty_iter = 4
        solver.max_penalty_iter = 8
        solver.callback = []

        # solver.epsilon = 5e-3
        solver.epsilon = 1e-2
        solver.sqp_iters = 0
        solver.solver.admm_sqp(opt_probs, self.hl_params)

    def big_sqp(self, opt_probs):
        # for opt_prob in opt_probs:
        #     opt_prob.primal()
        solver = self.solver
        solver.improve_ratio_threshold = .25
        # solver.min_trust_box_size = 1e-4
        solver.min_trust_box_size = 1e-2
        # solver.min_approx_improve = 1e-4
        # solver.min_approx_improve = 1e-2
        solver.min_approx_improve = 1e-1
        solver.max_iter = 50
        solver.trust_shrink_ratio = .1
        solver.trust_expand_ratio = 1.5
        solver.cnt_tolerance = 1e-4
        solver.max_merit_coeff_increases = 5
        solver.merit_coeff_increase_ratio = 10
        # solver.initial_trust_box_size = 1
        # solver.initial_trust_box_size = 2
        solver.initial_trust_box_size = 8
        # solver.initial_penalty_coeff = 1.
        # solver.initial_penalty_coeff = 0.1
        solver.initial_penalty_coeff = 0.01
        solver.max_penalty_iter = 20

        self.solver.big_sqp(opt_probs, self.hl_params)
Exemplo n.º 7
0
 def __init__(self):
     Solver.__init__(self)
     self.sense = min
     self.objective = identity_fnc