Skip to content

Add discrete variable support#58

Merged
chrislupp merged 7 commits into
developfrom
feature/discrete_vars
Apr 8, 2026
Merged

Add discrete variable support#58
chrislupp merged 7 commits into
developfrom
feature/discrete_vars

Conversation

@chrislupp
Copy link
Copy Markdown
Collaborator

@chrislupp chrislupp commented Apr 8, 2026

Summary

  • Add add_discrete_input / add_discrete_output to the discipline base class for declaring discrete variables
  • Server-side process_inputs demuxes the new VariableMessage wrapper, routing continuous chunks to numpy arrays and discrete values to plain Python dicts
  • Client-side _assemble_input_messages and all _recover_* methods handle the VariableMessage oneof envelope
  • OpenMDAO bindings (RemoteExplicitComponent, RemoteImplicitComponent) auto-discover discrete variable metadata from the server and forward discrete_inputs / discrete_outputs through compute, apply_nonlinear, linearize, etc.
  • Regenerated gRPC stubs from updated proto submodule (feature/discrete_vars)
  • Discrete values are serialized as google.protobuf.Value, supporting scalars, lists, and nested structures

Test plan

  • All 127 existing tests pass (1 pre-existing apply_linear signature failure is unrelated)
  • Add integration test with a discipline that uses discrete inputs/outputs

Closes #54
Depends on MDO-Standards/Philote-MDO#15

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.
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 8, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

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.
@chrislupp chrislupp self-assigned this Apr 8, 2026
@chrislupp chrislupp added the enhancement New feature or request label Apr 8, 2026
@chrislupp chrislupp added this to the Version 0.8.0 milestone Apr 8, 2026
@chrislupp chrislupp merged commit 225683b into develop Apr 8, 2026
8 checks passed
@chrislupp chrislupp deleted the feature/discrete_vars branch April 9, 2026 02:02
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