CoolFace
Datasetpublic

OrDora/coachtwin-workouts

CoachTwin Workouts 10,393 synthetic, structured workout plans, generated with an open small language model and used to power the CoachTwin app - a workout recommender plus AI workout generator. How it was generated Generated with Qwen2.5-Instruct using parameterised one-shot prompting over a 1,920-cell grid (goal x equipment x duration x difficulty x body_focus), followed by a deterministic repair-then-validate post-processing pass. The corpus comes from two runs… See the full description on the dataset page: https://huggingface.co/datasets/OrDora/coachtwin-workouts.

sourceHugging Facemitupdated 28d agoView on Hugging Face
1likes84downloads
Dataset Card

CoachTwin Workouts

10,393 synthetic, structured workout plans, generated with an open small language model and used to power the CoachTwin app - a workout recommender plus AI workout generator.

How it was generated

Generated with Qwen2.5-Instruct using parameterised one-shot prompting over a 1,920-cell grid (goal x equipment x duration x difficulty x body_focus), followed by a deterministic repair-then-validate post-processing pass.

The corpus comes from two runs, marked by the source column:

`source`rowsmodelprompt
v1_prompt7,223Qwen/Qwen2.5-0.5B-Instructno exercise-count target
duration_aware3,170Qwen/Qwen2.5-1.5B-Instructstates a per-duration exercise-count target

Both runs pass through the same repair-then-validate contract, so every published row meets one standard. Note that model and prompt changed between the two runs, so the volume comparison in the EDA is a quasi-experiment rather than a clean single-variable one — stated explicitly there.

The repair step is the reason this dataset reaches five figures. An earlier reject-only pipeline discarded an entire workout for any single defect and yielded 4.5% - roughly half the losses were plans whose only flaw was a time reference in the title. Repairing deterministically fixable defects (stripping digits from titles, clamping rest_seconds, dropping one off-target exercise instead of the whole plan) raised the yield by an order of magnitude while keeping the validation contract intact.

Category balance is maintained by inverse-frequency weighted sampling over body_focus, which corrected a 54.8x imbalance down to 2.4x.

Full code: coachtwin_generation.ipynb in this repo.

Schema

columntypedescription
titlestringworkout name (contains no digits by construction)
warm_upstringwarm-up description
exercisesJSON stringlist of {name, sets, reps, rest_seconds}
cool_downstringcool-down description
notesstringtrainer notes
goalcategorystrength / weight loss / endurance / flexibility / general fitness
equipmentcategorybodyweight / dumbbells / resistance bands / full gym
duration_minutesint15 / 30 / 45 / 60
difficultycategorybeginner / intermediate / advanced
body_focuscategoryfull body / upper body / lower body / core / cardio / push / pull / legs
sourcecategoryprovenance: v1_prompt (no volume target) or duration_aware
python
import pandas as pd, ast
df = pd.read_csv("https://huggingface.co/datasets/OrDora/coachtwin-workouts/resolve/main/coachtwin_workouts.csv")
df["exercises"] = df["exercises"].apply(ast.literal_eval)

EDA summary

  • —10,393 rows, 0 missing values.
  • —Body focus balance: imbalance ratio 2.40x (down from 54.8x under uniform sampling).
body_focuscount
full body1905
legs1538
upper body1396
cardio1352
lower body1192
core1128
pull1087
push795
  • —Richness: 2.9 exercises per workout on average (range 2-9).
  • —Volume does NOT scale with duration - a reported negative result. correlation(duration_minutes, num_exercises) = 0.06, against ~0.02 in the earlier version. Explicit per-duration exercise-count targets were added to the prompt specifically to fix this, and they did not: asked for 6-8 exercises at 60 minutes, the model produces about 4 before repair and about 3 after. A 1.5B model responds to an explicit count instruction, but far too weakly for the effect to survive into the data.
  • —The two EDA-driven fixes interact. Inverse-frequency sampling corrected the body-focus imbalance by concentrating generation on push/pull/core - which average 2.4-2.8 exercises against 3.5 for full body. Fixing the imbalance therefore depressed mean volume. The dataset reflects that trade-off, and the EDA notebook measures both halves of it.
  • —The repair layer is not the cause. Notebook 01 cell [7b] records exercise count before and after repair on the same generations: repair removes ~0.4 exercises per surviving plan and leaves the duration correlation unchanged (+0.34 before, +0.35 after). Its real cost is whole-plan rejection, about 30%.
  • —Provenance: the source column marks which prompt version produced each row. Because both populations come from the same model on the same parameter grid and differ only in whether the prompt stated an exercise-count target, the dataset contains a controlled before/after for that single change.
  • —Vocabulary: 4,707 unique exercise names across 30,270 entries (type-token ratio 0.156).
  • —Duplication: 0 true duplicates (0.0%). 3,953 rows share a title with another row but differ in content and parameters.
  • —Rest periods: all values inside the intended 15-120s range.

Full analysis with plots: coachtwin_eda.ipynb in this repo.

Known limitations

  • —Title vocabulary is narrower than exercise vocabulary; generic names such as "Strength Training Circuit" recur across genuinely different workouts.
  • —Content is not expert-verified. This is synthetic data for a machine learning demonstration and is not fitness or medical advice.
  • —Exercise-to-body_focus matching is enforced by keyword rules, so an exercise whose name does not contain a recognised keyword can be dropped even when it is appropriate.

Intended use

Retrieval corpus for an embedding-based workout recommender, and few-shot grounding context for an AI workout generator. See the CoachTwin Space.