示例#1
0
void Stabilisator::update_pi(CplexSolver & solver, DoubleVector const & pi) {
	DoubleVector rc;
	solver.rc(rc);
	_pi_bar = pi;
	int n_rows((int) _pi_bar.size());
//	std::cout << "avg = " << avg / _pi_bar.size() << std::endl;
	_dual_cost.assign(4 * _pi_bar.size(), 0);
	_cost.assign(4 * _pi_bar.size(), 0);
	_indexes.assign(4 * _pi_bar.size(), 0);

	int index(-1);
	for (int row(0); row < n_rows; ++row) {
		_cost[++index] = gamma1(row);
		_dual_cost[index] = dseta_m();
		_indexes[index] = index;

		_cost[++index] = delta1(row);
		_dual_cost[index] = epsilon_m();
		_indexes[index] = index;

		_cost[++index] = -delta2(row);
		_dual_cost[index] = epsilon_p();
		_indexes[index] = index;

		_cost[++index] = -gamma2(row);
		_dual_cost[index] = dseta_p();
		_indexes[index] = index;
	}
	solver.chgObj(_indexes, _cost);
}
float tgamma(float x)
{
  // Check for pure zero argument.
  if(xcmath::near_integer(x, std::uint_least8_t(0U)))
  {
    return std::numeric_limits<float>::quiet_NaN();
  }

  // Check for overflow and underflow.
  if(    (x > 35)
     || ((x > -1.0E-4F) && (x < 1.0E-4F))
    )
  {
    return std::numeric_limits<float>::infinity();
  }

  // Is the argument 1 or 2?
  if(   xcmath::near_integer(x, std::uint_least8_t(1U))
     || xcmath::near_integer(x, std::uint_least8_t(2U))
    )
  {
    return 1.0F;
  }

  // Use a positive argument for the Gamma calculation.
  const bool b_neg = (x < 0);
  x = (b_neg ? -x : x);

  // Get any integer recursion and scale the argument.
  const std::uint16_t nx = std::uint16_t(::floor(x));
  x -= float(nx);

  float g = gamma1(x);

  // Do the recursion if necessary.
  for(std::uint16_t recur = 0U; recur < nx; ++recur)
  {
    g *= x;
    ++x;
  }

  // Return (and possibly reflect) the result.
  if(false == b_neg)
  {
    return g;
  }
  else
  {
    const float sin_pi_x = sin(const_pi<float>() * x);

    return -const_pi<float>() / ((x * g) * sin_pi_x);
  }
}
示例#3
0
std::string ThreeSstarCoeffs::str() const
{
  std::stringstream ss;
  for (int i=0; i<nb_stages(); ++i)
  {
    ss << std::setw(2) << i << ": " 
       << std::setw(9) << delta(i) 
       << std::setw(9) << beta(i)
       << std::setw(9) << gamma1(i)
       << std::setw(9) << gamma2(i)
       << std::setw(9) << gamma3(i);
    ss << std::endl;
  }
  return ss.str();
}
示例#4
0
void UntiedGaussMixtureDensityEBTrainer::retrain(const DataSet& traindata) {
  vector<uint>   maxApproxIdx(N_);
  
  for(uint it=0;it<maxIterations_;++it) {
    UntiedGaussMixtureDensityClassifier oldClassifier(classifier_);
    DBG(10) << "Iteration " << it+1 << "/" << maxIterations_ <<"." << endl;
    
    for(uint c=0;c<C_;++c) {
      DBG(10) << "Iteration " << it+1 << "/" << maxIterations_ <<" class " << c << "/" << C_ << "." << std::endl;
      
      uint I=classifier_.mixtures_[c].numberOfClusters();
      GaussMixtureDensity& gmdi=classifier_.mixtures_[c];
      
      vector<double> gamma1(I*D_,0.0);
      vector<double> gammaX(I*D_,0.0);
      vector<double> gammaX2(I*D_,0.0);
      
      DBG(15) << "Getting gammas" << endl;
      for(uint n=0;n<N_;++n) {
        double maxLogPx=-numeric_limits<double>::max();
        
        for(uint i=0;i<I;++i) {
          double logpx=gmdi.logp_x(traindata[n]);
          if(logpx>maxLogPx) {
            maxLogPx=logpx;
            maxApproxIdx[n]=i;
          } 
          
          vector<double> p_cn_xn; classifier.p_c_x(traindata[n],p_cn_xn);
          double gamma=1.0/double(N_)*criterion_->fprime(traindata[n],c,classifier_)*(delta(c,traindata[n].cls())-p_cn_xn[c]);
          uint in=maxApproxIdx[n];
          
          for(uint d=0;d<D_;++d) {
            uint idx=d*I+in;
            double xd=traindata[n][d];
            
            gamma1[idx]+=gamma;
            gammaX[idx]+=gamma*xd;
            gammaX2[idx]+=gamma*xd*xd;
          }
        }



      }
    } // for c
  } // for it
}
//----------------------
float tmVisThreshC1_MixtureModeling2::differenceGamma (int i) {
	return gamma1(i)-gamma2(i);
}
//----------------------
float tmVisThreshC1_MixtureModeling2::gamma (int i) {
	return gamma1(i)+gamma2(i);
}