Skip to content

Add serial Octave pipeline support and fix web version histories - #65

Open
andremun wants to merge 9 commits into
masterfrom
codex/octave-compatibility-foundation
Open

andremun wants to merge 9 commits into
masterfrom
codex/octave-compatibility-foundation

Conversation

@andremun

@andremun andremun commented Oct 4, 2026

Copy link
Copy Markdown
Owner

The pipeline previously depended on MATLAB-only APIs for preprocessing, optimization, geometry, persistence and graphics. This adds a bounded serial Octave 2D/3D build → save/load → explore workflow while retaining the MATLAB backends.

Changes

  • Add namespaced adapters for Box–Cox normalization, feature selection, numerical/SIMPLS projection, KNN none/Sobol tuning, TRACE3 footprints, model archives and PNG export.
  • Preserve trained predictions and footprint summaries across Octave save/load/explore; support CSV output, quoted Unicode labels, evaluation-only algorithms and instance subsets.
  • Add portable regression suites and CI with pinned Octave and package versions.
  • Consolidate web documentation changes under v0.9.2, move misplaced entries into Version History, order releases newest-first and regenerate the HTML/search index.

Validation

  • Octave 11.3.0 with Statistics 2.0.0 and Datatypes 1.5.0: deterministic, learning, optimization, geometry and workflow-edge suites passed; complete 2D/3D build/save/load/explore with CSV and PNG passed. PNG output was visually inspected.
  • Octave 6.4.0: core-only deterministic suite passed.
  • MATLAB R2026a Update 5: shared deterministic, learning and optimization contracts passed. Both ClassApiTest cases passed across separate runs after the combined run reached its graphics-output time limit.
  • Documentation generation check, link check, release-history structure checks and git diff whitespace check passed.
  • New GitHub CI configuration awaits its hosted run; the full MATLAB regression suite was not run locally.

Support boundary

KNN is the validated Octave classifier. Bayesian tuning, parallel execution, legacy TRACE, FIG files and web palette export remain unsupported in Octave. 3D PNG requires Qt and a display or virtual display. Classifier archives are runtime-specific; equal seeds do not imply identical MATLAB/Octave optimizer, Sobol or geometry results. See docs/octave-compatibility.md for the tested environment and contracts.

Copilot AI balanced review requested due to automatic review settings October 4, 2026 08:47

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Staged Octave builds bypass the early checks for unsupported web and 3D FIG output options.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
What changed in this PR

Adds bounded serial GNU Octave support across the ISA pipeline while retaining MATLAB backends, persistence, and outputs.

Changes:

  • Adds Octave compatibility adapters for preprocessing, projection, optimization, classifiers, geometry, archives, and graphics.
  • Adds portable MATLAB/Octave regression suites and Octave CI.
  • Updates and regenerates v0.9.2 documentation and version histories.
