Repository navigation
fix: store build parameters in model recipes, and refuse what they cannot rebuild - #375
Draft
lachlangrose wants to merge 3 commits into
Draft
lachlangrose wants to merge 3 commits into
lachlangrose wants to merge 3 commits into
Conversation
Recipe: to_recipe_json / from_recipe_json do not store a feature's build parameters (nelements, interpolatortype, regularisation), so a model built with anything but the defaults rebuilds with the defaults and gives a different field (differences of 12 to 60 on a field of range about 560). The default-parameter case passes; the three others are strict xfails. Inequality: ADMM enforces the bounds with the arguments the existing builder test uses, but with its default arguments returns essentially the unconstrained solution (4 of 24 bounds violated, worst 0.056), and with solver cg the inequality data are dropped without a warning. A control (the unconstrained solution does violate bounds) and the working ADMM configuration pass; the default-ADMM case and the cg-warning expectation are strict xfails. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…nnot rebuild A recipe rebuilt every feature with the default build parameters and as a foliation, so a model built with non-default nelements, interpolatortype or regularisation gave a different field (12 to 60 on a field of range ~560), a fault came back as a foliation, and a model with an unconformity could not be rebuilt at all. - create_and_add_feature records the parameters it was *requested* with on the feature (the element count realised by the interpolator would not reproduce the grid) - the recipe stores them per foliation (build.feature_type, build.parameters) and the reader replays them through create_and_add_feature - the stratigraphic column's group_mapping is stored - feature_recipe_kind tests subclasses first, so faults and unconformities are no longer labelled structural_frame / foliation - to_recipe_* raise LoopValueError for a feature it cannot rebuild yet (non-foliation, custom data=, a parameter JSON cannot hold, no creation record) instead of writing a wrong recipe - recipes written before this (no build entry) still load, with a warning; an older non-foliation entry is refused The three strict xfails from the recipe test now pass and their markers are removed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This was referenced Oct 29, 2026
… parameters Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This branch has not been deployed
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.
Problem
A recipe rebuilt every feature with the default build parameters, and as a foliation. See the diagnosis in #374. In short: a model built with non-default
nelements,interpolatortypeorregularisationrebuilt to a different field (12 to 60 on a field of range about 560); a fault came back as a plain foliation;group_mappingwas lost; a model with an unconformity could not be rebuilt at all.Change
GeologicalModel.create_and_add_feature(the single entry point allcreate_and_add_*methods go through) stores the parameters it was requested with on the feature. The element count the interpolator realised (build_arguments["nelements"]) is deliberately not used: replaying it gave differences of 6 to 25, while replaying the requested count reproduced the field exactly.build: {feature_type, parameters}, and the stratigraphic column'sgroup_mappingis stored. Additive: the schemaversionstays 1.from_recipe_*rebuilds each feature throughcreate_and_add_feature(feature_type, name, **parameters).feature_recipe_kindtests subclasses first, so a fault isfault(notstructural_frame) and an unconformity isunconformity(notfoliation).to_recipe_*raisesLoopValueError, naming the feature, for: a non-foliation feature (fault, unconformity, fold, ...), a feature built with its owndata=, a parameter JSON cannot hold (e.g. a callablesolver), or a feature with no creation record.buildentry), with a warning that defaults are used. An older entry whose kind is notfoliationis refused.Behaviour change to be aware of
A model that contains a fault, an unconformity, a fold, or a feature built with
data=can no longer be written to a recipe; it raises. Before, it wrote a recipe that rebuilt wrongly (or, for an unconformity, could not be loaded).COMPAT.mdhas a row. I have not checked whether the QGIS plugin or anything else relies on writing recipes for such models. If that is a concern, the alternative is to warn instead of raise; I chose to raise because a silent wrong rebuild is the worse failure.Tests
test_recipe_reproduces_field.py: the three strict xfails from test: pin the recipe and inequality-constraint problems (strict xfail) #374 now pass and their markers are gone; I added a case with several parameters. The default case passes as before.test_recipe_limits.py(13 tests): requested (not realised) parameters are stored;data/faults/indexare not;group_mappinground trip, and a column without it still loads; fault and unconformity are recognised; each refusal and its message; an older recipe loads with a warning; an older non-foliation entry is refused.tests: 748 passed, 6 skipped. ruff: no new findings.Not done (stages 2 and 3)
custom data=could be supported by storing the data inline per feature; I did not.🤖 Generated with Claude Code