コード例 #1
0
void ParticleSystem::derivative( LargeVector<Matx33d> &K, LargeVector<Vec3d> &V, 
	LargeVector<Vec3d> &F, LargeVector<Matx33d> &M )
{
	clearForces();				// zero the force accumulators
	computeForces(K);			// magic force function
	computeConstraintForces();	// constrain force function

	V.resize(pts.size());
	F.resize(pts.size());
	M.resize(pts.size());
	for (size_t i = 0; i < pts.size(); i++)
	{
		if (pts[i].isPinned)
		{
			V[i] = V3dZero;
			F[i] = V3dZero;
		}
		else
		{
			V[i] = pts[i].v;
			F[i] = pts[i].f;
		}
		M[i] = pts[i].m * I33d;
	}
}
コード例 #2
0
ファイル: greedy.cpp プロジェクト: ikoryakovskiy/grl
LargeVector EpsilonGreedySampler::calculateBaseDistribution(const LargeVector &epsilon) const
{
  // Calculate base distribution
  LargeVector distribution = LargeVector::Constant(epsilon.size(), 0.);
  
  std::vector<double> e;
  fromVector(epsilon, e);
  e.push_back(0.); // So we can start at ii=1.
  std::sort(e.begin(), e.end());
  
  for (size_t ii=1; ii < e.size(); ++ii)
  {
    if (e[ii] != e[ii-1])
    {
      // Divvy up difference in probability among eligible actions.
      size_t eligible = 0;
      for (size_t jj=0; jj < epsilon.size(); ++jj)
        if (e[ii] <= epsilon[jj])
          eligible++;
      for (size_t jj=0; jj < epsilon.size(); ++jj)
        if (e[ii] <= epsilon[jj])
          distribution[jj] += (e[ii]-e[ii-1])/eligible;
    }
  }
  
  TRACE("Base distribution is " << distribution);
  
  return distribution;
}
コード例 #3
0
void SparseGridMtxLU :: SolveLV(const LargeVector &b, LargeVector &x)
{
    if ( & x != & b ) {
        x.Initialize(b, 0, n);
    }

    SolveLU( x.DataPtr() );
}
コード例 #4
0
void ParticleSystem::getState( LargeVector<Vec3d> &P, LargeVector<Vec3d> &V )
{
	P.resize(pts.size());
	V.resize(pts.size());
	for (size_t i = 0; i < pts.size(); i++)
	{
		P[i] = pts[i].cp;
		V[i] = pts[i].v;
	}
}
コード例 #5
0
void ParticleSystem::setState( LargeVector<Vec3d> P, LargeVector<Vec3d> V, bool updateOld )
{
	assert(P.size() == pts.size() && V.size() == pts.size());
	for (size_t i = 0; i < pts.size(); i++)
	{
		if (updateOld)
		{
			pts[i].op = pts[i].cp;
		}
		pts[i].cp = P[i];
		pts[i].v = V[i];
	}
}
コード例 #6
0
ファイル: greedy.cpp プロジェクト: ikoryakovskiy/grl
void EpsilonGreedySampler::distribution(const LargeVector &values, LargeVector *distribution) const
{
  if (epsilon_.size() > 1)
  {
    *distribution = distribution_;
    (*distribution)[GreedySampler::sample(values)] += 1 - distribution_sum_;
  }
  else
  {
    GreedySampler::distribution(values, distribution);
    
    for (size_t ii=0; ii < values.size(); ++ii)
    {
      if ((*distribution)[ii] == 1)
        (*distribution)[ii] = 1-epsilon_[0];
      (*distribution)[ii] += epsilon_[0]/values.size();
    }
  }
}
コード例 #7
0
void ParticleSystem::derivative( LargeVector<Vec3d> &V, LargeVector<Vec3d> &A )
{
	clearForces();
	computeForces();
	computeConstraintForces();	// constrain force function

	V.resize(pts.size());
	A.resize(pts.size());
	for (size_t i = 0; i < pts.size(); i++)
	{
		if (pts[i].isPinned)
		{
			V[i] = V3dZero;
			A[i] = V3dZero;
		}
		else
		{
			V[i] = pts[i].v;
			A[i] = pts[i].f / pts[i].m;
		}
	}
}
コード例 #8
0
ファイル: greedy.cpp プロジェクト: ikoryakovskiy/grl
size_t EpsilonGreedySampler::sample(const LargeVector &values, ActionType *at) const
{
  double r = rand_->get();
  
  if (epsilon_.size() > 1)
  {
    if (epsilon_.size() != values.size())
      throw bad_param("sampler/epsilon_greedy:epsilon");
      
    // Find number of eligible actions
    size_t eligible=0;
    for (size_t ii=0; ii < epsilon_.size(); ++ii)
      if (r < epsilon_[ii])
        eligible++;
        
    if (eligible > 0)
    {
      // Chose one randomly
      size_t ri = rand_->getInteger(eligible);
      for (size_t ii=0; ii < epsilon_.size(); ++ii)
        if (r < epsilon_[ii])
          if (!ri--)
          {
            if (at)
              *at = atExploratory;
            return ii;
          }
    }
  }
  else if (r < epsilon_[0])
  {
    if (at)
      *at = atExploratory;
    return rand_->getInteger(values.size());
  }

  return GreedySampler::sample(values, at);
}
コード例 #9
0
void ParticleSystem::computeForces( LargeVector<Matx33d> &K )
{
	K.resize(pts.size());
	K.clear();

	for (size_t i = 0; i < pts.size(); i++)
	{
		pts[i].f = pts[i].m * g + pts[i].fu + airDamping * pts[i].v;
	}

	for (size_t i = 0; i < springs.size(); i++)
	{
		int p1 = springs[i].p1;
		int p2 = springs[i].p2;
		double l0 = springs[i].l0;
		double ks = springs[i].ks;
		double kd = springs[i].kd;

		Vec3d dx = pts[p1].cp - pts[p2].cp;
		Vec3d dv = pts[p1].v - pts[p2].v;
		double d2 = dx.ddot(dx);
		double d = sqrt(d2);
		Vec3d dxdir = dx / d;

		Matx31d tmpDx = Matx31d(dx);
		Matx33d tmpK = ks * (-I33d + l0 / d * 
			(I33d - 1 / d2 * tmpDx * tmpDx.t()));
		K[p1] += tmpK;
		K[p2] += tmpK;

		Vec3d f = -ks * (d - l0) * dxdir
			+ kd * dv.ddot(dxdir) * dxdir;
		
		pts[p1].f += f;
		pts[p2].f -= f;
	}
}
コード例 #10
0
ファイル: greedy.cpp プロジェクト: ikoryakovskiy/grl
size_t GreedySampler::sample(const LargeVector &values, ActionType *at) const
{
  size_t mai = 0;

  for (size_t ii=1; ii < values.size(); ++ii)
    if (values[ii] > values[mai])
      mai = ii;

  if (rand_max_)
  {
    LargeVector same_values = ConstantVector(values.size(), 0);
    size_t jj = 0;
    for (size_t ii=0; ii < values.size(); ++ii)
      if (values[ii] == values[mai])
        same_values[jj++] = ii;

    if (jj != 0)
      mai = same_values[rand_->getInteger(jj)];
  }

  if (at)
    *at = atGreedy;
  return mai;
}
コード例 #11
0
ファイル: greedy.cpp プロジェクト: ikoryakovskiy/grl
void GreedySampler::distribution(const LargeVector &values, LargeVector *distribution) const
{
  *distribution = LargeVector::Constant(values.size(), 0.);
  (*distribution)[GreedySampler::sample(values)] = 1;
}