"Multi-dataset class symbolic regression with shared and
Scanned 9/8/2026
Install to Claude Code
npx -y skills add VectorSpaceLab/AREX-Skill --skill class-sr --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Class Sr?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/vectorspacelab-class-sr)More formats (shields.io, HTML) on the badges page.
---
name: class-sr
description: "Multi-dataset class symbolic regression with shared and
realization-specific free constants."
read_when: "Use when multiple related realizations must share one symbolic law
with class and realization-specific constants."
disable-model-invocation: true
metadata:
disco-role: operating
license: MIT
---
# Class SR
## Role
Use this sub-skill when the user has multiple realizations of the same phenomenon and wants one shared symbolic form with:
- class free constants shared by every realization
- realization-specific free constants (`spe_free_consts`)
- ClassSR-specific data-shape validation and quick-start guidance
If the user has only one dataset, route to the sibling `sr` sub-skill instead.
If the user mainly needs expression-tree or constant-table manipulation, hand off to the sibling `toolkit` sub-skill.
## Included
- `physo.ClassSR`
- `multi_X`, `multi_y`, `multi_y_weights`
- `class_free_consts_*` and `spe_free_consts_*`
- ClassSR config selection (`config0b`, `config1b`, `config2b`)
- safe quick-start execution on CPU
- loading and inspecting Pareto logs
- constant inspection handoff to toolkit-style workflows
## Excluded
- single-dataset `physo.SR`
- benchmark equivalence utilities and benchmark runner automation
- generated jobfile helpers and maintainer-only benchmark orchestration
- generic multi-task ML workflows that are not ClassSR
## Verified entry points
- `physo.ClassSR`
- `physo.config.config0b.config0b`
- `physo.config.config1b.config1b`
- `physo.config.config2b.config2b`
- `physo.read_pareto_pkl`
- `physo.load_expr`
- `run_logger.get_pareto_front()`
- `best_expr.free_consts.class_values`
- `best_expr.free_consts.spe_values`
- `best_expr.get_infix_sympy(evaluate_consts=True)`
## Canonical workflow
1. Build `multi_X` and `multi_y` as lists with one element per realization.
- Each `X_i` must have shape `(n_dim, n_samples_i)`.
- Each `y_i` must have shape `(n_samples_i,)`.
- Different realizations may have different sample counts.
2. Provide weights with `multi_y_weights` when you need to bias one realization or one region of a realization.
3. Define constants and units.
- `class_free_consts_*` are shared across realizations.
- `spe_free_consts_*` may vary by realization.
4. Pick a ClassSR config.
- `config0b`: quick smoke / demos
- `config1b`: dimensional-analysis-heavy ClassSR and Milky Way streams
- `config2b`: class benchmark style runs
- prefer the `b` variants for ClassSR because they give more free-constant optimization steps
5. Run `physo.ClassSR(...)` on CPU for a smoke test, or on the target device if the environment is already verified.
6. Inspect the result with `best_expr.get_infix_pretty()`, `run_logger.get_pareto_front()`, and `best_expr.free_consts`.
7. If you need deeper program or constant-table work, switch to the sibling `toolkit` sub-skill instead of expanding this one.
## Input / output contract
- Input `multi_X`: list-like of length `n_realizations`; each item is array-like with shape `(n_dim, n_samples_i)`.
- Input `multi_y`: list-like of length `n_realizations`; each item is array-like with shape `(n_samples_i,)`.
- Input `multi_y_weights`: one of
- a single scalar, broadcast to every realization
- a list/array of length `n_realizations` containing one scalar per realization
- a list/array of length `n_realizations` containing one weight array per realization with shape `(n_samples_i,)`
- Input `class_free_consts_names` / `class_free_consts_units` / `class_free_consts_init_val`: same length, one entry per shared constant.
- In the `ClassSR` wrapper, pass init values in name order as a list/array-like container.
- Input `spe_free_consts_names` / `spe_free_consts_units` / `spe_free_consts_init_val`: same length, one entry per realization-specific constant.
- In the `ClassSR` wrapper, pass init values in name order as a list/array-like container.
- `spe_free_consts_init_val` may use a scalar or a length-`n_realizations` vector per constant.
- Output `best_expression`: `physo.physym.program.Program`
- Output `run_logger`: logger object with Pareto-front access
- Output `best_expression.free_consts.class_values`: shape `(1, n_class_free_consts)`
- Output `best_expression.free_consts.spe_values`: shape `(1, n_spe_free_consts, n_realizations)`
- Output `best_expression.get_infix_sympy(evaluate_consts=True)`: array with one expression per realization
## Quick safe run
Use the bundled smoke helper for a CPU-safe sanity check:
```bash
python skills/disco/physo/sub-skills/class-sr/scripts/smoke_class_sr_quick_start.py
```
The helper uses tiny deterministic data, short epochs, CPU execution, and temporary log files.
## Troubleshooting
- If imports fail, check the environment first: `physo`, `torch`, `numpy`, `sympy`, `pandas`, `matplotlib`, `scikit-learn`.
- If a realization has a different sample count, that is allowed; only each `X_i` / `y_i` pair must match.
- If `multi_y_weights` length does not match `multi_y`, or any per-point weight array has the wrong length, fix the list shape first.
- If class/spe constant unit arrays do not match the name counts, fix the name/unit lists before running.
- If `spe_free_consts_init_val` is a vector, its length must match `n_realizations`.
- If `parallel_mode` or CUDA behavior is unclear, keep the smoke run on `device='cpu'` with `parallel_mode=False`.
- CUDA-capable torch builds may still print parallel-mode warnings during a CPU smoke run; treat them as expected noise unless the run actually fails.
- If LaTeX or display extras are missing, prefer `get_infix_pretty()` or `get_infix_sympy()`; pretty LaTeX rendering is optional.
- If you need saved logs or Pareto reloads, use `run_logger.get_pareto_front()` first and then `physo.read_pareto_pkl(...)` on the saved `_pareto.pkl` file.
## Related native tests and examples
- `physo/task/tests/class_sr_UnitTest.py` — canonical ClassSR task check
- `physo/physym/tests/free_const_UnitTest.py` — class/spe constant table behavior
- `physo/physym/tests/dataset_UnitTest.py` — realization and weight-shape validation
- `physo/benchmark/ClassDataset/tests/ClassProblem_UnitTest.py` — benchmark-shaped multi-dataset loading
- `demos/class_sr_quick_start.py` — source quick-start recipe adapted by the smoke script
- `demos/class_sr/demo_free_fall/demo_free_fall.py` — reference ClassSR example with class and spe constants
- `demos/class_sr/demo_milky_way_streams/MW_streams_run.py` — reference-only, longer benchmark-style run
## See also
- Root `physo` skill for package-level routing and shared troubleshooting
- Sibling `toolkit` skill for program inspection, constant-table work, and log loading
- Sibling `benchmarks` skill for benchmark problem loaders and symbolic comparison
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!