Skip to content

Add a max-flow based rigid subgeometry finder#97

Draft
tomcur wants to merge 3 commits intomainfrom
max-flow-min-cut
Draft

Add a max-flow based rigid subgeometry finder#97
tomcur wants to merge 3 commits intomainfrom
max-flow-min-cut

Conversation

@tomcur
Copy link
Copy Markdown
Contributor

@tomcur tomcur commented Sep 16, 2025

This replaces the exhaustively searching dense function with a max-flow based one. The exhaustive search finds minimum dense subgeometry (which is known to be NP-hard), whereas we only need minimal dense subgeometry (in that there isn't a proper subset of that subgeometry that itself is also dense).

Draft, as this needs more explanation in the code, and more validation. I believe this uncovers an issue in the solving: sometimes the final configuration of points is not correct. I've had a quick look, and I think the issue is that child clusters sometimes get wrong poses. When there are two child clusters that share more than one element, those clusters should all be posed such that they agree on the elements' positions. I believe currently, only the elements of the subgeometry now solved for are considered.

tomcur added a commit that referenced this pull request Sep 18, 2025
When solving using a recursive assembly plan, elements we're now solving
for may occur on one or more existing cluster's frontiers. The previous
code correctly solves for those cluster's poses such that all clusters
agree on those elements' global positions.

However, the previous code does not take into account that changing one
of those clusters' poses may move an element that we're not directly
solving for, but which may itself occur on some other cluster's
frontier. That cluster will then also have to be moved, etc.

Therefore, we need to solve for the transitive closure of all elements
affected.

#97 passes once rebased on top of
this.
tomcur added a commit that referenced this pull request Sep 18, 2025
The old routine does a depth-first search, which doesn't actually find
*minimum* dense subgraphs, which a a breadth-first search does find.
Finding small dense subgraphs is important for solving performance. Note
both the DFS and the BFS implementations have exponential
time-complexity, but BFS will in general lead to constructing more
efficient decomposition plans.

#97 introduced a polynomial-time
*minimal* dense subgraph finder (not *minimum*). Its correctness is
harder to check, so I'm thinking to keep the exhaustive search too, for
now, mainly for ease of debugging.

In addition to changing to BFS, this now makes use of the sparsity of
the graph (normally, most elements only have a few incident edges) to
reduce the amount of scanning performed, making this more useful in
practice.
tomcur added a commit that referenced this pull request Sep 22, 2025
The old routine does a depth-first search, which doesn't actually find
*minimum* dense subgraphs, which a a breadth-first search does find.
Finding small dense subgraphs is important for solving performance. Note
both the DFS and the BFS implementations have exponential
time-complexity, but BFS will in general lead to constructing more
efficient decomposition plans.

#97 introduced a polynomial-time
*minimal* dense subgraph finder (not *minimum*). Its correctness is
harder to check, so I'm thinking to keep the exhaustive search too, for
now, mainly for ease of debugging.

In addition to changing to BFS, this now makes use of the sparsity of
the graph (normally, most elements only have a few incident edges) to
reduce the amount of scanning performed, making this more useful in
practice.
tomcur added a commit that referenced this pull request Oct 8, 2025
The old routine does a depth-first search, which doesn't actually find
*minimum* dense subgraphs, which a a breadth-first search does find.
Finding small dense subgraphs is important for solving performance. Note
both the DFS and the BFS implementations have exponential
time-complexity, but BFS will in general lead to constructing more
efficient decomposition plans.

#97 introduced a polynomial-time
*minimal* dense subgraph finder (not *minimum*). Its correctness is
harder to check, so I'm thinking to keep the exhaustive search too, for
now, mainly for ease of debugging.

In addition to changing to BFS, this now makes use of the sparsity of
the graph (normally, most elements only have a few incident edges) to
reduce the amount of scanning performed, making this more useful in
practice.
tomcur added a commit that referenced this pull request Oct 28, 2025
The old routine does a depth-first search, which doesn't actually find
*minimum* dense subgraphs, which a a breadth-first search does find.
Finding small dense subgraphs is important for solving performance. Note
both the DFS and the BFS implementations have exponential
time-complexity, but BFS will in general lead to constructing more
efficient decomposition plans.

#97 introduced a polynomial-time
*minimal* dense subgraph finder (not *minimum*). Its correctness is
harder to check, so I'm thinking to keep the exhaustive search too, for
now, mainly for ease of debugging.

In addition to changing to BFS, this now makes use of the sparsity of
the graph (normally, most elements only have a few incident edges) to
reduce the amount of scanning performed, making this more useful in
practice.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant