Skip to content

Commit 50a9df8

Browse files
adding getTermsSize to constraintCollection
1 parent 1f684c8 commit 50a9df8

File tree

5 files changed

+69
-10
lines changed

5 files changed

+69
-10
lines changed

ocs2_core/include/ocs2_core/constraint/StateConstraintCollection.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@ class StateConstraintCollection : public Collection<StateConstraint> {
4949
~StateConstraintCollection() override = default;
5050
StateConstraintCollection* clone() const override;
5151

52-
/** Returns the number of active constraints at given time. */
53-
virtual size_t getNumConstraints(scalar_t time) const;
52+
/** Returns the number of active constraints at a given time. */
53+
size_t getNumConstraints(scalar_t time) const;
54+
55+
/** Returns the number of active constraints at a given time for each term. If a term is inactive, its size is zero. */
56+
size_array_t getTermsSize(scalar_t time) const;
5457

5558
/** Get an array of all constraints */
5659
virtual vector_array_t getValue(scalar_t time, const vector_t& state, const PreComputation& preComp) const;

ocs2_core/include/ocs2_core/constraint/StateInputConstraintCollection.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@ class StateInputConstraintCollection : public Collection<StateInputConstraint> {
4949
~StateInputConstraintCollection() override = default;
5050
StateInputConstraintCollection* clone() const override;
5151

52-
/** Returns the number of active constraints at given time. */
53-
virtual size_t getNumConstraints(scalar_t time) const;
52+
/** Returns the number of active constraints at a given time. */
53+
size_t getNumConstraints(scalar_t time) const;
54+
55+
/** Returns the number of active constraints at a given time for each term. If a term is inactive, its size is zero. */
56+
size_array_t getTermsSize(scalar_t time) const;
5457

5558
/** Get an array of all constraints */
5659
virtual vector_array_t getValue(scalar_t time, const vector_t& state, const vector_t& input, const PreComputation& preComp) const;

ocs2_core/src/constraint/StateConstraintCollection.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,27 @@ StateConstraintCollection* StateConstraintCollection::clone() const {
4848
/******************************************************************************************************/
4949
size_t StateConstraintCollection::getNumConstraints(scalar_t time) const {
5050
size_t numConstraints = 0;
51-
52-
// accumulate number of constraints for each constraintTerm
5351
for (const auto& constraintTerm : this->terms_) {
5452
if (constraintTerm->isActive(time)) {
5553
numConstraints += constraintTerm->getNumConstraints(time);
5654
}
5755
}
58-
5956
return numConstraints;
6057
}
6158

59+
/******************************************************************************************************/
60+
/******************************************************************************************************/
61+
/******************************************************************************************************/
62+
size_array_t StateConstraintCollection::getTermsSize(scalar_t time) const {
63+
size_array_t termsSize(this->terms_.size(), 0);
64+
for (size_t i = 0; i < this->terms_.size(); ++i) {
65+
if (this->terms_[i]->isActive(time)) {
66+
termsSize[i] = this->terms_[i]->getNumConstraints(time);
67+
}
68+
}
69+
return termsSize;
70+
}
71+
6272
/******************************************************************************************************/
6373
/******************************************************************************************************/
6474
/******************************************************************************************************/

ocs2_core/src/constraint/StateInputConstraintCollection.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,27 @@ StateInputConstraintCollection* StateInputConstraintCollection::clone() const {
4949
/******************************************************************************************************/
5050
size_t StateInputConstraintCollection::getNumConstraints(scalar_t time) const {
5151
size_t numConstraints = 0;
52-
53-
// accumulate number of constraints for each constraintTerm
5452
for (const auto& constraintTerm : this->terms_) {
5553
if (constraintTerm->isActive(time)) {
5654
numConstraints += constraintTerm->getNumConstraints(time);
5755
}
5856
}
59-
6057
return numConstraints;
6158
}
6259

60+
/******************************************************************************************************/
61+
/******************************************************************************************************/
62+
/******************************************************************************************************/
63+
size_array_t StateInputConstraintCollection::getTermsSize(scalar_t time) const {
64+
size_array_t termsSize(this->terms_.size(), 0);
65+
for (size_t i = 0; i < this->terms_.size(); ++i) {
66+
if (this->terms_[i]->isActive(time)) {
67+
termsSize[i] = this->terms_[i]->getNumConstraints(time);
68+
}
69+
}
70+
return termsSize;
71+
}
72+
6373
/******************************************************************************************************/
6474
/******************************************************************************************************/
6575
/******************************************************************************************************/

ocs2_core/test/constraint/testConstraintCollection.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2727
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828
******************************************************************************/
2929

30+
#include <numeric>
31+
3032
#include <gtest/gtest.h>
3133

3234
#include <ocs2_core/constraint/StateConstraintCollection.h>
@@ -56,6 +58,37 @@ TEST(TestConstraintCollection, numberOfConstraints) {
5658
EXPECT_EQ(constraintCollection.getNumConstraints(0.0), addedConstraints);
5759
}
5860

61+
TEST(TestConstraintCollection, termsSize) {
62+
ocs2::StateInputConstraintCollection constraintCollection;
63+
64+
// Initially we have zero constraints for all types
65+
auto termsSize = constraintCollection.getTermsSize(0.0);
66+
EXPECT_EQ(termsSize.size(), 0);
67+
EXPECT_EQ(std::accumulate(termsSize.begin(), termsSize.end(), 0), 0);
68+
69+
// Add 2 Linear inequality constraint term, which has 2 constraints
70+
constraintCollection.add("Constraint1", std::make_unique<TestDummyConstraint>());
71+
constraintCollection.add("Constraint2", std::make_unique<TestDummyConstraint>());
72+
constraintCollection.add("Constraint3", std::make_unique<TestDummyConstraint>());
73+
auto& constraint1 = constraintCollection.get<TestDummyConstraint>("Constraint1");
74+
const size_t constraint1Size = constraint1.getNumConstraints(0.0);
75+
76+
// Check the right constraint size
77+
termsSize = constraintCollection.getTermsSize(0.0);
78+
EXPECT_EQ(termsSize.size(), 3);
79+
if (termsSize.size() == 3) {
80+
EXPECT_EQ(termsSize[0], constraint1Size);
81+
EXPECT_EQ(termsSize[1], constraint1Size);
82+
EXPECT_EQ(termsSize[2], constraint1Size);
83+
}
84+
85+
// Deactivate constraint1
86+
constraint1.setActivity(false);
87+
termsSize = constraintCollection.getTermsSize(0.0);
88+
EXPECT_EQ(termsSize.size(), 3);
89+
EXPECT_EQ(std::accumulate(termsSize.begin(), termsSize.end(), 0), 2 * constraint1Size);
90+
}
91+
5992
TEST(TestConstraintCollection, activatingConstraints) {
6093
ocs2::StateInputConstraintCollection constraintCollection;
6194

0 commit comments

Comments
 (0)