File Description
InstanceSpace.m Integrates compatibility checks, archives, and portable validation.
README.md Documents supported Octave workflow.
.github/​workflows/​octave-smoke.yml Adds pinned Octave CI jobs.
core/​CLOISTER.m Uses portable correlation and extrema adapters.
core/​PILOT.m Adds portable PLS, optimization, and rounding.
core/​PILOTviewpoint.m Uses the serial optimizer adapter.
core/​PRELIM.m Uses portable Box–Cox and quartile operations.
core/​PYTHIA.m Adds Octave validation, Sobol candidates, and portable CV access.
core/​SIFTED.m Adds serial clustering and integer-search support.
core/​TRACE.m Adds portable alpha-shape handling.
output/​scriptcsv.m Supports compatible alpha-shape exports.
output/​scriptfcn.m Adapts plotting helpers and geometry detection.
output/​scriptpng.m Adds Octave PNG export and graphics handling.
utils/​ISAdefaults.m Disables FIG output by default in Octave.
utils/​ISAmigrateModel.m Supports Octave model archives during migration.
utils/​+isacompat/​AlphaShape.m Implements portable 2D/3D alpha complexes.
utils/​+isacompat/​Partition.m Provides portable CV partition masks.
utils/​+isacompat/​archiveValue.m Encodes and reconstructs supported archive values.
utils/​+isacompat/​boxcoxApply.m Applies stable Box–Cox transformations.
utils/​+isacompat/​boxcoxFit.m Fits Box–Cox parameters in Octave.
utils/​+isacompat/​columnExtrema.m Adds NaN-aware column extrema.
utils/​+isacompat/​columnQuartiles.m Adds portable medians and IQRs.
utils/​+isacompat/​diagnostics.m Reports runtime and package capabilities.
utils/​+isacompat/​exportFigure.m Selects runtime-specific PNG export.
utils/​+isacompat/​integerSearch.m Implements bounded serial integer search.
utils/​+isacompat/​isAlphaShape.m Recognizes native and compatible shapes.
utils/​+isacompat/​isOctave.m Detects GNU Octave.
utils/​+isacompat/​loadModel.m Loads native or versioned archives.
utils/​+isacompat/​makeAlphaShape.m Selects the runtime geometry backend.
utils/​+isacompat/​minimize.m Maps optimizer options by runtime.
utils/​+isacompat/​pearsonColumns.m Implements portable Pearson significance.
utils/​+isacompat/​pls.m Implements Octave SIMPLS projection.
utils/​+isacompat/​requireFeature.m Rejects unsupported capabilities.
utils/​+isacompat/​requirePipelineSupport.m Validates the Octave pipeline boundary.
utils/​+isacompat/​requirePythiaSupport.m Restricts Octave classifier support.
utils/​+isacompat/​roundDecimal.m Adds portable decimal rounding.
utils/​+isacompat/​saveModel.m Writes safe runtime-specific archives.
utils/​+isacompat/​selectInteger.m Selects native GA or serial search.
utils/​+isacompat/​sobolCandidates.m Generates runtime-specific Sobol candidates.
tests/​OctaveCompatibilityTest.m Runs portable contracts in MATLAB CI.
tests/​portable/​runDeterministicStages.m Tests preprocessing and hull contracts.
tests/​portable/​runGeometrySmoke.m Tests compatible alpha geometry.
tests/​portable/​runLearningSmoke.m Tests Octave KNN training and evaluation.
tests/​portable/​runOptimizationSmoke.m Tests PLS and search adapters.
tests/​portable/​runPipelineSmoke.m Tests complete save/load/explore workflows.
tests/​portable/​runPortableSmoke.m Tests shared projection contracts.
tests/​portable/​runWorkflowEdges.m Tests subsets and archive safety.
tests/​portable/​setupOctaveValidation.m Provisions pinned Octave packages.
docs/​octave-compatibility.md Documents support, setup, and limitations.
doc/​src/​CLOISTER.md Documents Octave hull support.
doc/​src/​FILTER.md Moves fixes into v0.9.2 history.
doc/​src/​ISAmigrateModel.md Documents Octave archive migration.
doc/​src/​InstanceSpace.md Documents Octave class workflows.
doc/​src/​MetadataFormat.md Corrects version-history placement.
doc/​src/​OptionsReference.md Labels validation changes as v0.9.2.
doc/​src/​PILOT.md Documents portable projections.
doc/​src/​PILOTviewpoint.md Documents portable viewpoint optimization.
doc/​src/​PRELIM.md Documents Octave normalization.
doc/​src/​PYTHIA.md Documents Octave KNN support.
doc/​src/​SIFTED.md Documents serial feature selection.
doc/​src/​TRACE.md Documents compatible TRACE3 geometry.
doc/​src/​WhatsNew.md Announces Octave support.
doc/​src/​scriptcsv.md Consolidates geometry export history.
doc/​src/​scriptpng.md Documents Octave plotting support.
doc/​html/​CLOISTER.html Regenerates CLOISTER documentation.
doc/​html/​FILTER.html Regenerates FILTER documentation.
doc/​html/​ISAmigrateModel.html Regenerates migration documentation.
doc/​html/​InstanceSpace.html Regenerates class documentation.
doc/​html/​MetadataFormat.html Regenerates metadata documentation.
doc/​html/​OptionsReference.html Regenerates option documentation.
doc/​html/​PILOT.html Regenerates PILOT documentation.
doc/​html/​PILOTviewpoint.html Regenerates viewpoint documentation.
doc/​html/​PRELIM.html Regenerates PRELIM documentation.
doc/​html/​PYTHIA.html Regenerates PYTHIA documentation.
doc/​html/​SIFTED.html Regenerates SIFTED documentation.
doc/​html/​TRACE.html Regenerates TRACE documentation.
doc/​html/​WhatsNew.html Regenerates release highlights.
doc/​html/​scriptcsv.html Regenerates CSV documentation.
doc/​html/​scriptpng.html Regenerates PNG documentation.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread utils/+isacompat/requirePipelineSupport.m Outdated
@codecov

codecov Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 88.96552% with 16 lines in your changes missing coverage. Please review.
✅ Project coverage is 94.60%. Comparing base (aac7d7d) to head (681ac5d).
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
InstanceSpace.m 81.08% 7 Missing ⚠️
output/scriptpng.m 82.75% 5 Missing ⚠️
output/scriptfcn.m 90.00% 2 Missing ⚠️
core/SIFTED.m 91.66% 1 Missing ⚠️
core/TRACE.m 80.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master      #65      +/-   ##
==========================================
- Coverage   94.88%   94.60%   -0.28%     
==========================================
  Files          23       23              
  Lines        3282     3320      +38     
==========================================
+ Hits         3114     3141      +27     
- Misses        168      179      +11     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The archive decoder can misinterpret ordinary structs containing isaArchiveType, breaking guaranteed model round-trips.

Review effort: Balanced
Findings: 1 High severity

Open (1)
Resolved since last review (1)

Comment thread utils/+isacompat/archiveValue.m

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Explore-time compatibility checks and the canonical v0.9.2 release notes remain incomplete.

Review effort: Balanced
Findings: 1 Medium severity · 1 Low severity

Open (2)
Resolved since last review (1)

Comment thread InstanceSpace.m
Comment thread doc/src/WhatsNew.md

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Portable archive detection can reject valid native models with an ordinary top-level archiveVersion field.

Review effort: Balanced
Findings: 2 Low severity

Open (2)
Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Avoid misclassifying native models as portable archives

utils/​+isacompat/​loadModel.m:28

A native flattened model is treated as a portable archive solely because it has a top-level archiveVersion field. On MATLAB this immediately raises ISA:compat:archiveVersion (~isOctave() is true), so models with an otherwise ordinary custom field that previously loaded successfully now break. Detect the exact portable envelope written by saveModel (archiveVersion plus payload, with no other top-level variables) before applying archive validation; otherwise return the native model unchanged.

Comment thread doc/src/InstanceSpace.md

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The new CI sequence cannot resolve PILOT in runOptimizationSmoke, and the default Octave SIFTED diagnostics path remains untested.

Review effort: Balanced
Findings: 1 High severity · 1 Low severity

Open (2)
Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Test Octave evalclusters conversion with diagnostics enabled

core/​SIFTED.m:179

The Octave-only evalclusters conversion is not exercised by any portable test: the sole full SIFTED workflow sets diagnostics=false, and no other portable runner calls SIFTED. Since diagnostics defaults to true, the advertised default Octave build path (including this object-to-struct conversion before archive save) can regress while the new CI remains green. Add a focused Octave run with diagnostics enabled and verify the converted fields survive save/load.

Comment thread tests/portable/runOptimizationSmoke.m

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The broad numerical and persistence changes still have an unresolved TRACE3 scaling concern, and the new hosted CI has not yet run.

Review effort: Balanced
Findings: 1 Low severity

Open (1)
Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Avoid quadratic simplex scans in inShape containment checks

utils/​+isacompat/​AlphaShape.m:96

inShape tests every still-unclassified query against every active simplex. TRACE invokes containment for up to 101 alpha candidates per algorithm, and a 3-D Delaunay complex can contain quadratic-many tetrahedra, so realistic workflows can spend O(algorithms × alpha steps × queries × simplices) time here. Please use a triangulation point-location routine/spatial index (or otherwise reuse indexed simplex data) rather than rescanning all points for every simplex.

@andremun
andremun requested a balanced review from Copilot October 5, 2026 00:52

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

This branch has not been deployed

No deployments
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