9 #ifndef IMPALGEBRA_UNIT_SIMPLEX_D_H 
   10 #define IMPALGEBRA_UNIT_SIMPLEX_D_H 
   12 #include <IMP/algebra/algebra_config.h> 
   17 #include <boost/math/special_functions/gamma.hpp> 
   18 #include <cereal/access.hpp> 
   24 IMPALGEBRA_BEGIN_NAMESPACE
 
   32   virtual int get_dimension() 
const = 0;
 
   37     double ci = 1.0 / 
static_cast<double>(get_dimension());
 
   38     return get_ones_vector_kd<D>(get_dimension(), ci);
 
   49       double atol = std::numeric_limits<double>::epsilon())
 const {
 
   50     int d = p.get_dimension();
 
   51     if (d != get_dimension()) 
return false;
 
   53     for (
int i = 0; i < d; ++i) {
 
   54       if (p[i] < 0) 
return false;
 
   57     if (std::abs(nrm - 1) > d * atol) 
return false;
 
   71   friend class cereal::access;
 
   73   template<
class Archive> 
void serialize(Archive &ar) {}
 
   90   friend class cereal::access;
 
   92   template<
class Archive> 
void serialize(Archive &ar) {
 
  107                       { out << 
"UnitSimplexKD(" << d_ << 
")"; });
 
  113 typedef UnitSimplexD<1> UnitSimplex1D;
 
  133   for (
int i = 0; i < d; ++i)
 
  134     ret.push_back(get_basis_vector_kd<D>(d, i));
 
  140   return Triangle3D(ps[0], ps[1], ps[2]);
 
  152                   "Dimension of point must match dimension of simplex.");
 
  155   std::partial_sum(p.begin(), p.end(), q.begin());
 
  166                   "Dimension of point must match dimension of simplex.");
 
  168   std::adjacent_difference(p.begin(), p.end(), q.begin());
 
  184                   "Dimension of point must match dimension of simplex.");
 
  189   std::sort(u.begin(), u.end(), std::greater<double>());
 
  192   std::partial_sum(u.begin(), u.end(), u_cumsum.begin());
 
  196     if (u[rho] + (1 - u_cumsum[rho]) / (rho + 1) < 0) 
break;
 
  199   double lam = (1 - u_cumsum[rho - 1]) / rho;
 
  201   for (
int i = 0; i < d; ++i) {
 
  202     double ui = p[i] + lam;
 
  203     u[i] = ui > 0 ? ui : 0.0;
 
  209 IMPALGEBRA_END_NAMESPACE
 
int get_dimension() const override
Get dimension D of embedded real space. 
 
Base class for geometric types. 
 
#define IMP_SHOWABLE_INLINE(Name, how_to_show)
Declare the methods needed by an object that can be printed. 
 
VectorD< D > get_zero_vector_kd(int Di)
Return a dynamically sized vector of zeros. 
 
Vector< VectorD< 3 > > Vector3Ds
 
VectorD< D > get_barycenter() const 
Get center of mass on simplex in embedded coordinates. 
 
Represent a unit simplex embedded in D-dimensional real space. 
 
Represent a triangle in 3D. 
 
A more IMP-like version of the std::vector. 
 
#define IMP_INTERNAL_CHECK(expr, message)
An assertion to check for internal errors in IMP. An IMP::ErrorException will be thrown. 
 
#define IMP_VALUES(Name, PluralName)
Define the type for storing sets of values. 
 
Base class for geometric types. 
 
bool get_contains(const VectorD< D > &p, double atol=std::numeric_limits< double >::epsilon()) const 
Get whether the point is on the unit simplex. 
 
VectorD< D > get_increasing_from_embedded(const UnitSimplexD< D > &s, const VectorD< D > &p)
Convert point on simplex from embedded to increasing coordinates. 
 
A Cartesian vector in D-dimensions. 
 
VectorD< D > get_embedded_from_increasing(const UnitSimplexD< D > &s, const VectorD< D > &p)
Convert point on simplex from increasing to embedded coordinates. 
 
int get_dimension() const override
Get dimension of embedded real space. 
 
Represent a triangle in 3D. 
 
UnitSimplexD(int d=1)
Construct from dimension d of embedded real space. 
 
Base class for a unit simplex embedded in D-dimensional real space. 
 
Represent a unit simplex embedded in d-dimensional real space. 
 
Vector< VectorD< D > > get_vertices(const UnitSimplexD< D > &s)
Return a list of the vertices (bases) of the unit simplex. 
 
VectorD< D > get_projected(const UnitSimplexD< D > &s, const VectorD< D > &p)
 
#define IMP_USAGE_CHECK(expr, message)
A runtime test for incorrect usage of a class or method. 
 
Macros to help with objects that can be printed to a stream.