-
Notifications
You must be signed in to change notification settings - Fork 6
Tree based acceleration for polygon clipping / boolean ops #274
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
base: main
Are you sure you want to change the base?
Conversation
6a29d2a
to
bbd5cac
Compare
This stack of pull requests is managed by Graphite. Learn more about stacking. |
476cf2f
to
be0dd9c
Compare
This was factored out of the "dev branch" #259 and contains the subset of changes that apply to GeometryOpsCore, for easier review. Child PRs: #271 (TGGeometry) -> #275 (AdaptivePredicates) -> #273 (clipping algorithm type) -> #274 (trees) - Use [StableTasks.jl](https://github.com/JuliaFolds2/StableTasks.jl) in apply and applyreduce - its type-stable tasks save us some allocations! - Remove `Base.@assume_effects` on the low level functions, which caused issues on Julia v1.11 and was probably incorrect anyway - Add an algorithm interface with an abstract supertype `Algorithm{M <: Manifold}`, as discussed in #247. Also adds an abstract Operator supertype and some discussion in code comments, but no implementation or interface surface there yet. - Split out `types.jl` into a directory `types` with a bunch of files in it, for ease of readability / docs / use. - (out of context change): refactor CI a bit for cleanliness. TODOs for later (not this PR): - [ ] Add a `format` method that takes in an incompletely specified algorithm and some geometry as input, and returns a completely specified algorithm. What does this mean? Imagine I call `GO.intersection(FosterHormannClipping(), geom1, geom2)`. That `FosterHormannClipping()` should get expanded to `FosterHormannClipping(AutoAlgorithm(), AutoAccelerator())`. Then, `format` will take `format(alg, args...)` and: - get the `crstrait` of the two geometries, scan for incompatibilities, assign the correct manifold to the algorithm (maybe warn or emit debug info) - if no geometries available, get the manifold via `best_manifold(::Algorithm)`. - maybe inflate the accelerator by checking `npoint` and later preparations to see what's most efficient, maybe not - depends on what we want!
71b1953
to
a801c2c
Compare
eef41bd
to
f6d526f
Compare
with optional acceleration via trees and extent thinning
Co-authored-by: Rafael Schouten <rafschouten@gmail.com>
e.g. remove redundant getpoint definitions, etc
do_query -> depth_first_search, etc. Otherwise all is the same.
this probably isn't the best test suite but at least there is something..
Looks like the SingleSTRtree implementation is ignoring some edges somehow...will have to give the a_list and b_list a look later on, maybe during the hackathon. |
somehow single natural tree seems to be swapping the order of intersects.... |
Argh, I forgot to add a hook for f_after_each_a in the loop.....need to switch this to SpatialTreeInterface proper asap! Here's what I am thinking - intersection accelerators can get simpler. struct NestedLoop end
struct TreeAccelerated{Tree1, Tree2}
treetype1::Tree1
treetype2::Tree2
end the trees in there can be tree specs that then get instantiated, I'm thinking something like your ArgsAndKwargs @rafaqz |
Can use STRtrees (expensive to construct, efficient to query) or Natural trees (from
tg
, cheap to construct, ~same query speed for our usecases)There are three methods here:
This algorithm should be easily portable to s2 when that becomes available - and the structure allows e.g. manifold passthrough as well.

This PR also adds a LoopStateMachine module that basically just defines an
Action
wrapper struct, and a macro that can take care of that action wrapper struct.With this macro, a function running within a loop can return
Break()
orContinue()
which indicates to the caller that it should break or continue.E.g.:
TODOs:
tg
benchmarks here