docs: def optimize(self, G, params0=None, n_times=10, verbose=False, vmax=5, perturb=1e-3, factr=1e7):
          """
          Optimize the model considering G
          """
          # set params0 from null if params0 is None
          if params0 is None:
              if self.null is None:
                  if verbose:     print(".. fitting null model")
                  self.fitNull()
              if self.bgRE:
                  params0 = sp.concatenate([self.null['params0_g'], self.null['params0_n']])
              else:
                  params0 = self.null['params0_n']
              params_was_None = True
          else:
              params_was_None = False
          G *= sp.sqrt(self.N/(G**2).sum())
          self._gp.covar.G = G
          start = TIME.time()
          for i in range(n_times):
              if params_was_None:
                  n_params = self.Cr.getNumberParams()
                  _params0 = {'covar': sp.concatenate([1e-3*sp.randn(n_params), params0])}
              else:
                  _params0 = {'covar': params0}
              self._gp.setParams(_params0)
              conv, info = self._gp.optimize(factr=factr, verbose=verbose)
              conv *= self.Cr.K().diagonal().max()<vmax
              conv *= self.getLMLgrad() < 0.1
              if conv or not params_was_None: break
          self.infoOpt = info
          if not conv:
              warnings.warn("not converged")
          # return value
          RV = {}
          if self.P>1:
              RV['Cr']  = self.Cr.K()
              if self.bgRE: RV['Cg']  = self.Cg.K()
              RV['Cn']  = self.Cn.K()
          RV['time']  = sp.array([TIME.time()-start])
          RV['params0'] = _params0
          RV['nit'] = sp.array([info['nit']])
          RV['funcalls'] = sp.array([info['funcalls']])
          RV['var']    = self.getVariances()
          RV['conv']  = sp.array([conv])
          RV['NLLAlt']  = sp.array([self.getNLLAlt()])
          RV['LLR']    = sp.array([self.getLLR()])
          RV['LMLgrad'] = sp.array([self.getLMLgrad()])
          return RV