fix: land three-objective NSGA selection on main and document it - #18
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Re-lands PR #17, whose changes never reached main. #16 merged at 08:46:36 (
nsga-n-objectives->main); #17 merged 12 seconds later intonsga-n-objectives, which main had already taken. So #17's content landed on an already-merged branch and never propagated —structural_complexitywas absent from main and the DOT/Typst bug was still live.bbdd47eis a clean cherry-pick of4aec365; the resulting tree is byte-identical to the reviewed #17 tip, so there is nothing new to review in that commit beyond what was already approved.850d749is new: the README documented two objectives and would have been wrong the moment this landed, so the docs ship with the code.The README's objectives section now lists all three (visual error, visual complexity, structural complexity), states that each is normalized by its own pool maximum so no weighting between them exists, and records that adding a fourth objective needs only a longer vector. That last claim is verified rather than asserted:
non_dominated_sort,crowding_distance,pareto_selectandpareto_frontwere all exercised at arity 3, 4 and 5 with no code changes. It also explains why structural complexity counts source characters instead of compressed size, since that decision is not self-evident from the code.One deliberate omission. The old text claimed the constraint-first gate treats "the top 25% by visual error" as feasible, but
_percentile_75actually makes roughly the best 75% feasible — measured, 7 of 10 candidates. Writing "75%" would document what may well be a bug as intended behaviour, and writing "25%" would be false, so the new text says the gate is a percentile of the pool without naming it. The specific number is a separate open decision about whether the README or the code is authoritative; when that is settled this line gets the number.Also corrects the
lineage.csvdescription in the output-layout tree, which no longer carries a singlecomplexitycolumn.400 passed, 13 skipped, ruff clean.