Exemplo n.º 1
0
// virtual
Matrix* NominalToCategorical::filterLabels(Matrix& labels)
{
	if(labels.cols() != 1)
		ThrowError("unexpected number of label dims");
	Matrix* pOut = new Matrix();
	pOut->setSize(0, m_labelVals);
	if(m_labelVals == 1)
	{
		for(size_t i = 0; i < labels.rows(); i++)
		{
			vector<double> row;
			row.push_back(labels[i][0]);
			pOut->copyRow(row);
		}
	}
	else
	{
		for(size_t i = 0; i < labels.rows(); i++)
		{
			vector<double> row;
			row.resize(m_labelVals, 0.0);
			row[(size_t)labels[i][0]] = 1.0;
			pOut->copyRow(row);
		}
	}
	return pOut;
}
Exemplo n.º 2
0
  virtual void Jacobian(const Vector& x,Matrix& J) {
    J.resize(1,x.n);
    Vector Ji(3);
    Real len = Sqrt(Sqr(x[1])+Sqr(x[0]));
    if(FuzzyZero(len)) Ji.setZero();
    else {
      Real xc = x[0]*primaryRadius/len;
      Real yc = x[1]*primaryRadius/len;
      Real dlend0 = x[0]/len;
      Real dlend1 = x[1]/len;
      //derivative of xc w.r.t. x[0], x[1]
      Real dxcd0 = (len*primaryRadius - x[0]*primaryRadius*dlend0)/Sqr(len);
      Real dxcd1 = -x[0]*primaryRadius*dlend1/Sqr(len);
      //derivative of yc w.r.t. x[0], x[1]
      Real dycd0 = -x[1]*primaryRadius*dlend0/Sqr(len);
      Real dycd1 = (len*primaryRadius - x[1]*primaryRadius*dlend1)/Sqr(len);
      Ji[0] = 2.0*(x[0]-xc)*(1-dxcd0) - 2.0*(x[1]-yc)*dycd0;
      Ji[1] = -2.0*(x[0]-xc)*dxcd1 + 2.0*(x[1]-yc)*(1-dycd1);
      Ji[2] = 2*x[2];
    }
    J.copyRow(0,Ji);

    /*
    //TEMP: debugging
    Matrix Jdiff(1,3);
    Vector temp=x;
    JacobianCenteredDifference(*this,temp,0.001,Jdiff);
    if(!Jdiff.isEqual(J,1e-2)) {
      cout<<"Jacobian error at "<<x<<endl;
      cout<<Ji<<endl;
      cout<<Jdiff<<endl;
    }
    Assert(Jdiff.isEqual(J,1e-2));
    */
  }
Exemplo n.º 3
0
 virtual void Jacobian(const Vector& x,Matrix& J) {
   J.resize(1,x.n);
   Vector Ji = x;
   Ji(0) = Mod(x[0]+1.5,3.0)-1.5;
   Ji *= 2;
   J.copyRow(0,Ji);
 }
Exemplo n.º 4
0
Matrix* Normalize::filterFeatures(Matrix& features)
{
	Matrix* pOut = new Matrix(features);
	for(size_t i = 0; i < features.rows(); i++)
	{
		vector<double> row = filterFeatures(features[i]);
		pOut->copyRow(row);
	}
	return pOut;
}
Exemplo n.º 5
0
Matrix* Discretize::filterFeatures(Matrix& features)
{
	Matrix* pOut = new Matrix(features);
	pOut->makeContinuousAttrsNominal(m_bins);
	for(size_t i = 0; i < features.rows(); i++)
	{
		vector<double> row = filterFeatures(features[i]);
		pOut->copyRow(row);
	}
	return pOut;
}
Exemplo n.º 6
0
Matrix* NominalToCategorical::filterFeatures(Matrix& features)
{
	Matrix* pOut = new Matrix();
	pOut->setSize(0, m_totalFeatureVals);
	for(size_t i = 0; i < features.rows(); i++)
	{
		vector<double> row = filterFeatures(features[i]);
		pOut->copyRow(row);
	}
	return pOut;
}
Exemplo n.º 7
0
// virtual
Matrix* Normalize::filterLabels(Matrix& labels)
{
	Matrix* pOut = new Matrix(labels);
	for(size_t i = 0; i < labels.rows(); i++)
	{
		vector<double> row;
		if(m_labelMin == UNKNOWN_VALUE) // if the attribute is nominal...
			row.push_back(labels[i][0]);
		else
			row.push_back((labels[i][0] - m_labelMin) / std::max(1e-12, m_labelMax - m_labelMin));
		pOut->copyRow(row);
	}
	return pOut;
}
Exemplo n.º 8
0
 virtual void Jacobian(const Vector& x,Matrix& J) {
   J.resize(1,x.n);
   Vector Ji = x;
   Ji *= 2;
   J.copyRow(0,Ji);
 }
