docs: def fit(self,Params0=None,grad_threshold=1e-2):
          """
          fit a variance component model with the predefined design and the initialization and returns all the results
          """
  
          # GPVD initialization
          lik = limix.CLikNormalNULL()
          # Initial Params
          if Params0==None:
              n_params = self.C1.getNumberParams()
              n_params+= self.C2.getNumberParams()
              Params0 = SP.rand(n_params)
          # MultiGP Framework
          covar = []
          gp    = []
          mean  = []
          for i in range(self.N):
              covar.append(limix.CLinCombCF())
              covar[i].addCovariance(self.C1)
              covar[i].addCovariance(self.C2)
              coeff = SP.array([self.eigen[i],1])
              covar[i].setCoeff(coeff)
              mean.append(limix.CLinearMean(self.Yt[:,i],SP.eye(self.P)))
          gpVD = limix.CGPvarDecomp(covar[0],lik,mean[0],SP.ones(self.N),self.P,self.Yt,Params0)
          for i in range(self.N):
              gp.append(limix.CGPbase(covar[i],lik,mean[i]))
              gp[i].setY(self.Yt[:,i])
              gpVD.addGP(gp[i])
                  
          # Optimization
          gpVD.initGPs()
          gpopt = limix.CGPopt(gpVD)
          LML0=-1.0*gpVD.LML()
          start_time = time.time()
          conv = gpopt.opt()
          time_train = time.time() - start_time
          LML=-1.0*gpVD.LML()
          LMLgrad = SP.linalg.norm(gpVD.LMLgrad()['covar'])
          Params = gpVD.getParams()['covar']
      
          # Check whether limix::CVarianceDecomposition.train() has converged
          if conv!=True or LMLgrad>grad_threshold or Params.max()>10:
              print('limix::CVarianceDecomposition::train has not converged')
              res=None
          else:
              res = {
                  'Params0':          Params0,
                  'Params':           Params,
                  'LML':              SP.array([LML]),
                  'LML0':             SP.array([LML0]),
                  'LMLgrad':          SP.array([LMLgrad]),
                  'time_train':       SP.array([time_train]),
                  }
          return res
          pass