29 #ifndef CDPL_UTIL_DGCOORDINATESGENERATOR_HPP
30 #define CDPL_UTIL_DGCOORDINATESGENERATOR_HPP
37 #include <boost/random/mersenne_twister.hpp>
38 #include <boost/random/uniform_real.hpp>
39 #include <boost/random/uniform_int.hpp>
57 template <std::
size_t Dim,
typename T,
typename Derived>
65 typedef std::vector<DistanceConstraint> DistanceConstraintList;
157 std::size_t point1Idx;
158 std::size_t point2Idx;
297 template <
typename CoordsArray>
298 void generate(std::size_t num_points, CoordsArray& coords);
306 template <
typename CoordsArray>
324 std::size_t getNumVolumeConstraints()
const;
326 template <
typename CoordsArray>
327 void embedCoords(std::size_t num_points, CoordsArray& coords);
329 template <
typename CoordsArray>
330 void adjCoordsForDistanceConstraint(CoordsArray& coords,
const ValueType& lambda, std::size_t constr_idx)
const;
332 template <
typename Vec>
335 template <
typename CoordsArray>
336 void adjCoordsForVolumeConstraint(CoordsArray& coords,
const ValueType& lambda, std::size_t constr_idx)
const;
338 template <
typename Vec>
339 static ValueType calcDiffVectorAndSquaredDist(
const Vec& pt1_pos,
const Vec& pt2_pos,
ValueType diff[]);
341 typedef boost::random::mt11213b RandNumEngine;
343 std::size_t numCycles;
344 double cycleStepCountFactor;
347 DistanceConstraintList distConstraints;
348 RandNumEngine randomEngine;
351 template <std::
size_t Dim,
typename T,
typename Derived>
354 template <std::
size_t Dim,
typename T,
typename Derived>
357 template <std::
size_t Dim,
typename T,
typename Derived>
360 template <std::
size_t Dim,
typename T,
typename Derived>
364 template <std::
size_t Dim,
typename T,
typename Derived>
375 template <std::
size_t Dim,
typename T>
385 template <
typename T>
393 class VolumeConstraint;
396 typedef std::vector<VolumeConstraint> VolumeConstraintList;
417 class VolumeConstraint
470 std::size_t point1Idx;
471 std::size_t point2Idx;
472 std::size_t point3Idx;
473 std::size_t point4Idx;
561 template <
typename CoordsArray>
565 template <
typename CoordsArray>
566 void adjCoordsForVolumeConstraint(CoordsArray& coords,
const ValueType& lambda, std::size_t constr_idx)
const;
568 template <
typename Vec>
569 void adjCoordsForConstraint(
const VolumeConstraint& constr, Vec& pt1_pos, Vec& pt2_pos, Vec& pt3_pos,
570 Vec& pt4_pos,
const ValueType& lambda)
const;
572 template <
typename Vec>
573 static void calcDiffVector(
const Vec& pt1_pos,
const Vec& pt2_pos,
ValueType diff[]);
575 VolumeConstraintList volConstraints;
589 template <std::
size_t Dim,
typename T,
typename Derived>
591 const ValueType& lb,
const ValueType& ub):
593 point2Idx(pt2_idx), lowerBound(lb), upperBound(ub)
596 template <std::
size_t Dim,
typename T,
typename Derived>
602 template <std::
size_t Dim,
typename T,
typename Derived>
608 template <std::
size_t Dim,
typename T,
typename Derived>
614 template <std::
size_t Dim,
typename T,
typename Derived>
620 template <std::
size_t Dim,
typename T,
typename Derived>
623 if (point1Idx < constr.point1Idx)
626 if (point1Idx == constr.point1Idx)
627 return (point2Idx < constr.point2Idx);
635 template <std::
size_t Dim,
typename T,
typename Derived>
637 numCycles(DEF_NUM_CYCLES), cycleStepCountFactor(DEF_CYCLE_STEP_COUNT_FACTOR), startLearningRate(DEF_START_LEARNING_RATE),
638 learningRateDecr(DEF_LEARNING_RATE_DECREMENT), randomEngine(170375)
641 template <std::
size_t Dim,
typename T,
typename Derived>
643 numCycles(gen.numCycles), cycleStepCountFactor(gen.cycleStepCountFactor),
644 startLearningRate(gen.startLearningRate), learningRateDecr(gen.learningRateDecr),
645 distConstraints(gen.distConstraints),
646 randomEngine(gen.randomEngine)
649 template <std::
size_t Dim,
typename T,
typename Derived>
656 numCycles = gen.numCycles;
657 cycleStepCountFactor = gen.cycleStepCountFactor;
658 startLearningRate = gen.startLearningRate;
659 learningRateDecr = gen.learningRateDecr;
660 distConstraints = gen.distConstraints;
661 randomEngine = gen.randomEngine;
666 template <std::
size_t Dim,
typename T,
typename Derived>
669 distConstraints.clear();
672 template <std::
size_t Dim,
typename T,
typename Derived>
674 const ValueType& lb,
const ValueType& ub)
676 distConstraints.push_back(DistanceConstraint(pt1_idx, pt2_idx, lb, ub));
679 template <std::
size_t Dim,
typename T,
typename Derived>
682 return distConstraints.size();
685 template <std::
size_t Dim,
typename T,
typename Derived>
689 if (idx >= distConstraints.size())
690 throw Base::IndexError(
"DGCoordinatesGeneratorBase: constraint index out of bounds");
692 return distConstraints[idx];
695 template <std::
size_t Dim,
typename T,
typename Derived>
699 if (idx >= distConstraints.size())
700 throw Base::IndexError(
"DGCoordinatesGeneratorBase: constraint index out of bounds");
702 return distConstraints[idx];
705 template <std::
size_t Dim,
typename T,
typename Derived>
708 if (idx >= distConstraints.size())
709 throw Base::IndexError(
"DGCoordinatesGeneratorBase: constraint index out of bounds");
711 distConstraints.erase(distConstraints.begin() + idx);
714 template <std::
size_t Dim,
typename T,
typename Derived>
717 if ((it - distConstraints.begin()) >= distConstraints.size())
718 throw Base::IndexError(
"DGCoordinatesGeneratorBase: constraint iterator out of bounds");
720 distConstraints.erase(it);
723 template <std::
size_t Dim,
typename T,
typename Derived>
727 return distConstraints.begin();
730 template <std::
size_t Dim,
typename T,
typename Derived>
734 return distConstraints.end();
737 template <std::
size_t Dim,
typename T,
typename Derived>
741 return distConstraints.begin();
744 template <std::
size_t Dim,
typename T,
typename Derived>
748 return distConstraints.end();
751 template <std::
size_t Dim,
typename T,
typename Derived>
754 numCycles = num_cycles;
757 template <std::
size_t Dim,
typename T,
typename Derived>
760 cycleStepCountFactor = fact;
763 template <std::
size_t Dim,
typename T,
typename Derived>
766 startLearningRate = rate;
769 template <std::
size_t Dim,
typename T,
typename Derived>
772 learningRateDecr = decr;
775 template <std::
size_t Dim,
typename T,
typename Derived>
781 template <std::
size_t Dim,
typename T,
typename Derived>
784 return cycleStepCountFactor;
787 template <std::
size_t Dim,
typename T,
typename Derived>
791 return startLearningRate;
794 template <std::
size_t Dim,
typename T,
typename Derived>
798 return learningRateDecr;
801 template <std::
size_t Dim,
typename T,
typename Derived>
804 randomEngine.seed(seed);
807 template <std::
size_t Dim,
typename T,
typename Derived>
808 template <
typename CoordsArray>
812 ValueType error = ValueType();
813 ValueType pos_diff[Dim];
815 for (
typename DistanceConstraintList::const_iterator it = distConstraints.begin(), end = distConstraints.end(); it != end; ++it) {
816 const DistanceConstraint& constr = *it;
818 ValueType dist_2 = calcDiffVectorAndSquaredDist(coords[constr.getPoint1Index()], coords[constr.getPoint2Index()], pos_diff);
819 ValueType dist = std::sqrt(dist_2);
820 ValueType lb = constr.getLowerBound();
821 ValueType ub = constr.getUpperBound();
823 if (dist >= lb && dist <= ub)
827 ValueType tmp = (dist_2 - lb * lb) / (0.000001 + lb * lb);
832 ValueType tmp = (dist_2 - ub * ub) / (0.000001 + ub * ub);
841 template <std::
size_t Dim,
typename T,
typename Derived>
847 template <std::
size_t Dim,
typename T,
typename Derived>
850 std::sort(distConstraints.begin(), distConstraints.end());
853 template <std::
size_t Dim,
typename T,
typename Derived>
854 template <
typename CoordsArray>
857 embedCoords(num_points, coords);
860 template <std::
size_t Dim,
typename T,
typename Derived>
861 template <
typename CoordsArray>
864 std::size_t num_dist_constrs = distConstraints.size();
865 std::size_t num_vol_constrs =
static_cast<Derived&
>(*this).getNumVolumeConstraints();
867 if ((num_dist_constrs + num_vol_constrs) == 0)
870 std::size_t num_steps = std::size_t((num_dist_constrs + num_vol_constrs) * cycleStepCountFactor);
871 ValueType lambda = startLearningRate;
873 if (num_dist_constrs > 0 && num_vol_constrs > 0) {
874 boost::random::uniform_int_distribution<std::size_t> constr_sd(0, num_dist_constrs + num_vol_constrs - 1);
876 for (std::size_t i = 0; i < numCycles; i++, lambda -= learningRateDecr) {
877 for (std::size_t j = 0; j < num_steps; j++) {
878 std::size_t constr_idx = constr_sd(randomEngine);
880 if (constr_idx < num_dist_constrs)
881 adjCoordsForDistanceConstraint(coords, lambda, constr_idx);
883 static_cast<Derived&
>(*this).template adjCoordsForVolumeConstraint<CoordsArray>(coords, lambda, constr_idx - num_dist_constrs);
890 if (num_dist_constrs > 0) {
891 boost::random::uniform_int_distribution<std::size_t> constr_sd(0, num_dist_constrs - 1);
893 for (std::size_t i = 0; i < numCycles; i++, lambda -= learningRateDecr)
894 for (std::size_t j = 0; j < num_steps; j++)
895 adjCoordsForDistanceConstraint(coords, lambda, constr_sd(randomEngine));
900 boost::random::uniform_int_distribution<std::size_t> constr_sd(0, num_vol_constrs - 1);
902 for (std::size_t i = 0; i < numCycles; i++, lambda -= learningRateDecr)
903 for (std::size_t j = 0; j < num_steps; j++)
904 static_cast<Derived&
>(*this).template adjCoordsForVolumeConstraint<CoordsArray>(coords, lambda, constr_sd(randomEngine));
907 template <std::
size_t Dim,
typename T,
typename Derived>
908 template <
typename CoordsArray>
910 std::size_t constr_idx)
const
912 const DistanceConstraint& constr = distConstraints[constr_idx];
914 adjCoordsForConstraint(constr, coords[constr.getPoint1Index()], coords[constr.getPoint2Index()], lambda);
917 template <std::
size_t Dim,
typename T,
typename Derived>
918 template <
typename Vec>
920 Vec& pt2_pos,
const ValueType& lambda)
const
922 ValueType pos_diff[Dim];
923 ValueType dist = std::sqrt(calcDiffVectorAndSquaredDist(pt1_pos, pt2_pos, pos_diff));
925 ValueType ub = constr.getUpperBound();
926 ValueType lb = constr.getLowerBound();
928 if (dist >= lb && dist <= ub)
931 ValueType bound = (dist > ub ? ub : lb);
932 ValueType factor = lambda / 2 * (bound - dist) / (0.000001 + dist);
934 for (std::size_t i = 0; i < Dim; i++) {
935 ValueType pos_delta = pos_diff[i] * factor;
937 pt1_pos[i] -= pos_delta;
938 pt2_pos[i] += pos_delta;
942 template <std::
size_t Dim,
typename T,
typename Derived>
943 template <
typename CoordsArray>
945 std::size_t constr_idx)
const
948 template <std::
size_t Dim,
typename T,
typename Derived>
949 template <
typename Vec>
953 ValueType dist_2 = ValueType();
955 for (std::size_t i = 0; i < Dim; i++) {
956 diff[i] = pt2_pos[i] - pt1_pos[i];
957 dist_2 += diff[i] * diff[i];
966 template <
typename T>
968 std::size_t pt3_idx, std::size_t pt4_idx,
969 const ValueType& lb,
const ValueType& ub):
971 point2Idx(pt2_idx), point3Idx(pt3_idx), point4Idx(pt4_idx), lowerBound(lb), upperBound(ub)
974 template <
typename T>
980 template <
typename T>
986 template <
typename T>
992 template <
typename T>
998 template <
typename T>
1005 template <
typename T>
1015 template <
typename T>
1018 volConstraints.clear();
1021 template <
typename T>
1023 std::size_t pt4_idx,
const ValueType& lb,
const ValueType& ub)
1025 volConstraints.push_back(VolumeConstraint(pt1_idx, pt2_idx, pt3_idx, pt4_idx, lb, ub));
1028 template <
typename T>
1031 return volConstraints.size();
1034 template <
typename T>
1038 if (idx >= volConstraints.size())
1039 throw Base::IndexError(
"DGCoordinatesGenerator: constraint index out of bounds");
1041 return volConstraints[idx];
1044 template <
typename T>
1047 if (idx >= volConstraints.size())
1048 throw Base::IndexError(
"DGCoordinatesGenerator: constraint index out of bounds");
1050 volConstraints.erase(volConstraints.begin() + idx);
1053 template <
typename T>
1056 if ((it - volConstraints.begin()) >= volConstraints.size())
1057 throw Base::IndexError(
"DGCoordinatesGenerator: constraint iterator out of bounds");
1059 volConstraints.erase(it);
1062 template <
typename T>
1066 return volConstraints.begin();
1069 template <
typename T>
1073 return volConstraints.end();
1076 template <
typename T>
1080 return volConstraints.begin();
1083 template <
typename T>
1087 return volConstraints.end();
1090 template <
typename T>
1091 template <
typename CoordsArray>
1095 ValueType error = ValueType();
1100 for (
typename VolumeConstraintList::const_iterator it = volConstraints.begin(), end = volConstraints.end(); it != end; ++it) {
1101 const VolumeConstraint& constr = *it;
1103 calcDiffVector(coords[constr.getPoint4Index()], coords[constr.getPoint1Index()], v_41);
1104 calcDiffVector(coords[constr.getPoint4Index()], coords[constr.getPoint2Index()], v_42);
1105 calcDiffVector(coords[constr.getPoint4Index()], coords[constr.getPoint3Index()], v_43);
1107 ValueType vol = (v_41[0] * (v_42[1] * v_43[2] - v_42[2] * v_43[1]) - v_41[1] * (v_42[0] * v_43[2] - v_42[2] * v_43[0]) + v_41[2] * (v_42[0] * v_43[1] - v_42[1] * v_43[0])) / 6;
1109 ValueType lb = constr.getLowerBound();
1110 ValueType ub = constr.getUpperBound();
1112 if (vol >= lb && vol <= ub)
1116 ValueType tmp = (vol - lb);
1121 ValueType tmp = (vol - ub);
1130 template <
typename T>
1131 template <
typename CoordsArray>
1134 const VolumeConstraint& constr = volConstraints[constr_idx];
1136 adjCoordsForConstraint(constr, coords[constr.getPoint1Index()], coords[constr.getPoint2Index()],
1137 coords[constr.getPoint3Index()], coords[constr.getPoint4Index()], lambda);
1140 template <
typename T>
1141 template <
typename Vec>
1143 Vec& pt4_pos,
const ValueType& lambda)
const
1145 Vec* pt_pos[4] = {&pt1_pos, &pt2_pos, &pt3_pos, &pt4_pos};
1150 calcDiffVector(*pt_pos[3], *pt_pos[0], v_41);
1151 calcDiffVector(*pt_pos[3], *pt_pos[1], v_42);
1152 calcDiffVector(*pt_pos[3], *pt_pos[2], v_43);
1156 g[0][0] = (v_42[1] * v_43[2] - v_42[2] * v_43[1]) / 6;
1157 g[0][1] = -(v_42[0] * v_43[2] - v_42[2] * v_43[0]) / 6;
1158 g[0][2] = (v_42[0] * v_43[1] - v_42[1] * v_43[0]) / 6;
1160 ValueType vol = (v_41[0] * g[0][0] + v_41[1] * g[0][1] + v_41[2] * g[0][2]);
1161 ValueType ub = constr.getUpperBound();
1162 ValueType lb = constr.getLowerBound();
1164 if (vol >= lb && vol <= ub)
1167 g[1][0] = (v_41[2] * v_43[1] - v_41[1] * v_43[2]) / 6;
1168 g[1][1] = (v_41[0] * v_43[2] - v_41[2] * v_43[0]) / 6;
1169 g[1][2] = (v_41[1] * v_43[0] - v_41[0] * v_43[1]) / 6;
1171 g[2][0] = (v_41[1] * v_42[2] - v_41[2] * v_42[1]) / 6;
1172 g[2][1] = (v_41[2] * v_42[0] - v_41[0] * v_42[2]) / 6;
1173 g[2][2] = (v_41[0] * v_42[1] - v_41[1] * v_42[0]) / 6;
1175 g[3][0] = -g[0][0] - g[1][0] - g[2][0];
1176 g[3][1] = -g[0][1] - g[1][1] - g[2][1];
1177 g[3][2] = -g[0][2] - g[1][2] - g[2][2];
1179 ValueType g_len2_sum = ValueType();
1181 for (std::size_t i = 0; i < 4; i++)
1182 g_len2_sum += g[i][0] * g[i][0] + g[i][1] * g[i][1] + g[i][2] * g[i][2];
1184 ValueType bound = (vol < lb ? lb : ub);
1185 ValueType fact = lambda * (bound - vol) / g_len2_sum;
1187 for (std::size_t i = 0; i < 4; i++)
1188 for (std::size_t j = 0; j < 3; j++)
1189 (*pt_pos[i])[j] += fact * g[i][j];
1192 template <
typename T>
1193 template <
typename Vec>
1196 for (std::size_t i = 0; i < 3; i++)
1197 diff[i] = pt2_pos[i] - pt1_pos[i];
Definition of exception classes.
A constraint that pins the distance between two points to the interval [lb, ub].
Definition: DGCoordinatesGenerator.hpp:112
bool operator<(const DistanceConstraint &constr) const
Lexicographic less-than comparison on (point1Idx, point2Idx).
std::size_t getPoint1Index() const
Returns the index of the first constrained point.
std::size_t getPoint2Index() const
Returns the index of the second constrained point.
DistanceConstraint(std::size_t pt1_idx, std::size_t pt2_idx, const ValueType &lb, const ValueType &ub)
Constructs a distance constraint for the points with indices pt1_idx and pt2_idx whose Euclidean dist...
const ValueType & getLowerBound() const
Returns the lower distance bound.
const ValueType & getUpperBound() const
Returns the upper distance bound.
Serves as foundation for subclasses that perform coordinates generation based on distance-geometry.
Definition: DGCoordinatesGenerator.hpp:59
~DGCoordinatesGeneratorBase()
Definition: DGCoordinatesGenerator.hpp:319
std::size_t getNumCycles() const
Returns the currently configured number of optimization cycles.
void setNumCycles(std::size_t num_cycles)
Sets the number of optimization cycles.
DGCoordinatesGeneratorBase & operator=(const DGCoordinatesGeneratorBase &gen)
const ValueType & getStartLearningRate() const
Returns the currently configured initial learning rate.
void setCycleStepCountFactor(double fact)
Sets the multiplier that determines the per-cycle step count (steps per cycle = factor * number of co...
void setStartLearningRate(const ValueType &rate)
Sets the initial learning rate used by the first optimization cycle.
DistanceConstraint & getDistanceConstraint(std::size_t idx)
Returns the distance constraint at index idx.
static constexpr std::size_t DEF_NUM_CYCLES
Default number of optimization cycles.
Definition: DGCoordinatesGenerator.hpp:91
static constexpr double DEF_CYCLE_STEP_COUNT_FACTOR
Default per-cycle step-count multiplier (steps per cycle = factor * number of constraints).
Definition: DGCoordinatesGenerator.hpp:96
void addDistanceConstraint(std::size_t pt1_idx, std::size_t pt2_idx, const ValueType &lb, const ValueType &ub)
Appends a new distance constraint to the list of configured constraints.
void removeDistanceConstraint(std::size_t idx)
Removes the distance constraint at index idx.
std::size_t getNumDistanceConstraints() const
Returns the number of configured distance constraints.
void setRandomSeed(unsigned int seed)
Sets the seed of the internal random number generator used to initialize the coordinates.
DistanceConstraintList::iterator DistanceConstraintIterator
A mutable iterator over the configured distance constraints.
Definition: DGCoordinatesGenerator.hpp:71
const DistanceConstraint & getDistanceConstraint(std::size_t idx) const
Returns the distance constraint at index idx.
const ValueType & getLearningRateDecrement() const
Returns the currently configured per-cycle learning-rate decrement.
void removeDistanceConstraint(const DistanceConstraintIterator &it)
Removes the distance constraint referenced by iterator it.
ConstDistanceConstraintIterator getDistanceConstraintsBegin() const
Returns a constant iterator pointing to the first distance constraint.
void setLearningRateDecrement(const ValueType &decr)
Sets the per-cycle learning-rate decrement.
DistanceConstraintIterator getDistanceConstraintsEnd()
Returns a mutable iterator pointing one past the last distance constraint.
static constexpr ValueType DEF_LEARNING_RATE_DECREMENT
Default per-cycle decrement subtracted from the learning rate.
Definition: DGCoordinatesGenerator.hpp:106
void generate(std::size_t num_points, CoordsArray &coords)
Generates num_points coordinate vectors that try to satisfy the configured constraints and stores the...
void clearDistanceConstraints()
Removes all configured distance constraints.
static constexpr std::size_t COORDS_DIM
Dimensionality of the coordinate space.
Definition: DGCoordinatesGenerator.hpp:86
static constexpr ValueType DEF_START_LEARNING_RATE
Default initial learning rate.
Definition: DGCoordinatesGenerator.hpp:101
ValueType getDistanceError(const CoordsArray &coords) const
Computes the cumulative squared distance error of coords against the configured distance constraints.
double getCycleStepCountFactor() const
Returns the currently configured per-cycle step-count factor.
void orderDistanceConstraints()
Sorts the configured distance constraints in lexicographic order.
DistanceConstraintIterator getDistanceConstraintsBegin()
Returns a mutable iterator pointing to the first distance constraint.
DGCoordinatesGeneratorBase(const DGCoordinatesGeneratorBase &gen)
DGCoordinatesGeneratorBase()
DistanceConstraintList::const_iterator ConstDistanceConstraintIterator
A constant iterator over the configured distance constraints.
Definition: DGCoordinatesGenerator.hpp:76
T ValueType
The scalar value type used for coordinates and constraint bounds.
Definition: DGCoordinatesGenerator.hpp:81
ConstDistanceConstraintIterator getDistanceConstraintsEnd() const
Returns a constant iterator pointing one past the last distance constraint.
std::size_t getPoint2Index() const
Returns the index of the second constrained point.
std::size_t getPoint4Index() const
Returns the index of the fourth constrained point.
const ValueType & getLowerBound() const
Returns the lower volume bound.
std::size_t getPoint3Index() const
Returns the index of the third constrained point.
std::size_t getPoint1Index() const
Returns the index of the first constrained point.
VolumeConstraint(std::size_t pt1_idx, std::size_t pt2_idx, std::size_t pt3_idx, std::size_t pt4_idx, const ValueType &lb, const ValueType &ub)
Constructs a volume constraint for the tetrahedron spanned by the four points with the given indices.
const ValueType & getUpperBound() const
Returns the upper volume bound.
const VolumeConstraint & getVolumeConstraint(std::size_t idx) const
Returns the volume constraint at index idx.
VolumeConstraintList::iterator VolumeConstraintIterator
A mutable iterator over the configured volume constraints.
Definition: DGCoordinatesGenerator.hpp:407
VolumeConstraintIterator getVolumeConstraintsBegin()
Returns a mutable iterator pointing to the first volume constraint.
VolumeConstraint & getVolumeConstraint(std::size_t idx)
Returns the volume constraint at index idx.
void removeVolumeConstraint(const VolumeConstraintIterator &it)
Removes the volume constraint referenced by iterator it.
ValueType getVolumeError(const CoordsArray &coords) const
Computes the cumulative volume error of coords against the configured volume constraints.
void removeVolumeConstraint(std::size_t idx)
Removes the volume constraint at index idx.
VolumeConstraintList::const_iterator ConstVolumeConstraintIterator
A constant iterator over the configured volume constraints.
Definition: DGCoordinatesGenerator.hpp:412
void addVolumeConstraint(std::size_t pt1_idx, std::size_t pt2_idx, std::size_t pt3_idx, std::size_t pt4_idx, const ValueType &lb, const ValueType &ub)
Appends a new volume constraint to the list of configured constraints.
std::size_t getNumVolumeConstraints() const
Returns the number of configured volume constraints.
ConstVolumeConstraintIterator getVolumeConstraintsBegin() const
Returns a constant iterator pointing to the first volume constraint.
ConstVolumeConstraintIterator getVolumeConstraintsEnd() const
Returns a constant iterator pointing one past the last volume constraint.
void clearVolumeConstraints()
Removes all configured volume constraints.
BaseType::ValueType ValueType
The scalar value type used for coordinates and constraint bounds.
Definition: DGCoordinatesGenerator.hpp:402
VolumeConstraintIterator getVolumeConstraintsEnd()
Returns a mutable iterator pointing one past the last volume constraint.
Generic distance-geometry implementation for the generation of coordinates that fulfill user-provided...
Definition: DGCoordinatesGenerator.hpp:377
constexpr unsigned int T
Specifies Hydrogen (Tritium).
Definition: AtomType.hpp:67
DGCoordinatesGenerator< 3, double > DG3DCoordinatesGenerator
Convenience alias for the 3D coordinates generator with double-precision values.
Definition: DGCoordinatesGenerator.hpp:581
The namespace of the Chemical Data Processing Library.