Add support for struct (dict) discipline options#59
Closed
Add support for struct (dict) discipline options#59
Conversation
Implement discrete variable handling across the full stack: - Discipline base class: add_discrete_input/add_discrete_output methods with VariableMetaData using kDiscreteInput/kDiscreteOutput types - Server: process_inputs demuxes VariableMessage oneof into continuous and discrete dicts; yields VariableMessage wrappers on output - Client: _assemble_input_messages wraps both Array and DiscreteVariable in VariableMessage; _recover_outputs handles discrete responses - OpenMDAO bindings: auto-discover discrete vars from server metadata, declare them via add_discrete_input/output, and forward through compute/apply_nonlinear/linearize calls Discrete values use google.protobuf.Value for language-interoperable serialization of scalars, lists, and nested structures. Updates proto submodule to feature/discrete_vars (DiscreteVariable message, VariableMessage wrapper, stream VariableMessage RPCs). Refs: #54
Wrap all raw data.Array messages in data.VariableMessage in test fixtures to match the new streaming protocol. Update OpenMDAO test assertions to include discrete_inputs parameters in expected calls.
Add comprehensive test suite covering all new discrete variable code paths: value conversion helpers, discipline base class, server/client discrete message handling, explicit/implicit server discrete dispatch, client discrete assembly/recovery, and OpenMDAO bindings. Coverage restored to 99% (remaining misses are import guards and an unreachable defensive branch).
Add codecov.yml requiring 95% coverage on both project total and patch (new/changed lines). Add fail_under = 95 to .coveragerc for local enforcement via coverage report.
Add coverage exclusion pragmas to three unreachable code paths: - _value_to_python else fallback (all protobuf Value kinds handled) - openmdao/__init__.py ImportError guard (requires uninstalling OpenMDAO) - examples/__init__.py ImportError guard (same) Also fixes bare except to except ImportError in examples/__init__.py.
Add end-to-end integration tests using a ScaledParaboloid discipline that uses a discrete input (mode) to switch scaling behavior and a discrete output (label) to report the mode used. Tests cover: - Raw ExplicitClient compute with discrete inputs/outputs - Raw ExplicitClient compute_partials with discrete inputs - OpenMDAO RemoteExplicitComponent auto-discovery and forwarding of discrete variables through a real gRPC server
Add entries for coverage enforcement, pragma no cover annotations, and the bare except fix under the appropriate sections.
Add kStruct DataType to the protocol and wire it through the Python stack so disciplines can declare and receive complex nested data as options. Changes: - Update proto submodule (kStruct = 4 in DataType enum) - Regenerate gRPC stubs - Map "dict" ↔ kStruct in server and client type mappings - Support dict type in OpenMDAO declare_options utility - Add tests for struct option round-trip - Update CHANGELOG
Merge origin/develop into feature/struct_options, resolving conflicts in CHANGELOG.md, generated stubs, and proto submodule.
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
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.
Summary
kStructDataType support so disciplines can declare options that accept complex nested dictionaries, not just scalar typesGetAvailableOptions), client (get_available_options), and OpenMDAO (declare_options) type mappingsTest plan
python utils/compile_proto.py— stubs regenerate without errorspytest tests/— all 168 tests pass (5 new tests for struct options)add_option("config", "dict")round-trips nested dict through client/server