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: 3e7ad79fc289
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: f8e0d4588b2e
Choose a head ref
  • 3 commits
  • 5 files changed
  • 1 contributor

Commits on Nov 20, 2021

  1. Copy the full SHA
    89376ea View commit details
  2. Leftover 1337.

    pleroy committed Nov 20, 2021
    Copy the full SHA
    eacc5d3 View commit details
  3. Merge pull request #3207 from pleroy/Optimize

    Optimize some operations of DiscreteTrajectory and friends
    pleroy authored Nov 20, 2021
    Copy the full SHA
    f8e0d45 View commit details
6 changes: 3 additions & 3 deletions benchmarks/discrete_trajectory.cpp
Original file line number Diff line number Diff line change
@@ -89,7 +89,7 @@ void BM_DiscreteTrajectoryFront(benchmark::State& state) {
auto const& segment = trajectory.segments().back();

for (auto _ : state) {
segment.front();
benchmark::DoNotOptimize(segment.front());
}
}
void BM_DiscreteTrajectoryBack(benchmark::State& state) {
@@ -102,7 +102,7 @@ void BM_DiscreteTrajectoryBack(benchmark::State& state) {
auto const& segment = trajectory.segments().back();

for (auto _ : state) {
segment.back();
benchmark::DoNotOptimize(segment.back());
}
}

@@ -116,7 +116,7 @@ void BM_DiscreteTrajectoryBegin(benchmark::State& state) {
auto const& segment = trajectory.segments().back();

for (auto _ : state) {
segment.begin();
benchmark::DoNotOptimize(segment.begin());
}
}

17 changes: 7 additions & 10 deletions physics/discrete_trajectory_iterator_body.hpp
Original file line number Diff line number Diff line change
@@ -13,13 +13,14 @@ using astronomy::InfiniteFuture;
using geometry::Instant;

template<typename Frame>
DiscreteTrajectoryIterator<Frame>&
FORCE_INLINE(inline) DiscreteTrajectoryIterator<Frame>&
DiscreteTrajectoryIterator<Frame>::operator++() {
CHECK(!is_at_end(point_));
auto& point = iterator(point_);
Instant const previous_time = point->time;
do {
if (point == std::prev(segment_->timeline_end())) {
++point;
if (point == segment_->timeline_end()) {
do {
++segment_;
} while (!segment_.is_end() && segment_->timeline_empty());
@@ -30,15 +31,13 @@ DiscreteTrajectoryIterator<Frame>::operator++() {
} else {
point = segment_->timeline_begin();
}
} else {
++point;
}
} while (point->time == previous_time);
return *this;
}

template<typename Frame>
DiscreteTrajectoryIterator<Frame>&
FORCE_INLINE(inline) DiscreteTrajectoryIterator<Frame>&
DiscreteTrajectoryIterator<Frame>::operator--() {
bool const point_is_at_end = is_at_end(point_);
if (point_is_at_end) {
@@ -48,16 +47,14 @@ DiscreteTrajectoryIterator<Frame>::operator--() {
// Now proceed with the decrement.
}
auto& point = iterator(point_);
std::optional<Instant> const previous_time =
point_is_at_end ? std::nullopt : std::make_optional(point->time);
Instant const previous_time = point_is_at_end ? InfiniteFuture : point->time;
do {
if (point == segment_->timeline_begin()) {
CHECK(!segment_.is_begin());
--segment_;
point = std::prev(segment_->timeline_end());
} else {
--point;
point = segment_->timeline_end();
}
--point;
} while (point->time == previous_time);
return *this;
}
7 changes: 4 additions & 3 deletions physics/discrete_trajectory_segment_body.hpp
Original file line number Diff line number Diff line change
@@ -46,13 +46,13 @@ void DiscreteTrajectorySegment<Frame>::SetDownsamplingUnconditionally(
template<typename Frame>
typename DiscreteTrajectorySegment<Frame>::reference
DiscreteTrajectorySegment<Frame>::front() const {
return *begin();
return *timeline_.begin();
}

template<typename Frame>
typename DiscreteTrajectorySegment<Frame>::reference
DiscreteTrajectorySegment<Frame>::back() const {
return *rbegin();
return *std::prev(timeline_.end());
}

template<typename Frame>
@@ -68,7 +68,8 @@ DiscreteTrajectorySegment<Frame>::end() const {
return iterator(self_, timeline_.end());
} else {
// The decrement/increment ensures that we normalize the end iterator to the
// next segment or to the end of the trajectory.
// next segment or to the end of the trajectory. This is relatively
// expensive, taking 25-30 ns.
return ++iterator(self_, --timeline_.end());
}
}
23 changes: 13 additions & 10 deletions physics/discrete_trajectory_segment_iterator_body.hpp
Original file line number Diff line number Diff line change
@@ -6,54 +6,57 @@ namespace principia {
namespace physics {
namespace internal_discrete_trajectory_segment_iterator {

// Note the use of DCHECK, not DCHECK_NOTNULL, below, because the latter does
// not go away when compiled in non-debug mode (don't ask).

template<typename Frame>
DiscreteTrajectorySegmentIterator<Frame>&
DiscreteTrajectorySegmentIterator<Frame>::operator++() {
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
++iterator_;
return *this;
}

template<typename Frame>
DiscreteTrajectorySegmentIterator<Frame>&
DiscreteTrajectorySegmentIterator<Frame>::operator--() {
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
--iterator_;
return *this;
}

template<typename Frame>
DiscreteTrajectorySegmentIterator<Frame>
DiscreteTrajectorySegmentIterator<Frame>::operator++(int) { // NOLINT
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
return DiscreteTrajectorySegmentIterator(segments_, iterator_++);
}

template<typename Frame>
DiscreteTrajectorySegmentIterator<Frame>
DiscreteTrajectorySegmentIterator<Frame>::operator--(int) { // NOLINT
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
return DiscreteTrajectorySegmentIterator(segments_, iterator_--);
}

template<typename Frame>
typename DiscreteTrajectorySegmentIterator<Frame>::reference
DiscreteTrajectorySegmentIterator<Frame>::operator*() const {
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
return *iterator_;
}

template<typename Frame>
typename DiscreteTrajectorySegmentIterator<Frame>::pointer
DiscreteTrajectorySegmentIterator<Frame>::operator->() const {
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
return &*iterator_;
}

template<typename Frame>
bool DiscreteTrajectorySegmentIterator<Frame>::operator==(
DiscreteTrajectorySegmentIterator const& other) const {
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
return segments_ == other.segments_ && iterator_ == other.iterator_;
}

@@ -72,20 +75,20 @@ DiscreteTrajectorySegmentIterator<Frame>::DiscreteTrajectorySegmentIterator(

template<typename Frame>
bool DiscreteTrajectorySegmentIterator<Frame>::is_begin() const {
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
return iterator_ == segments_->begin();
}

template<typename Frame>
bool DiscreteTrajectorySegmentIterator<Frame>::is_end() const {
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
return iterator_ == segments_->end();
}

template<typename Frame>
DiscreteTrajectorySegmentRange<DiscreteTrajectorySegmentIterator<Frame>>
DiscreteTrajectorySegmentIterator<Frame>::segments() const {
CHECK_NOTNULL(segments_);
DCHECK(segments_ != nullptr);
return {DiscreteTrajectorySegmentIterator(segments_, segments_->begin()),
DiscreteTrajectorySegmentIterator(segments_, segments_->end())};
}
46 changes: 23 additions & 23 deletions physics/discrete_trajectory_test.cpp
Original file line number Diff line number Diff line change
@@ -59,7 +59,7 @@ using ::testing::Eq;
using ::testing::HasSubstr;
using ::testing::Not;

class DiscreteTraject0ryTest : public ::testing::Test {
class DiscreteTrajectoryTest : public ::testing::Test {
protected:
using World = Frame<serialization::Frame::TestTag,
Inertial,
@@ -126,17 +126,17 @@ class DiscreteTraject0ryTest : public ::testing::Test {
Instant const t0_;
};

TEST_F(DiscreteTraject0ryTest, Make) {
TEST_F(DiscreteTrajectoryTest, Make) {
auto const trajectory = MakeTrajectory();
}

TEST_F(DiscreteTraject0ryTest, BackFront) {
TEST_F(DiscreteTrajectoryTest, BackFront) {
auto const trajectory = MakeTrajectory();
EXPECT_EQ(t0_, trajectory.front().time);
EXPECT_EQ(t0_ + 14 * Second, trajectory.back().time);
}

TEST_F(DiscreteTraject0ryTest, IterateForward) {
TEST_F(DiscreteTrajectoryTest, IterateForward) {
auto const trajectory = MakeTrajectory();
std::vector<Instant> times;
for (auto const& [t, _] : trajectory) {
@@ -160,7 +160,7 @@ TEST_F(DiscreteTraject0ryTest, IterateForward) {
t0_ + 14 * Second));
}

TEST_F(DiscreteTraject0ryTest, IterateBackward) {
TEST_F(DiscreteTrajectoryTest, IterateBackward) {
auto const trajectory = MakeTrajectory();
std::vector<Instant> times;
for (auto it = trajectory.rbegin(); it != trajectory.rend(); ++it) {
@@ -184,21 +184,21 @@ TEST_F(DiscreteTraject0ryTest, IterateBackward) {
t0_));
}

TEST_F(DiscreteTraject0ryTest, Empty) {
TEST_F(DiscreteTrajectoryTest, Empty) {
DiscreteTrajectory<World> trajectory;
EXPECT_TRUE(trajectory.empty());
trajectory = MakeTrajectory();
EXPECT_FALSE(trajectory.empty());
}

TEST_F(DiscreteTraject0ryTest, Size) {
TEST_F(DiscreteTrajectoryTest, Size) {
DiscreteTrajectory<World> trajectory;
EXPECT_EQ(0, trajectory.size());
trajectory = MakeTrajectory();
EXPECT_EQ(15, trajectory.size());
}

TEST_F(DiscreteTraject0ryTest, Find) {
TEST_F(DiscreteTrajectoryTest, Find) {
auto const trajectory = MakeTrajectory();
{
auto const it = trajectory.find(t0_ + 3 * Second);
@@ -224,7 +224,7 @@ TEST_F(DiscreteTraject0ryTest, Find) {
}
}

TEST_F(DiscreteTraject0ryTest, LowerBound) {
TEST_F(DiscreteTrajectoryTest, LowerBound) {
auto const trajectory = MakeTrajectory();
{
auto const it = trajectory.lower_bound(t0_ + 3.9 * Second);
@@ -273,7 +273,7 @@ TEST_F(DiscreteTraject0ryTest, LowerBound) {
}
}

TEST_F(DiscreteTraject0ryTest, UpperBound) {
TEST_F(DiscreteTrajectoryTest, UpperBound) {
auto const trajectory = MakeTrajectory();
{
auto const it = trajectory.upper_bound(t0_ + 3.9 * Second);
@@ -322,7 +322,7 @@ TEST_F(DiscreteTraject0ryTest, UpperBound) {
}
}

TEST_F(DiscreteTraject0ryTest, Segments) {
TEST_F(DiscreteTrajectoryTest, Segments) {
auto const trajectory = MakeTrajectory();
std::vector<Instant> begin;
std::vector<Instant> rbegin;
@@ -338,7 +338,7 @@ TEST_F(DiscreteTraject0ryTest, Segments) {
ElementsAre(t0_ + 4 * Second, t0_ + 9 * Second, t0_ + 14 * Second));
}

TEST_F(DiscreteTraject0ryTest, RSegments) {
TEST_F(DiscreteTrajectoryTest, RSegments) {
auto const trajectory = MakeTrajectory();
std::vector<Instant> begin;
std::vector<Instant> rbegin;
@@ -354,7 +354,7 @@ TEST_F(DiscreteTraject0ryTest, RSegments) {
ElementsAre(t0_ + 14 * Second, t0_ + 9 * Second, t0_ + 4 * Second));
}

TEST_F(DiscreteTraject0ryTest, DetachSegments) {
TEST_F(DiscreteTrajectoryTest, DetachSegments) {
auto trajectory1 = MakeTrajectory();
auto const first_segment = trajectory1.segments().begin();
auto const second_segment = std::next(first_segment);
@@ -406,7 +406,7 @@ TEST_F(DiscreteTraject0ryTest, DetachSegments) {
}
}

TEST_F(DiscreteTraject0ryTest, AttachSegmentsMatching) {
TEST_F(DiscreteTrajectoryTest, AttachSegmentsMatching) {
auto trajectory1 = MakeTrajectory();
auto trajectory2 = MakeTrajectory(
t0_ + 14 * Second,
@@ -453,7 +453,7 @@ TEST_F(DiscreteTraject0ryTest, AttachSegmentsMatching) {
}
}

TEST_F(DiscreteTraject0ryTest, AttachSegmentsMismatching) {
TEST_F(DiscreteTrajectoryTest, AttachSegmentsMismatching) {
auto trajectory1 = MakeTrajectory();
auto trajectory2 = MakeTrajectory(
t0_ + 15 * Second,
@@ -479,7 +479,7 @@ TEST_F(DiscreteTraject0ryTest, AttachSegmentsMismatching) {
5 * Metre}));
}

TEST_F(DiscreteTraject0ryTest, DeleteSegments) {
TEST_F(DiscreteTrajectoryTest, DeleteSegments) {
auto trajectory = MakeTrajectory();
auto const first_segment = trajectory.segments().begin();
auto second_segment = std::next(first_segment);
@@ -490,7 +490,7 @@ TEST_F(DiscreteTraject0ryTest, DeleteSegments) {
EXPECT_TRUE(second_segment == trajectory.segments().end());
}

TEST_F(DiscreteTraject0ryTest, ForgetAfter) {
TEST_F(DiscreteTrajectoryTest, ForgetAfter) {
auto trajectory = MakeTrajectory();

trajectory.ForgetAfter(trajectory.end());
@@ -516,7 +516,7 @@ TEST_F(DiscreteTraject0ryTest, ForgetAfter) {
EXPECT_EQ(1, trajectory.segments().size());
}

TEST_F(DiscreteTraject0ryTest, ForgetBefore) {
TEST_F(DiscreteTrajectoryTest, ForgetBefore) {
auto trajectory = MakeTrajectory();

trajectory.ForgetBefore(t0_ + 3 * Second);
@@ -570,7 +570,7 @@ TEST_F(DiscreteTraject0ryTest, ForgetBefore) {
EXPECT_TRUE(trajectory.empty());
}

TEST_F(DiscreteTraject0ryTest, TMinTMaxEvaluate) {
TEST_F(DiscreteTrajectoryTest, TMinTMaxEvaluate) {
auto const trajectory = MakeTrajectory();
EXPECT_EQ(t0_, trajectory.t_min());
EXPECT_EQ(t0_ + 14 * Second, trajectory.t_max());
@@ -592,7 +592,7 @@ TEST_F(DiscreteTraject0ryTest, TMinTMaxEvaluate) {
0 * Metre / Second}), 0)));
}

TEST_F(DiscreteTraject0ryTest, SerializationRoundTrip) {
TEST_F(DiscreteTrajectoryTest, SerializationRoundTrip) {
auto const trajectory = MakeTrajectory();
auto const trajectory_first_segment = trajectory.segments().begin();
auto const trajectory_second_segment = std::next(trajectory_first_segment);
@@ -641,7 +641,7 @@ TEST_F(DiscreteTraject0ryTest, SerializationRoundTrip) {
EXPECT_THAT(message2, EqualsProto(message1));
}

TEST_F(DiscreteTraject0ryTest, SerializationExactEndpoints) {
TEST_F(DiscreteTrajectoryTest, SerializationExactEndpoints) {
DiscreteTrajectory<World> trajectory;
AngularFrequency const ω = 3 * Radian / Second;
Length const r = 2 * Metre;
@@ -700,7 +700,7 @@ TEST_F(DiscreteTraject0ryTest, SerializationExactEndpoints) {
IsNear(1.5_⑴ * Milli(Metre) / Second)));
}

TEST_F(DiscreteTraject0ryTest, SerializationRange) {
TEST_F(DiscreteTrajectoryTest, SerializationRange) {
auto const trajectory1 = MakeTrajectory();
auto trajectory2 = MakeTrajectory();

@@ -724,7 +724,7 @@ TEST_F(DiscreteTraject0ryTest, SerializationRange) {
EXPECT_THAT(message1, EqualsProto(message2));
}

TEST_F(DiscreteTraject0ryTest, DISABLED_SerializationPreΖήνωνCompatibility) {
TEST_F(DiscreteTrajectoryTest, DISABLED_SerializationPreΖήνωνCompatibility) {
StringLogSink log_warning(google::WARNING);
auto const serialized_message = ReadFromBinaryFile(
R"(P:\Public Mockingbird\Principia\Saves\3136\trajectory_3136.proto.bin)"); // NOLINT