Skip to content

Fix OUQBase Symbolics 7 Core and QA failures - #50

Draft
ChrisRackauckas-Claude wants to merge 6 commits into
SciML:mainfrom
ChrisRackauckas-Claude:codex/ouqbase-symbolics-ci-followup
Draft

Fix OUQBase Symbolics 7 Core and QA failures#50
ChrisRackauckas-Claude wants to merge 6 commits into
SciML:mainfrom
ChrisRackauckas-Claude:codex/ouqbase-symbolics-ci-followup

Conversation

@ChrisRackauckas-Claude

@ChrisRackauckas-Claude ChrisRackauckas-Claude commented Sep 1, 2026

Copy link
Copy Markdown
Member

Important

Please ignore this draft until it has been reviewed by @ChrisRackauckas.

What changed and why

This is stacked on the head of #48 (e09e7f03cb487178af23237b66273102c94605d3). It fixes the OUQBase failures that remain after that PR: Symbolics 7 wraps numeric equation sides and rewritten exponents in BasicSymbolic, while OUQBase's raw-moment builder stores concrete numbers; OUQBase also relied on several Symbolics/SymbolicUtils implementation details that are not public API.

The first commit unwraps numeric constants with public Symbolics.value, evaluates inequalities with public SymbolicUtils.substitute plus documented Inequality fields, and adds moment and inclusive-boundary regressions. The second commit models the OUQ operator functors locally, identifies random variables from the admissible-set map, and removes the remaining nonpublic Operator, default_is_atomic, evaluate, geq, and leq accesses without adding QA ignores.

Both fixes are in one stacked PR because either commit alone leaves OUQBase CI red: Core/downgrade require the constant and condition handling, while QA requires the public-interface cleanup.

Root cause and history

The adjacent scheduled-run boundary is:

  • last green sublibrary run: 01c015fef4176e370c21ed0d0204b91ee4923b47
  • first red run: 939aeff699d4b727d4dd04d4471113f3bc6063fa (Drop stale [compat] majors older than one year)

That compat change first made the graph unresolvable; #49 repaired resolution. Once resolved, #48 exposed the latent OUQBase assumptions under Symbolics 7.37–7.39: numeric constants are symbolic wrappers, and several names OUQBase used are not declared public by their owner modules.

The replacement dependencies were checked at their owners: Symbolics.value, Symbolics.wrap, Symbolics.Inequality, Symbolics.≲, and Symbolics.≳ are public/documented; SymbolicUtils.term and SymbolicUtils.substitute are public/exported, and substitute(...; fold=Val(true)) is documented. SymbolicUtils.Operator, SymbolicUtils.default_is_atomic, Symbolics.evaluate, Symbolics.geq, and Symbolics.leq are not public and are no longer used.

Failing before

On the unmodified PR 48 head with Julia 1.12.7, the focused canonical-moment constructor printed the wrapped RHS type and failed in the Float64 assignment:

rhs_type=SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymReal}
ERROR: Unreachable reached.
...
convert(::Type{Float64}, ::SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymReal})
...
build_raw_moment_sequence ... canonical_moments.jl:25

The hosted PR 48 composition independently failed OUQBase Core, QA, and downgrade:

Passing after

Focused discriminator on the patched code:

FOCUSED_REPRO_PASS rhs_type=SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymReal} storage_type=Vector{Float64}
BOUNDARY_CONDITION_PASS

Current Julia Core:

$ GROUP=OUQBase JULIA_NUM_THREADS=2 julia +1.12 --project=. -e 'using Pkg; Pkg.test()'
Test Summary:          | Pass  Total      Time
Flood Problem (Q only) |    5      5  13m25.4s
Test Summary:                               | Pass  Total  Time
Flood Problem (canonical moments objective) |    6      6  3.5s
Testing OUQBase tests passed
Testing OptimalUncertaintyQuantification tests passed

Current Julia QA:

