mirror of
https://github.com/storytold/craft-libs.git
synced 2026-11-14 22:42:46 +00:00
Merge pull request #637 from dotCooCoo/fix/linesweeper-sweep-doc-left-scan
linesweeper: the left intersection scan in docs/sweep.typ compares with alpha^(i+1)
This commit is contained in:
4 files changed
+29
-21
No files matched your search
@@ -254,9 +254,10 @@ applications retain their own document-font selection and licensing policy.
|
||||
linesweeper
|
||||
|
||||
linesweeper 0.5.0 (https://crates.io/crates/linesweeper/0.5.0), MIT OR Apache-2.0, is stored in
|
||||
vendor/linesweeper with its upstream license files and one local patch. Its manifest names Joe Neeman
|
||||
as author, and its LICENSE-MIT reads "Copyright (c) 2018 Raph Levien". See
|
||||
vendor/linesweeper/README.craft.md and vendor/linesweeper/SOURCE.json for provenance, the local patch
|
||||
vendor/linesweeper with its upstream license files and local patches, to src/sweep/sweep_line.rs and
|
||||
docs/sweep.typ. Its manifest names Joe Neeman as author, and its LICENSE-MIT reads "Copyright (c) 2018
|
||||
Raph Levien". See vendor/linesweeper/README.craft.md and vendor/linesweeper/SOURCE.json for
|
||||
provenance, the local patches
|
||||
and the files left out.
|
||||
|
||||
Platform lifecycle source provenance
|
||||
|
||||
Vendored
+10
-6
@@ -1,21 +1,25 @@
|
||||
# Local linesweeper 0.5.0 copy
|
||||
|
||||
This is the crates.io linesweeper 0.5.0 package (MIT OR Apache-2.0) with some files left out and the
|
||||
local patch listed below. `.cargo_vcs_info.json` names the commit it was packaged from,
|
||||
`824b0791a750f7b27b8edcbb6c6244d0e629875e`. That commit is not in the GitHub repository the manifest
|
||||
names, which is archived; its README says development moved off GitHub.
|
||||
local patches listed below, to `src/sweep/sweep_line.rs` and `docs/sweep.typ`. `.cargo_vcs_info.json`
|
||||
names the commit it was packaged from, `824b0791a750f7b27b8edcbb6c6244d0e629875e`. That commit is not
|
||||
in the GitHub repository the manifest names, which is archived; its README says development moved off
|
||||
GitHub.
|
||||
|
||||
Every file here except this one, `SOURCE.json` and the patched file below is byte for byte the file
|
||||
in the `.crate` archive. `SOURCE.json` records the hash of the `.crate` download
|
||||
Every file here except this one, `SOURCE.json` and the two patched files below is byte for byte the
|
||||
file in the `.crate` archive. `SOURCE.json` records the hash of the `.crate` download
|
||||
(`source_archive_sha256`) and, for every file kept, the hash in the package (`source_sha256`) and the
|
||||
hash here (`sha256`). `upstream_repository` is null because no public repository this copy can name
|
||||
holds `upstream_revision`. `local_patches` describes the local patch.
|
||||
holds `upstream_revision`. `local_patches` describes each local patch.
|
||||
|
||||
## Local patches
|
||||
|
||||
| File | Change |
|
||||
|---|---|
|
||||
| `src/sweep/sweep_line.rs` | The doc comment of `SweepLine::line_segment` says it can return a segment that has exited, which `segment_range` leaves out. Code comments label the change `Craft patch (exited slots)`. |
|
||||
| `docs/sweep.typ` | The intersection scan to the left compares each segment with `alpha^(i+1)` instead of `alpha^i`. With `alpha^i`, its first pass compared `alpha^i` with itself, and the lemma after it is stated for `alpha^(i+1)`. |
|
||||
| `docs/sweep.typ` | Two typos are corrected. "condi0.2tions" reads "conditions", and `q(i+i)` reads `q(i+1)`, the first index for which `q` is false. |
|
||||
| `docs/sweep.typ` | The lemma for the intersection scan to the left asks for the ordering invariant on `(alpha^1, ..., alpha^(i+1))` and the crossing invariant on `(alpha^1, ..., alpha^i)`, which is how the bidirectional lemma uses it. The argument for the order invariant cites the crossing invariant instead of a "third invariant"; the document defines two. |
|
||||
|
||||
`omitted_files` lists the 43 files of the package left out here, with their hashes:
|
||||
|
||||
|
||||
Vendored
+5
-2
@@ -8,7 +8,10 @@
|
||||
"upstream_revision": "824b0791a750f7b27b8edcbb6c6244d0e629875e",
|
||||
"upstream_directory": "",
|
||||
"local_patches": [
|
||||
"In `src/sweep/sweep_line.rs`, the doc comment of `SweepLine::line_segment` says it can return a segment that has exited, which `segment_range` leaves out."
|
||||
"In `src/sweep/sweep_line.rs`, the doc comment of `SweepLine::line_segment` says it can return a segment that has exited, which `segment_range` leaves out.",
|
||||
"In `docs/sweep.typ`, the intersection scan to the left compares each segment with `alpha^(i+1)`, the segment the lemma after it is stated for, instead of `alpha^i`.",
|
||||
"In `docs/sweep.typ`, the typo \"condi0.2tions\" reads \"conditions\", and `q(i+i)` reads `q(i+1)`, the first index for which `q` is false.",
|
||||
"In `docs/sweep.typ`, the lemma for the intersection scan to the left asks for the ordering invariant on `(alpha^1, ..., alpha^(i+1))` and the crossing invariant on `(alpha^1, ..., alpha^i)`, as the bidirectional lemma uses it, and the argument for the order invariant cites the crossing invariant instead of a \"third invariant\"."
|
||||
],
|
||||
"files": [
|
||||
{ "path": ".cargo_vcs_info.json", "source_sha256": "47fba6a9dbdf445a5c97f783c9be62093035f9d5e5cdc2cf3216ad8259bcd8fc", "source_git_blob": null, "sha256": "47fba6a9dbdf445a5c97f783c9be62093035f9d5e5cdc2cf3216ad8259bcd8fc" },
|
||||
@@ -23,7 +26,7 @@
|
||||
{ "path": "benches/linebender_logo.rs", "source_sha256": "d10867f43439d37f0e1da5d30eaed9ab3bfbe655ed47212f65dc20ab4db65cb3", "source_git_blob": null, "sha256": "d10867f43439d37f0e1da5d30eaed9ab3bfbe655ed47212f65dc20ab4db65cb3" },
|
||||
{ "path": "benches/painted_dreams.rs", "source_sha256": "073008db93840d380710e13ed3ae38e08cb823f10c12e5f838dac1ccf37eaecf", "source_git_blob": null, "sha256": "073008db93840d380710e13ed3ae38e08cb823f10c12e5f838dac1ccf37eaecf" },
|
||||
{ "path": "benches/synthetic.rs", "source_sha256": "7ce59bef2e1c4f28b00cb89feb15bc71ca4b098a8d27e7b02ea699aca9bcc810", "source_git_blob": null, "sha256": "7ce59bef2e1c4f28b00cb89feb15bc71ca4b098a8d27e7b02ea699aca9bcc810" },
|
||||
{ "path": "docs/sweep.typ", "source_sha256": "4766082c8672a7bb4356b5581043489c13b4e3fb8931ba3a5f0a473fab0172f3", "source_git_blob": null, "sha256": "4766082c8672a7bb4356b5581043489c13b4e3fb8931ba3a5f0a473fab0172f3" },
|
||||
{ "path": "docs/sweep.typ", "source_sha256": "4766082c8672a7bb4356b5581043489c13b4e3fb8931ba3a5f0a473fab0172f3", "source_git_blob": null, "sha256": "c151c2c47032eca41914139b105177d10996b6ece9c93622aaeb31a371cfe17b" },
|
||||
{ "path": "examples/boolean_op.rs", "source_sha256": "3b38a1ccda7e736cce4b191a3a45ab4824c4c365190e3eb637b2fb39b5996c9f", "source_git_blob": null, "sha256": "3b38a1ccda7e736cce4b191a3a45ab4824c4c365190e3eb637b2fb39b5996c9f" },
|
||||
{ "path": "examples/bus.rs", "source_sha256": "e206a08be73899f564188052c8ecc15526b54606e52ee2935a64ce6b5723da33", "source_git_blob": null, "sha256": "e206a08be73899f564188052c8ecc15526b54606e52ee2935a64ce6b5723da33" },
|
||||
{ "path": "examples/curve_metrics.rs", "source_sha256": "0db6a5327fd2119a03a9a66624fea3e04b6bbb519655667ad30487aee6c787d2", "source_git_blob": null, "sha256": "0db6a5327fd2119a03a9a66624fea3e04b6bbb519655667ad30487aee6c787d2" },
|
||||
|
||||
Vendored
+10
-10
@@ -221,7 +221,7 @@ The first observation is that the sweep line invariants are maintained as we inc
|
||||
to the next event:
|
||||
+ For the order invariant, first note that there is an event whenever $y$ leaves the domain of a segment, so $y$ remains in all domains until the next event.
|
||||
Moreover, if at any $y' > y$ the ordering breaks, two line segments must have $epsilon$-crossed one another by $y'$.
|
||||
The third invariant guarantees that there's an event before this happens, so by the contra-positive until an event happens the ordering
|
||||
The crossing invariant guarantees that there's an event before this happens, so by the contra-positive until an event happens the ordering
|
||||
constraint is maintained.
|
||||
+ The crossing invariant is maintained because the set of things to check (i.e. the set of line segments that $epsilon$-cross
|
||||
one another after $y$) only shrinks as $y$ increases.
|
||||
@@ -368,13 +368,13 @@ of the other one.
|
||||
#figure(
|
||||
pseudocode-list([
|
||||
+ *for* $j = i$ down to $1$
|
||||
+ let $w^j$ be the smallest height of any event between $j$ and $i$
|
||||
+ let $w^j$ be the smallest height of any event between $j$ and $i+1$
|
||||
|
||||
+ *if* $(alpha^j_(-,epsilon), alpha^i)$ cross by $w^j$
|
||||
+ choose $z$ before the crossing, such that $alpha^j approx_(z,epsilon) alpha^i$
|
||||
+ insert an intersection event for $(alpha^j, alpha^i)$ at $z$
|
||||
+ *if* $(alpha^j_(-,epsilon), alpha^(i+1))$ cross by $w^j$
|
||||
+ choose $z$ before the crossing, such that $alpha^j approx_(z,epsilon) alpha^(i+1)$
|
||||
+ insert an intersection event for $(alpha^j, alpha^(i+1))$ at $z$
|
||||
|
||||
+ *if* $alpha^j_+ (z) <= alpha^i (z)$ for all $z in [y, w^j]$
|
||||
+ *if* $alpha^j_+ (z) <= alpha^(i+1) (z)$ for all $z in [y, w^j]$
|
||||
+ *break*
|
||||
]),
|
||||
caption: "Intersection scan to the left"
|
||||
@@ -383,8 +383,8 @@ of the other one.
|
||||
We'll skip the proof of the following lemma, because it's basically the same as the last one.
|
||||
|
||||
#lemma[
|
||||
Suppose that $(alpha^1, ..., alpha^i)$ satisfy the ordering invariant
|
||||
at $y$, and suppose also that $(alpha^1, ..., alpha^(i+1))$
|
||||
Suppose that $(alpha^1, ..., alpha^(i+1))$ satisfy the ordering invariant
|
||||
at $y$, and suppose also that $(alpha^1, ..., alpha^i)$
|
||||
satisfy the crossing invariant at $y$.
|
||||
After running an intersection scan to the left,
|
||||
$(alpha^1, ..., alpha^(i+1))$ satisfy a slightly stronger crossing invariant at $y$: for every $j <= i$,
|
||||
@@ -555,7 +555,7 @@ height. Note that because the sweep line changes at a discrete set of heights,
|
||||
at every important height $y$ we actually have two weakly-ordered sweep line:
|
||||
the "old" one from infinitesmally before $y$ height and the "new" one from $y$
|
||||
onwards. Because everything is continuous and the weak ordering conditions are
|
||||
closed, both the old and new sweep lines satisfy the weak ordering condi0.2tions
|
||||
closed, both the old and new sweep lines satisfy the weak ordering conditions
|
||||
at $y$.
|
||||
|
||||
The algorithm goes like this: at every important height we use
|
||||
@@ -623,7 +623,7 @@ Let's check that this insertion position is valid: for every $j <= i$ we have
|
||||
either $j <= i_-$ or $i_- < j <= i$. In the first case, we already observed
|
||||
that $alpha^j_-(y) <= beta(y)$; in the second case, $q(j)$ returned `true` and
|
||||
so $alpha^j_-(y) <= beta^j^+ (y)$. In either case, $alpha^j prec.tilde beta$.
|
||||
On the other hand, $q(i+i)$ being `false` implies that $alpha^(i+1)_- (y) >=
|
||||
On the other hand, $q(i+1)$ being `false` implies that $alpha^(i+1)_- (y) >=
|
||||
beta(y)$. This implies that for all $j >= i+1$, $alpha^j_+ (y) >= beta(y)$ and
|
||||
so $alpha^j succ.tilde_y beta$.
|
||||
|
||||
|
||||
Reference in new issue
Block a user