Exemplo n.º 9
0
bool LP_InteriorPoint::Set(const LinearProgram& lp)
{
  Matrix Aeq;
  Vector beq;
  int neq=0,nineq=0;
  for(int i=0;i<lp.A.m;i++) {
    if(lp.ConstraintType(i) == LinearProgram::Fixed) neq++;
    else {
      if(lp.HasLowerBound(lp.ConstraintType(i))) nineq++;
      if(lp.HasUpperBound(lp.ConstraintType(i))) nineq++;
    }
  }
  for(int i=0;i<lp.A.n;i++) {
    if(lp.VariableType(i) == LinearProgram::Fixed) neq++;
    else {
      if(lp.HasLowerBound(lp.VariableType(i))) nineq++;
      if(lp.HasUpperBound(lp.VariableType(i))) nineq++;
    }
  }

  if(neq == 0) {
    x0.clear();
    N.clear();
    ((LinearProgram&)solver) = lp;
    //solver.minimize is ignored by the solver
    if(!solver.minimize) solver.c.inplaceNegative();
    return true;
  }

  Aeq.resize(neq,lp.A.n);
  beq.resize(neq);
  neq=0;
  for(int i=0;i<lp.A.m;i++) {
    if(lp.ConstraintType(i)==LinearProgram::Fixed)
    {
      Vector Ai;
      lp.A.getRowRef(i,Ai);
      Aeq.copyRow(neq,Ai);
      beq(neq) = lp.p(i);
      neq++;
    }
  }
  for (int i=0;i<lp.A.n;i++) {
    if(lp.VariableType(i)==LinearProgram::Fixed)
    {
      Vector Aeqi;
      Aeq.getRowRef(i,Aeqi);
      Aeqi.setZero();
      Aeqi(i) = One;
      beq(neq) = lp.l(i);
      neq++;
    }
  }

  SVDecomposition<Real> svd;
  if(!svd.set(Aeq)) {
    if(solver.verbose>=1) cout<<"LP_InteriorPoint: Couldn't set SVD of equality constraints!!!"<<endl;
    return false;
  }
  svd.backSub(beq,x0);
  svd.getNullspace(N);

  //Set the solver to use the new variable y
  if(N.n == 0) {  //overconstrained!
    cout<<"Overconstrained!"<<endl;
    solver.Resize(0,0);
    return true;
  }

  if(nineq == 0) {
    cout<<"No inequalities!"<<endl;
    abort();
    return true;
  }

  if(solver.verbose >= 1) cout<<"LP_InteriorPoint: Decomposed the problem from "<<lp.A.n<<" to "<<N.n<<" variables"<<endl;

  solver.Resize(nineq,N.n);
  //objective
  foffset = dot(lp.c,x0);
  //c is such that c'*y = lp.c'*N*y => c = N'*lp.c
  N.mulTranspose(lp.c,solver.c);
  solver.minimize = lp.minimize;
  if(!solver.minimize) solver.c.inplaceNegative();


  //inequality constraints
  //q <= Aineq*x <= p
  //q <= Aineq*x0 + Aineq*N*y <= p
  //q - Aineq*x0 <= Aineq*N*y <= p-Aineq*x0
  //==> -Aineq*N*y <= -q + Aineq*x0
  nineq=0;
  for(int i=0;i<lp.A.m;i++) {
    if(lp.ConstraintType(i)==LinearProgram::Fixed) continue;
    if(lp.HasUpperBound(lp.ConstraintType(i))) {
      Vector Ai,sAi;
      lp.A.getRowRef(i,Ai);
      solver.A.getRowRef(nineq,sAi);
      N.mulTranspose(Ai,sAi);
      solver.p(nineq) = lp.p(i) - dot(Ai,x0);
      nineq++;
    }
    if(lp.HasLowerBound(lp.ConstraintType(i))) {
      Vector Ai,sAi;
      lp.A.getRowRef(i,Ai);
      solver.A.getRowRef(nineq,sAi);
      N.mulTranspose(Ai,sAi);
      sAi.inplaceNegative();
      solver.p(nineq) = dot(Ai,x0) - lp.q(i);
      nineq++;
    }
  }

  //transform bounds to inequality constraints
  for(int i=0;i<lp.u.n;i++) {
    if(lp.VariableType(i)==LinearProgram::Fixed) continue;
    if(lp.HasLowerBound(lp.VariableType(i))) {
      //-xi < -li
      //-ei'*N*y <= -li+ei'*x0
      Vector Ni,sAi;
      N.getRowRef(i,Ni);
      solver.A.getRowRef(nineq,sAi);
      sAi.setNegative(Ni);
      solver.p(nineq) = -lp.l(i) + x0(i);
      nineq++;
    }
    if(lp.HasUpperBound(lp.VariableType(i))) {
      //xi < ui
      //ei'*N*y <= ui-ei'*x0
      Vector Ni,sAi;
      N.getRowRef(i,Ni);
      solver.A.getRowRef(nineq,sAi);
      sAi.copy(Ni);
      solver.p(nineq) = lp.u(i) - x0(i);
      nineq++;
    }
  }
  Assert(solver.IsValid());
  return true;
}