Skip to content

Add support for struct (dict) discipline options#59

Closed
chrislupp wants to merge 9 commits intodevelopfrom
feature/struct_options
Closed

Add support for struct (dict) discipline options#59
chrislupp wants to merge 9 commits intodevelopfrom
feature/struct_options

Conversation

@chrislupp
Copy link
Copy Markdown
Collaborator

Summary

  • Adds kStruct DataType support so disciplines can declare options that accept complex nested dictionaries, not just scalar types
  • Wires the new type through server (GetAvailableOptions), client (get_available_options), and OpenMDAO (declare_options) type mappings
  • Regenerates gRPC stubs from updated proto submodule
  • Closes Structs as options #49

Test plan

  • python utils/compile_proto.py — stubs regenerate without errors
  • pytest tests/ — all 168 tests pass (5 new tests for struct options)
  • Manual verification: discipline with add_option("config", "dict") round-trips nested dict through client/server

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
@chrislupp chrislupp self-assigned this Apr 9, 2026
@chrislupp chrislupp added the enhancement New feature or request label Apr 9, 2026
@chrislupp chrislupp added this to the Version 0.8.0 milestone Apr 9, 2026
Merge origin/develop into feature/struct_options, resolving conflicts
in CHANGELOG.md, generated stubs, and proto submodule.
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 9, 2026

Codecov Report

❌ Patch coverage is 83.33333% with 1 line in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
philote_mdo/openmdao/utils.py 50.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@chrislupp chrislupp closed this Apr 9, 2026
@chrislupp chrislupp deleted the feature/struct_options branch April 9, 2026 02:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant