Skip to content

Evolve exercise library into an accurate, powerful foundation for building advanced workout builders and other fitness apps #5

@Dieterbe

Description

@Dieterbe

I want to build a powerful foundation of an "exercise library", which has all the exercise science state of the art baked in, so we can build other fitness applications on top (such as, but not limited to, body.build's ambition to generate world class workout programs)

Most applications use "lists of exercises", wherein each exercise defines which muscles it works.
But such approaches fall short. They don't embody enough nuance. Going through the course, i learned about many "nuances" which affect the outcome of workouts and exercises and therefore a good library needs to factor them in. Especially when trying new exercises or execution styles and analyzing stats retroactively, comparing progress, etc awareness of these nuances matters, mainly for 2 reasons:

  1. some nuances affect recruitment, which should be factored in during volume counting
  2. some nuances may affect the growth stimulus. tracking these nuances will be handy later when doing analysis on progression data

Where are we today:

Today we mainly support tracking muscle activations (with support for fractional accounting) based on exercise and equipment used. activations can also specify modalities, but this is currently limited and phrased as text only (e.g. "trains over full ROM but highest load at the mid point"), this is also something we could improve, but that's another topic.

It's implemented like this:

  • ProgramGroup: groups together different muscles or muscle heads that are trained together. E.g. there's a programgroup for the rectus femoris, and one for the other 3 quads. The same muscle (head) does not appear in multiple groups, but you can train multiple ProgramGroups at once. (e.g. a leaned back leg extension trains both of the mentioned PG's) - perhaps a shortcoming today is that the lattissimus is 1 PG today. you cannot ever train that whole muscle all at once, but this seems fine because an exercise with value 1 for the lat PG does the max recruitment for the (area of) the lat that you can get within one exercise.
    * EBase: basic movement type to represent exercises which are mostly equivalent (though we can deviate based on equipment, see VolumeAssignment below)
  • VolumeAssignment assigns fractional muscle activations to EBase's, with optional overrides based on equipment. for now, equipment-specifics is only used to tweak wristFlexor/wristExtensor based on usage of bodyweight vs barbell vs dumbbell vs smith machine (which may not be due to the equipment per se, it's used more as a representation of how heavy a load is). I don't remember if i had other uses of equipment-conditional activations in mind. we keep all volume assignments in a list called... volumeAssignments - each EBase occurs in exactly 1 volume assignment rule.
  • Exercise: speficic exercise which is a combination of EBase and a set of equipment, and therefore has a precisely defined muscle activation

this is simplified as of #15 : exercises specify volume assignments directly together with their modifiers which modify volume assignments.

More nuances to support in the future

different "zones" within the same muscle or muscle head. (leave for later)

e.g. the lats is a huge muscle with fibers in different places and alignments. certain loads/movements train certain regions better. for pecs, this is already kindof implemented (we have a 'virtual' muscle head "upper pecs" and "lower pecs").
spine has different areas. e.g. lumbar vs thoracic. trained differently e.g. via squat bar position.

posture during exercises & different exercise execution styles

