def __init__(self, step: float = None, tol: float = 0., max_iter: int = 100, verbose: bool = True, print_every: int = 10, record_every: int = 1, linesearch_step_increase: float = 2., linesearch_step_decrease: float = 0.5, modified=False): SolverFirstOrder.__init__(self, step=step, tol=tol, max_iter=max_iter, verbose=verbose, print_every=print_every, record_every=record_every) self.linesearch_step_increase = linesearch_step_increase self.linesearch_step_decrease = linesearch_step_decrease self.modified = modified self.model_ssc = None self.prox_ssc = self._ProxStandardSC() self._th_gain = 0
def __init__(self, step: float = None, epoch_size: int = None, rand_type="unif", tol=0., max_iter=100, verbose=True, print_every=10, record_every=1, seed=-1): self._step = None # We must first construct SolverSto (otherwise self.step won't # work in SolverFirstOrder) SolverSto.__init__(self, epoch_size=epoch_size, rand_type=rand_type, seed=seed) SolverFirstOrder.__init__(self, step=step, tol=tol, max_iter=max_iter, verbose=verbose, print_every=print_every, record_every=record_every)
def set_prox(self, prox: Prox): """Set proximal operator in the solver. Parameters ---------- prox : `Prox` The proximal operator of the penalization function Returns ------- output : `Solver` The solver with given prox Notes ----- In some solvers, ``set_model`` must be called before ``set_prox``, otherwise and error might be raised. """ if type(prox) is ProxZero: SolverFirstOrder.set_prox(self, prox) self._set("_prox_grad", lambda x: x) elif type(prox) is ProxL2Sq: SolverFirstOrder.set_prox(self, prox) self._set("_prox_grad", lambda x: prox.strength * x) else: raise ValueError("BFGS only accepts ProxZero and ProxL2sq " "for now") return self
def set_prox(self, prox: list): """ Parameters ---------- prox : list[Prox] List of all proximal operators of the model """ prox = CompositeProx(prox) SolverFirstOrder.set_prox(self, prox) return self
def __init__(self, step: float = None, tol: float = 0., max_iter: int = 100, linesearch: bool = True, linesearch_step_increase: float = 2., linesearch_step_decrease: float = 0.5, verbose: bool = True, print_every: int = 10, record_every: int = 1): SolverFirstOrder.__init__(self, step=step, tol=tol, max_iter=max_iter, verbose=verbose, print_every=print_every, record_every=record_every) self.linesearch = linesearch self.linesearch_step_increase = linesearch_step_increase self.linesearch_step_decrease = linesearch_step_decrease
def _handle_history(self, n_iter: int, force: bool = False, **kwargs): """Updates the history of the solver. """ if n_iter == 0: self._set('_initial_n_hessiannorm_calls', self.model.n_calls_hessian_norm) hessiannorm_calls = self.model.n_calls_hessian_norm - \ self._initial_n_hessiannorm_calls SolverFirstOrder._handle_history(self, n_iter, force=force, n_calls_hessiannorm=hessiannorm_calls, **kwargs)
def __init__(self, tol: float = 1e-10, max_iter: int = 10, verbose: bool = True, print_every: int = 1, record_every: int = 1): SolverFirstOrder.__init__(self, step=None, tol=tol, max_iter=max_iter, verbose=verbose, print_every=print_every, record_every=record_every) self._prox_grad = None
def _initialize_values(self, x0, step): step, obj, x, prev_x, prev_grad_x_ssc, grad_x_ssc = \ SolverFirstOrder._initialize_values(self, x0, step, n_empty_vectors=3) grad_x_ssc = self.model_ssc.grad(x, out=grad_x_ssc) return step, obj, x, prev_x, prev_grad_x_ssc, grad_x_ssc
def __init__(self, step: float = None, tol: float = 0., max_iter: int = 1000, surrelax=1., verbose: bool = True, print_every: int = 10, record_every: int = 1): SolverFirstOrder.__init__(self, step=step, tol=tol, max_iter=max_iter, verbose=verbose, print_every=print_every, record_every=record_every) self.surrelax = surrelax
def initialize_values(self, x0, step): step, obj, x, x_old = \ SolverFirstOrder._initialize_values(self, x0, step, n_empty_vectors=1) z_list = [np.zeros_like(x) for _ in range(self.prox.n_proxs)] z_old_list = [np.zeros_like(x) for _ in range(self.prox.n_proxs)] return x, x_old, z_list, z_old_list, obj, step
def set_prox(self, prox: Prox): """Set prox in the solver Parameters ---------- prox : `Prox` Sets the prox in the solver Returns ------- output : `Solver` The `Solver` with given prox """ SolverFirstOrder.set_prox(self, prox) SolverSto.set_prox(self, prox) return self
def set_model(self, model: Model): """Set model in the solver Parameters ---------- model : `Model` Sets the model in the solver. The model gives the first order information about the model (loss, gradient, among other things) Returns ------- output : `Solver` The `Solver` with given model """ SolverFirstOrder.set_model(self, model) SolverSto.set_model(self, model) return self
def _initialize_values(self, x0=None, step=None): if step is None: if self.step is None: if self.linesearch: # If we use linesearch, then we can choose a large # initial step step = 1e9 else: raise ValueError("No step specified.") step, obj, x, prev_x, x_new = \ SolverFirstOrder._initialize_values(self, x0, step, n_empty_vectors=2) return x, prev_x, x_new, step, obj