Skeletons
A skeleton is an expression template that you contribute to the symbolic-regression search. It captures the shape of a relationship you already suspect (a saturating curve, a power law, an exponential decay) while leaving the exact constants for the search to determine. Skeletons let you inject domain knowledge into the automatic modeling without pinning the result: the search still explores the wider function space, but it is nudged toward the forms you provided.
Skeletons are scoped to a project. Every skeleton you register on a project is mixed into the search for that project's automatic analyses and models, alongside the built-in shortlist of candidate forms.
Skeletons are scoped to a project. Every skeleton you register on a project is mixed into the search for that project's automatic analyses and models, alongside the built-in shortlist of candidate forms.
Templates and the ? placeholder
A skeleton is written in Ufinq's node notation — nested function calls such as
For example, this template describes "a power of a feature, offset and scaled", leaving all three constants free for the search to determine:
Named parameters let a single fitted constant appear in more than one place — here the same rate governs both the slope and the exponent:
add, mul, div, pow, exp, log, sin and cos. Two placeholders give a template its flexibility: | Placeholder | Meaning |
|---|---|
? | A free parameter. A value is determined for each ? when the skeleton is evaluated against your data — you supply the structure, the search supplies the numbers. |
?name | A named free parameter. Every occurrence of the same ?name shares one determined value, so you can force two positions in the template to use the same constant. |
x | The feature placeholder — where an input variable enters the expression. |
For example, this template describes "a power of a feature, offset and scaled", leaving all three constants free for the search to determine:
A skeleton template
Named parameters let a single fitted constant appear in more than one place — here the same rate governs both the slope and the exponent:
Shared named parameter
How skeletons shape the search
Symbolic regression searches the space of mathematical expressions for the one that best explains your data. A skeleton seeds that search with a known-good starting shape. Rather than forcing the answer, it biases the search toward the template's form — the search can still refine, extend, or move away from it if the data disagrees. In effect you are saying "candidates that look like this are worth a closer look."
Each skeleton carries a weight (default
Each skeleton carries a weight (default
0.5) that controls how strongly it is sampled relative to the built-in shortlist. A higher weight makes the search try the skeleton more often; a lower weight keeps it as a gentle hint. The weight must be greater than zero. Creating and managing skeletons in the Lab
Each project has a Skeletons surface in the Lab. From there you can:
You can also start a skeleton from an existing model. When viewing a model entity in the Lab — or its model section in an analysis notebook — "Create skeleton from this model" prefills the template with that model's expression and a name derived from it. Replace the literal constants with
| Action | Description |
|---|---|
| List | See every skeleton on the project with its name, template, parameter count, weight and the current N / 100 capacity count. |
| Create | Add a new skeleton from a single form: a name, the template (typed in a monospaced editor), and an optional weight. Invalid templates (unknown functions or a wrong number of arguments) are rejected with the parser's message shown right under the template field. |
| Edit / delete | Open a skeleton to review its metadata and change any field, or remove it. Deleting a skeleton means later analysis runs on the project no longer mix it in. |
You can also start a skeleton from an existing model. When viewing a model entity in the Lab — or its model section in an analysis notebook — "Create skeleton from this model" prefills the template with that model's expression and a name derived from it. Replace the literal constants with
? placeholders so the search can determine them anew — that generalization is exactly what turns a one-off model into a reusable skeleton. Managing skeletons via MCP
The same operations are available programmatically through the Diafunc MCP server, so an assistant or script can register skeletons for a project:
A non-null template passed to
create_skeleton, list_skeletons, get_skeleton, update_skeleton and delete_skeleton. Registering a skeleton via MCP
A non-null template passed to
create_skeleton or update_skeleton is re-validated by Ufinq; a failed parse returns the same user-facing error you would see in the Lab. On update_skeleton, omitted fields are left unchanged. Limits
A project can hold up to 100 skeletons. Once the project is at that cap, the Lab disables the "New skeleton" button and the API returns an error — delete one before adding another. Weights are static multipliers: the search samples each skeleton according to its weight on every run, and there is no online learning of which skeletons perform best.
How skeletons relate to Analyses and Models
Skeletons feed the same search that produces every Diafunc model. When an automatic analysis discovers a model for a project, the project's skeletons are mixed into the search — so a good skeleton can raise the quality and readability of the resulting formula. The model you get back is still a single, self-contained symbolic expression: skeletons influence how the search explores, not what a model is once it is found.
Models Automatic Analyses