modifiers on a continuum, or boolean which affect recruitment values

  • dorsiflexing ankles increases recruitment of gastrocs during leg curls Exercise modifiers v1 #7
  • extending the hip during hip abductions shifts recruitment from glute max to glute med. Exercise modifiers v1 #7
  • leaning back during leg extensions, causes better rectus femoris recruitment (at long length) Exercise modifiers v1 #7
  • WAIT: bench inclination angle: this one depends on amount of back arching (not sure how to convey that in a very user friendly way to people who are used to talking about incline angles), and is still a bit contentions (see comments on https://www.instagram.com/menno.henselmans/p/DFae9u1ztyO/?img_index=10) - maybe wait this one out and see what other studies we come across
  • back inclination angle for rows i think this one is covered via the different EBase's
  • flexing knees increases vasti engagement during hip thrusts & glute kickbacks. Exercise modifiers v1 #7
  • soleus can activate during squats if the lower leg needs moving Exercise modifiers v1 #7
  • a bulgiarian split squat, most advocate not using the rear leg at all.
    menno henselmans recommends using the rear leg to assist, as this way you can also train the rectus femoris.
    Exercise modifiers v1 #7

technique modifiers which don't modify any numbers specifically, but may affect gains

(these should be orthogonal to the exercise information, and be its own separate thing)

  • alternating limb curls vs simultaneous ones
  • differing rests of, and between the eccentric/concentric contractions
  • ROM modifications such as staying in bottom half on calf raises, avoiding max depth in squats, etc
  • using momentum (swing) to go past sticking points and/or for eccentric overloading, possibly in moderation and possibly only for last few reps.
  • lean angle for lateral raises
  • focus on.. mind muscle connection or on technique or other
  • cues such as pulling on leg extension handles or no Exercise modifiers 2 #12

individual specific execution styles

deadlift : ham vs quad activation
length of femurs affects activation during squats

grip width and handle attachments

all these affect ROM and muscle involvement

  • pull-up/pull-down grip width
  • handle attachments (wide bar, v-grip, etc)
  • feet position in squats, leg press, calf raise
  • bar position during squat (front, high back, low back, mid back) Exercise modifiers v1 #7
  • dumbbell vs barbell
  • varying levels of deficit (to be expressed as what.. number of stacked plates or platforms, or cm? or a generic scale like 1-10 up to the discretion of the user. in practice this can probably just yes/no. someone who wants to use a deficit typically wants to use the largest deficit they can) Exercise modifiers v1 #7

note that you can do pulldowns with supinated (underhand) grip, but if you apply this to a pull-up, suddenly the exercise is called a chin-up.

unilateral vs bilateral

this affects strength development, carryover and tonnage (work output)

  • for some exercises, their name is associated with being unilateral (e.g. dumbbell lateral raise, pistol squat), or bilateral (e.g. preacher curl, deadlift), although you could argue about whether a unilateral deadlift or preacher curl is just another variant of the same exercise, or a different exercise.
  • for other exercises, they can be done either way (e.g. leg curls, leg extensions) can be done unilaterally, bilaterally or bilateral concentrics and unilateral eccentrics which allows for eccentric overloading. (one limb per set, or alternating)
  • for some exercises, they also imply a certain ROM (e.g. rear delt fly typically has more ROM if unilateral)

seated, standing and machine.

e.g. for shoulder press or good morning, these are all variations that affect the contribution of the core, for example. (right now we just use distinct exercises for these, but would require a new EBase)

loading type

e.g. during lunges or bulgarian split squats: load same side or other side as working leg? or symmetric load? e.g. you can do BSQ's while facing a smith machine, or being sideways in it, or with dumbbells or god forbid even a barbell which also affects balance and ability to load the target musculature

concentric+eccentric (the default), negatives (eccentric only), concentric only, eccentric overloading

should this be a distinct modifier or is it derived from the name (e.g. pullup negative, powerlifting deadlift) or from the execution style (see unilateral/bilateral above)

straps

affects grip development, and number of reps - aka the volume and therefore the quality of recruitment
an exercise can be done:

  • without straps
  • with straps for all sets, incl. warmup sets (probably a bad idea)
  • with straps for all working sets only
  • with straps only for some of the working sets (we probably don't need to cover all possible variations here. not sure how common this is. maybe "only the first" is relatively common?)
  • with straps only for the heaviest set (in case of pyramiding or reverse pyramiding)

similar for knee/elbow wraps, powerlifting belts, suits, etc.

grip types which may affect performance and development

e.g. for dead hangs, pull ups, but also dumbbells etc

  • ez-grips
  • different diameters
  • knurling vs smooth vs foam

form "correctness" properties that affect ROM and recruitment

  • cable stack height
  • seat position
  • slot pin number (fly machine, leg extension machine, etc)

etc

with or without "extra hard grip squeeze" #16

may affect forearm/grip development

How to implement?

  • should these "modifiers" be "execution details" for an exercise, or do they confer new, distinct exercises? Surely, making a new exercise for every variation results in a combinatorial explosion that we don't want to blow up in the UI when looking at exercises initially. so at least some aspects need to become "modifiers"
  • idea: graceful degradation: users who don't care about certain modifiers, shouldn't be bothered by them. certainly not when following (viewing, logging) an exercise program. but during program construction, it may be unavoidable
  • gracefully expansion: allow adding new types of modifiers, or modifier values, in the future in a way which doesn't break existing programs and treats previous logs gracefully (e.g. backfill the nuance, or assume the most likely values for them)
  • a lot of these cues, technique tweaks etc are not commonly used, at least not by the same person, and they're personal and new ones will commonly be invented in the future. therefore instead of trying to model all of them in the the datastructures, perhaps they could be modeled more loosely, as additional tags. or pieces of metadata when logging. this seems most appropriate when their effect is more speculative, not when they're "fundamental truths" -> this can wait. for now let's just hardcode them.

refactoring the base datastructures

*note that EBase's are no longer the singular distinct "collections of ProgramGroup assignments", because some exercises with certain modifiers applied may constitute the same "assignment collection" as each other, or as an existing EBase. (e.g. suspended leg curl with hip flexed modifier, is equivalent to legCurlSeated EBase). do we still need EBases actually? we could programatically compute them essentially. other than VolumeAssignment, we use them for ignoring "classes of exercises" but even that is not a good abstraction (same example as leg curls, means having to specify multiple EBases). we have disabled the feature, but if we wanted it, might be better to only allow specifying exercises (or search patterns matching exercises like *leg curl*

  • it's weird that the volume assignments are divorced from the exercise modifiers, because the modifiers directly alter relate them, so being able to compare them more directly would make sense. iow. being able to add modifiers directly to VA rules (and therefore to all exercises that have one of those EBases, e.g. all fly's)

done in #15

Sub-issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions