Exemplo n.º 1
0
    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
Exemplo n.º 2
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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
 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
Exemplo n.º 10
0
 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
Exemplo n.º 11
0
    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
Exemplo n.º 12
0
    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
Exemplo n.º 13
0
 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