$ GROUP=OUQBase_QA JULIA_NUM_THREADS=2 julia +1.12 --project=. -e 'using Pkg; Pkg.test()'
Test Summary:     | Pass  Total     Time
Quality Assurance |   18     18  4m02.7s
Testing OUQBase tests passed
Testing OptimalUncertaintyQuantification tests passed

Hosted CI completed with 22 successful checks, one empty-matrix skip, and one failure. All
OUQBase Core checks on current, LTS, and prerelease Julia, OUQBase QA, and OUQBase downgrade
passed. The only failure is the root umbrella QA job, whose five implicit facade imports,
17 undocumented bindings, 23 unapproved reexports, and 18-pass/2-fail/1-error summary exactly
match the failure on the stacked base PR:

Exact sublibrary downgrade workflow, run with Julia 1.10.12 in a workspace-local isolated depot and the reusable workflow's effective stdlib/in-tree skip set:

$ julia +lts --startup-file=no julia-downgrade-compat-v2/downgrade.jl "$EFFECTIVE_SKIP" lib/OUQBase alldeps 1.10 ''
[ Info: Successfully resolved minimal versions for lib/OUQBase (with extras)
⌥ [d1185830] SymbolicUtils v4.38.0
⌃ [0c5d862f] Symbolics v7.37.0
$ OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP=Core JULIA_NUM_THREADS=2 julia +lts --startup-file=no --project=lib/OUQBase -e 'using Pkg; Pkg.test(allow_reresolve=false)'
Test Summary:          | Pass  Total   Time
Flood Problem (Q only) |    5      5  31.9s
Test Summary:                               | Pass  Total  Time
Flood Problem (canonical moments objective) |    6      6  1.9s
Testing OUQBase tests passed

Mechanical checks:

$ julia +1.12 --project="$HOME/.julia/environments/@runic117" -m Runic --check --diff <all changed .jl files>
$ typos <all changed .jl files>
$ git diff --check
RUNIC_EXIT:0 TYPOS_EXIT:0 DIFF_CHECK_EXIT:0

Not verified / scope

  • No docs build was run because this PR adds no public name and changes no public docstring or rendered documentation; its new helpers/constants are private.
  • The unrelated root umbrella QA facade/reexport failures visible on PR 48 are outside this OUQBase-only follow-up and are not hidden or allow-listed here.
  • The root umbrella facade failure will be handled separately so this OUQBase repair remains focused.

Links

🤖 Generated with Codex CLI (model: gpt-5.6-sol; session: local session ID 01a0598f-11b9-72d1-91d9-b2fbb186557d).

ChrisRackauckas and others added 6 commits August 27, 2026 17:55
Disambiguate promote_symtype for expectation/probability operators, recurse through operator calls when collecting random variables, bind Symbolics for the precompile workload, and cap SymbolicUtils below 4.46 until MTK loads cleanly with newer SymbolicUtils.

Co-authored-by: Cursor <cursoragent@cursor.com>
IA 1.x rejects Base.intersect on intervals; Downgrade/main DiscreteMeasures
tests hit ArgumentError on clamp_domain.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ests.

IA 1.x empty intervals evaluate `∅_trv == ∅_trv` as false, so clamp_domain
tests failed under both Sublibrary CI and Downgrade Sublibraries after switching
to intersect_interval.

Co-authored-by: Cursor <cursoragent@cursor.com>
Base isequal/== are inconclusive or false for decorated intervals in IA 1.x;
isequal_interval is the supported comparison.

Co-authored-by: Cursor <cursoragent@cursor.com>
Unwrap numeric constants produced by Symbolics 7 and evaluate probability inequalities through public symbolic substitution APIs.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Agent-Harness: Codex CLI 0.151.0
Agent-Model: gpt-5.6-sol
Agent-Session: local session ID 01a0598f-11b9-72d1-91d9-b2fbb186557d
Model OUQ operators locally, identify random variables behaviorally, and remove nonpublic Symbolics relation and evaluator accesses.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Agent-Harness: Codex CLI 0.151.0
Agent-Model: gpt-5.6-sol
Agent-Session: local session ID 01a0598f-11b9-72d1-91d9-b2fbb186557d
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants