CoolFace
Datasetpublic

projenix/tinysynth-reasoning

TinySynth Reasoning Primitives Synthetic training data for teaching small language models stable state representation and controlled reasoning operations — entity/attribute binding, state persistence, mutation, transfer, reference resolution, current-vs-cumulative distinctions, and claim validation — in a systems/computing vocabulary. Every example is generated from a hidden symbolic world and verified by a symbolic solver before any natural language is produced: semantic state… See the full description on the dataset page: https://huggingface.co/datasets/projenix/tinysynth-reasoning.

sourceHugging Facemitupdated 8d agoView on Hugging Face
0likes63downloads
Dataset Card

TinySynth Reasoning Primitives

Synthetic training data for teaching small language models stable state representation and controlled reasoning operations — entity/attribute binding, state persistence, mutation, transfer, reference resolution, current-vs-cumulative distinctions, and claim validation — in a systems/computing vocabulary.

Every example is generated from a hidden symbolic world and verified by a symbolic solver before any natural language is produced:

semantic state schema -> symbolic world -> symbolic events -> solver
    -> known final + intermediate states -> structural validation -> rendering

Language only ever renders already-verified truth; it never determines the answer. Nouns and verbs are not mixed freely — each state variable owns the verbs that may act on it, so semantically broken text like "3 stored files finish" is unproducible by construction rather than filtered out afterwards.

Configs = curriculum levels

One config per difficulty level, intended to be trained in order.

ConfigExamplesApprox. tokensPrimitives
difficulty_0797,391~20,000,080containment, mapping, membership, retrieval
difficulty_1553,128~20,000,058decrement, increment, noopcontrast, replace, statepersistence, toggle
difficulty_2485,859~20,000,038attributebinding, booleanlogic, comparison, conditional, contradiction, countingselected, currentvscumulative, entitybinding, equality, eventclassification, irrelevantfilter, ordering, referenceresolution, statepersistence, transfer, validation
difficulty_3459,909~20,000,055accumulation, multi_step
difficulty_4361,059~20,000,060contradiction, currentvscumulative, irrelevantfilter, referenceresolution, state_persistence, transfer
difficulty_5265,089~20,000,126crossentity, referenceresolution

Difficulty is computed from latent features (transitions, entities, references, distractors, no-ops, conditions), not from sentence count — a long arithmetic chain does not automatically score high.

LevelContent
0Pure retrieval / lookup, no events
1One state operation, or pure observation (no-ops only)
2One operation + one complication
32-4 clean state transitions
4Multiple transitions + exactly one complication
5Multiple transitions + two or more complications

Usage

python
from datasets import load_dataset

ds = load_dataset("sam/tinysynth-reasoning", "difficulty_0")
print(ds["train"][0]["text"])

Train on the text field. To walk the curriculum:

python
for level in range(6):
    ds = load_dataset("sam/tinysynth-reasoning", f"difficulty_{level}")
    train(ds["train"])

Recover the symbolic ground truth for analysis or programmatic grading:

python
import json
latent = json.loads(ds["train"][0]["latent_state"])
# {'initial': {...}, 'events': [...], 'final': {...}, 'query': {...}}

Splits

SplitPurpose
trainTraining data.
validationHeld-out, same distribution.
testHeld-out, same distribution.
ood_testGeneralization split. Same reasoning primitives, but held-out wording, entity names, schema/entity-kind pairings, and one surface form (state_transition) reserved exclusively for it. Measures whether the model learned the operation or memorized the template.

Splits are assigned per latent problem, so every surface variant of a problem stays in one split — there is no leakage between splits even though the same underlying world may be rendered several ways.

Fields

FieldTypeDescription
idstringUnique id: <latent_problem_id>_<surface_form>.
latent_problem_idstringId of the underlying symbolic problem. All surface variants of one problem share it and always land in the same split.
primitivestringReasoning primitive exercised (validated structurally, not just labelled).
subprimitivestringFiner variant, e.g. mutation_among_no_ops, irrelevant_events_other_entity. May be null.
difficultyint64Curriculum level 0-5, computed centrally from latent features.
surface_formstringRendering style, e.g. natural_qa, compact_reasoning, stepwise_state.
wording_templatestring<primitive>/<surface_form>, for slicing accuracy by template.
domainstringEntity kind, e.g. server, cache, message queue.
state_schemastringSemantic state variable, e.g. active_jobs, queued_requests. May be null for schema-less primitives.
splitstringSplit this row belongs to (also encoded by the file it lives in).
contrast_group_idstringSet on minimal-pair examples (observation vs mutation) that share a setup. May be null.
entity_countint64Number of entities carrying state.
attribute_countint64Number of distinct tracked attributes.
transition_countint64Number of state-changing events.
noop_countint64Number of observation (no-op) events.
reference_countint64Number of anaphoric references.
distractor_countint64Number of irrelevant facts.
promptstringModel input.
answerstringTarget completion.
textstringprompt + "\n\n" + answer — the field to train on.
latent_statestringJSON string: {initial, events, final, query} — the symbolic ground truth the example was generated from.

latent_state is a JSON string rather than a nested struct on purpose: its keys are entity-specific (host_1.running_containers, ...), so an inferred Arrow struct would carry hundreds of mostly-null columns and would not be stable across shards or datasets versions.

Generation

bash
python -m tinysynth.hf_export --output-dir tinysynth-reasoning \
    --target-tokens-per-level 20000000 \
    --seed 42 --variants-per-problem 3 \
    --ood-fraction 0.05

Generation is deterministic for a fixed seed and configuration.

Design notes and limitations

  • Observation is not mutation. A large share of the corpus trains explicitly on the fact that checking, reading, listing, or displaying state leaves it unchanged, including minimal pairs (contrast_group_id) whose setups are identical apart from one verb.
  • Similar nouns are distinguished. queued_requests and total_requests_received are different variables; an arrival increments both, a completion decrements only the first.
  • Anaphora appear only where the antecedent is adjacent and unambiguous, so hard coreference is out of scope by design.
  • Conditionals are single-clause threshold checks; there is no nested depth.
  • Numbers are small (0-9 by default) on purpose — the target is reasoning mechanics, not arithmetic difficulty.
  • The ood_test split varies surface realization only, not reasoning structure; it measures template memorization, not compositional generalization.