Aikido
RnBoxConstraint-impl.hpp
Go to the documentation of this file.
1 #include <stdexcept>
2 
4 
5 namespace aikido {
6 namespace constraint {
7 namespace uniform {
8 
10 
11 //==============================================================================
12 extern template class RBoxConstraint<0>;
13 
14 extern template class RBoxConstraint<1>;
15 
16 extern template class RBoxConstraint<2>;
17 
18 extern template class RBoxConstraint<3>;
19 
20 extern template class RBoxConstraint<6>;
21 
22 extern template class RBoxConstraint<Eigen::Dynamic>;
23 
24 //==============================================================================
25 template <int N>
27 {
28 public:
29  using VectorNd = Eigen::Matrix<double, N, 1>;
30 
31  statespace::ConstStateSpacePtr getStateSpace() const override;
32 
33  bool sample(statespace::StateSpace::State* _state) override;
34 
35  int getNumSamples() const override;
36 
37  bool canSample() const override;
38 
39 private:
41  std::shared_ptr<const statespace::R<N>> _space,
42  std::unique_ptr<common::RNG> _rng,
43  const VectorNd& _lowerLimits,
44  const VectorNd& _upperLimits);
45 
46  std::shared_ptr<const statespace::R<N>> mSpace;
47  std::unique_ptr<common::RNG> mRng;
48  std::vector<std::uniform_real_distribution<double>> mDistributions;
49 
50  friend class RBoxConstraint<N>;
51 };
52 
53 //==============================================================================
54 template <int N>
56  std::shared_ptr<const statespace::R<N>> _space,
57  std::unique_ptr<common::RNG> _rng,
58  const VectorNd& _lowerLimits,
59  const VectorNd& _upperLimits)
60  : mSpace(std::move(_space)), mRng(std::move(_rng))
61 {
62  const auto dimension = mSpace->getDimension();
63  mDistributions.reserve(dimension);
64 
65  for (std::size_t i = 0; i < dimension; ++i)
66  mDistributions.emplace_back(_lowerLimits[i], _upperLimits[i]);
67 }
68 
69 //==============================================================================
70 template <int N>
73 {
74  return mSpace;
75 }
76 
77 //==============================================================================
78 template <int N>
81 {
82  VectorNd value(mDistributions.size());
83 
84  for (auto i = 0; i < value.size(); ++i)
85  value[i] = mDistributions[i](*mRng);
86 
87  mSpace->setValue(
88  static_cast<typename statespace::R<N>::State*>(_state), value);
89 
90  return true;
91 }
92 
93 //==============================================================================
94 template <int N>
96 {
97  return NO_LIMIT;
98 }
99 
100 //==============================================================================
101 template <int N>
103 {
104  return true;
105 }
106 
107 //==============================================================================
108 template <int N>
110  std::shared_ptr<const statespace::R<N>> _space,
111  std::unique_ptr<common::RNG> _rng,
112  const VectorNd& _lowerLimits,
113  const VectorNd& _upperLimits)
114  : mSpace(std::move(_space))
115  , mRng(std::move(_rng))
116  , mLowerLimits(_lowerLimits)
117  , mUpperLimits(_upperLimits)
118 {
119  if (!mSpace)
120  throw std::invalid_argument("StateSpace is null.");
121 
122  const auto dimension = mSpace->getDimension();
123 
124  if (static_cast<std::size_t>(mLowerLimits.size()) != dimension)
125  {
126  std::stringstream msg;
127  msg << "Lower limits have incorrect dimension: expected "
128  << mSpace->getDimension() << ", got " << mLowerLimits.size() << ".";
129  throw std::invalid_argument(msg.str());
130  }
131 
132  if (static_cast<std::size_t>(mUpperLimits.size()) != dimension)
133  {
134  std::stringstream msg;
135  msg << "Upper limits have incorrect dimension: expected "
136  << mSpace->getDimension() << ", got " << mUpperLimits.size() << ".";
137  throw std::invalid_argument(msg.str());
138  }
139 
140  for (std::size_t i = 0; i < dimension; ++i)
141  {
142  if (mLowerLimits[i] > mUpperLimits[i])
143  {
144  std::stringstream msg;
145  msg << "Unable to sample from StateSpace because lower limit exceeds"
146  << " upper limit on dimension " << i << ": " << mLowerLimits[i]
147  << " > " << mUpperLimits[i] << ".";
148  throw std::invalid_argument(msg.str());
149  }
150  }
151 }
152 
153 //==============================================================================
154 template <int N>
156 {
157  return mSpace;
158 }
159 
160 //==============================================================================
161 template <int N>
163 {
164  // TODO: Only create constraints for bounded dimensions.
165  return mSpace->getDimension();
166 }
167 
168 //==============================================================================
169 template <int N>
170 std::vector<ConstraintType> RBoxConstraint<N>::getConstraintTypes() const
171 {
172  return std::vector<ConstraintType>(
173  mSpace->getDimension(), ConstraintType::INEQUALITY);
174 }
175 
176 //==============================================================================
177 template <int N>
179  const statespace::StateSpace::State* state, TestableOutcome* outcome) const
180 {
181  auto defaultOutcomeObject
182  = dynamic_cast_or_throw<DefaultTestableOutcome>(outcome);
183 
184  const auto value = mSpace->getValue(
185  static_cast<const typename statespace::R<N>::State*>(state));
186 
187  for (auto i = 0; i < value.size(); ++i)
188  {
189  if (value[i] < mLowerLimits[i] || value[i] > mUpperLimits[i])
190  {
191  if (defaultOutcomeObject)
192  defaultOutcomeObject->setSatisfiedFlag(false);
193  return false;
194  }
195  }
196 
197  if (defaultOutcomeObject)
198  defaultOutcomeObject->setSatisfiedFlag(true);
199  return true;
200 }
201 
202 //==============================================================================
203 template <int N>
204 std::unique_ptr<TestableOutcome> RBoxConstraint<N>::createOutcome() const
205 {
206  return std::unique_ptr<TestableOutcome>(new DefaultTestableOutcome);
207 }
208 
209 //==============================================================================
210 template <int N>
213  statespace::StateSpace::State* _out) const
214 {
215  VectorNd value = mSpace->getValue(
216  static_cast<const typename statespace::R<N>::State*>(_s));
217 
218  for (auto i = 0; i < value.size(); ++i)
219  {
220  if (value[i] < mLowerLimits[i])
221  value[i] = mLowerLimits[i];
222  else if (value[i] > mUpperLimits[i])
223  value[i] = mUpperLimits[i];
224  }
225 
226  mSpace->setValue(static_cast<typename statespace::R<N>::State*>(_out), value);
227 
228  return true;
229 }
230 
231 //==============================================================================
232 template <int N>
234  const statespace::StateSpace::State* _s, Eigen::VectorXd& _out) const
235 {
236  auto stateValue = mSpace->getValue(
237  static_cast<const typename statespace::R<N>::State*>(_s));
238 
239  const std::size_t dimension = mSpace->getDimension();
240  _out.resize(dimension);
241 
242  for (std::size_t i = 0; i < dimension; ++i)
243  {
244  if (stateValue[i] < mLowerLimits[i])
245  _out[i] = stateValue[i] - mLowerLimits[i];
246  else if (stateValue[i] > mUpperLimits[i])
247  _out[i] = mUpperLimits[i] - stateValue[i];
248  else
249  _out[i] = 0.;
250  }
251 }
252 
253 //==============================================================================
254 template <int N>
256  const statespace::StateSpace::State* _s, Eigen::MatrixXd& _out) const
257 {
258  auto stateValue = mSpace->getValue(
259  static_cast<const typename statespace::R<N>::State*>(_s));
260 
261  const std::size_t dimension = mSpace->getDimension();
262  _out = Eigen::MatrixXd::Zero(dimension, dimension);
263 
264  for (auto i = 0; i < _out.rows(); ++i)
265  {
266  if (stateValue[i] < mLowerLimits[i])
267  _out(i, i) = -1.;
268  else if (stateValue[i] > mUpperLimits[i])
269  _out(i, i) = 1.;
270  else
271  _out(i, i) = 0.;
272  }
273 }
274 
275 //==============================================================================
276 template <int N>
277 std::unique_ptr<constraint::SampleGenerator>
279 {
280  if (!mRng)
281  throw std::invalid_argument("mRng is null.");
282 
283  for (std::size_t i = 0; i < mSpace->getDimension(); ++i)
284  {
285  if (!std::isfinite(mLowerLimits[i]) || !std::isfinite(mUpperLimits[i]))
286  {
287  std::stringstream msg;
288  msg << "Unable to sample from StateSpace because dimension " << i
289  << " is unbounded.";
290  throw std::runtime_error(msg.str());
291  }
292  }
293 
294  return std::unique_ptr<RnBoxConstraintSampleGenerator<N>>(
296  mSpace, mRng->clone(), mLowerLimits, mUpperLimits));
297 }
298 
299 //==============================================================================
300 template <int N>
302 {
303  return mLowerLimits;
304 }
305 
306 //==============================================================================
307 template <int N>
309 {
310  return mUpperLimits;
311 }
312 
313 } // namespace uniform
314 } // namespace constraint
315 } // namespace aikido
aikido::statespace::R
Represents a N-dimensional real vector space with vector addition as the group operation.
Definition: Rn.hpp:18
aikido::constraint::uniform::RBoxConstraint::mUpperLimits
VectorNd mUpperLimits
Definition: RnBoxConstraint.hpp:88
aikido::constraint::uniform::RBoxConstraint::getJacobian
void getJacobian(const statespace::StateSpace::State *_s, Eigen::MatrixXd &_out) const override
Get the jacobian of constraints evaluated at _s, expressed in the frame each state space is expressed...
Definition: RnBoxConstraint-impl.hpp:255
aikido
Format of serialized trajectory in YAML.
Definition: algorithm.hpp:4
aikido::constraint::SampleGenerator
Generator for drawing samples from a Sampleable.
Definition: Sampleable.hpp:44
aikido::constraint::ConstraintType::INEQUALITY
@ INEQUALITY
aikido::constraint::uniform::RnBoxConstraintSampleGenerator::getNumSamples
int getNumSamples() const override
Gets an upper bound on the number of samples remaining or NO_LIMIT.
Definition: RnBoxConstraint-impl.hpp:95
aikido::constraint::uniform::RBoxConstraint::getValue
void getValue(const statespace::StateSpace::State *_s, Eigen::VectorXd &_out) const override
Get the value of constraints at _s.
Definition: RnBoxConstraint-impl.hpp:233
aikido::constraint::uniform::RnBoxConstraintSampleGenerator
Definition: RnBoxConstraint-impl.hpp:26
aikido::constraint::uniform::RBoxConstraint::mSpace
std::shared_ptr< const statespace::R< N > > mSpace
Definition: RnBoxConstraint.hpp:85
aikido::statespace::ConstStateSpacePtr
std::shared_ptr< const StateSpace > ConstStateSpacePtr
Definition: StateSpace.hpp:15
aikido::constraint::uniform::RBoxConstraint::getStateSpace
statespace::ConstStateSpacePtr getStateSpace() const override
Gets the StateSpace that this constraint operates on.
Definition: RnBoxConstraint-impl.hpp:155
aikido::constraint::uniform::RBoxConstraint::isSatisfied
bool isSatisfied(const statespace::StateSpace::State *state, TestableOutcome *outcome=nullptr) const override
Returns true if state satisfies this constraint.
Definition: RnBoxConstraint-impl.hpp:178
aikido::constraint::uniform::RBoxConstraint::mLowerLimits
VectorNd mLowerLimits
Definition: RnBoxConstraint.hpp:87
aikido::constraint::uniform::RBoxConstraint::getLowerLimits
auto getLowerLimits() const -> const VectorNd &
Returns lower limits of this constraint.
Definition: RnBoxConstraint-impl.hpp:301
aikido::constraint::uniform::RnBoxConstraintSampleGenerator::getStateSpace
statespace::ConstStateSpacePtr getStateSpace() const override
Gets the StateSpace that this SampleGenerator samples from.
Definition: RnBoxConstraint-impl.hpp:72
aikido::constraint::uniform::RBoxConstraint::VectorNd
Eigen::Matrix< double, N, 1 > VectorNd
Definition: RnBoxConstraint.hpp:27
aikido::constraint::DefaultTestableOutcome
Simple default TestableOutcome derivative class.
Definition: DefaultTestableOutcome.hpp:13
RnBoxConstraint.hpp
aikido::constraint::uniform::RBoxConstraint::createSampleGenerator
std::unique_ptr< constraint::SampleGenerator > createSampleGenerator() const override
Creates a SampleGenerator for sampling from this constraint.
Definition: RnBoxConstraint-impl.hpp:278
aikido::constraint::uniform::RBoxConstraint::getUpperLimits
auto getUpperLimits() const -> const VectorNd &
Returns upper limits of this constraint.
Definition: RnBoxConstraint-impl.hpp:308
aikido::constraint::uniform::RBoxConstraint::getConstraintDimension
std::size_t getConstraintDimension() const override
Size of constraints.
Definition: RnBoxConstraint-impl.hpp:162
aikido::constraint::uniform::RBoxConstraint::getConstraintTypes
std::vector< constraint::ConstraintType > getConstraintTypes() const override
Returns a vector of constraints' types, i-th element correspoinding to the type of i-th constraint.
Definition: RnBoxConstraint-impl.hpp:170
aikido::constraint::ConstraintType
ConstraintType
Enum for classifying constraints used in Differentiable.
Definition: Differentiable.hpp:19
aikido::constraint::TestableOutcome
Base class for constraint outcomes.
Definition: TestableOutcome.hpp:13
aikido::constraint::uniform::RnBoxConstraintSampleGenerator::mSpace
std::shared_ptr< const statespace::R< N > > mSpace
Definition: RnBoxConstraint-impl.hpp:46
mSpace
std::shared_ptr< const statespace::R< N > > mSpace
Definition: RnConstantSampler-impl.hpp:46
aikido::constraint::uniform::RnBoxConstraintSampleGenerator::sample
bool sample(statespace::StateSpace::State *_state) override
Returns one sample from this constraint; returns true if succeeded.
Definition: RnBoxConstraint-impl.hpp:79
aikido::constraint::uniform::RnBoxConstraintSampleGenerator::RnBoxConstraintSampleGenerator
RnBoxConstraintSampleGenerator(std::shared_ptr< const statespace::R< N >> _space, std::unique_ptr< common::RNG > _rng, const VectorNd &_lowerLimits, const VectorNd &_upperLimits)
Definition: RnBoxConstraint-impl.hpp:55
aikido::constraint::uniform::RBoxConstraint::project
bool project(const statespace::StateSpace::State *_s, statespace::StateSpace::State *_out) const override
Projection _s to _out.
Definition: RnBoxConstraint-impl.hpp:211
aikido::constraint::uniform::RnBoxConstraintSampleGenerator::mRng
std::unique_ptr< common::RNG > mRng
Definition: RnBoxConstraint-impl.hpp:47
aikido::constraint::uniform::RnBoxConstraintSampleGenerator::mDistributions
std::vector< std::uniform_real_distribution< double > > mDistributions
Definition: RnBoxConstraint-impl.hpp:48
aikido::constraint::uniform::RnBoxConstraintSampleGenerator::canSample
bool canSample() const override
Returns whether getNumSamples() > 0.
Definition: RnBoxConstraint-impl.hpp:102
aikido::statespace::R::State
Point in a R<N>.
Definition: Rn.hpp:22
aikido::statespace::StateSpace::State
Definition: StateSpace.hpp:167
aikido::constraint::uniform::RBoxConstraint::createOutcome
std::unique_ptr< TestableOutcome > createOutcome() const override
Return an instance of DefaultTestableOutcome, since this class doesn't have a more specialized Testab...
Definition: RnBoxConstraint-impl.hpp:204
aikido::constraint::uniform::RBoxConstraint
A BoxConstraint on RealVectorStates.
Definition: RnBoxConstraint.hpp:17
aikido::constraint::uniform::RnBoxConstraintSampleGenerator::VectorNd
Eigen::Matrix< double, N, 1 > VectorNd
Definition: RnBoxConstraint-impl.hpp:29
aikido::constraint::uniform::RBoxConstraint::RBoxConstraint
RBoxConstraint(std::shared_ptr< const statespace::R< N >> _space, std::unique_ptr< common::RNG > _rng, const VectorNd &_lowerLimits, const VectorNd &_upperLimits)
Constructor.
Definition: RnBoxConstraint-impl.hpp:109