Skip to content
Back to skills

Toolkit

ASecurity

"Build, encode, decode, sample, inspect, optimize, and reload PhySO

  • 247 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 8, 2026
toolspythonbashexpressapibackend

Works with

  • cursor
  • terminal
  • api

Security analysis

A100/100

Pro scans all 6 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add VectorSpaceLab/AREX-Skill --skill toolkit --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Toolkit?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Toolkit
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/vectorspacelab-toolkit/badge)](https://www.skillsdirectory.com/skills/vectorspacelab-toolkit)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: toolkit
description: "Build, encode, decode, sample, inspect, optimize, and reload PhySO
  symbolic programs without running SR orchestration."
read_when: "Use when a task concerns physo.toolkit, expression prefix encodings,
  token libraries, free constants, program trees, display, monitoring, or
  Pareto/result loading."
disable-model-invocation: true
metadata:
  disco-role: operating
license: MIT
---

# PhySO toolkit

## Role

Use this sub-skill for the low-level symbolic-expression layer of PhySO. It
turns a token library and prefix expressions into executable `Program` or
`VectPrograms` objects, and provides safe routes for sampling, inspecting,
optimizing, displaying, and reloading those objects. The verified baseline is
PhySO 1.2.0 in a CPU-only Python environment. Import-time warnings about
missing system LaTeX are expected and do not invalidate plain-text workflows.

## Boundaries

### Included

- `physo.toolkit.get_library`, `get_expressions`, `get_prior`, and
  `sample_random_expressions`.
- `Library.encode`/`decode`, prefix-token validation, one-hot encodings, and
  length/structural priors.
- `Dataset`, `Token` and its public typed subclasses, `Library`, `Program`,
  `VectPrograms`, `Cursor`, `FreeConstantsTable`, and differentiable
  `candidate_wrapper` usage at the expression layer.
- CPU-safe execution, autograd inspection, free-constant optimization, class versus
  realization-specific constants, tree relationships, and plain or optional
  display representations.
- `RunLogger`, Pareto-front inspection, `physo.read_pareto_csv`,
  `physo.read_pareto_pkl`, and `physo.load_expr`.

### Excluded

- `physo.SR` and `physo.ClassSR` orchestration, run presets, stopping rules,
  and dataset/task selection. Route those questions to
  [the SR sibling](../sr/SKILL.md) or [the Class SR sibling](../class-sr/SKILL.md).
- Feynman/Class benchmark problem definitions, selectors, and equivalence
  workflows. Route them to [the benchmarks sibling](../benchmarks/SKILL.md).
- Maintainer benchmark runners, cluster jobfile generation, long training,
  plotting-heavy analysis, CUDA-specific claims, and undocumented private
  helpers.

## Verified entry points

| Need | Start here | Result |
|---|---|---|
| Define variables, constants, operations, units, and free constants | `physo.toolkit.get_library(...)` | A `physo.physym.library.Library` |
| Encode readable prefix names | `library.encode(expressions_str, one_hot=False)` | One integer-token list per expression; `one_hot=True` returns one-hot matrices |
| Decode integer prefixes | `library.decode(expressions_idx, n_realizations=1)` | A `VectPrograms` batch with padded invalid placeholders |
| Make an empty program batch | `physo.toolkit.get_expressions(batch_size, max_length, library, ...)` | A `VectPrograms` ready for `append` or `set_programs` |
| Build priors for an existing batch | `physo.toolkit.get_prior(priors_config, max_length, expressions, library)` | A prior collection callable |
| Generate random valid candidates | `physo.toolkit.sample_random_expressions(...)` | A sampled `VectPrograms` batch |
| Inspect one candidate | `batch.get_prog(i)` | A `Program` with execution, constants, text, SymPy, and save methods |
| Inspect a batch/tree | `batch.status()`, `batch.tokens`, `Cursor`, family methods | Names, arities, units, parent/child/sibling/ancestor relations |
| Fit constants | `program.optimize_constants(...)`, `batch.batch_optimize_constants(...)` | Updated constant tables and a loss history for the single-program route |
| Reload results | `physo.read_pareto_pkl`, `physo.read_pareto_csv`, `physo.load_expr` | Programs or SymPy expressions, subject to the CSV/Class SR caveat |

See [API reference](references/api-reference.md) for source-verified
signatures, [workflows](references/workflows.md) for compact recipes, and the
[PhySO root skill](../../SKILL.md) for install/backend routing.

## Operating workflow

1. **Fix the data contract first.** For each realization, use `X` with shape
   `(n_dim, n_samples)` and `y` with shape `(n_samples,)`, both floating-point
   tensors or safely convertible arrays. A `Dataset` receives lists
   `multi_X` and `multi_y`, even for one realization (`[X]`, `[y]`). Keep all
   `X`, `y`, and weights on the same device.
2. **Build the smallest library.** Set `X_names`, `y_name`, aligned fixed and
   free-constant arrays, and an explicit `op_names` list. Use protected
   operations unless you deliberately need unprotected numerical behavior.
   With units, every terminal units vector must be aligned and consistent.
3. **Encode only choosable names.** Write expressions in prefix order, e.g.
   `['mul', 'c', 'x']`. Check `library.choosable_names`; placeholders such as
   the superparent, dummy, and invalid token are not encodable user tokens.
4. **Decode and validate.** Pass a batch-shaped list of Python `int` indices to
   `Library.decode`. Inspect `batch.status()`, `batch.n_lengths`,
   `batch.is_complete`, and `batch.get_infix_str(i)` before executing. A prefix
   expression must be a complete tree: `len(tokens) - sum(token.arity) == 1`.
5. **Sample under bounded priors.** Use a small `batch_size` and `max_length`
   for exploration. If `priors_config` is supplied, include a
   `HardLengthPrior`; its `max_length` controls the sampler and takes
   precedence over the top-level value. Seed NumPy and PyTorch when a
   reproducible fixture matters.
6. **Execute and inspect.** Get a `Program` with `get_prog`, call it with a
   tensor, or use `execute(..., i_realization=..., n_samples_per_dataset=...)`
   for realization-specific constants. Prefer `get_infix_str`,
   `get_infix_pretty`, and `get_infix_sympy` for non-graph output.
7. **Optimize constants only after shapes are stable.** Use differentiable
   PyTorch operations and a float target. If using a `candidate_wrapper`, it
   must be callable as `(func, X) -> wrapped_output` and remain differentiable.
   `Program.optimize_constants` uses
   MSE plus LBFGS by default; inspect `history`, `free_consts.class_values`,
   `free_consts.spe_values`, `is_opti`, and `opti_steps`.
8. **Save and reload deliberately.** Use the run visualizer/logger paths to
   identify the generated Pareto CSV/PKL. Prefer PKL for programs and Class SR
   expressions with spe constants. Use CSV loading only for non-spe Pareto
   fronts and pass a SymPy symbol dictionary when assumptions matter.
9. **Fall back when optional display tools are absent.** Missing `latex`,
   `pygraphviz`, `dot2tex`, `pdflatex`, `pdf2image`, or Pillow affects images
   and tree rendering, not prefix encoding or plain text. Do not turn a display
   dependency into a core-workflow failure.

## Input/output contracts

- **Library inputs:** `X_names` length must match the first dimension of data;
  units rows must align with their names and use at most seven dimensions.
  `fixed_consts_units`, `free_consts_units`, and spe-constant units align with
  their corresponding value/name arrays. For the toolkit convenience API,
  `free_consts_init_val` and `spe_free_consts_init_val` are array-like values
  aligned with names; low-level tokenization may use name-to-value dicts.
- **Prefix inputs:** outer sequence is a batch; each inner sequence is a list
  or NumPy array of strings for `encode`, or Python integers for `decode`.
  Variable expression lengths are accepted by `decode` and padded internally.
  One-hot output is for model input and is not a valid direct input to
  `decode`.
- **Program inputs:** `X` is `(n_dim, n_samples)`, target and weights are
  `(n_samples,)`. For flattened multiple realizations, concatenate datasets in
  realization order and pass `n_samples_per_dataset` with the matching counts.
- **Constant outputs:** `class_values` has shape
  `(batch_size, n_class_free_const)`; `spe_values` has shape
  `(batch_size, n_spe_free_const, n_realizations)`. A scalar spe initializer is
  broadcast; a vector must have exactly `n_realizations` entries.
- **Monitoring outputs:** `RunLogger.get_pareto_front()` returns
  `(complexities, programs, rewards, rmse)`. `read_pareto_pkl` returns a list
  of `Program` objects; `read_pareto_csv` returns SymPy expressions, or a
  `(expressions, DataFrame)` tuple when `return_df=True`.

## Verification and native evidence

The related native candidates are:

- `physo.toolkit.tests.codec_UnitTest`
- `physo.toolkit.tests.random_sampler_UnitTest`
- `physo.physym.tests.program_UnitTest`
- `physo.physym.tests.vect_programs_UnitTest`
- `physo.physym.tests.library_UnitTest`
- `physo.physym.tests.token_UnitTest`
- `physo.physym.tests.tokenize_UnitTest`
- `physo.physym.tests.dataset_UnitTest`
- `physo.physym.tests.free_const_UnitTest`
- `physo.physym.tests.program_display_UnitTest`
- `physo.learn.tests.monitoring_UnitTest`

Run the bundled CPU-safe checks before using a generated result:

```bash
python skills/disco/physo/sub-skills/toolkit/scripts/check_toolkit_roundtrip.py
python skills/disco/physo/sub-skills/toolkit/scripts/smoke_toolkit.py
```

These scripts do not access the network, plot, or launch a long search. They
exercise encoding/decoding, an expected unknown-token failure, bounded random
sampling, `Dataset` shape handling, and a small LBFGS constant fit.

## Troubleshooting

Use [troubleshooting](references/troubleshooting.md) when an error is not
immediately explained. In particular, check exact library names and token
arity before changing code; check spe initializer and flattened-data shapes
before changing an optimizer; and use text/SymPy output before installing
optional renderers. If the request asks for an SR/Class SR run or a benchmark
problem loader, hand it to the sibling skill instead of extending this route.

Files in this skill

  • SKILL.md9.5 KB
  • references/api-reference.md11.6 KB
  • references/troubleshooting.md7.9 KB
  • references/workflows.md10.3 KB
  • scripts/check_toolkit_roundtrip.py2.3 KB
  • scripts/smoke_toolkit.py2.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.