thundergraph-model 1.4.0__tar.gz → 1.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/PKG-INFO +1 -1
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/pyproject.toml +1 -1
- thundergraph_model-1.4.2/tests/integration/evaluation/test_sub_system_allocations.py +260 -0
- thundergraph_model-1.4.2/tests/integration/structural_models/test_requirement_class_dedupe.py +269 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/configured_model.py +243 -83
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/.github/ISSUE_TEMPLATE/01-bug_report.yml +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/.github/ISSUE_TEMPLATE/02-feature_request.yml +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/.github/ISSUE_TEMPLATE/03-documentation.yml +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/.github/pull_request_template.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/.github/workflows/publish.yml +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/.gitignore +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/CHANGELOG.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/LICENSE +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/PYPI.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/README.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/behavior_methodology.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/behavioral_projection_plan.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/brainstorm.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/conceptual_requirements.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/evaluation_api_facade_implementation_plan.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/execution_methodology.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/graph_compiler_nested_requirement_owner_fix_plan.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/implementation_plan.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/logical_architecture.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/model_prototype_sketch.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/requirement_composition_and_naming_implementation_plan.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/system_authoring_restrictions_implementation_plan.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/use_cases.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/generation_docs/v0_api.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/release/v1.2.0.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/release/v1.2.1.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/IMPLEMENTATION_PLAN.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/README.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.buildinfo +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.buildinfo.bak +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/api/api_analysis.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/api/api_execution.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/api/api_integrations.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/api/api_model.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/api/api_root.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/api/index.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/concepts_behavior.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/developer/architecture.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/developer/contributing.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/developer/extension_playbook.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/developer/releasing.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/developer/repository_map.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/developer/testing.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/docstring_style.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/drafts/concepts_behavior_internal.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/drafts/execution_pipeline.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/drafts/glossary.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/drafts/repository_map.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/drafts/what_is_thundergraph_model.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/environment.pickle +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/index.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/concepts_behavior.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/concepts_evaluation.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/concepts_external_compute.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/concepts_parts.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/concepts_requirements.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/concepts_system.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/end_to_end_guide.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/faq.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/install.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/mental_model.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/overview.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/.doctrees/user/quickstart.doctree +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/index.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/analysis/compare_variants.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/analysis/impact.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/analysis/sweep.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/behavior.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/configured_model.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/connection_bindings.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/dependency_graph.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/evaluator.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/graph_compiler.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/instances.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/requirements.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/run_context.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/validation.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/execution/value_slots.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/integrations/external_compute.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/model/definition_context.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/model/elements.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/model/expr.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_modules/tg_model/model/refs.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/api/api_analysis.rst.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/api/api_execution.rst.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/api/api_integrations.rst.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/api/api_model.rst.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/api/api_root.rst.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/api/index.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/concepts_behavior.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/developer/architecture.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/developer/contributing.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/developer/extension_playbook.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/developer/releasing.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/developer/repository_map.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/developer/testing.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/docstring_style.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/drafts/concepts_behavior_internal.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/drafts/execution_pipeline.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/drafts/glossary.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/drafts/repository_map.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/drafts/what_is_thundergraph_model.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/index.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/concepts_behavior.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/concepts_evaluation.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/concepts_external_compute.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/concepts_parts.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/concepts_requirements.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/concepts_system.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/end_to_end_guide.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/faq.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/install.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/mental_model.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/overview.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_sources/user/quickstart.md.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/base-stemmer.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/basic.css +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/debug.css +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/doctools.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/documentation_options.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/english-stemmer.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/file.png +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/language_data.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/minus.png +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/plus.png +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/pygments.css +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/scripts/furo-extensions.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/scripts/furo.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/scripts/furo.js.LICENSE.txt +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/scripts/furo.js.map +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/searchtools.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/skeleton.css +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/sphinx_highlight.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/styles/furo-extensions.css +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/styles/furo-extensions.css.map +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/styles/furo.css +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/_static/styles/furo.css.map +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/api/api_analysis.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/api/api_execution.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/api/api_integrations.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/api/api_model.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/api/api_root.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/api/index.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/concepts_behavior.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/developer/architecture.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/developer/contributing.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/developer/extension_playbook.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/developer/releasing.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/developer/repository_map.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/developer/testing.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/docstring_style.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/drafts/concepts_behavior_internal.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/drafts/execution_pipeline.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/drafts/glossary.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/drafts/repository_map.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/drafts/what_is_thundergraph_model.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/genindex.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/index.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/objects.inv +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/py-modindex.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/search.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/searchindex.js +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/concepts_behavior.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/concepts_evaluation.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/concepts_external_compute.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/concepts_parts.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/concepts_requirements.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/concepts_system.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/end_to_end_guide.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/faq.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/install.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/mental_model.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/overview.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/_build/html/user/quickstart.html +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/api/api_analysis.rst +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/api/api_execution.rst +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/api/api_integrations.rst +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/api/api_model.rst +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/api/api_root.rst +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/api/index.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/conf.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/developer/architecture.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/developer/contributing.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/developer/extension_playbook.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/developer/releasing.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/developer/repository_map.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/developer/testing.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/docstring_style.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/drafts/README.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/drafts/concepts_behavior_internal.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/drafts/execution_pipeline.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/drafts/glossary.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/drafts/repository_map.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/drafts/what_is_thundergraph_model.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/index.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/concepts_behavior.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/concepts_evaluation.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/concepts_external_compute.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/concepts_parts.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/concepts_requirements.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/concepts_system.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/end_to_end_guide.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/faq.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/install.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/mental_model.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/overview.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/docs/user_docs/user/quickstart.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/IMPLEMENTATION_PLAN.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/README.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/integrations/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/integrations/adapters.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/integrations/bindings.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/product/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/product/aircraft.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/product/major_assemblies/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/product/major_assemblies/parts.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/program/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/program/cargo_jet_program.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/program/l1_requirement_packages.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/program/mission_context.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/reporting/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/reporting/extract.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/commercial_aircraft/reporting/snapshot.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/hpc_datacenter/README.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/hpc_datacenter/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/hpc_datacenter/program.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/mars_ntp_tug/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/mars_ntp_tug/integrations/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/mars_ntp_tug/integrations/adapters.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/mars_ntp_tug/integrations/bindings.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/mars_ntp_tug/integrations/preset_inputs.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/mars_ntp_tug/reporting/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/mars_ntp_tug/reporting/extract.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/mars_ntp_tug/reporting/snapshot.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/examples/mars_ntp_tug/tug_model.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/implementation_plan_instructions.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/logo.png +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/notebooks/_gen_leo_notebook.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/notebooks/aev_architecture.mmd +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/notebooks/cargo_jet_program.ipynb +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/notebooks/hpc_datacenter_parameter_sweep.ipynb +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/notebooks/mars_ntp_nuclear_tug.ipynb +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/reviewer_architype.md +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/analysis/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/analysis/test_analysis_workflows.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/behavior/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/behavior/test_behavior_e2e.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/evaluation/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/evaluation/test_allocate_parameter_wiring.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/evaluation/test_evaluation_e2e.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/evaluation/test_external_compute.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/evaluation/test_requirement_acceptance.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/evaluation/test_system_in_system_requirements.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/evaluation/test_unitflow_evaluation.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/structural_models/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/structural_models/test_citations.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/structural_models/test_drive_system.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/structural_models/test_instantiation.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/test_commercial_aircraft_smoke.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/test_hpc_datacenter_smoke.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/integration/test_mars_ntp_tug_smoke.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/analysis/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/analysis/test_sweep_planning.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_behavior_runtime.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_behavior_scope.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_configured_model.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_configured_model_evaluate.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_dependency_graph.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_evaluation_phase0.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_evaluator.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_graph_compiler.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_instances.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_phase6_runtime.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_run_context.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/execution/test_validation.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/export/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/integrations/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_attribute_ref.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_behavior_declarations.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_compile_types.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_definition_context.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_elements.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_example_system_authoring_policy.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_expr.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_identity.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_new_api_validators.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_parameter_ref.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_phase6_ontology.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_refs.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_requirement_block.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tests/unit/model/test_system_authoring_restrictions.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/analysis/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/analysis/_coherence.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/analysis/compare_variants.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/analysis/impact.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/analysis/sweep.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/behavior.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/connection_bindings.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/dependency_graph.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/evaluation.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/evaluator.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/external_ops.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/graph_compiler.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/instances.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/requirements.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/rollups.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/run_context.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/solve_groups.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/stable_ids.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/validation.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/execution/value_slots.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/export/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/integrations/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/integrations/external_compute.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/compile_types.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/declarations/__init__.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/declarations/behavior.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/declarations/values.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/definition_context.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/elements.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/evaluation_context.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/expr.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/identity.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/tg_model/model/refs.py +0 -0
- {thundergraph_model-1.4.0 → thundergraph_model-1.4.2}/uv.lock +0 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"""Integration test: ``model.allocate(...)`` calls authored inside a composed
|
|
2
|
+
sub-System (not the top-level program) are collected into the root
|
|
3
|
+
``ConfiguredModel.allocations`` and wire correctly end-to-end.
|
|
4
|
+
|
|
5
|
+
Background
|
|
6
|
+
----------
|
|
7
|
+
Historically, ``_instantiate_allocations`` only inspected the root type's
|
|
8
|
+
compile artifact, so allocate edges declared inside a sub-System's
|
|
9
|
+
``define()`` were silently dropped. This violated the design intent that
|
|
10
|
+
each ``System`` class be self-contained — composable into larger programs
|
|
11
|
+
without requiring its allocations to be hoisted to the program root.
|
|
12
|
+
|
|
13
|
+
The walk now mirrors ``_instantiate_all_connections`` and
|
|
14
|
+
``_instantiate_all_references``: every ``PartInstance`` in the tree
|
|
15
|
+
contributes its own allocate edges, with paths re-rooted via
|
|
16
|
+
``part.instance_path``.
|
|
17
|
+
|
|
18
|
+
Coverage in this file
|
|
19
|
+
---------------------
|
|
20
|
+
1. Allocations declared in an inner System are present in
|
|
21
|
+
``cm.allocations`` after instantiating the outer System.
|
|
22
|
+
2. The constraint declared on the inner Requirement evaluates correctly
|
|
23
|
+
end-to-end (inputs wired via the inner allocation).
|
|
24
|
+
3. Two inner Systems composed into the same outer System get distinct
|
|
25
|
+
stable IDs even when their relative allocate paths are identical
|
|
26
|
+
(no stable-id collisions across sub-System scopes).
|
|
27
|
+
4. Root-level allocations alongside sub-System allocations both work
|
|
28
|
+
(no regression in the previously-working pattern).
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
from unitflow import Quantity
|
|
34
|
+
from unitflow.catalogs.si import kN
|
|
35
|
+
|
|
36
|
+
from tg_model.execution.configured_model import instantiate
|
|
37
|
+
from tg_model.model.elements import Part, Requirement, System
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
41
|
+
# Shared declarations
|
|
42
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class _Thruster(Part):
|
|
46
|
+
@classmethod
|
|
47
|
+
def define(cls, model): # type: ignore[override]
|
|
48
|
+
model.name("thruster")
|
|
49
|
+
model.parameter("vacuum_thrust", unit=kN)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class _ThrustFloorReq(Requirement):
|
|
53
|
+
@classmethod
|
|
54
|
+
def define(cls, model): # type: ignore[override]
|
|
55
|
+
model.name("thrust_floor")
|
|
56
|
+
model.doc("Thruster shall deliver at least the declared minimum vacuum thrust.")
|
|
57
|
+
required = model.parameter("required_thrust", unit=kN)
|
|
58
|
+
declared = model.parameter("declared_thrust", unit=kN)
|
|
59
|
+
margin = model.attribute("thrust_margin", unit=kN, expr=declared - required)
|
|
60
|
+
model.constraint("thrust_margin_non_negative", expr=margin >= Quantity(0, kN))
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class _PropulsionSubsystem(System):
|
|
64
|
+
"""Inner System: composes Part + Requirement and wires the allocation locally."""
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def define(cls, model): # type: ignore[override]
|
|
68
|
+
model.name("propulsion_subsystem")
|
|
69
|
+
floor = model.parameter("mission_thrust_floor", unit=kN)
|
|
70
|
+
thruster = model.composed_of("thruster", _Thruster)
|
|
71
|
+
req = model.composed_of("thrust_req", _ThrustFloorReq)
|
|
72
|
+
# This is the case that previously dropped silently: an allocate
|
|
73
|
+
# authored inside a sub-System's define().
|
|
74
|
+
model.allocate(
|
|
75
|
+
req,
|
|
76
|
+
thruster,
|
|
77
|
+
inputs={
|
|
78
|
+
"required_thrust": floor,
|
|
79
|
+
"declared_thrust": thruster.vacuum_thrust,
|
|
80
|
+
},
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class _ProgramWithOneSubSystem(System):
|
|
85
|
+
"""Outer program composing exactly one sub-System."""
|
|
86
|
+
|
|
87
|
+
@classmethod
|
|
88
|
+
def define(cls, model): # type: ignore[override]
|
|
89
|
+
model.name("program_with_one_subsystem")
|
|
90
|
+
model.composed_of("prop", _PropulsionSubsystem)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class _ProgramWithTwoSubSystems(System):
|
|
94
|
+
"""Outer program composing two structurally-identical sub-Systems under
|
|
95
|
+
different slot names. Exercises stable-id uniqueness."""
|
|
96
|
+
|
|
97
|
+
@classmethod
|
|
98
|
+
def define(cls, model): # type: ignore[override]
|
|
99
|
+
model.name("program_with_two_subsystems")
|
|
100
|
+
model.composed_of("prop_a", _PropulsionSubsystem)
|
|
101
|
+
model.composed_of("prop_b", _PropulsionSubsystem)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class _RootLevelOnlyProgram(System):
|
|
105
|
+
"""Regression check: allocation declared at the root, no sub-Systems involved."""
|
|
106
|
+
|
|
107
|
+
@classmethod
|
|
108
|
+
def define(cls, model): # type: ignore[override]
|
|
109
|
+
model.name("root_level_only_program")
|
|
110
|
+
floor = model.parameter("mission_thrust_floor", unit=kN)
|
|
111
|
+
thruster = model.composed_of("thruster", _Thruster)
|
|
112
|
+
req = model.composed_of("thrust_req", _ThrustFloorReq)
|
|
113
|
+
model.allocate(
|
|
114
|
+
req,
|
|
115
|
+
thruster,
|
|
116
|
+
inputs={
|
|
117
|
+
"required_thrust": floor,
|
|
118
|
+
"declared_thrust": thruster.vacuum_thrust,
|
|
119
|
+
},
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def setup_function() -> None:
|
|
124
|
+
_Thruster._reset_compilation()
|
|
125
|
+
_ThrustFloorReq._reset_compilation()
|
|
126
|
+
_PropulsionSubsystem._reset_compilation()
|
|
127
|
+
_ProgramWithOneSubSystem._reset_compilation()
|
|
128
|
+
_ProgramWithTwoSubSystems._reset_compilation()
|
|
129
|
+
_RootLevelOnlyProgram._reset_compilation()
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
133
|
+
# 1) Sub-System allocations are collected
|
|
134
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def test_sub_system_allocation_collected_on_root() -> None:
|
|
138
|
+
"""An allocate declared inside _PropulsionSubsystem.define() should appear
|
|
139
|
+
in the outer program's cm.allocations after instantiate()."""
|
|
140
|
+
cm = instantiate(_ProgramWithOneSubSystem)
|
|
141
|
+
assert len(cm.allocations) == 1, (
|
|
142
|
+
"Allocation declared inside sub-System.define() was not collected"
|
|
143
|
+
)
|
|
144
|
+
alloc = cm.allocations[0]
|
|
145
|
+
# Paths are re-rooted via the sub-System's instance_path.
|
|
146
|
+
assert alloc.requirement.path_string == (
|
|
147
|
+
"_ProgramWithOneSubSystem.prop.thrust_req"
|
|
148
|
+
)
|
|
149
|
+
assert alloc.target.path_string == "_ProgramWithOneSubSystem.prop.thruster"
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def test_sub_system_allocation_parameter_overrides_resolve() -> None:
|
|
153
|
+
"""The inputs dict on a sub-System allocate must resolve against the
|
|
154
|
+
sub-System's path_string (not the root's), because the relative paths
|
|
155
|
+
in the edge are scoped to the declaring System."""
|
|
156
|
+
cm = instantiate(_ProgramWithOneSubSystem)
|
|
157
|
+
alloc = cm.allocations[0]
|
|
158
|
+
overrides = alloc.parameter_overrides
|
|
159
|
+
assert set(overrides.keys()) == {"required_thrust", "declared_thrust"}
|
|
160
|
+
assert overrides["required_thrust"].path_string == (
|
|
161
|
+
"_ProgramWithOneSubSystem.prop.mission_thrust_floor"
|
|
162
|
+
)
|
|
163
|
+
assert overrides["declared_thrust"].path_string == (
|
|
164
|
+
"_ProgramWithOneSubSystem.prop.thruster.vacuum_thrust"
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
169
|
+
# 2) End-to-end evaluation through a sub-System allocation
|
|
170
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def test_sub_system_allocation_evaluates_pass() -> None:
|
|
174
|
+
cm = instantiate(_ProgramWithOneSubSystem)
|
|
175
|
+
result = cm.evaluate(
|
|
176
|
+
inputs={
|
|
177
|
+
cm.prop.mission_thrust_floor.stable_id: Quantity(50, kN),
|
|
178
|
+
cm.prop.thruster.vacuum_thrust.stable_id: Quantity(80, kN),
|
|
179
|
+
},
|
|
180
|
+
)
|
|
181
|
+
assert result.passed, result.failures
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def test_sub_system_allocation_evaluates_fail() -> None:
|
|
185
|
+
cm = instantiate(_ProgramWithOneSubSystem)
|
|
186
|
+
result = cm.evaluate(
|
|
187
|
+
inputs={
|
|
188
|
+
cm.prop.mission_thrust_floor.stable_id: Quantity(100, kN),
|
|
189
|
+
cm.prop.thruster.vacuum_thrust.stable_id: Quantity(60, kN),
|
|
190
|
+
},
|
|
191
|
+
)
|
|
192
|
+
assert not result.passed
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
196
|
+
# 3) Stable-id uniqueness across sub-System scopes
|
|
197
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def test_two_sub_systems_produce_two_distinct_allocations() -> None:
|
|
201
|
+
"""Two structurally identical sub-Systems composed under different slot
|
|
202
|
+
names should produce TWO allocations with DISTINCT stable IDs."""
|
|
203
|
+
cm = instantiate(_ProgramWithTwoSubSystems)
|
|
204
|
+
assert len(cm.allocations) == 2
|
|
205
|
+
|
|
206
|
+
sids = {a.stable_id for a in cm.allocations}
|
|
207
|
+
assert len(sids) == 2, (
|
|
208
|
+
"Allocations from two sub-System instances must have distinct stable_ids; "
|
|
209
|
+
"collisions indicate the part.instance_path is not included in the stable_id"
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
# Endpoints should resolve into the two different subtrees.
|
|
213
|
+
targets = {a.target.path_string for a in cm.allocations}
|
|
214
|
+
assert targets == {
|
|
215
|
+
"_ProgramWithTwoSubSystems.prop_a.thruster",
|
|
216
|
+
"_ProgramWithTwoSubSystems.prop_b.thruster",
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def test_two_sub_systems_both_evaluate_independently() -> None:
|
|
221
|
+
cm = instantiate(_ProgramWithTwoSubSystems)
|
|
222
|
+
result = cm.evaluate(
|
|
223
|
+
inputs={
|
|
224
|
+
cm.prop_a.mission_thrust_floor.stable_id: Quantity(50, kN),
|
|
225
|
+
cm.prop_a.thruster.vacuum_thrust.stable_id: Quantity(80, kN),
|
|
226
|
+
cm.prop_b.mission_thrust_floor.stable_id: Quantity(50, kN),
|
|
227
|
+
cm.prop_b.thruster.vacuum_thrust.stable_id: Quantity(40, kN),
|
|
228
|
+
},
|
|
229
|
+
)
|
|
230
|
+
# prop_a passes (80 >= 50), prop_b fails (40 < 50) — overall fails but
|
|
231
|
+
# both constraints were actually evaluated.
|
|
232
|
+
assert not result.passed
|
|
233
|
+
constraint_names = {cr.name for cr in result.constraint_results}
|
|
234
|
+
assert any("prop_a" in n for n in constraint_names)
|
|
235
|
+
assert any("prop_b" in n for n in constraint_names)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
239
|
+
# 4) Root-level allocations still work (no regression)
|
|
240
|
+
# ──────────────────────────────────────────────────────────────────────────
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def test_root_level_allocation_still_works() -> None:
|
|
244
|
+
"""The previously-supported pattern (allocate at root) must remain intact."""
|
|
245
|
+
cm = instantiate(_RootLevelOnlyProgram)
|
|
246
|
+
assert len(cm.allocations) == 1
|
|
247
|
+
alloc = cm.allocations[0]
|
|
248
|
+
assert alloc.requirement.path_string == "_RootLevelOnlyProgram.thrust_req"
|
|
249
|
+
assert alloc.target.path_string == "_RootLevelOnlyProgram.thruster"
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def test_root_level_allocation_evaluates_pass() -> None:
|
|
253
|
+
cm = instantiate(_RootLevelOnlyProgram)
|
|
254
|
+
result = cm.evaluate(
|
|
255
|
+
inputs={
|
|
256
|
+
cm.mission_thrust_floor.stable_id: Quantity(50, kN),
|
|
257
|
+
cm.thruster.vacuum_thrust.stable_id: Quantity(80, kN),
|
|
258
|
+
},
|
|
259
|
+
)
|
|
260
|
+
assert result.passed, result.failures
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"""Integration tests for Requirement class-identity deduplication.
|
|
2
|
+
|
|
3
|
+
A Requirement class is a specification statement. When the same Requirement
|
|
4
|
+
subclass is composed in multiple places from DIFFERENT defining classes (e.g.
|
|
5
|
+
inside a domain System AND inside a top-level rollup package), tg-model treats
|
|
6
|
+
them as ONE shared RequirementPackageInstance with multiple navigation paths.
|
|
7
|
+
|
|
8
|
+
When the SAME defining class introduces the same Requirement multiple times
|
|
9
|
+
(because that class is instantiated more than once), each instance gets its own
|
|
10
|
+
independent RequirementPackageInstance. This is the multi-instantiation case
|
|
11
|
+
and must NOT be deduped.
|
|
12
|
+
|
|
13
|
+
Parts and Systems are unaffected — they always retain distinct-instance semantics.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import pytest
|
|
19
|
+
from unitflow import Quantity
|
|
20
|
+
from unitflow.catalogs.si import kN
|
|
21
|
+
|
|
22
|
+
from tg_model.execution.configured_model import instantiate
|
|
23
|
+
from tg_model.model.elements import Part, Requirement, System
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# ── Shared leaf declarations ─────────────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
class _Thruster(Part):
|
|
29
|
+
@classmethod
|
|
30
|
+
def define(cls, model): # type: ignore[override]
|
|
31
|
+
model.name("thruster")
|
|
32
|
+
model.parameter("thrust", unit=kN)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class _ThrustReq(Requirement):
|
|
36
|
+
@classmethod
|
|
37
|
+
def define(cls, model): # type: ignore[override]
|
|
38
|
+
model.name("thrust_req")
|
|
39
|
+
model.doc("Thrust shall meet the floor.")
|
|
40
|
+
declared = model.parameter("declared", unit=kN)
|
|
41
|
+
floor = model.parameter("floor", unit=kN)
|
|
42
|
+
margin = model.attribute("margin", unit=kN, expr=declared - floor)
|
|
43
|
+
model.constraint("margin_non_negative", expr=margin >= Quantity(0, kN))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class _CapacityReq(Requirement):
|
|
47
|
+
@classmethod
|
|
48
|
+
def define(cls, model): # type: ignore[override]
|
|
49
|
+
model.name("capacity_req")
|
|
50
|
+
model.doc("Capacity shall meet the minimum.")
|
|
51
|
+
capacity = model.parameter("capacity", unit=kN)
|
|
52
|
+
minimum = model.parameter("minimum", unit=kN)
|
|
53
|
+
headroom = model.attribute("headroom", unit=kN, expr=capacity - minimum)
|
|
54
|
+
model.constraint("headroom_non_negative", expr=headroom >= Quantity(0, kN))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# ── Programs for dedupe scenarios ────────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
class _RollupReqs(Requirement):
|
|
60
|
+
"""Top-level rollup that re-composes _ThrustReq — should alias the domain System's instance."""
|
|
61
|
+
@classmethod
|
|
62
|
+
def define(cls, model): # type: ignore[override]
|
|
63
|
+
model.name("rollup")
|
|
64
|
+
model.doc("Top-level rollup view.")
|
|
65
|
+
model.composed_of("thrust", _ThrustReq)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class _DomainSystem(System):
|
|
69
|
+
"""Domain System that owns _ThrustReq and allocates it to the thruster."""
|
|
70
|
+
@classmethod
|
|
71
|
+
def define(cls, model): # type: ignore[override]
|
|
72
|
+
model.name("domain")
|
|
73
|
+
floor = model.parameter("floor_kN", unit=kN)
|
|
74
|
+
thr = model.composed_of("thruster", _Thruster)
|
|
75
|
+
req = model.composed_of("thrust_req", _ThrustReq)
|
|
76
|
+
model.allocate(req, thr, inputs={
|
|
77
|
+
"declared": thr.thrust,
|
|
78
|
+
"floor": floor,
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class _ProgramWithRollup(System):
|
|
83
|
+
"""Top-level program: domain System + rollup that also composes the same Requirement."""
|
|
84
|
+
@classmethod
|
|
85
|
+
def define(cls, model): # type: ignore[override]
|
|
86
|
+
model.name("program_with_rollup")
|
|
87
|
+
model.composed_of("domain", _DomainSystem)
|
|
88
|
+
model.composed_of("rollup", _RollupReqs)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# ── Programs for multi-instantiation (no-dedupe) scenario ────────────────────
|
|
92
|
+
|
|
93
|
+
class _SubSystem(System):
|
|
94
|
+
"""Sub-system that composes _ThrustReq internally."""
|
|
95
|
+
@classmethod
|
|
96
|
+
def define(cls, model): # type: ignore[override]
|
|
97
|
+
model.name("subsystem")
|
|
98
|
+
floor = model.parameter("floor_kN", unit=kN)
|
|
99
|
+
thr = model.composed_of("thruster", _Thruster)
|
|
100
|
+
req = model.composed_of("thrust_req", _ThrustReq)
|
|
101
|
+
model.allocate(req, thr, inputs={
|
|
102
|
+
"declared": thr.thrust,
|
|
103
|
+
"floor": floor,
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class _ProgramWithTwoSubSystems(System):
|
|
108
|
+
"""Two instances of the same sub-System class — each should get its own Requirement instance."""
|
|
109
|
+
@classmethod
|
|
110
|
+
def define(cls, model): # type: ignore[override]
|
|
111
|
+
model.name("program_two_subsystems")
|
|
112
|
+
model.composed_of("sub_a", _SubSystem)
|
|
113
|
+
model.composed_of("sub_b", _SubSystem)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
# ── Programs for regression tests ───────────────────────────────────────────
|
|
117
|
+
|
|
118
|
+
class _Motor(Part):
|
|
119
|
+
@classmethod
|
|
120
|
+
def define(cls, model): # type: ignore[override]
|
|
121
|
+
model.name("motor")
|
|
122
|
+
model.parameter("torque", unit=kN)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class _ProgramTwoDistinctParts(System):
|
|
126
|
+
@classmethod
|
|
127
|
+
def define(cls, model): # type: ignore[override]
|
|
128
|
+
model.name("program_two_parts")
|
|
129
|
+
model.composed_of("motor_a", _Motor)
|
|
130
|
+
model.composed_of("motor_b", _Motor)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class _InnerSystem(System):
|
|
134
|
+
@classmethod
|
|
135
|
+
def define(cls, model): # type: ignore[override]
|
|
136
|
+
model.name("inner")
|
|
137
|
+
model.parameter("p", unit=kN)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class _ProgramTwoDistinctSystems(System):
|
|
141
|
+
@classmethod
|
|
142
|
+
def define(cls, model): # type: ignore[override]
|
|
143
|
+
model.name("program_two_systems")
|
|
144
|
+
model.composed_of("inner_a", _InnerSystem)
|
|
145
|
+
model.composed_of("inner_b", _InnerSystem)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def setup_function() -> None:
|
|
149
|
+
for cls in (
|
|
150
|
+
_Thruster, _ThrustReq, _CapacityReq, _RollupReqs, _DomainSystem,
|
|
151
|
+
_ProgramWithRollup, _SubSystem, _ProgramWithTwoSubSystems,
|
|
152
|
+
_Motor, _ProgramTwoDistinctParts, _InnerSystem, _ProgramTwoDistinctSystems,
|
|
153
|
+
):
|
|
154
|
+
cls._reset_compilation()
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
# ── 1) Dedupe: same Requirement class composed by two DIFFERENT classes ──────
|
|
158
|
+
|
|
159
|
+
def test_same_req_class_two_parents_is_one_instance() -> None:
|
|
160
|
+
"""DomainSystem and RollupReqs both compose _ThrustReq — only one instance."""
|
|
161
|
+
cm = instantiate(_ProgramWithRollup)
|
|
162
|
+
domain_req = cm.handle("_ProgramWithRollup.domain.thrust_req")
|
|
163
|
+
rollup_req = cm.handle("_ProgramWithRollup.rollup.thrust")
|
|
164
|
+
assert domain_req is rollup_req, "Both paths must resolve to the SAME RequirementPackageInstance"
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def test_alias_path_resolves_to_canonical_slots() -> None:
|
|
168
|
+
"""Both navigation paths point to the same ValueSlot objects."""
|
|
169
|
+
cm = instantiate(_ProgramWithRollup)
|
|
170
|
+
canonical_declared = cm.handle("_ProgramWithRollup.domain.thrust_req.declared")
|
|
171
|
+
alias_declared = cm.handle("_ProgramWithRollup.rollup.thrust.declared")
|
|
172
|
+
assert canonical_declared is alias_declared
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def test_id_registry_has_one_entry_per_req_instance() -> None:
|
|
176
|
+
"""id_registry dedupe: only one stable_id entry for _ThrustReq."""
|
|
177
|
+
cm = instantiate(_ProgramWithRollup)
|
|
178
|
+
thrust_req_entries = [
|
|
179
|
+
(sid, obj) for sid, obj in cm.id_registry.items()
|
|
180
|
+
if hasattr(obj, "package_type") and obj.package_type is _ThrustReq
|
|
181
|
+
]
|
|
182
|
+
assert len(thrust_req_entries) == 1, (
|
|
183
|
+
f"Expected exactly one id_registry entry for _ThrustReq, got {len(thrust_req_entries)}"
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def test_allocation_wires_shared_instance() -> None:
|
|
188
|
+
"""Allocation declared in DomainSystem uses the shared instance and correct source slots."""
|
|
189
|
+
cm = instantiate(_ProgramWithRollup)
|
|
190
|
+
assert len(cm.allocations) == 1
|
|
191
|
+
alloc = cm.allocations[0]
|
|
192
|
+
# Requirement points at the shared (canonical) instance
|
|
193
|
+
assert alloc.requirement.path_string == "_ProgramWithRollup.domain.thrust_req"
|
|
194
|
+
# parameter_overrides maps req-param-name → SOURCE slot (the Part side of the wiring)
|
|
195
|
+
assert set(alloc.parameter_overrides.keys()) == {"declared", "floor"}
|
|
196
|
+
assert alloc.parameter_overrides["declared"].path_string == "_ProgramWithRollup.domain.thruster.thrust"
|
|
197
|
+
assert alloc.parameter_overrides["floor"].path_string == "_ProgramWithRollup.domain.floor_kN"
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def test_end_to_end_evaluates_constraint_once() -> None:
|
|
201
|
+
"""Only one constraint result — not two copies of the same constraint."""
|
|
202
|
+
cm = instantiate(_ProgramWithRollup)
|
|
203
|
+
result = cm.evaluate(inputs={
|
|
204
|
+
cm.domain.floor_kN.stable_id: Quantity(50, kN),
|
|
205
|
+
cm.domain.thruster.thrust.stable_id: Quantity(80, kN),
|
|
206
|
+
})
|
|
207
|
+
assert result.passed
|
|
208
|
+
assert len(result.constraint_results) == 1, (
|
|
209
|
+
f"Expected 1 constraint result (not duplicated), got {len(result.constraint_results)}"
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
# ── 2) No-dedupe: same class instantiated multiple times ─────────────────────
|
|
214
|
+
|
|
215
|
+
def test_multi_instantiation_produces_distinct_req_instances() -> None:
|
|
216
|
+
"""sub_a and sub_b each get their OWN _ThrustReq instance (different subsystem instances)."""
|
|
217
|
+
cm = instantiate(_ProgramWithTwoSubSystems)
|
|
218
|
+
req_a = cm.handle("_ProgramWithTwoSubSystems.sub_a.thrust_req")
|
|
219
|
+
req_b = cm.handle("_ProgramWithTwoSubSystems.sub_b.thrust_req")
|
|
220
|
+
assert req_a is not req_b, "_SubSystem instances must each own their own _ThrustReq"
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def test_multi_instantiation_distinct_slots() -> None:
|
|
224
|
+
slot_a = cm_two = instantiate(_ProgramWithTwoSubSystems)
|
|
225
|
+
slot_a_declared = cm_two.handle("_ProgramWithTwoSubSystems.sub_a.thrust_req.declared")
|
|
226
|
+
slot_b_declared = cm_two.handle("_ProgramWithTwoSubSystems.sub_b.thrust_req.declared")
|
|
227
|
+
assert slot_a_declared is not slot_b_declared
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def test_multi_instantiation_two_allocations() -> None:
|
|
231
|
+
cm = instantiate(_ProgramWithTwoSubSystems)
|
|
232
|
+
assert len(cm.allocations) == 2
|
|
233
|
+
targets = {a.target.path_string for a in cm.allocations}
|
|
234
|
+
assert targets == {
|
|
235
|
+
"_ProgramWithTwoSubSystems.sub_a.thruster",
|
|
236
|
+
"_ProgramWithTwoSubSystems.sub_b.thruster",
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def test_multi_instantiation_evaluates_each_subsystem() -> None:
|
|
241
|
+
cm = instantiate(_ProgramWithTwoSubSystems)
|
|
242
|
+
result = cm.evaluate(inputs={
|
|
243
|
+
cm.sub_a.floor_kN.stable_id: Quantity(50, kN),
|
|
244
|
+
cm.sub_a.thruster.thrust.stable_id: Quantity(80, kN), # passes
|
|
245
|
+
cm.sub_b.floor_kN.stable_id: Quantity(50, kN),
|
|
246
|
+
cm.sub_b.thruster.thrust.stable_id: Quantity(30, kN), # fails
|
|
247
|
+
})
|
|
248
|
+
assert not result.passed
|
|
249
|
+
assert len(result.constraint_results) == 2
|
|
250
|
+
states = {cr.state for cr in result.constraint_results}
|
|
251
|
+
assert "passed" in states and "failed" in states
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
# ── 3) Regression: Parts and Systems always produce distinct instances ────────
|
|
255
|
+
|
|
256
|
+
def test_part_composed_twice_distinct_instances() -> None:
|
|
257
|
+
cm = instantiate(_ProgramTwoDistinctParts)
|
|
258
|
+
motor_a = cm.handle("_ProgramTwoDistinctParts.motor_a")
|
|
259
|
+
motor_b = cm.handle("_ProgramTwoDistinctParts.motor_b")
|
|
260
|
+
assert motor_a is not motor_b
|
|
261
|
+
assert motor_a.stable_id != motor_b.stable_id
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def test_system_composed_twice_distinct_instances() -> None:
|
|
265
|
+
cm = instantiate(_ProgramTwoDistinctSystems)
|
|
266
|
+
inner_a = cm.handle("_ProgramTwoDistinctSystems.inner_a")
|
|
267
|
+
inner_b = cm.handle("_ProgramTwoDistinctSystems.inner_b")
|
|
268
|
+
assert inner_a is not inner_b
|
|
269
|
+
assert inner_a.stable_id != inner_b.stable_id
|