Changeset 43274223 in tol


Ignore:
Timestamp:
Oct 20, 2008, 8:11:38 AM (18 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
ada82ec
Parents:
f22ae37
Message:

Just commentaries

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@12 be4846ae-f051-483a-831f-b64e7d08527f

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tol/btol/vmatrix_type/vmat_stats.cpp

    rf22ae37 r43274223  
    436436                                      BVMat& b,
    437437                                      BVMat& z)
    438 // Generates z as a truncated standard multinormal
    439 // b <= d 
    440 // b = D*z
     438// Generates a set of standarized multibormal z constrained to
     439//   D*z <= d 
     440// Value od d-D*z is stored in b and must be initialized by the caller function
    441441////////////////////////////////////////////////////////////////////////////////
    442442{
    … …  
    621621};
    622622
     623
     624/*
     625////////////////////////////////////////////////////////////////////////////////
     626  int BVMat::constrained_multivariate(const BVMat& D,
     627                                      const BVMat& d,
     628                                            BVMat& b,
     629                                            BVMat& z,
     630                                      const BArray<BTruncatedDist*>& dist)
     631// Generates a set of independent multivariate z constrained to
     632//   D*z <= d 
     633// given a truncated univariate distribution
     634// Value od d-D*z is stored in b and must be initialized by the caller function
     635////////////////////////////////////////////////////////////////////////////////
     636{
     637  int i, j, k, h, hj;
     638  double  aux;
     639  bool    sp = D.code_ == ESC_chlmRsparse;
     640  int     n  = z.s_.blasRdense_->nrow;
     641  int     r  = d.s_.blasRdense_->nrow;
     642  int     k0 = 0;
     643  int     k1 = r;
     644  double* zx = (double*)z.s_.blasRdense_->x;
     645  double* dx = (double*)d.s_.blasRdense_->x;
     646  double* bx = (double*)b.s_.blasRdense_->x;
     647  double* Dx = (double*)(sp?D.s_.chlmRsparse_->x:D.s_.blasRdense_->x);
     648  int*    Di = (int*   )(sp?D.s_.chlmRsparse_->i:NULL);
     649  int*    Dp = (int*   )(sp?D.s_.chlmRsparse_->p:NULL);
     650  double  negInf = BDat::NegInf();
     651  double  posInf = BDat::PosInf();
     652  double  lower  = BDat::NegInf();
     653  double  upper  = BDat::PosInf();
     654  int     nnz    = D.NonNullCells();
     655  double  drop   = nnz*DEpsilon();
     656  for(h=hj=j=0; j<n; j++)
     657  {
     658    double& zj = zx[j];
     659  //Std(BText("\nj=")<<j);
     660    lower=negInf;
     661    upper=posInf;
     662    if(sp)
     663    {
     664      k0 = Dp[j];
     665      k1 = Dp[j+1];
     666    }
     667    else
     668    {
     669      hj = h;
     670    }
     671    for(k=k0; k<k1; k++)
     672    {
     673      i = sp?Di[k]:k;
     674      const double& Dij = sp?Dx[k]:Dx[h++];
     675      int Dij_sign = gsl_fcmp(Dij+1.0,1.0,DBL_EPSILON);
     676      if(Dij_sign!=0)
     677      {
     678        bx[i] += Dij*zj;
     679      //Std(BText("\nD[")+i+","+j+"]="+Dij+"\tz["+j+"]="+zj+"\tb["+i+"]="+bx[i]+"\td["+i+"]="+dx[i]);
     680        if(Dij_sign<0)
     681        {
     682          aux = bx[i]/Dij;
     683          if(lower<aux) { lower = aux; }
     684        //Std(BText("\naux=")+aux+"\tlower="<<lower);
     685        }
     686        else //if(Dij_sign>0)
     687        {
     688          aux = bx[i]/Dij;
     689          if(upper>aux) { upper = aux; }
     690        //Std(BText("\naux=")+aux+"\tupper="<<upper);
     691        }
     692      }
     693    }
     694  //Std(BText("\nlower=")<<lower<<"\tupper="<<upper);
     695    double length = lower-upper;
     696    int length_sign = gsl_fcmp(length+1.0,1.0,DBL_EPSILON);
     697    if(length_sign>=0)
     698    {
     699      if(length_sign==0)
     700      {
     701        lower = upper;
     702      }
     703      else
     704      {
     705        err_cannot_apply("TruncStdGaussian",
     706          I2("(empty interval",
     707             "(intervalo vacio")+" ["+lower+","+upper+"])",z);
     708      //return(-1);
     709      }
     710    }
     711  //if((j>=2)&&(lower<0)&&(upper>0))      printf("");
     712    dist[j]->SetBounds(lower, upper);
     713    zj = dist[j]->Random().Value();
     714    Std(BText("\nTRACE constrained_multivariate ")+lower+"<=z["+j+"]="+zj+"<="+upper);
     715    assert((lower<=zj) && (zj<=upper));
     716    if(!sp) { h=hj; }
     717    for(k=k0; k<k1; k++)
     718    {
     719      i = sp?Di[k]:k;
     720      const double& Dij = sp?Dx[k]:Dx[h++];
     721      bx[i] -= Dij*zj;
     722    //Std(BText("\nD[")+i+","+j+"]="+Dij+"\tz["+j+"]="+zj+"\tb["+i+"]="+bx[i]);
     723    }
     724  }
     725  return(0);
     726};
     727
     728
     729////////////////////////////////////////////////////////////////////////////////
     730  int BVMat::FindFeasiblePoint(const BVMat& D, const BVMat& d_, BVMat& z0)
     731////////////////////////////////////////////////////////////////////////////////
     732{
     733  z0.Delete();
     734  static char* fName = "FindFeasiblePoint";
     735  if(!D .CheckDefined(fName)) { return(-1); }
     736  if(!d_.CheckDefined(fName)) { return(-2); }
     737  BVMat d(d_,ESC_blasRdense);
     738  int Dr = D.Rows();
     739  int Dc = D.Columns();
     740  int dr = d.Rows();
     741  int dc = d.Columns();
     742  if((Dr!=dr)||(dc!=1)||
     743     !Dc||!Dr||!dc||!dr)
     744  {
     745    err_invalid_dimensions(fName,D,d_,z0);
     746    return(-3);
     747  }
     748  BVMat Ir, DI, u, b;
     749  BArray<BTruncatedDist*> dist(Dc+Dr);
     750  int i,j,k,iter;
     751  int cm = 0;
     752  bool isFeasible = false;
     753  switch(D.code_) {
     754  case(ESC_blasRdense ) :
     755  case(ESC_chlmRsparse ) :
     756    z0.Zeros(Dc,1,ESC_blasRdense);
     757    Ir.Eye(Dr,Dr);
     758    DI = D | Ir;
     759    u = z0 << d;
     760  //for(k=0; k<Dc; k++) { dist[k] = new BClosestInsideDist(-1,1,0); }
     761  //for(k=Dc; k<Dc+Dr; k++) { dist[k] = new BClosestInsideDist(-1,1,0); }
     762    for(k=0;  k<Dc;    k++) { dist[k] = new BTruncatedNormalDist(-1,1,0,1); }
     763    for(k=Dc; k<Dc+Dr; k++) { dist[k] = new BTruncatedNormalDist(-1,1,0,1); }
     764    b = d-DI*u;
     765    for(iter=0; !isFeasible && (iter<10*(Dr+Dc)); iter++)
     766    {
     767      Std(BText("\nTRACE constrained_multivariate iteration ")+iter);
     768      cm = constrained_multivariate(DI,d,b,u,dist);
     769      if(cm!=0)
     770      { return(-4); }
     771      isFeasible = true;
     772      k=Dc;
     773      for(i=0; isFeasible && (i<Dr); i++, k++)
     774      {
     775        BDat uk = u.GetCell(k,0);
     776        isFeasible = (uk>=0.0);
     777      }
     778      for(k=Dc; k<Dc+Dr; k++)
     779      {
     780        BDat s = BDat(0.5)^iter;
     781        delete dist[k];
     782        dist[k] = new BTruncatedNormalDist(-1,1,0,s);
     783      }
     784    }
     785    for(k=0; k<dist.Size(); k++) { delete dist[k]; }
     786    break;
     787  default:
     788    err_cannot_create(fName,D.code_);  return(-5); }
     789  if(!isFeasible)
     790  { return(-6); }
     791  u.Sub(0, 0, Dc, 1, z0);
     792  return(0);
     793}
     794
     795////////////////////////////////////////////////////////////////////////////////
     796  int BVMat::TruncStdGaussian(const BVMat& D, const BVMat& d_,
     797                               const BVMat& z0, int ncol, int burnin)
     798//Matrix instances
     799////////////////////////////////////////////////////////////////////////////////
     800{
     801  static char* fName = "TruncStdGaussian";
     802  if(!D .CheckDefined(fName)) { return(-1); }
     803  if(!d_.CheckDefined(fName)) { return(-2); }
     804  if(!z0.CheckDefined(fName)) { return(-3); }
     805  int Dr = D.Rows();
     806  int Dc = D.Columns();
     807  int dr = d_.Rows();
     808  int dc = d_.Columns();
     809  int zr = z0.Rows();
     810  int zc = z0.Columns();
     811  if((Dr!=dr)||(dc!=1)||
     812     (Dc!=zr)||(zc!=1)||
     813     !Dc||!Dr||!dc||!dr||!zc||!zr)
     814  {
     815    err_invalid_dimensions(fName,D,d_,z0);
     816    return(-4);
     817  }
     818  double* aux;
     819  int k, nrow = Dc;
     820  BVMat d(d_,ESC_blasRdense);
     821  BVMat z(z0,ESC_blasRdense);
     822  BVMat Dz = D*z;
     823  BVMat b  = d-Dz;
     824  double bMin = b.Min();
     825  int    nnz  = D.NonNullCells();
     826  double drop = nnz*DEpsilon();
     827  if(bMin<-drop)
     828  {
     829    err_cannot_apply(fName,
     830      I2("(non feasible initial point)",
     831         "(valor inicial no factible)"),z0);
     832    return(-5);
     833  }
     834  if(burnin<=0 ) { burnin = 1; }
     835  BVMat burn;
     836  burn.Zeros(nrow, burnin, ESC_blasRdense);
     837  Zeros(nrow, ncol, ESC_blasRdense);
     838  int size_row = nrow*sizeof(double);
     839  switch(D.code_) {
     840  case(ESC_blasRdense ) :
     841  case(ESC_chlmRsparse ) :
     842    aux = (double*)burn.s_.blasRdense_->x;
     843    for(k=0; k<burnin; k++, aux+=nrow)
     844    {
     845      if(trunc_std_gaussian(D, d, b, z)!=0) { return(-6); } 
     846      memcpy(aux, z.s_.blasRdense_->x, size_row);
     847    }
     848    aux = (double*)s_.blasRdense_->x;
     849    for(k=0; k<ncol; k++, aux+=nrow)
     850    {
     851      if(trunc_std_gaussian(D, d, b, z)!=0) { return(-7); } 
     852      memcpy(aux, z.s_.blasRdense_->x, size_row);
     853    }
     854    break;
     855  default:
     856    err_cannot_create(fName,D.code_);  return(-8); }
     857  return(0);
     858};
     859
    623860/* */
Note: See TracChangeset for help on using the changeset viewer.