Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 438d530e6880
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 9eced774c801
Choose a head ref
  • 4 commits
  • 3 files changed
  • 1 contributor

Commits on Oct 29, 2021

  1. Copy the full SHA
    289221c View commit details
  2. Make a test faster.

    pleroy committed Oct 29, 2021
    Copy the full SHA
    c5f35c5 View commit details

Commits on Oct 30, 2021

  1. Copy the full SHA
    5753d98 View commit details
  2. Merge pull request #3178 from pleroy/SegmentEnd

    Support for using segments().end() as a marker for nonexistent trajectory segments.
    pleroy authored Oct 30, 2021
    Copy the full SHA
    9eced77 View commit details
Showing with 37 additions and 27 deletions.
  1. +1 −1 physics/discrete_traject0ry.hpp
  2. +12 −12 physics/discrete_traject0ry_body.hpp
  3. +24 −14 physics/discrete_traject0ry_test.cpp
2 changes: 1 addition & 1 deletion physics/discrete_traject0ry.hpp
Original file line number Diff line number Diff line change
@@ -86,7 +86,7 @@ class DiscreteTraject0ry : public Trajectory<Frame> {

DiscreteTraject0ry DetachSegments(SegmentIterator begin);
SegmentIterator AttachSegments(DiscreteTraject0ry&& trajectory);
void DeleteSegments(SegmentIterator begin);
void DeleteSegments(SegmentIterator& begin);

// Deletes the trajectory points with a time in [t, end[. Drops the segments
// that are empty as a result.
24 changes: 12 additions & 12 deletions physics/discrete_traject0ry_body.hpp
Original file line number Diff line number Diff line change
@@ -225,7 +225,7 @@ DiscreteTraject0ry<Frame>::AttachSegments(
}

template<typename Frame>
void DiscreteTraject0ry<Frame>::DeleteSegments(SegmentIterator const begin) {
void DiscreteTraject0ry<Frame>::DeleteSegments(SegmentIterator& begin) {
segments_->erase(begin.iterator(), segments_->end());
if (segments_->empty()) {
segment_by_left_endpoint_.clear();
@@ -242,6 +242,8 @@ void DiscreteTraject0ry<Frame>::DeleteSegments(SegmentIterator const begin) {
segment_by_left_endpoint_.end());
}
}
// Make sure that the client doesn't try to use the invalid iterator.
begin = segments().end();

DCHECK_OK(ConsistencyStatus());
}
@@ -370,7 +372,9 @@ void DiscreteTraject0ry<Frame>::WriteToMessage(
absl::flat_hash_map<DiscreteTrajectorySegment<Frame> const*, int>
segment_to_position;
for (int i = 0; i < tracked.size(); ++i) {
segment_to_position.emplace(&*tracked[i], i);
if (tracked[i] != segments().end()) {
segment_to_position.emplace(&*tracked[i], i);
}
}

// Initialize the tracked positions to be able to recognize if some are
@@ -407,13 +411,6 @@ void DiscreteTraject0ry<Frame>::WriteToMessage(
t.WriteToMessage(segment_by_left_endpoint->mutable_left_endpoint());
segment_by_left_endpoint->set_segment(i);
}

// Check that all the segments in |tracked| were mapped.
// NOTE(phl): This might be too strong a constraint in Entwurf.
for (auto const tracked_position : message->tracked_position()) {
CHECK_NE(serialization::DiscreteTrajectory::MISSING_TRACKED_POSITION,
tracked_position);
}
}

template<typename Frame>
@@ -450,9 +447,12 @@ DiscreteTraject0ry<Frame>::ReadFromMessage(
CHECK_EQ(tracked.size(), message.tracked_position_size());
for (int i = 0; i < message.tracked_position_size(); ++i) {
int const tracked_position = message.tracked_position(i);
CHECK_NE(serialization::DiscreteTrajectory::MISSING_TRACKED_POSITION,
tracked_position);
*tracked[i] = segment_iterators[tracked_position];
if (tracked_position ==
serialization::DiscreteTrajectory::MISSING_TRACKED_POSITION) {
*tracked[i] = trajectory.segments().end();
} else {
*tracked[i] = segment_iterators[tracked_position];
}
}

// Finally restore the left endpoints.
38 changes: 24 additions & 14 deletions physics/discrete_traject0ry_test.cpp
Original file line number Diff line number Diff line change
@@ -446,11 +446,12 @@ TEST_F(DiscreteTraject0ryTest, AttachSegments) {
TEST_F(DiscreteTraject0ryTest, DeleteSegments) {
auto trajectory = MakeTrajectory();
auto const first_segment = trajectory.segments().begin();
auto const second_segment = std::next(first_segment);
auto second_segment = std::next(first_segment);
trajectory.DeleteSegments(second_segment);
EXPECT_EQ(1, trajectory.segments().size());
EXPECT_EQ(t0_, trajectory.begin()->time);
EXPECT_EQ(t0_ + 4 * Second, trajectory.rbegin()->time);
EXPECT_TRUE(second_segment == trajectory.segments().end());
}

TEST_F(DiscreteTraject0ryTest, ForgetAfter) {
@@ -546,23 +547,31 @@ TEST_F(DiscreteTraject0ryTest, SerializationRoundTrip) {
auto const trajectory = MakeTrajectory();
auto const trajectory_first_segment = trajectory.segments().begin();
auto const trajectory_second_segment = std::next(trajectory_first_segment);
auto const trajectory_past_the_end = trajectory.segments().end();

serialization::DiscreteTrajectory message1;
trajectory.WriteToMessage(&message1,
/*tracked=*/{trajectory_second_segment},
/*tracked=*/{trajectory_second_segment,
trajectory_past_the_end},
/*exact=*/
{trajectory.lower_bound(t0_ + 2 * Second),
trajectory.lower_bound(t0_ + 3 * Second)});

DiscreteTrajectorySegmentIterator<World> deserialized_second_segment;
DiscreteTrajectorySegmentIterator<World> deserialized_past_the_end;
auto const deserialized_trajectory =
DiscreteTraject0ry<World>::ReadFromMessage(
message1, /*tracked=*/{&deserialized_second_segment});
message1, /*tracked=*/{&deserialized_second_segment,
&deserialized_past_the_end});

// Check that the tracked segment was properly retrieved.
EXPECT_EQ(t0_ + 4 * Second, deserialized_second_segment->begin()->time);
EXPECT_EQ(t0_ + 9 * Second, deserialized_second_segment->rbegin()->time);

// Check that the past-the-end iterator was properly set.
EXPECT_TRUE(deserialized_past_the_end ==
deserialized_trajectory.segments().end());

// Check that the exact points are exact.
EXPECT_EQ(
deserialized_trajectory.lower_bound(t0_ + 2 * Second)->degrees_of_freedom,
@@ -574,7 +583,8 @@ TEST_F(DiscreteTraject0ryTest, SerializationRoundTrip) {
serialization::DiscreteTrajectory message2;
deserialized_trajectory.WriteToMessage(
&message2,
/*tracked=*/{deserialized_second_segment},
/*tracked=*/{deserialized_second_segment,
deserialized_past_the_end},
/*exact=*/
{deserialized_trajectory.lower_bound(t0_ + 2 * Second),
deserialized_trajectory.lower_bound(t0_ + 3 * Second)});
@@ -588,8 +598,8 @@ TEST_F(DiscreteTraject0ryTest, SerializationExactEndpoints) {
Length const r = 2 * Metre;
Time const Δt = 1.0 / 3.0 * Milli(Second);
Instant const t1 = t0_;
Instant const t2 = t0_ + 1000.0 / 7.0 * Second;
Instant const t3 = t0_ + 2000.0 / 11.0 * Second;
Instant const t2 = t0_ + 100.0 / 7.0 * Second;
Instant const t3 = t0_ + 200.0 / 11.0 * Second;
// Downsampling is required for ZFP compression.
DiscreteTrajectorySegment<World>::DownsamplingParameters const
downsampling_parameters{.max_dense_intervals = 100,
@@ -607,9 +617,9 @@ TEST_F(DiscreteTraject0ryTest, SerializationExactEndpoints) {
trajectory);

auto const degrees_of_freedom1 =
trajectory.EvaluateDegreesOfFreedom(t1 + 100 * Second);
trajectory.EvaluateDegreesOfFreedom(t1 + 10 * Second);
auto const degrees_of_freedom2 =
trajectory.EvaluateDegreesOfFreedom(t2 + 20 * Second);
trajectory.EvaluateDegreesOfFreedom(t2 + 2 * Second);

serialization::DiscreteTrajectory message;
trajectory.WriteToMessage(&message, /*tracked=*/{}, /*exact=*/{});
@@ -619,26 +629,26 @@ TEST_F(DiscreteTraject0ryTest, SerializationExactEndpoints) {
DiscreteTraject0ry<World>::ReadFromMessage(message, /*tracked=*/{});

auto const deserialized_degrees_of_freedom1 =
deserialized_trajectory.EvaluateDegreesOfFreedom(t1 + 100 * Second);
deserialized_trajectory.EvaluateDegreesOfFreedom(t1 + 10 * Second);
auto const deserialized_degrees_of_freedom2 =
deserialized_trajectory.EvaluateDegreesOfFreedom(t2 + 20 * Second);
deserialized_trajectory.EvaluateDegreesOfFreedom(t2 + 2 * Second);

// These checks verify that ZFP compression actually happened (so we observe
// small errors on the degrees of freedom).
EXPECT_THAT(
(deserialized_degrees_of_freedom1.position() - World::origin).Norm(),
AbsoluteErrorFrom((degrees_of_freedom1.position() - World::origin).Norm(),
IsNear(0.24_⑴*Milli(Metre))));
IsNear(0.27_⑴*Milli(Metre))));
EXPECT_THAT(deserialized_degrees_of_freedom1.velocity().Norm(),
AbsoluteErrorFrom(degrees_of_freedom1.velocity().Norm(),
IsNear(1.5_⑴ * Micro(Metre) / Second)));
IsNear(82_⑴ * Milli(Metre) / Second)));
EXPECT_THAT(
(deserialized_degrees_of_freedom2.position() - World::origin).Norm(),
AbsoluteErrorFrom((degrees_of_freedom2.position() - World::origin).Norm(),
IsNear(0.16_⑴*Milli(Metre))));
IsNear(0.19_⑴*Milli(Metre))));
EXPECT_THAT(deserialized_degrees_of_freedom2.velocity().Norm(),
AbsoluteErrorFrom(degrees_of_freedom2.velocity().Norm(),
IsNear(0.39_⑴ * Metre / Second)));
IsNear(0.36_⑴ * Metre / Second)));
}

TEST_F(DiscreteTraject0ryTest, DISABLED_SerializationPreΖήνωνCompatibility) {