Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: reduce complexity of highly nested blocks #3633

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

AJPfleger
Copy link
Contributor

No description provided.

@AJPfleger AJPfleger added this to the next milestone Sep 19, 2024
@github-actions github-actions bot added Component - Core Affects the Core module Component - Examples Affects the Examples module Component - Plugins Affects one or more Plugins Track Finding labels Sep 19, 2024
Copy link

📊: Physics performance monitoring for 375edfa

Full contents

physmon summary

Copy link

sonarcloud bot commented Sep 19, 2024

Comment on lines +56 to +57

return;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: void return at the end of the function

dynamic_cast<const Acts::TrapezoidBounds*>(&sbounds);
std::vector<Acts::Vector2> trapVerts = trapBounds->vertices();

for (long unsigned int i = 0; i < trapVerts.size(); i++) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

long unsigned int is an interesting type 😄

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wenn man std::size_t bei Wish.com bestellt.

}
}

return;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment as @andiwand gave above

return true;
}

for (int j = -m_cfg.localMaxWindowSize; j <= m_cfg.localMaxWindowSize; j++) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is our test coverage high enough to be able to see if this is equivalent? /cc @goblirsc

Comment on lines +297 to 338
if (m_cfg.localMaxWindowSize == 0) {
return true;
}

for (int j = -m_cfg.localMaxWindowSize; j <= m_cfg.localMaxWindowSize; j++) {
if (y + j >= m_cfg.houghHistSize_y) {
continue;
}

for (int i = -m_cfg.localMaxWindowSize; i <= m_cfg.localMaxWindowSize;
i++) {
if (i == 0 && j == 0) {
continue;
}

if (x + i >= m_cfg.houghHistSize_x) {
continue;
}

if (houghHist.atLocalBins({y + j, x + i}).first <
houghHist.atLocalBins({y, x}).first) {
continue;
}

if (houghHist.atLocalBins({y + j, x + i}).first >
houghHist.atLocalBins({y, x}).first) {
return false;
}

if (houghHist.atLocalBins({y + j, x + i}).second.size() <
houghHist.atLocalBins({y, x}).second.size()) {
continue;
}

if (houghHist.atLocalBins({y + j, x + i}).second.size() >
houghHist.atLocalBins({y, x}).second.size()) {
return false;
}

if (j <= 0 && i <= 0) {
return false; // favor bottom-left (low phi, low neg q/pt)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a case where I am really not sure if the right hand side is actually more readable than the left hand side. The mental load of tracking early returns and continues is quite significant.

Comment on lines +81 to 84
if (!accept) {
break;
}
for (auto y : std::vector<double>{-dy, dy}) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is so you abort earlier. However, this is not at all performance critical code, so readability might be preferable over an earlier abort.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since the loops seem independent something like a product iteration like in python might be nice. then the control flow is easier to handle with a single break. otherwise I agree with paul that the additional looping is not in a critical path so the old version might be preferable

Comment on lines +208 to +238
if (axisTypeA == AxisType::Equidistant &&
axisTypeB == AxisType::Equidistant) {
auto [rangeA, binsA] = eqExtractor(jAxisA);
auto [rangeB, binsB] = eqExtractor(jAxisB);
EqBoundEqClosed ebecAG{rangeA, binsA, rangeB, binsB};
auto grid = GridJsonConverter::fromJson<EqBoundEqClosed, ValueType>(
jGrid, ebecAG);

return generator.createUpdater(std::move(grid), {bValueA, bValueB},
transform);
}

if (axisTypeA == AxisType::Equidistant) {
auto [rangeA, binsA] = eqExtractor(jAxisA);
EqBoundVarClosed ebvcAG{rangeA, binsA, vExtractor(jAxisB)};
auto grid = GridJsonConverter::fromJson<EqBoundVarClosed, ValueType>(
jGrid, ebvcAG);

return generator.createUpdater(std::move(grid), {bValueA, bValueB},
transform);
}

if (axisTypeB == AxisType::Equidistant) {
auto [rangeB, binsB] = eqExtractor(jAxisB);
VarBoundEqClosed vbecAG{vExtractor(jAxisA), rangeB, binsB};
auto grid = GridJsonConverter::fromJson<VarBoundEqClosed, ValueType>(
jGrid, vbecAG);

return generator.createUpdater(std::move(grid), {bValueA, bValueB},
transform);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be an else-if construction.

Comment on lines +81 to +91
if (!accept) {
break;
}
for (auto y : std::vector<double>{-dy, dy}) {
if (!accept) {
break;
}
for (auto z : std::vector<double>{-dz, dz}) {
Vector3 edge = etrf * Vector3(x, y, z);
for (auto& check : options.parseRanges) {
double val = VectorHelpers::cast(edge, check.first);
if (val < check.second.first || val > check.second.second) {
if (!accept) {
break;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't these breaks be put at the end of the inner loop body?

Comment on lines +519 to +539

if (a.direction() == direction) {
std::size_t nBinsA = locBinsA.at(0);
std::size_t nBinsB = locBinsB.at(0);
std::size_t nBinsCommon = locBinsB.at(1);

for (std::size_t i = 1; i <= nBinsA; ++i) {
for (std::size_t j = 1; j <= nBinsCommon; ++j) {
merged.atLocalBins({i, j}) = a.atLocalBins({i, j});
}
}

for (std::size_t i = 1; i <= nBinsCommon; ++i) {
for (std::size_t j = 1; j <= nBinsB; ++j) {
std::size_t tj = j + nBinsA;
merged.atLocalBins({i, tj}) = b.atLocalBins({i, j});
}
for (std::size_t i = 1; i <= nBinsB; ++i) {
for (std::size_t j = 1; j <= nBinsCommon; ++j) {
std::size_t ti = i + nBinsA;
merged.atLocalBins({ti, j}) = b.atLocalBins({i, j});
}
}

return;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could be an else-if construct, avoiding an early return.

@stephenswat
Copy link
Member

Regarding this use of continue and return statements I would like to refer to EWD215 by our lord and saviour Edsger Wybe Dijkstra: https://www.cs.utexas.edu/~EWD/ewd02xx/EWD215.PDF

@github-actions github-actions bot added the Stale label Oct 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Component - Core Affects the Core module Component - Examples Affects the Examples module Component - Plugins Affects one or more Plugins Stale Track Finding
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants