Streprogen documentation¶
Streprogen is a Python strength program generator. It helps strength athletes and their trainers efficiently build dynamic strength training programs with great flexibility and power.
Project summary¶
Streprogen (short for strength program generator) is a Python package which allows the user to easily create dynamic, flexible strength training programs. The main features are:
- Sensible defaults: The software comes with sensible default values for all input parameters, giving the novice strength athlete some guidance on parameter selection. The software will raise warnings if the input parameters are unreasonable, but will still run.
- High level of customization: Every important parameter can be changed by the user. It is possible to create long-term training programs with several layers of periodization if the user wishes to do so.
- Simple object oriented interface: The software is essentially built
on four classes
StaticExercise
,DynamicExercise
,Day
andProgram
. In addition to these classes, a set of utility functions is provided for advanced usage. - Pretty output: The training programs are easily
saved as
.txt
,.html
or.tex
files. From there you can print it and bring it to the gym.
Installation¶
Here’s the layman guide to installation.
- Download Anaconda distribution of Python 3.x from the Anaconda Website.
- Install
streprogen
from PyPI.- Windows: Open the Anaconda prompt from the start menu and run
pip install streprogen
. - Linux: Open the terminal and run
pip install streprogen
.
- Windows: Open the Anaconda prompt from the start menu and run
- Open a Python Editor (such as Spyder, which comes with Anaconda).
- Write
from streprogen import *
to import everything fromstreprogen
.
Sample code¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from streprogen import Program # Create an 8-week program, rounding every exercise to nearest unit og 5kg program = Program("My first program!", duration=8, units="kg", round_to=5) with program.Day("Day A"): program.DynamicExercise("Bench press", start_weight=80, min_reps=3, max_reps=8) program.DynamicExercise("Squats", start_weight=100, min_reps=3, max_reps=8) with program.Day("Day B"): program.DynamicExercise("Deadlifts", start_weight=100, min_reps=2, max_reps=7) program.StaticExercise("Curls", "3 x 10 @ 18kg") # Render the program, then print it program.render() print(program) |
----------------------------------------------------------------
Program: My first program!
Program parameters
duration: 8
reps_per_exercise: 25
intensity: 83
units: kg
----------------------------------------------------------------
Exercise information
Day A
Bench press 80kg -> 89.6kg
reps: [3, 8] weekly inc.: 1.5%
Squats 100kg -> 112kg
reps: [3, 8] weekly inc.: 1.5%
Day B
Deadlifts 100kg -> 112kg
reps: [2, 7] weekly inc.: 1.5%
Curls 3 x 10 @ 18kg
----------------------------------------------------------------
Program
Week 1
Day A
Bench press 8 x 60kg 7 x 65kg 7 x 65kg 7 x 65kg
Squats 8 x 75kg 7 x 80kg 7 x 80kg 7 x 80kg
Day B
Deadlifts 7 x 80kg 7 x 80kg 6 x 80kg 6 x 80kg 5 x 85kg
Curls 3 x 10 @ 18kg
Week 2
Day A
Bench press 7 x 65kg 7 x 65kg 6 x 65kg 5 x 70kg 5 x 70kg
Squats 7 x 80kg 7 x 80kg 6 x 85kg 5 x 85kg 5 x 85kg
Day B
Deadlifts 7 x 80kg 7 x 80kg 6 x 85kg 5 x 85kg 5 x 85kg
Curls 3 x 10 @ 18kg
Week 3
...
...
Contents¶
Essential features¶
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
Imports¶
[2]:
import matplotlib.pyplot as plt
from streprogen import Program
Program setup¶
[3]:
program = Program(
name="EssentialFeatures",
duration=8, # Weeks
reps_per_exercise=25,
units="kg", # Typically 'kg', 'lbs' or '' (empty)
round_to=5,
)
with program.Day():
program.DynamicExercise(name="Bench", start_weight=80)
# The repetition range can be specified as follows
program.DynamicExercise(name="Squats", start_weight=100,
min_reps=3, max_reps=8)
# A static exercise, which repeats every week
program.StaticExercise("Curls", "3 x 12")
with program.Day():
# Specify the increase manually (defaut is 1.5 % per week)
# Starting at 100kg, 2 % per weeks means 16 % in 8 weeks
program.DynamicExercise(name="Deadlifts", start_weight=100,
percent_inc_per_week=2)
# If you prefer, the `final_weight` parameter can be used
program.DynamicExercise(name="Squats",
start_weight=90, final_weight=110)
# Default names are 'Day 1', 'Day 2', ..., but can be specified manually
with program.Day("Saturday"):
# An individual exercise can deviate from the global program repetition setting
program.DynamicExercise(name="Deadlifts", start_weight=100, reps=15)
# Or from the default rounding
program.DynamicExercise(name="Curls", start_weight=30, round_to=2)
Render the program¶
[4]:
# Do the computations and render a program. Might take a few seconds.
program.render()
Print and save the program¶
[5]:
print(program)
----------------------------------------------------------------
Program: EssentialFeatures
Program parameters
duration: 8
reps_per_exercise: 25
intensity: 83
units: kg
----------------------------------------------------------------
Exercise information
Day 1
Bench 80kg -> 89.6kg
reps: [3, 8] weekly inc.: 1.5%
Squats 100kg -> 112kg
reps: [3, 8] weekly inc.: 1.5%
Curls 3 x 12
Day 2
Deadlifts 100kg -> 116kg
reps: [3, 8] weekly inc.: 2.0%
Squats 90kg -> 110kg
reps: [3, 8] weekly inc.: 2.8%
Saturday
Deadlifts 100kg -> 112kg
reps: [3, 8] weekly inc.: 1.5%
Curls 30kg -> 33.6kg
reps: [3, 8] weekly inc.: 1.5%
----------------------------------------------------------------
Program
Week 1
Day 1
Bench 8 x 60kg 7 x 65kg 7 x 65kg 7 x 65kg
Squats 8 x 75kg 7 x 80kg 7 x 80kg 7 x 80kg
Curls 3 x 12
Day 2
Deadlifts 8 x 75kg 7 x 80kg 7 x 80kg 7 x 80kg
Squats 8 x 70kg 7 x 70kg 7 x 70kg 7 x 70kg
Saturday
Deadlifts 7 x 80kg 6 x 80kg 6 x 80kg
Curls 8 x 22kg 7 x 24kg 7 x 24kg 7 x 24kg
Week 2
Day 1
Bench 7 x 65kg 7 x 65kg 6 x 65kg 5 x 70kg 5 x 70kg
Squats 7 x 80kg 7 x 80kg 6 x 85kg 5 x 85kg 5 x 85kg
Curls 3 x 12
Day 2
Deadlifts 7 x 80kg 7 x 80kg 6 x 85kg 5 x 85kg 5 x 85kg
Squats 7 x 75kg 7 x 75kg 6 x 75kg 5 x 80kg 5 x 80kg
Saturday
Deadlifts 7 x 80kg 6 x 85kg 5 x 85kg
Curls 7 x 24kg 7 x 24kg 6 x 24kg 5 x 26kg 5 x 26kg
Week 3
Day 1
Bench 7 x 65kg 6 x 70kg 5 x 70kg 5 x 70kg 5 x 70kg
Squats 7 x 80kg 6 x 85kg 5 x 90kg 5 x 90kg 5 x 90kg
Curls 3 x 12
Day 2
Deadlifts 7 x 85kg 6 x 85kg 5 x 90kg 5 x 90kg 5 x 90kg
Squats 7 x 75kg 6 x 80kg 5 x 80kg 5 x 80kg 5 x 80kg
Saturday
Deadlifts 6 x 85kg 6 x 85kg 5 x 90kg
Curls 7 x 24kg 6 x 26kg 5 x 26kg 5 x 26kg 5 x 26kg
Week 4
Day 1
Bench 6 x 70kg 6 x 70kg 5 x 70kg 5 x 70kg 4 x 75kg
Squats 6 x 85kg 6 x 85kg 5 x 90kg 5 x 90kg 4 x 95kg
Curls 3 x 12
Day 2
Deadlifts 6 x 90kg 6 x 90kg 5 x 90kg 5 x 90kg 4 x 95kg
Squats 6 x 80kg 6 x 80kg 5 x 85kg 5 x 85kg 4 x 90kg
Saturday
Deadlifts 6 x 85kg 5 x 90kg 5 x 90kg
Curls 6 x 26kg 6 x 26kg 5 x 26kg 5 x 26kg 4 x 28kg
Week 5
Day 1
Bench 6 x 70kg 5 x 75kg 5 x 75kg 4 x 75kg 4 x 75kg
Squats 6 x 90kg 5 x 90kg 5 x 90kg 4 x 95kg 4 x 95kg
Curls 3 x 12
Day 2
Deadlifts 6 x 90kg 5 x 95kg 5 x 95kg 4 x 95kg 4 x 95kg
Squats 6 x 85kg 5 x 85kg 5 x 85kg 4 x 90kg 4 x 90kg
Saturday
Deadlifts 6 x 90kg 5 x 90kg 4 x 95kg
Curls 6 x 26kg 5 x 28kg 5 x 28kg 4 x 28kg 4 x 28kg
Week 6
Day 1
Bench 6 x 70kg 5 x 75kg 4 x 75kg 4 x 75kg 4 x 75kg
Squats 6 x 90kg 5 x 90kg 4 x 95kg 4 x 95kg 4 x 95kg
Curls 3 x 12
Day 2
Deadlifts 6 x 90kg 5 x 95kg 4 x 100kg 4 x 100kg 4 x 100kg
Squats 6 x 85kg 5 x 90kg 4 x 90kg 4 x 90kg 4 x 90kg
Saturday
Deadlifts 5 x 90kg 5 x 90kg 4 x 95kg
Curls 6 x 26kg 5 x 28kg 4 x 28kg 4 x 28kg 4 x 28kg
Week 7
Day 1
Bench 5 x 75kg 5 x 75kg 4 x 75kg 4 x 75kg 3 x 80kg
Squats 5 x 95kg 5 x 95kg 4 x 95kg 4 x 95kg 3 x 100kg
Curls 3 x 12
Day 2
Deadlifts 5 x 95kg 5 x 95kg 4 x 100kg 4 x 100kg 3 x 105kg
Squats 5 x 90kg 5 x 90kg 4 x 95kg 4 x 95kg 3 x 100kg
Saturday
Deadlifts 5 x 95kg 4 x 95kg 4 x 95kg
Curls 5 x 28kg 5 x 28kg 4 x 30kg 4 x 30kg 3 x 30kg
Week 8
Day 1
Bench 5 x 75kg 4 x 80kg 4 x 80kg 4 x 80kg 3 x 80kg
Squats 5 x 95kg 4 x 100kg 4 x 100kg 4 x 100kg 3 x 100kg
Curls 3 x 12
Day 2
Deadlifts 5 x 100kg 4 x 100kg 4 x 100kg 4 x 100kg 3 x 105kg
Squats 5 x 95kg 4 x 95kg 4 x 95kg 4 x 95kg 3 x 100kg
Saturday
Deadlifts 5 x 95kg 4 x 100kg 3 x 100kg
Curls 5 x 28kg 4 x 30kg 4 x 30kg 4 x 30kg 3 x 30kg
----------------------------------------------------------------
Export the program as .html
or .tex
, then to .pdf
¶
A .html
file can be printed directly from your browser, or printed to a .pdf
from your browser.
[6]:
# Save the program as a HTML file
with open("EssentialFeatures.html", "w", encoding="utf-8") as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_html(table_width=6))
Use a .tex
to generate .pdf
if you have LaTeX installed, or use:
- latexbase.com from your browser.
[7]:
# If you have LaTeX installed on your system, you can render a program to .tex
# Alternatively, you can paste the LaTeX into: https://latexbase.com/
print(program.to_tex(table_width=6))
% -----------------------------------------------
% Package imports
% -----------------------------------------------
\documentclass[12pt, a4paper]{article}% 'twoside' for printing
\usepackage[utf8]{inputenc}% Allow input to be UTF-8
\usepackage[margin=2cm]{geometry}% May be used to set margins
% -----------------------------------------------
% Document start
% -----------------------------------------------
\begin{document}
\large
\section*{Program: EssentialFeatures}
This program was made using \verb|streprogen|,
the Python strength program generator.
The latest version can be found at \\
\verb|https://pypi.python.org/pypi/streprogen/|.
\section*{Program parameters}
\begin{tabular}{l|l}
\textbf{Parameter} & \textbf{Value} \\ \hline
\verb|duration| & 8 \\
\verb|reps_per_exercise| & 25 \\
\verb|intensity| & 83 \\
\verb|units| & kg
\end{tabular}
\section*{Exercise information}
\begin{tabular}{llllll}
\textbf{Exercise} & \textbf{Start} & \textbf{End} & \textbf{Reps min}
& \textbf{Reps max} & \textbf{Weekly increase} \\ \hline
\textbf{ Day 1 } & & & & & \\ \hline
\hspace{0.5em}Bench &
80 kg &
89.6 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Squats &
100 kg &
112 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\textbf{ Day 2 } & & & & & \\ \hline
\hspace{0.5em}Deadlifts &
100 kg &
116 kg &
3 & 8 &
2.0\%\\
\hspace{0.5em}Squats &
90 kg &
110 kg &
3 & 8 &
2.8\%\\
\textbf{ Saturday } & & & & & \\ \hline
\hspace{0.5em}Deadlifts &
100 kg &
112 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Curls &
30 kg &
33.6 kg &
3 & 8 &
1.5\%\\
\end{tabular}
\clearpage
\section*{Program}
\subsection*{\hspace{0.25em} Week 1 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 8 x 60kg
& 7 x 65kg
& 7 x 65kg
& 7 x 65kg
&
\\
\hspace{0.75em} Squats
& 8 x 75kg
& 7 x 80kg
& 7 x 80kg
& 7 x 80kg
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 8 x 75kg
& 7 x 80kg
& 7 x 80kg
& 7 x 80kg
&
\\
\hspace{0.75em} Squats
& 8 x 70kg
& 7 x 70kg
& 7 x 70kg
& 7 x 70kg
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} Saturday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 7 x 80kg
& 6 x 80kg
& 6 x 80kg
&
&
\\
\hspace{0.75em} Curls
& 8 x 22kg
& 7 x 24kg
& 7 x 24kg
& 7 x 24kg
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 2 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 65kg
& 7 x 65kg
& 6 x 65kg
& 5 x 70kg
& 5 x 70kg
\\
\hspace{0.75em} Squats
& 7 x 80kg
& 7 x 80kg
& 6 x 85kg
& 5 x 85kg
& 5 x 85kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 7 x 80kg
& 7 x 80kg
& 6 x 85kg
& 5 x 85kg
& 5 x 85kg
\\
\hspace{0.75em} Squats
& 7 x 75kg
& 7 x 75kg
& 6 x 75kg
& 5 x 80kg
& 5 x 80kg
\\
\end{tabular}
\subsection*{\hspace{0.5em} Saturday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 7 x 80kg
& 6 x 85kg
& 5 x 85kg
&
&
\\
\hspace{0.75em} Curls
& 7 x 24kg
& 7 x 24kg
& 6 x 24kg
& 5 x 26kg
& 5 x 26kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 3 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 65kg
& 6 x 70kg
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
\\
\hspace{0.75em} Squats
& 7 x 80kg
& 6 x 85kg
& 5 x 90kg
& 5 x 90kg
& 5 x 90kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 7 x 85kg
& 6 x 85kg
& 5 x 90kg
& 5 x 90kg
& 5 x 90kg
\\
\hspace{0.75em} Squats
& 7 x 75kg
& 6 x 80kg
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
\\
\end{tabular}
\subsection*{\hspace{0.5em} Saturday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 85kg
& 6 x 85kg
& 5 x 90kg
&
&
\\
\hspace{0.75em} Curls
& 7 x 24kg
& 6 x 26kg
& 5 x 26kg
& 5 x 26kg
& 5 x 26kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 4 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 70kg
& 6 x 70kg
& 5 x 70kg
& 5 x 70kg
& 4 x 75kg
\\
\hspace{0.75em} Squats
& 6 x 85kg
& 6 x 85kg
& 5 x 90kg
& 5 x 90kg
& 4 x 95kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 90kg
& 6 x 90kg
& 5 x 90kg
& 5 x 90kg
& 4 x 95kg
\\
\hspace{0.75em} Squats
& 6 x 80kg
& 6 x 80kg
& 5 x 85kg
& 5 x 85kg
& 4 x 90kg
\\
\end{tabular}
\subsection*{\hspace{0.5em} Saturday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 85kg
& 5 x 90kg
& 5 x 90kg
&
&
\\
\hspace{0.75em} Curls
& 6 x 26kg
& 6 x 26kg
& 5 x 26kg
& 5 x 26kg
& 4 x 28kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 5 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 70kg
& 5 x 75kg
& 5 x 75kg
& 4 x 75kg
& 4 x 75kg
\\
\hspace{0.75em} Squats
& 6 x 90kg
& 5 x 90kg
& 5 x 90kg
& 4 x 95kg
& 4 x 95kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 90kg
& 5 x 95kg
& 5 x 95kg
& 4 x 95kg
& 4 x 95kg
\\
\hspace{0.75em} Squats
& 6 x 85kg
& 5 x 85kg
& 5 x 85kg
& 4 x 90kg
& 4 x 90kg
\\
\end{tabular}
\subsection*{\hspace{0.5em} Saturday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 90kg
& 5 x 90kg
& 4 x 95kg
&
&
\\
\hspace{0.75em} Curls
& 6 x 26kg
& 5 x 28kg
& 5 x 28kg
& 4 x 28kg
& 4 x 28kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 6 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 70kg
& 5 x 75kg
& 4 x 75kg
& 4 x 75kg
& 4 x 75kg
\\
\hspace{0.75em} Squats
& 6 x 90kg
& 5 x 90kg
& 4 x 95kg
& 4 x 95kg
& 4 x 95kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 90kg
& 5 x 95kg
& 4 x 100kg
& 4 x 100kg
& 4 x 100kg
\\
\hspace{0.75em} Squats
& 6 x 85kg
& 5 x 90kg
& 4 x 90kg
& 4 x 90kg
& 4 x 90kg
\\
\end{tabular}
\subsection*{\hspace{0.5em} Saturday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 5 x 90kg
& 5 x 90kg
& 4 x 95kg
&
&
\\
\hspace{0.75em} Curls
& 6 x 26kg
& 5 x 28kg
& 4 x 28kg
& 4 x 28kg
& 4 x 28kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 7 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 5 x 75kg
& 5 x 75kg
& 4 x 75kg
& 4 x 75kg
& 3 x 80kg
\\
\hspace{0.75em} Squats
& 5 x 95kg
& 5 x 95kg
& 4 x 95kg
& 4 x 95kg
& 3 x 100kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 5 x 95kg
& 5 x 95kg
& 4 x 100kg
& 4 x 100kg
& 3 x 105kg
\\
\hspace{0.75em} Squats
& 5 x 90kg
& 5 x 90kg
& 4 x 95kg
& 4 x 95kg
& 3 x 100kg
\\
\end{tabular}
\subsection*{\hspace{0.5em} Saturday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 5 x 95kg
& 4 x 95kg
& 4 x 95kg
&
&
\\
\hspace{0.75em} Curls
& 5 x 28kg
& 5 x 28kg
& 4 x 30kg
& 4 x 30kg
& 3 x 30kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 8 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 5 x 75kg
& 4 x 80kg
& 4 x 80kg
& 4 x 80kg
& 3 x 80kg
\\
\hspace{0.75em} Squats
& 5 x 95kg
& 4 x 100kg
& 4 x 100kg
& 4 x 100kg
& 3 x 100kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 5 x 100kg
& 4 x 100kg
& 4 x 100kg
& 4 x 100kg
& 3 x 105kg
\\
\hspace{0.75em} Squats
& 5 x 95kg
& 4 x 95kg
& 4 x 95kg
& 4 x 95kg
& 3 x 100kg
\\
\end{tabular}
\subsection*{\hspace{0.5em} Saturday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 5 x 95kg
& 4 x 100kg
& 3 x 100kg
&
&
\\
\hspace{0.75em} Curls
& 5 x 28kg
& 4 x 30kg
& 4 x 30kg
& 4 x 30kg
& 3 x 30kg
\\
\end{tabular}
\end{document}
Intermediate features¶
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
Imports¶
[2]:
import matplotlib.pyplot as plt
from streprogen import Program
Examining default parameters¶
[3]:
reps = list(range(1, 11))
weeks = list(range(1, 9))
plt.figure(figsize=(14, 4))
# ------------------------------------------------------
plt.subplot(1, 3, 1)
plt.title("Relationship between reps and intensity")
plt.plot(reps, Program._default_reps_to_intensity_func(reps), "-o")
plt.xlabel("Reps")
plt.ylabel("Intensity")
plt.grid()
# ------------------------------------------------------
plt.subplot(1, 3, 2)
plt.title("Relationship between weeks and general strength progression")
plt.plot(
weeks,
Program._default_progression_func(
weeks, start_weight=0, final_weight=100, start_week=1, final_week=8
),
"-o",
)
plt.xlabel("Weeks")
plt.ylabel("Weight")
plt.grid()
# ------------------------------------------------------
plt.subplot(1, 3, 3)
plt.title("Rep and set scale factors")
plt.plot(
weeks,
Program._default_rep_scaler_func(weeks, final_week=8),
"-o",
label="Repetitions",
)
plt.plot(
weeks,
Program._default_intensity_scaler_func(weeks, final_week=8),
"-o",
label="Intensity",
)
plt.legend()
plt.xlabel("Weeks")
plt.ylabel("Scale factor (multiplicative)")
plt.ylim([0.85, 1.15])
plt.grid()
plt.tight_layout()

Custom function for sets/intensity mapping¶
[4]:
# These three functions are supplied for your convencience
from streprogen.modeling import (
reps_to_intensity,
reps_to_intensity_relaxed,
reps_to_intensity_tight,
)
def custom_reps_to_intensity(reps):
"""Define your own custom relationship here"""
return 98 - 5 * (reps - 1)
reps = list(range(1, 11))
plt.figure(figsize=(8, 4))
# ------------------------------------------------------
plt.title("Relationship between reps and intensity")
plt.plot(reps, reps_to_intensity(reps), "-o", label="Default")
plt.plot(reps, reps_to_intensity_relaxed(reps), "-o", label="Relaxed")
plt.plot(reps, reps_to_intensity_tight(reps), "-o", label="Tight")
plt.plot(
reps,
[custom_reps_to_intensity(r) for r in reps],
"-o",
label="`custom_reps_to_intensity`",
)
plt.xlabel("Reps")
plt.ylabel("Intensity")
plt.grid()
plt.legend()
plt.tight_layout()

Program setup¶
[5]:
program = Program(
name="IntermediateFeatures",
duration=4, # The duration of the training program in weeks.
reps_per_exercise=20,
units="kg", # Typically 'kg', 'lbs' or '' (empty)
round_to=2.5,
# The intensity is the average % of 1RM that repetitions are performed at
intensity=80,
# The `reps_to_intensity_func` can be replaced with any function mapping from reps to intensity
# Two non-defaults supplied are: reps_to_intensity_relaxed, reps_to_intensity_tight
reps_to_intensity_func=custom_reps_to_intensity,
)
import random
random.seed(123) # Seed the random number generator for reproducible results
def static_stomach(week):
"""A static function can return random strings."""
return random.choice(["3 x 10", "4 x 8", "5 x 8"])
with program.Day("Monday"):
# The intensity can be changed for a specific exercise
program.DynamicExercise(
name="Bench", start_weight=80, min_reps=1, max_reps=6, intensity=82
)
program.DynamicExercise(name="Squats", start_weight=100, min_reps=3, max_reps=8)
program.StaticExercise("Curls", "3 x 12")
with program.Day("Wednesday"):
program.DynamicExercise(name="Deadlifts", start_weight=100, percent_inc_per_week=2)
program.DynamicExercise(name="Squats", start_weight=90, final_weight=100)
with program.Day("Friday"):
program.DynamicExercise(name="Deadlifts", start_weight=100, reps=15)
program.DynamicExercise(name="Curls", start_weight=30, round_to=2)
# Instead of passing a string, we can pass a function
# that takes a week number and returns a string
program.StaticExercise("Stomach", static_stomach)
Render the program¶
[6]:
# Do the computations and render a program. Might take a few seconds.
program.render()
Print and save the program¶
[7]:
print(program)
----------------------------------------------------------------
Program: IntermediateFeatures
Program parameters
duration: 4
reps_per_exercise: 20
intensity: 80
units: kg
----------------------------------------------------------------
Exercise information
Monday
Bench 80kg -> 84.8kg
reps: [1, 6] weekly inc.: 1.5%
Squats 100kg -> 106kg
reps: [3, 8] weekly inc.: 1.5%
Curls 3 x 12
Wednesday
Deadlifts 100kg -> 108kg
reps: [3, 8] weekly inc.: 2.0%
Squats 90kg -> 100kg
reps: [3, 8] weekly inc.: 2.8%
Friday
Deadlifts 100kg -> 106kg
reps: [3, 8] weekly inc.: 1.5%
Curls 30kg -> 31.8kg
reps: [3, 8] weekly inc.: 1.5%
Stomach 3 x 10
----------------------------------------------------------------
Program
Week 1
Monday
Bench 6 x 57.5kg 5 x 62.5kg 5 x 62.5kg 4 x 67.5kg 4 x 67.5kg
Squats 6 x 72.5kg 6 x 72.5kg 5 x 77.5kg 4 x 82.5kg 4 x 82.5kg
Curls 3 x 12
Wednesday
Deadlifts 6 x 72.5kg 6 x 72.5kg 5 x 77.5kg 4 x 82.5kg 4 x 82.5kg
Squats 6 x 65kg 6 x 65kg 5 x 70kg 4 x 75kg 4 x 75kg
Friday
Deadlifts 6 x 72.5kg 6 x 72.5kg 5 x 77.5kg
Curls 6 x 22kg 6 x 22kg 5 x 24kg 4 x 24kg 4 x 24kg
Stomach 4 x 8
Week 2
Monday
Bench 5 x 65kg 5 x 65kg 4 x 67.5kg 4 x 67.5kg 3 x 72.5kg
Squats 5 x 80kg 5 x 80kg 5 x 80kg 5 x 80kg
Curls 3 x 12
Wednesday
Deadlifts 5 x 80kg 5 x 80kg 5 x 80kg 5 x 80kg
Squats 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg
Friday
Deadlifts 5 x 80kg 5 x 80kg 5 x 80kg
Curls 5 x 24kg 5 x 24kg 5 x 24kg 5 x 24kg
Stomach 3 x 10
Week 3
Monday
Bench 5 x 65kg 4 x 70kg 4 x 70kg 3 x 72.5kg 3 x 72.5kg
Squats 5 x 82.5kg 5 x 82.5kg 4 x 87.5kg 3 x 92.5kg 3 x 92.5kg
Curls 3 x 12
Wednesday
Deadlifts 5 x 82.5kg 5 x 82.5kg 4 x 87.5kg 3 x 92.5kg 3 x 92.5kg
Squats 5 x 75kg 5 x 75kg 4 x 80kg 3 x 85kg 3 x 85kg
Friday
Deadlifts 5 x 82.5kg 4 x 87.5kg 4 x 87.5kg
Curls 5 x 24kg 5 x 24kg 4 x 26kg 3 x 28kg 3 x 28kg
Stomach 4 x 8
Week 4
Monday
Bench 4 x 70kg 4 x 70kg 3 x 75kg 3 x 75kg 2 x 80kg
Squats 4 x 87.5kg 4 x 87.5kg 4 x 87.5kg 3 x 92.5kg
Curls 3 x 12
Wednesday
Deadlifts 4 x 90kg 4 x 90kg 4 x 90kg 3 x 95kg
Squats 4 x 82.5kg 4 x 82.5kg 4 x 82.5kg 3 x 87.5kg
Friday
Deadlifts 4 x 87.5kg 4 x 87.5kg 4 x 87.5kg
Curls 4 x 26kg 4 x 26kg 4 x 26kg 3 x 28kg
Stomach 4 x 8
----------------------------------------------------------------
Export the program as .html
or .tex
, then to .pdf
¶
A .html
file can be printed directly from your browser, or printed to a .pdf
from your browser.
[8]:
# Save the program as a HTML file
with open("IntermediateFeatures.html", "w", encoding="utf-8") as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_html(table_width=6))
Use a .tex
to generate .pdf
if you have LaTEX installed, or use:
- latexbase.com from your browser.
[9]:
# If you have LaTeX installed on your system, you can render a program to .tex
# Alternatively, you can paste the LaTeX into: https://latexbase.com/
print(program.to_tex(table_width=6))
% -----------------------------------------------
% Package imports
% -----------------------------------------------
\documentclass[12pt, a4paper]{article}% 'twoside' for printing
\usepackage[utf8]{inputenc}% Allow input to be UTF-8
\usepackage[margin=2cm]{geometry}% May be used to set margins
% -----------------------------------------------
% Document start
% -----------------------------------------------
\begin{document}
\large
\section*{Program: IntermediateFeatures}
This program was made using \verb|streprogen|,
the Python strength program generator.
The latest version can be found at \\
\verb|https://pypi.python.org/pypi/streprogen/|.
\section*{Program parameters}
\begin{tabular}{l|l}
\textbf{Parameter} & \textbf{Value} \\ \hline
\verb|duration| & 4 \\
\verb|reps_per_exercise| & 20 \\
\verb|intensity| & 80 \\
\verb|units| & kg
\end{tabular}
\section*{Exercise information}
\begin{tabular}{llllll}
\textbf{Exercise} & \textbf{Start} & \textbf{End} & \textbf{Reps min}
& \textbf{Reps max} & \textbf{Weekly increase} \\ \hline
\textbf{ Monday } & & & & & \\ \hline
\hspace{0.5em}Bench &
80 kg &
84.8 kg &
1 & 6 &
1.5\%\\
\hspace{0.5em}Squats &
100 kg &
106 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\textbf{ Wednesday } & & & & & \\ \hline
\hspace{0.5em}Deadlifts &
100 kg &
108 kg &
3 & 8 &
2.0\%\\
\hspace{0.5em}Squats &
90 kg &
100 kg &
3 & 8 &
2.8\%\\
\textbf{ Friday } & & & & & \\ \hline
\hspace{0.5em}Deadlifts &
100 kg &
106 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Curls &
30 kg &
31.8 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Stomach & \multicolumn{ 5 }{l}{ 4 x 8 } \\
\end{tabular}
\clearpage
\section*{Program}
\subsection*{\hspace{0.25em} Week 1 }
\subsection*{\hspace{0.5em} Monday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 57.5kg
& 5 x 62.5kg
& 5 x 62.5kg
& 4 x 67.5kg
& 4 x 67.5kg
\\
\hspace{0.75em} Squats
& 6 x 72.5kg
& 6 x 72.5kg
& 5 x 77.5kg
& 4 x 82.5kg
& 4 x 82.5kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Wednesday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 72.5kg
& 6 x 72.5kg
& 5 x 77.5kg
& 4 x 82.5kg
& 4 x 82.5kg
\\
\hspace{0.75em} Squats
& 6 x 65kg
& 6 x 65kg
& 5 x 70kg
& 4 x 75kg
& 4 x 75kg
\\
\end{tabular}
\subsection*{\hspace{0.5em} Friday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 72.5kg
& 6 x 72.5kg
& 5 x 77.5kg
&
&
\\
\hspace{0.75em} Curls
& 6 x 22kg
& 6 x 22kg
& 5 x 24kg
& 4 x 24kg
& 4 x 24kg
\\
\hspace{0.75em} Stomach & \multicolumn{ 5 }{l}{ 4 x 8 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 2 }
\subsection*{\hspace{0.5em} Monday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 5 x 65kg
& 5 x 65kg
& 4 x 67.5kg
& 4 x 67.5kg
& 3 x 72.5kg
\\
\hspace{0.75em} Squats
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Wednesday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
&
\\
\hspace{0.75em} Squats
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} Friday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
&
&
\\
\hspace{0.75em} Curls
& 5 x 24kg
& 5 x 24kg
& 5 x 24kg
& 5 x 24kg
&
\\
\hspace{0.75em} Stomach & \multicolumn{ 5 }{l}{ 3 x 10 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 3 }
\subsection*{\hspace{0.5em} Monday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 5 x 65kg
& 4 x 70kg
& 4 x 70kg
& 3 x 72.5kg
& 3 x 72.5kg
\\
\hspace{0.75em} Squats
& 5 x 82.5kg
& 5 x 82.5kg
& 4 x 87.5kg
& 3 x 92.5kg
& 3 x 92.5kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Wednesday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 5 x 82.5kg
& 5 x 82.5kg
& 4 x 87.5kg
& 3 x 92.5kg
& 3 x 92.5kg
\\
\hspace{0.75em} Squats
& 5 x 75kg
& 5 x 75kg
& 4 x 80kg
& 3 x 85kg
& 3 x 85kg
\\
\end{tabular}
\subsection*{\hspace{0.5em} Friday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 5 x 82.5kg
& 4 x 87.5kg
& 4 x 87.5kg
&
&
\\
\hspace{0.75em} Curls
& 5 x 24kg
& 5 x 24kg
& 4 x 26kg
& 3 x 28kg
& 3 x 28kg
\\
\hspace{0.75em} Stomach & \multicolumn{ 5 }{l}{ 3 x 10 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 4 }
\subsection*{\hspace{0.5em} Monday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 4 x 70kg
& 4 x 70kg
& 3 x 75kg
& 3 x 75kg
& 2 x 80kg
\\
\hspace{0.75em} Squats
& 4 x 87.5kg
& 4 x 87.5kg
& 4 x 87.5kg
& 3 x 92.5kg
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Wednesday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 4 x 90kg
& 4 x 90kg
& 4 x 90kg
& 3 x 95kg
&
\\
\hspace{0.75em} Squats
& 4 x 82.5kg
& 4 x 82.5kg
& 4 x 82.5kg
& 3 x 87.5kg
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} Friday }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 4 x 87.5kg
& 4 x 87.5kg
& 4 x 87.5kg
&
&
\\
\hspace{0.75em} Curls
& 4 x 26kg
& 4 x 26kg
& 4 x 26kg
& 3 x 28kg
&
\\
\hspace{0.75em} Stomach & \multicolumn{ 5 }{l}{ 3 x 10 } \\
\end{tabular}
\end{document}
Advanced features¶
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
Imports¶
[2]:
import matplotlib.pyplot as plt
from streprogen import Program
Long term planning - a very simple setup¶
Setting everything to constant, just to show how it works.
[3]:
# We'll create a 16 week program, i.e. 4 months
duration = 16
weeks = list(range(1, duration))
from streprogen import progression_sinusoidal, progression_diffeq
import functools
plt.figure(figsize=(14, 4))
# ------------------------------------------------------
k = 0 # k=0 is linear, as k gets higher progression becomes more non-linear
progression = functools.partial(progression_diffeq, k=k)
plt.subplot(1, 2, 1)
plt.title("Relationship between weeks and general strength progression")
plt.plot(
weeks,
progression(
weeks, start_weight=100, final_weight=120,
start_week=1, final_week=duration
),
"-o",
)
plt.xlabel("Weeks")
plt.ylabel("Weight")
plt.grid()
# ------------------------------------------------------
period = 1
offset = 0 # The offset of the cycles
scale = 0.00
scale_repetitions = functools.partial(
progression_sinusoidal,
start_weight=1,
final_weight=1,
start_week=1,
final_week=duration,
period=period,
scale=scale,
offset=offset,
k=0,
)
period = 1 # The number of cycles (sine waves) in the 16 weeks
offset = 0 # The offset of the cycles
scale = 0.00
scale_intensity = functools.partial(
progression_sinusoidal,
start_weight=1,
final_weight=1,
start_week=1,
final_week=duration,
period=period,
scale=scale,
offset=offset,
k=0,
)
plt.subplot(1, 2, 2)
plt.title("Rep and set scale factors")
plt.plot(weeks, scale_repetitions(weeks), "-o", label="Repetitions")
plt.plot(weeks, scale_intensity(weeks), "-o", label="Intensity")
plt.legend()
plt.xlabel("Weeks")
plt.ylabel("Scale factor (multiplicative)")
plt.ylim([0.75, 1.25])
plt.grid()
plt.tight_layout()

Progression functions - sinusoidal and sawtooth¶
[4]:
duration = 52
weeks = list(range(1, duration))
from streprogen import progression_sinusoidal, progression_sawtooth
import functools
plt.figure(figsize=(14, 4))
# ------------------------------------------------------
period = 6 # The period of a cycle (sine wave), measured in weeks
scale = 0.1 # The amplitude of each cycle (i.e. height)
k = 2 # The non-linearity. k=0 is linear, higher is more non-linear
start_weight = 100
final_weight = 150
progression = functools.partial(
progression_sinusoidal,
start_weight=start_weight,
final_weight=final_weight,
start_week=1,
final_week=duration,
period=period,
scale=scale,
k=k,
)
plt.subplot(1, 2, 1)
plt.title("Sinusoidal progression")
plt.plot(
weeks, progression(weeks, offset=0.5), "-o",
)
plt.xlabel("Weeks")
plt.ylabel("Weight")
plt.grid()
progression = functools.partial(
progression_sawtooth,
start_weight=start_weight,
final_weight=final_weight,
start_week=1,
final_week=duration,
period=period,
scale=scale,
k=k,
)
plt.subplot(1, 2, 2)
plt.title("Sawtooth progression")
plt.plot(
weeks, progression(weeks, offset=-2), "-o",
)
plt.xlabel("Weeks")
plt.ylabel("Weight")
plt.grid()
plt.tight_layout()

Long term planning - a more realistic setup¶
Using periodicity and non-linearity.
[5]:
# We'll create a 16 week program, i.e. 4 months
duration = 16
weeks = list(range(1, duration))
from streprogen import progression_sinusoidal
import functools
plt.figure(figsize=(14, 4))
# ------------------------------------------------------
period = 4 # The period of a cycle (sine wave), measured in weeks
scale = 0.015 # The amplitude of each cycle (i.e. height)
offset = 2 # The offset of the cycles
k = 2 # The non-linearity. k=0 is linear, as k gets higher progression becomes more non-linear
progression = functools.partial(
progression_sinusoidal, period=period, scale=scale, offset=offset, k=k
)
plt.subplot(1, 2, 1)
plt.title("Relationship between weeks and general strength progression")
plt.plot(
weeks,
progression(
weeks, start_weight=100, final_weight=120, start_week=1, final_week=duration
),
"-o",
)
plt.xlabel("Weeks")
plt.ylabel("Weight")
plt.grid()
# ------------------------------------------------------
period = 2 # The number of cycles (sine waves) in the 16 weeks
scale = 0.2 # If the baseline is 25 reps/exercise, scale of 0.2 means we can go between 20 and 30
offset = 0 # The offset of the cycles
scale_repetitions = functools.partial(
progression_sinusoidal,
start_weight=1,
final_weight=1,
start_week=1,
final_week=duration,
period=period,
scale=scale,
offset=offset,
k=0,
)
period = 3 # The number of cycles (sine waves) in the 16 weeks
offset = 4 # The offset of the cycles
scale = 0.04 # If the baseline is an intensity of 80%, scale of 0.04 means approx between 76 and 84
scale_intensity = functools.partial(
progression_sinusoidal,
start_weight=1,
final_weight=1,
start_week=1,
final_week=duration,
period=period,
scale=scale,
offset=offset,
k=0,
)
plt.subplot(1, 2, 2)
plt.title("Rep and set scale factors")
plt.plot(weeks, scale_repetitions(weeks), "-o", label="Repetitions")
plt.plot(weeks, scale_intensity(weeks), "-o", label="Intensity")
plt.legend()
plt.xlabel("Weeks")
plt.ylabel("Scale factor (multiplicative)")
plt.ylim([0.75, 1.25])
plt.grid()
plt.tight_layout()

Program setup¶
[6]:
program = Program(
name="AdvancedFeatures", # The name of the training program
duration=duration, # The duration of the training program in weeks.
units="kg", # Units for the weights, typically 'kg', 'lbs' or '' (empty)
round_to=5, # What the weights are rounded to.
# Use the functions above
reps_per_exercise=25,
rep_scaler_func=scale_repetitions,
intensity=80,
intensity_scaler_func=scale_intensity,
progression_func=progression,
)
with program.Day("Day 1"):
program.DynamicExercise(name="Bench", start_weight=80, min_reps=2, max_reps=8)
program.DynamicExercise(name="Squats", start_weight=100, min_reps=2, max_reps=8)
program.StaticExercise("Curls", "3 x 12")
with program.Day("Day 2"):
program.DynamicExercise(name="Deadlifts", start_weight=100, min_reps=2, max_reps=8)
program.DynamicExercise(name="Squats", start_weight=90, min_reps=2, max_reps=8)
Render the program¶
[7]:
# Do the computations and render a program. Might take a few seconds.
program.render()
Print and save the program¶
[8]:
print(program)
----------------------------------------------------------------
Program: AdvancedFeatures
Program parameters
duration: 16
reps_per_exercise: 25
intensity: 80
units: kg
----------------------------------------------------------------
Exercise information
Day 1
Bench 80kg -> 99.2kg
reps: [2, 8] weekly inc.: 1.5%
Squats 100kg -> 124kg
reps: [2, 8] weekly inc.: 1.5%
Curls 3 x 12
Day 2
Deadlifts 100kg -> 124kg
reps: [2, 8] weekly inc.: 1.5%
Squats 90kg -> 111.6kg
reps: [2, 8] weekly inc.: 1.5%
----------------------------------------------------------------
Program
Week 1
Day 1
Bench 8 x 60kg 8 x 60kg 8 x 60kg
Squats 8 x 75kg 8 x 75kg 8 x 75kg
Curls 3 x 12
Day 2
Deadlifts 8 x 75kg 8 x 75kg 8 x 75kg
Squats 8 x 70kg 8 x 70kg 8 x 70kg
Week 2
Day 1
Bench 7 x 65kg 7 x 65kg 6 x 65kg 5 x 70kg
Squats 7 x 80kg 7 x 80kg 6 x 85kg 5 x 85kg
Curls 3 x 12
Day 2
Deadlifts 7 x 80kg 7 x 80kg 6 x 85kg 5 x 85kg
Squats 7 x 70kg 7 x 70kg 6 x 75kg 5 x 75kg
Week 3
Day 1
Bench 6 x 70kg 6 x 70kg 5 x 70kg 4 x 75kg 4 x 75kg
Squats 6 x 85kg 6 x 85kg 5 x 90kg 4 x 95kg 4 x 95kg
Curls 3 x 12
Day 2
Deadlifts 6 x 85kg 6 x 85kg 5 x 90kg 4 x 95kg 4 x 95kg
Squats 6 x 80kg 6 x 80kg 5 x 80kg 4 x 85kg 4 x 85kg
Week 4
Day 1
Bench 8 x 65kg 8 x 65kg 8 x 65kg
Squats 8 x 85kg 8 x 85kg 8 x 85kg
Curls 3 x 12
Day 2
Deadlifts 8 x 85kg 8 x 85kg 8 x 85kg
Squats 8 x 75kg 8 x 75kg 8 x 75kg
Week 5
Day 1
Bench 7 x 70kg 7 x 70kg 6 x 70kg 5 x 75kg
Squats 7 x 85kg 7 x 85kg 6 x 90kg 5 x 95kg
Curls 3 x 12
Day 2
Deadlifts 7 x 85kg 7 x 85kg 6 x 90kg 5 x 95kg
Squats 7 x 80kg 7 x 80kg 6 x 80kg 5 x 85kg
Week 6
Day 1
Bench 6 x 70kg 6 x 70kg 5 x 75kg 4 x 80kg 4 x 80kg
Squats 6 x 90kg 6 x 90kg 5 x 95kg 4 x 95kg 4 x 95kg
Curls 3 x 12
Day 2
Deadlifts 6 x 90kg 6 x 90kg 5 x 95kg 4 x 95kg 4 x 95kg
Squats 6 x 80kg 6 x 80kg 5 x 85kg 4 x 85kg 4 x 85kg
Week 7
Day 1
Bench 8 x 70kg 8 x 70kg 8 x 70kg
Squats 8 x 85kg 8 x 85kg 8 x 85kg
Curls 3 x 12
Day 2
Deadlifts 8 x 85kg 8 x 85kg 8 x 85kg
Squats 8 x 80kg 8 x 80kg 8 x 80kg
Week 8
Day 1
Bench 7 x 75kg 7 x 75kg 6 x 75kg 5 x 80kg
Squats 7 x 90kg 7 x 90kg 6 x 95kg 5 x 100kg
Curls 3 x 12
Day 2
Deadlifts 7 x 90kg 7 x 90kg 6 x 95kg 5 x 100kg
Squats 7 x 85kg 7 x 85kg 6 x 85kg 5 x 90kg
Week 9
Day 1
Bench 6 x 75kg 6 x 75kg 5 x 80kg 4 x 80kg 4 x 80kg
Squats 6 x 95kg 6 x 95kg 5 x 100kg 4 x 105kg 4 x 105kg
Curls 3 x 12
Day 2
Deadlifts 6 x 95kg 6 x 95kg 5 x 100kg 4 x 105kg 4 x 105kg
Squats 6 x 85kg 6 x 85kg 5 x 90kg 4 x 90kg 4 x 90kg
Week 10
Day 1
Bench 8 x 70kg 8 x 70kg 8 x 70kg
Squats 8 x 90kg 8 x 90kg 8 x 90kg
Curls 3 x 12
Day 2
Deadlifts 8 x 90kg 8 x 90kg 8 x 90kg
Squats 8 x 80kg 8 x 80kg 8 x 80kg
Week 11
Day 1
Bench 7 x 75kg 7 x 75kg 6 x 80kg 5 x 80kg
Squats 7 x 95kg 7 x 95kg 6 x 95kg 5 x 100kg
Curls 3 x 12
Day 2
Deadlifts 7 x 95kg 7 x 95kg 6 x 95kg 5 x 100kg
Squats 7 x 85kg 7 x 85kg 6 x 90kg 5 x 90kg
Week 12
Day 1
Bench 6 x 80kg 6 x 80kg 5 x 85kg 4 x 85kg 4 x 85kg
Squats 6 x 100kg 6 x 100kg 5 x 105kg 4 x 105kg 4 x 105kg
Curls 3 x 12
Day 2
Deadlifts 6 x 100kg 6 x 100kg 5 x 105kg 4 x 105kg 4 x 105kg
Squats 6 x 90kg 6 x 90kg 5 x 95kg 4 x 95kg 4 x 95kg
Week 13
Day 1
Bench 8 x 75kg 8 x 75kg 8 x 75kg
Squats 8 x 90kg 8 x 90kg 8 x 90kg
Curls 3 x 12
Day 2
Deadlifts 8 x 90kg 8 x 90kg 8 x 90kg
Squats 8 x 85kg 8 x 85kg 8 x 85kg
Week 14
Day 1
Bench 7 x 75kg 7 x 75kg 6 x 80kg 5 x 80kg
Squats 7 x 95kg 7 x 95kg 6 x 100kg 5 x 100kg
Curls 3 x 12
Day 2
Deadlifts 7 x 95kg 7 x 95kg 6 x 100kg 5 x 100kg
Squats 7 x 85kg 7 x 85kg 6 x 90kg 5 x 90kg
Week 15
Day 1
Bench 6 x 80kg 6 x 80kg 5 x 85kg 4 x 85kg 4 x 85kg
Squats 6 x 100kg 6 x 100kg 5 x 105kg 4 x 110kg 4 x 110kg
Curls 3 x 12
Day 2
Deadlifts 6 x 100kg 6 x 100kg 5 x 105kg 4 x 110kg 4 x 110kg
Squats 6 x 90kg 6 x 90kg 5 x 95kg 4 x 95kg 4 x 95kg
Week 16
Day 1
Bench 8 x 75kg 8 x 75kg 8 x 75kg
Squats 8 x 95kg 8 x 95kg 8 x 95kg
Curls 3 x 12
Day 2
Deadlifts 8 x 95kg 8 x 95kg 8 x 95kg
Squats 8 x 85kg 8 x 85kg 8 x 85kg
----------------------------------------------------------------
Export the program as .html
or .tex
, then to .pdf
¶
A .html
file can be printed directly from your browser, or printed to a .pdf
from your browser.
[9]:
# Save the program as a HTML file
with open("AdvancedFeatures.html", "w", encoding="utf-8") as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_html(table_width=6))
Use a .tex
to generate .pdf
if you have LaTEX installed, or use:
- latexbase.com from your browser.
[10]:
# If you have LaTeX installed on your system, you can render a program to .tex
# Alternatively, you can paste the LaTeX into: https://latexbase.com/
print(program.to_tex(table_width=6))
% -----------------------------------------------
% Package imports
% -----------------------------------------------
\documentclass[12pt, a4paper]{article}% 'twoside' for printing
\usepackage[utf8]{inputenc}% Allow input to be UTF-8
\usepackage[margin=2cm]{geometry}% May be used to set margins
% -----------------------------------------------
% Document start
% -----------------------------------------------
\begin{document}
\large
\section*{Program: AdvancedFeatures}
This program was made using \verb|streprogen|,
the Python strength program generator.
The latest version can be found at \\
\verb|https://pypi.python.org/pypi/streprogen/|.
\section*{Program parameters}
\begin{tabular}{l|l}
\textbf{Parameter} & \textbf{Value} \\ \hline
\verb|duration| & 16 \\
\verb|reps_per_exercise| & 25 \\
\verb|intensity| & 80 \\
\verb|units| & kg
\end{tabular}
\section*{Exercise information}
\begin{tabular}{llllll}
\textbf{Exercise} & \textbf{Start} & \textbf{End} & \textbf{Reps min}
& \textbf{Reps max} & \textbf{Weekly increase} \\ \hline
\textbf{ Day 1 } & & & & & \\ \hline
\hspace{0.5em}Bench &
80 kg &
99.2 kg &
2 & 8 &
1.5\%\\
\hspace{0.5em}Squats &
100 kg &
124 kg &
2 & 8 &
1.5\%\\
\hspace{0.5em}Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\textbf{ Day 2 } & & & & & \\ \hline
\hspace{0.5em}Deadlifts &
100 kg &
124 kg &
2 & 8 &
1.5\%\\
\hspace{0.5em}Squats &
90 kg &
111.6 kg &
2 & 8 &
1.5\%\\
\end{tabular}
\clearpage
\section*{Program}
\subsection*{\hspace{0.25em} Week 1 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 8 x 60kg
& 8 x 60kg
& 8 x 60kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 70kg
& 8 x 70kg
& 8 x 70kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 2 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 65kg
& 7 x 65kg
& 6 x 65kg
& 5 x 70kg
&
\\
\hspace{0.75em} Squats
& 7 x 80kg
& 7 x 80kg
& 6 x 85kg
& 5 x 85kg
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 7 x 80kg
& 7 x 80kg
& 6 x 85kg
& 5 x 85kg
&
\\
\hspace{0.75em} Squats
& 7 x 70kg
& 7 x 70kg
& 6 x 75kg
& 5 x 75kg
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 3 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 70kg
& 6 x 70kg
& 5 x 70kg
& 4 x 75kg
& 4 x 75kg
\\
\hspace{0.75em} Squats
& 6 x 85kg
& 6 x 85kg
& 5 x 90kg
& 4 x 95kg
& 4 x 95kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 85kg
& 6 x 85kg
& 5 x 90kg
& 4 x 95kg
& 4 x 95kg
\\
\hspace{0.75em} Squats
& 6 x 80kg
& 6 x 80kg
& 5 x 80kg
& 4 x 85kg
& 4 x 85kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 4 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 8 x 65kg
& 8 x 65kg
& 8 x 65kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 85kg
& 8 x 85kg
& 8 x 85kg
&
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 8 x 85kg
& 8 x 85kg
& 8 x 85kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 5 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 70kg
& 7 x 70kg
& 6 x 70kg
& 5 x 75kg
&
\\
\hspace{0.75em} Squats
& 7 x 85kg
& 7 x 85kg
& 6 x 90kg
& 5 x 95kg
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 7 x 85kg
& 7 x 85kg
& 6 x 90kg
& 5 x 95kg
&
\\
\hspace{0.75em} Squats
& 7 x 80kg
& 7 x 80kg
& 6 x 80kg
& 5 x 85kg
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 6 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 70kg
& 6 x 70kg
& 5 x 75kg
& 4 x 80kg
& 4 x 80kg
\\
\hspace{0.75em} Squats
& 6 x 90kg
& 6 x 90kg
& 5 x 95kg
& 4 x 95kg
& 4 x 95kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 90kg
& 6 x 90kg
& 5 x 95kg
& 4 x 95kg
& 4 x 95kg
\\
\hspace{0.75em} Squats
& 6 x 80kg
& 6 x 80kg
& 5 x 85kg
& 4 x 85kg
& 4 x 85kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 7 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 8 x 70kg
& 8 x 70kg
& 8 x 70kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 85kg
& 8 x 85kg
& 8 x 85kg
&
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 8 x 85kg
& 8 x 85kg
& 8 x 85kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 80kg
& 8 x 80kg
& 8 x 80kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 8 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 75kg
& 7 x 75kg
& 6 x 75kg
& 5 x 80kg
&
\\
\hspace{0.75em} Squats
& 7 x 90kg
& 7 x 90kg
& 6 x 95kg
& 5 x 100kg
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 7 x 90kg
& 7 x 90kg
& 6 x 95kg
& 5 x 100kg
&
\\
\hspace{0.75em} Squats
& 7 x 85kg
& 7 x 85kg
& 6 x 85kg
& 5 x 90kg
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 9 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 75kg
& 6 x 75kg
& 5 x 80kg
& 4 x 80kg
& 4 x 80kg
\\
\hspace{0.75em} Squats
& 6 x 95kg
& 6 x 95kg
& 5 x 100kg
& 4 x 105kg
& 4 x 105kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 95kg
& 6 x 95kg
& 5 x 100kg
& 4 x 105kg
& 4 x 105kg
\\
\hspace{0.75em} Squats
& 6 x 85kg
& 6 x 85kg
& 5 x 90kg
& 4 x 90kg
& 4 x 90kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 10 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 8 x 70kg
& 8 x 70kg
& 8 x 70kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 90kg
& 8 x 90kg
& 8 x 90kg
&
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 8 x 90kg
& 8 x 90kg
& 8 x 90kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 80kg
& 8 x 80kg
& 8 x 80kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 11 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 75kg
& 7 x 75kg
& 6 x 80kg
& 5 x 80kg
&
\\
\hspace{0.75em} Squats
& 7 x 95kg
& 7 x 95kg
& 6 x 95kg
& 5 x 100kg
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 7 x 95kg
& 7 x 95kg
& 6 x 95kg
& 5 x 100kg
&
\\
\hspace{0.75em} Squats
& 7 x 85kg
& 7 x 85kg
& 6 x 90kg
& 5 x 90kg
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 12 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 80kg
& 6 x 80kg
& 5 x 85kg
& 4 x 85kg
& 4 x 85kg
\\
\hspace{0.75em} Squats
& 6 x 100kg
& 6 x 100kg
& 5 x 105kg
& 4 x 105kg
& 4 x 105kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 100kg
& 6 x 100kg
& 5 x 105kg
& 4 x 105kg
& 4 x 105kg
\\
\hspace{0.75em} Squats
& 6 x 90kg
& 6 x 90kg
& 5 x 95kg
& 4 x 95kg
& 4 x 95kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 13 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 90kg
& 8 x 90kg
& 8 x 90kg
&
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 8 x 90kg
& 8 x 90kg
& 8 x 90kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 85kg
& 8 x 85kg
& 8 x 85kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 14 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 75kg
& 7 x 75kg
& 6 x 80kg
& 5 x 80kg
&
\\
\hspace{0.75em} Squats
& 7 x 95kg
& 7 x 95kg
& 6 x 100kg
& 5 x 100kg
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 7 x 95kg
& 7 x 95kg
& 6 x 100kg
& 5 x 100kg
&
\\
\hspace{0.75em} Squats
& 7 x 85kg
& 7 x 85kg
& 6 x 90kg
& 5 x 90kg
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 15 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 80kg
& 6 x 80kg
& 5 x 85kg
& 4 x 85kg
& 4 x 85kg
\\
\hspace{0.75em} Squats
& 6 x 100kg
& 6 x 100kg
& 5 x 105kg
& 4 x 110kg
& 4 x 110kg
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 6 x 100kg
& 6 x 100kg
& 5 x 105kg
& 4 x 110kg
& 4 x 110kg
\\
\hspace{0.75em} Squats
& 6 x 90kg
& 6 x 90kg
& 5 x 95kg
& 4 x 95kg
& 4 x 95kg
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 16 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 95kg
& 8 x 95kg
& 8 x 95kg
&
&
\\
\hspace{0.75em} Curls & \multicolumn{ 5 }{l}{ 3 x 12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 5 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Deadlifts
& 8 x 95kg
& 8 x 95kg
& 8 x 95kg
&
&
\\
\hspace{0.75em} Squats
& 8 x 85kg
& 8 x 85kg
& 8 x 85kg
&
&
\\
\end{tabular}
\end{document}
Custom optimization¶
(inspired by stronglifts)
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
Imports¶
[2]:
from streprogen import Program, reps_to_intensity, progression_diffeq
import matplotlib.pyplot as plt
import functools
The default optimizer¶
[3]:
program = Program(duration=4)
with program.Day():
program.DynamicExercise(name="Squat", start_weight=100)
program.render()
print(program)
----------------------------------------------------------------
Program: Untitled
Program parameters
duration: 4
reps_per_exercise: 25
intensity: 83
units: kg
----------------------------------------------------------------
Exercise information
Day 1
Squat 100kg -> 106kg
reps: [3, 8] weekly inc.: 1.5%
----------------------------------------------------------------
Program
Week 1
Day 1
Squat 8 x 75kg 7 x 77.5kg 7 x 77.5kg 7 x 77.5kg
Week 2
Day 1
Squat 6 x 82.5kg 6 x 82.5kg 6 x 82.5kg 5 x 87.5kg 4 x 90kg
Week 3
Day 1
Squat 6 x 85kg 5 x 87.5kg 4 x 92.5kg 4 x 92.5kg 4 x 92.5kg
Week 4
Day 1
Squat 5 x 90kg 4 x 92.5kg 4 x 92.5kg 4 x 92.5kg 3 x 95kg
----------------------------------------------------------------
Customizing the optimizer¶
To customize the optimizer, change max_diff
and max_unique
below.
[4]:
from streprogen import RepSchemeGenerator, RepSchemeOptimizer
[5]:
program = Program(duration=4)
# Create a generator
generator = RepSchemeGenerator(
max_diff=4, # Maximum difference between two consecutive sets.
max_unique=4, # Maximum unique sets in the solution.
)
# Override the default optimizer in the program
program.optimizer = RepSchemeOptimizer(generator=generator)
with program.Day():
program.DynamicExercise(name="Squat", start_weight=100)
program.render()
print(program)
----------------------------------------------------------------
Program: Untitled
Program parameters
duration: 4
reps_per_exercise: 25
intensity: 83
units: kg
----------------------------------------------------------------
Exercise information
Day 1
Squat 100kg -> 106kg
reps: [3, 8] weekly inc.: 1.5%
----------------------------------------------------------------
Program
Week 1
Day 1
Squat 8 x 75kg 8 x 75kg 7 x 77.5kg 4 x 87.5kg 3 x 90kg
Week 2
Day 1
Squat 7 x 80kg 7 x 80kg 6 x 82.5kg 4 x 90kg 3 x 92.5kg
Week 3
Day 1
Squat 6 x 85kg 6 x 85kg 5 x 87.5kg 3 x 95kg 3 x 95kg
Week 4
Day 1
Squat 5 x 90kg 4 x 92.5kg 4 x 92.5kg 4 x 92.5kg 3 x 95kg
----------------------------------------------------------------
Further customization is possible - please see the source code for how to inject more custom behavoirs.
Example - Beginner 5x5¶
(inspired by stronglifts)
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
Imports¶
[2]:
from streprogen import Program, reps_to_intensity, progression_diffeq
import matplotlib.pyplot as plt
import functools
Choose level of non-linearity¶
By default, streprogen
introduces a little non-linearity in the general strength progression, see below.
[3]:
plt.figure(figsize=(8, 4))
plt.title("Relationship between weeks and general strength progression")
duration = 12
weeks = list(range(1, duration + 1))
# For k=1, 2, 3, 4, plot the general strength progression function
for k in range(0, 4):
progression = functools.partial(progression_diffeq, k=k)
# The weights are arbitrary here, it's just to show the general behavior
# These weights will not be used in the actual program. In the actual program,
# weights for your specific exercises will be used.
plt.plot(weeks, progression(weeks, start_weight=100, final_weight=120,
start_week=1, final_week=12), '-o', label="k=" + str(k))
# Set up the plot and show it
plt.xlabel("Weeks"); plt.ylabel("Weight")
plt.grid(); plt.legend(); plt.tight_layout()

You can choose the non-linearity used below. Setting k=0
removes all non-linearity.
[4]:
# Setting k=0 means linear progression.
# The default value is slightly higher than 0.
k = 0
progression = functools.partial(progression_diffeq, k=k)
Program setup¶
Below is the code creating the program.
[5]:
reps_to_intensity(5)
[5]:
84.3
[6]:
# Increase in percentage per week. If set to 1.5, it takes you from 100kg to 103kg in 2 weeks.
# Here day A and B are cycled with 3 workouts per week, so we set it to a reasonably low value.
percent_inc_per_week = 1.4
program = Program(
# The name of the training program
name='Beginner5x5',
# The duration of the training program in weeks.
# Here day A and B are cycled with 3 workouts per week, so the duration would be ~8 weeks
duration=12,
# The baseline number of repetitions per dynamic exercise.
reps_per_exercise=25,
min_reps=5,
max_reps=5,
percent_inc_per_week=percent_inc_per_week,
# The baseline intensity value (approx 82 %)
intensity=reps_to_intensity(5),
# No variation in repetitions and intensity - scale with 1.0 every week
rep_scaler_func=lambda week:1,
intensity_scaler_func=lambda week:1,
# Units for the weights, typically 'kg', 'lbs' or '' (empty)
units='kg',
# What the weights are rounded to (closest multiple of this number).
round_to=2.5,
# Override the default progression function with out own
progression_func=progression
)
# --------------------------------------------------
# ---- INPUT YOUR OWN 1RMs AS START WEIGHTS BELOW --
# ---- Carefully assess the program, then go back --
# ---- and adjust further if necessary. --
# --------------------------------------------------
with program.Day("A"):
program.DynamicExercise(name="Squat", start_weight=80)
program.DynamicExercise(name="Bench Press", start_weight=60)
program.DynamicExercise(name="Barbell Row", start_weight=50)
with program.Day("B"):
program.DynamicExercise(name="Squat", start_weight=80)
program.DynamicExercise(name="Overhead Press", start_weight=40)
# Notice the additional `reps=5` here, constraining this exercise to a single set.
# This overrides the `reps_per_exercise=25` parameter in the program for this exercise.
program.DynamicExercise(name="Deadlift", start_weight=80, reps=5)
Render the program¶
[7]:
# Do the computations and render a program. Might take a few seconds.
program.render()
Print and save the program¶
[8]:
print(program)
----------------------------------------------------------------
Program: Beginner5x5
Program parameters
duration: 12
reps_per_exercise: 25
intensity: 84.3
units: kg
----------------------------------------------------------------
Exercise information
A
Squat 80kg -> 93.4kg
reps: [5, 5] weekly inc.: 1.4%
Bench Press 60kg -> 70.1kg
reps: [5, 5] weekly inc.: 1.4%
Barbell Row 50kg -> 58.4kg
reps: [5, 5] weekly inc.: 1.4%
B
Squat 80kg -> 93.4kg
reps: [5, 5] weekly inc.: 1.4%
Overhead Press 40kg -> 46.7kg
reps: [5, 5] weekly inc.: 1.4%
Deadlift 80kg -> 93.4kg
reps: [5, 5] weekly inc.: 1.4%
----------------------------------------------------------------
Program
Week 1
A
Squat 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg
Bench Press 5 x 50kg 5 x 50kg 5 x 50kg 5 x 50kg 5 x 50kg
Barbell Row 5 x 42.5kg 5 x 42.5kg 5 x 42.5kg 5 x 42.5kg 5 x 42.5kg
B
Squat 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg
Overhead Press 5 x 32.5kg 5 x 32.5kg 5 x 32.5kg 5 x 32.5kg 5 x 32.5kg
Deadlift 5 x 67.5kg
Week 2
A
Squat 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg
Bench Press 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg
Barbell Row 5 x 42.5kg 5 x 42.5kg 5 x 42.5kg 5 x 42.5kg 5 x 42.5kg
B
Squat 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg 5 x 67.5kg
Overhead Press 5 x 35kg 5 x 35kg 5 x 35kg 5 x 35kg 5 x 35kg
Deadlift 5 x 67.5kg
Week 3
A
Squat 5 x 70kg 5 x 70kg 5 x 70kg 5 x 70kg 5 x 70kg
Bench Press 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg
Barbell Row 5 x 42.5kg 5 x 42.5kg 5 x 42.5kg 5 x 42.5kg 5 x 42.5kg
B
Squat 5 x 70kg 5 x 70kg 5 x 70kg 5 x 70kg 5 x 70kg
Overhead Press 5 x 35kg 5 x 35kg 5 x 35kg 5 x 35kg 5 x 35kg
Deadlift 5 x 70kg
Week 4
A
Squat 5 x 70kg 5 x 70kg 5 x 70kg 5 x 70kg 5 x 70kg
Bench Press 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg
Barbell Row 5 x 45kg 5 x 45kg 5 x 45kg 5 x 45kg 5 x 45kg
B
Squat 5 x 70kg 5 x 70kg 5 x 70kg 5 x 70kg 5 x 70kg
Overhead Press 5 x 35kg 5 x 35kg 5 x 35kg 5 x 35kg 5 x 35kg
Deadlift 5 x 70kg
Week 5
A
Squat 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg
Bench Press 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg 5 x 52.5kg
Barbell Row 5 x 45kg 5 x 45kg 5 x 45kg 5 x 45kg 5 x 45kg
B
Squat 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg
Overhead Press 5 x 35kg 5 x 35kg 5 x 35kg 5 x 35kg 5 x 35kg
Deadlift 5 x 72.5kg
Week 6
A
Squat 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg
Bench Press 5 x 55kg 5 x 55kg 5 x 55kg 5 x 55kg 5 x 55kg
Barbell Row 5 x 45kg 5 x 45kg 5 x 45kg 5 x 45kg 5 x 45kg
B
Squat 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg
Overhead Press 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg
Deadlift 5 x 72.5kg
Week 7
A
Squat 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg
Bench Press 5 x 55kg 5 x 55kg 5 x 55kg 5 x 55kg 5 x 55kg
Barbell Row 5 x 45kg 5 x 45kg 5 x 45kg 5 x 45kg 5 x 45kg
B
Squat 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg
Overhead Press 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg
Deadlift 5 x 72.5kg
Week 8
A
Squat 5 x 75kg 5 x 75kg 5 x 75kg 5 x 75kg 5 x 75kg
Bench Press 5 x 55kg 5 x 55kg 5 x 55kg 5 x 55kg 5 x 55kg
Barbell Row 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg
B
Squat 5 x 75kg 5 x 75kg 5 x 75kg 5 x 75kg 5 x 75kg
Overhead Press 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg
Deadlift 5 x 75kg
Week 9
A
Squat 5 x 75kg 5 x 75kg 5 x 75kg 5 x 75kg 5 x 75kg
Bench Press 5 x 57.5kg 5 x 57.5kg 5 x 57.5kg 5 x 57.5kg 5 x 57.5kg
Barbell Row 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg
B
Squat 5 x 75kg 5 x 75kg 5 x 75kg 5 x 75kg 5 x 75kg
Overhead Press 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg
Deadlift 5 x 75kg
Week 10
A
Squat 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg
Bench Press 5 x 57.5kg 5 x 57.5kg 5 x 57.5kg 5 x 57.5kg 5 x 57.5kg
Barbell Row 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg
B
Squat 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg
Overhead Press 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg
Deadlift 5 x 77.5kg
Week 11
A
Squat 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg
Bench Press 5 x 57.5kg 5 x 57.5kg 5 x 57.5kg 5 x 57.5kg 5 x 57.5kg
Barbell Row 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg
B
Squat 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg 5 x 77.5kg
Overhead Press 5 x 40kg 5 x 40kg 5 x 40kg 5 x 40kg 5 x 40kg
Deadlift 5 x 77.5kg
Week 12
A
Squat 5 x 80kg 5 x 80kg 5 x 80kg 5 x 80kg 5 x 80kg
Bench Press 5 x 60kg 5 x 60kg 5 x 60kg 5 x 60kg 5 x 60kg
Barbell Row 5 x 50kg 5 x 50kg 5 x 50kg 5 x 50kg 5 x 50kg
B
Squat 5 x 80kg 5 x 80kg 5 x 80kg 5 x 80kg 5 x 80kg
Overhead Press 5 x 40kg 5 x 40kg 5 x 40kg 5 x 40kg 5 x 40kg
Deadlift 5 x 80kg
----------------------------------------------------------------
Export the program as .html
or .tex
, then to .pdf
¶
A .html
file can be printed directly from your browser, or printed to a .pdf
from your browser.
[9]:
# Save the program as a HTML file
with open('Beginner5x5.html', 'w', encoding='utf-8') as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_html(table_width=8))
[10]:
# Save the program as a TEX file
with open('Beginner5x5.tex', 'w', encoding='utf-8') as file:
file.write(program.to_tex(table_width=8))
Use a .tex
to generate .pdf
if you have LaTeX installed, or use:
- latexbase.com from your browser.
[11]:
# If you have LaTeX installed on your system, you can render a program to .tex
# Alternatively, you can paste the LaTeX into: https://latexbase.com/
print(program.to_tex(table_width=8))
% -----------------------------------------------
% Package imports
% -----------------------------------------------
\documentclass[12pt, a4paper]{article}% 'twoside' for printing
\usepackage[utf8]{inputenc}% Allow input to be UTF-8
\usepackage[margin=2cm]{geometry}% May be used to set margins
% -----------------------------------------------
% Document start
% -----------------------------------------------
\begin{document}
\large
\section*{Program: Beginner5x5}
This program was made using \verb|streprogen|,
the Python strength program generator.
The latest version can be found at \\
\verb|https://pypi.python.org/pypi/streprogen/|.
\section*{Program parameters}
\begin{tabular}{l|l}
\textbf{Parameter} & \textbf{Value} \\ \hline
\verb|duration| & 12 \\
\verb|reps_per_exercise| & 25 \\
\verb|intensity| & 84.3 \\
\verb|units| & kg
\end{tabular}
\section*{Exercise information}
\begin{tabular}{llllll}
\textbf{Exercise} & \textbf{Start} & \textbf{End} & \textbf{Reps min}
& \textbf{Reps max} & \textbf{Weekly increase} \\ \hline
\textbf{ A } & & & & & \\ \hline
\hspace{0.5em}Squat &
80 kg &
93.4 kg &
5 & 5 &
1.4\%\\
\hspace{0.5em}Bench Press &
60 kg &
70.1 kg &
5 & 5 &
1.4\%\\
\hspace{0.5em}Barbell Row &
50 kg &
58.4 kg &
5 & 5 &
1.4\%\\
\textbf{ B } & & & & & \\ \hline
\hspace{0.5em}Squat &
80 kg &
93.4 kg &
5 & 5 &
1.4\%\\
\hspace{0.5em}Overhead Press &
40 kg &
46.7 kg &
5 & 5 &
1.4\%\\
\hspace{0.5em}Deadlift &
80 kg &
93.4 kg &
5 & 5 &
1.4\%\\
\end{tabular}
\clearpage
\section*{Program}
\subsection*{\hspace{0.25em} Week 1 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 50kg
& 5 x 50kg
& 5 x 50kg
& 5 x 50kg
& 5 x 50kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 42.5kg
& 5 x 42.5kg
& 5 x 42.5kg
& 5 x 42.5kg
& 5 x 42.5kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 32.5kg
& 5 x 32.5kg
& 5 x 32.5kg
& 5 x 32.5kg
& 5 x 32.5kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 67.5kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 2 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 42.5kg
& 5 x 42.5kg
& 5 x 42.5kg
& 5 x 42.5kg
& 5 x 42.5kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
& 5 x 67.5kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 67.5kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 3 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 42.5kg
& 5 x 42.5kg
& 5 x 42.5kg
& 5 x 42.5kg
& 5 x 42.5kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 70kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 4 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
& 5 x 70kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 70kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 5 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
& 5 x 52.5kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
& 5 x 35kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 72.5kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 6 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 55kg
& 5 x 55kg
& 5 x 55kg
& 5 x 55kg
& 5 x 55kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 72.5kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 7 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 55kg
& 5 x 55kg
& 5 x 55kg
& 5 x 55kg
& 5 x 55kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
& 5 x 45kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
& 5 x 72.5kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 72.5kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 8 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 55kg
& 5 x 55kg
& 5 x 55kg
& 5 x 55kg
& 5 x 55kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 75kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 9 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 57.5kg
& 5 x 57.5kg
& 5 x 57.5kg
& 5 x 57.5kg
& 5 x 57.5kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
& 5 x 75kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 75kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 10 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 57.5kg
& 5 x 57.5kg
& 5 x 57.5kg
& 5 x 57.5kg
& 5 x 57.5kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
& 5 x 37.5kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 77.5kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 11 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 57.5kg
& 5 x 57.5kg
& 5 x 57.5kg
& 5 x 57.5kg
& 5 x 57.5kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
& 5 x 47.5kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
& 5 x 77.5kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 40kg
& 5 x 40kg
& 5 x 40kg
& 5 x 40kg
& 5 x 40kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 77.5kg
&
&
&
&
&
&
\\
\end{tabular}
\subsection*{\hspace{0.25em} Week 12 }
\subsection*{\hspace{0.5em} A }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
&
&
\\
\hspace{0.75em} Bench Press
& 5 x 60kg
& 5 x 60kg
& 5 x 60kg
& 5 x 60kg
& 5 x 60kg
&
&
\\
\hspace{0.75em} Barbell Row
& 5 x 50kg
& 5 x 50kg
& 5 x 50kg
& 5 x 50kg
& 5 x 50kg
&
&
\\
\end{tabular}
\subsection*{\hspace{0.5em} B }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Squat
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
& 5 x 80kg
&
&
\\
\hspace{0.75em} Overhead Press
& 5 x 40kg
& 5 x 40kg
& 5 x 40kg
& 5 x 40kg
& 5 x 40kg
&
&
\\
\hspace{0.75em} Deadlift
& 5 x 80kg
&
&
&
&
&
&
\\
\end{tabular}
\end{document}
Example - Beginner 5x5 modified¶
(inspired by stronglifts)
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
Imports¶
[2]:
from streprogen import Program, reps_to_intensity, progression_diffeq
import matplotlib.pyplot as plt
import functools
Choose level of non-linearity¶
By default, streprogen
introduces a little non-linearity in the general strength progression, see below.
[3]:
plt.figure(figsize=(8, 4))
plt.title("Relationship between weeks and general strength progression")
duration = 12
weeks = list(range(1, duration + 1))
for k in range(0, 4):
progression = functools.partial(progression_diffeq, k=k)
plt.plot(weeks, progression(weeks, start_weight=100, final_weight=120,
start_week=1, final_week=12), '-o', label="k=" + str(k))
plt.xlabel("Weeks"); plt.ylabel("Weight")
plt.grid(); plt.legend(); plt.tight_layout()

You can choose the non-linearity used below. Setting k=0
removes all non-linearity.
[4]:
# Setting k=0 means linear progression.
# The default value is slightly higher than 0.
k = 1
progression = functools.partial(progression_diffeq, k=k)
Program setup¶
Below is the code creating the program.
- We modify the 5x5 scheme by allowing reps to be between 4 and 6.
- The default settings will add some some periodicity to the number of reps and the intensity over the weeks.
[5]:
# Increase in percentage per week. If set to 1.5, it takes you from 100kg to 103kg in 2 weeks.
# Here day A and B are cycled with 3 workouts per week, so we set it to a reasonably low value.
percent_inc_per_week = 1.4
program = Program(
# The name of the training program
name='Beginner5x5modified',
# The duration of the training program in weeks.
# Here day A and B are cycled with 3 workouts per week, so the duration would be ~8 weeks
duration=12,
# The baseline number of repetitions per dynamic exercise.
reps_per_exercise=22,
min_reps=3,
max_reps=7,
percent_inc_per_week=percent_inc_per_week,
# The baseline intensity value (approx 82 %)
intensity=reps_to_intensity(5),
# Units for the weights, typically 'kg', 'lbs' or '' (empty)
units='kg',
# What the weights are rounded to.
round_to=2.5,
# Override the default progression function with out own
progression_func=progression
)
# --------------------------------------------------
# ---- INPUT YOUR OWN 1RMs AS START WEIGHTS BELOW --
# ---- Carefully assess the program, then go back --
# ---- and adjust further if necessary. --
# --------------------------------------------------
with program.Day("A"):
program.DynamicExercise(name="Squat", start_weight=80)
program.DynamicExercise(name="Bench Press", start_weight=60)
program.DynamicExercise(name="Barbell Row", start_weight=50)
with program.Day("B"):
program.DynamicExercise(name="Squat", start_weight=80)
program.DynamicExercise(name="Overhead Press", start_weight=40)
# Notice the additional `reps=5` here, constraining this exercise to a single set.
# This overrides the `reps_per_exercise=25` parameter in the program for this exercise.
program.DynamicExercise(name="Deadlift", start_weight=80, reps=5)
Render the program¶
[6]:
# Do the computations and render a program. Might take a few seconds.
program.render()
Print and save the program¶
[7]:
print(program)
----------------------------------------------------------------
Program: Beginner5x5modified
Program parameters
duration: 12
reps_per_exercise: 22
intensity: 84.3
units: kg
----------------------------------------------------------------
Exercise information
A
Squat 80kg -> 93.4kg
reps: [3, 7] weekly inc.: 1.4%
Bench Press 60kg -> 70.1kg
reps: [3, 7] weekly inc.: 1.4%
Barbell Row 50kg -> 58.4kg
reps: [3, 7] weekly inc.: 1.4%
B
Squat 80kg -> 93.4kg
reps: [3, 7] weekly inc.: 1.4%
Overhead Press 40kg -> 46.7kg
reps: [3, 7] weekly inc.: 1.4%
Deadlift 80kg -> 93.4kg
reps: [3, 7] weekly inc.: 1.4%
----------------------------------------------------------------
Program
Week 1
A
Squat 7 x 62.5kg 7 x 62.5kg 6 x 65kg 6 x 65kg
Bench Press 7 x 47.5kg 7 x 47.5kg 6 x 50kg 6 x 50kg
Barbell Row 7 x 40kg 7 x 40kg 6 x 40kg 6 x 40kg
B
Squat 7 x 62.5kg 7 x 62.5kg 6 x 65kg 6 x 65kg
Overhead Press 7 x 32.5kg 7 x 32.5kg 6 x 32.5kg 6 x 32.5kg
Deadlift 6 x 65kg
Week 2
A
Squat 7 x 65kg 6 x 67.5kg 6 x 67.5kg 6 x 67.5kg
Bench Press 7 x 47.5kg 6 x 50kg 6 x 50kg 6 x 50kg
Barbell Row 7 x 40kg 6 x 42.5kg 6 x 42.5kg 6 x 42.5kg
B
Squat 7 x 65kg 6 x 67.5kg 6 x 67.5kg 6 x 67.5kg
Overhead Press 7 x 32.5kg 6 x 32.5kg 6 x 32.5kg 6 x 32.5kg
Deadlift 6 x 67.5kg
Week 3
A
Squat 6 x 67.5kg 6 x 67.5kg 6 x 67.5kg 6 x 67.5kg
Bench Press 6 x 50kg 6 x 50kg 6 x 50kg 6 x 50kg
Barbell Row 6 x 42.5kg 6 x 42.5kg 6 x 42.5kg 6 x 42.5kg
B
Squat 6 x 67.5kg 6 x 67.5kg 6 x 67.5kg 6 x 67.5kg
Overhead Press 6 x 35kg 6 x 35kg 6 x 35kg 6 x 35kg
Deadlift 6 x 67.5kg
Week 4
A
Squat 6 x 67.5kg 6 x 67.5kg 6 x 67.5kg 5 x 72.5kg
Bench Press 6 x 52.5kg 6 x 52.5kg 6 x 52.5kg 5 x 52.5kg
Barbell Row 6 x 42.5kg 6 x 42.5kg 6 x 42.5kg 5 x 45kg
B
Squat 6 x 67.5kg 6 x 67.5kg 6 x 67.5kg 5 x 72.5kg
Overhead Press 6 x 35kg 6 x 35kg 6 x 35kg 5 x 35kg
Deadlift 6 x 67.5kg
Week 5
A
Squat 6 x 70kg 6 x 70kg 5 x 72.5kg 5 x 72.5kg
Bench Press 6 x 52.5kg 6 x 52.5kg 5 x 55kg 5 x 55kg
Barbell Row 6 x 42.5kg 6 x 42.5kg 5 x 45kg 5 x 45kg
B
Squat 6 x 70kg 6 x 70kg 5 x 72.5kg 5 x 72.5kg
Overhead Press 6 x 35kg 6 x 35kg 5 x 35kg 5 x 35kg
Deadlift 5 x 72.5kg
Week 6
A
Squat 6 x 70kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg
Bench Press 6 x 52.5kg 5 x 55kg 5 x 55kg 5 x 55kg
Barbell Row 6 x 45kg 5 x 45kg 5 x 45kg 5 x 45kg
B
Squat 6 x 70kg 5 x 72.5kg 5 x 72.5kg 5 x 72.5kg
Overhead Press 6 x 35kg 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg
Deadlift 5 x 72.5kg
Week 7
A
Squat 5 x 75kg 5 x 75kg 5 x 75kg 4 x 77.5kg 3 x 80kg
Bench Press 5 x 55kg 5 x 55kg 5 x 55kg 4 x 57.5kg 3 x 60kg
Barbell Row 5 x 47.5kg 5 x 47.5kg 5 x 47.5kg 4 x 47.5kg 3 x 50kg
B
Squat 5 x 75kg 5 x 75kg 5 x 75kg 4 x 77.5kg 3 x 80kg
Overhead Press 5 x 37.5kg 5 x 37.5kg 5 x 37.5kg 4 x 37.5kg 3 x 40kg
Deadlift 5 x 75kg
Week 8
A
Squat 5 x 75kg 5 x 75kg 4 x 77.5kg 4 x 77.5kg 3 x 80kg
Bench Press 5 x 57.5kg 5 x 57.5kg 4 x 57.5kg 4 x 57.5kg 3 x 60kg
Barbell Row 5 x 47.5kg 5 x 47.5kg 4 x 50kg 4 x 50kg 3 x 50kg
B
Squat 5 x 75kg 5 x 75kg 4 x 77.5kg 4 x 77.5kg 3 x 80kg
Overhead Press 5 x 37.5kg 5 x 37.5kg 4 x 40kg 4 x 40kg 3 x 40kg
Deadlift 5 x 75kg
Week 9
A
Squat 5 x 77.5kg 5 x 77.5kg 4 x 80kg 3 x 82.5kg 3 x 82.5kg
Bench Press 5 x 57.5kg 5 x 57.5kg 4 x 60kg 3 x 62.5kg 3 x 62.5kg
Barbell Row 5 x 47.5kg 5 x 47.5kg 4 x 50kg 3 x 52.5kg 3 x 52.5kg
B
Squat 5 x 77.5kg 5 x 77.5kg 4 x 80kg 3 x 82.5kg 3 x 82.5kg
Overhead Press 5 x 37.5kg 5 x 37.5kg 4 x 40kg 3 x 40kg 3 x 40kg
Deadlift 4 x 80kg
Week 10
A
Squat 5 x 77.5kg 4 x 80kg 4 x 80kg 3 x 82.5kg 3 x 82.5kg
Bench Press 5 x 57.5kg 4 x 60kg 4 x 60kg 3 x 62.5kg 3 x 62.5kg
Barbell Row 5 x 47.5kg 4 x 50kg 4 x 50kg 3 x 52.5kg 3 x 52.5kg
B
Squat 5 x 77.5kg 4 x 80kg 4 x 80kg 3 x 82.5kg 3 x 82.5kg
Overhead Press 5 x 37.5kg 4 x 40kg 4 x 40kg 3 x 42.5kg 3 x 42.5kg
Deadlift 4 x 80kg
Week 11
A
Squat 5 x 77.5kg 4 x 80kg 3 x 85kg 3 x 85kg 3 x 85kg
Bench Press 5 x 57.5kg 4 x 60kg 3 x 62.5kg 3 x 62.5kg 3 x 62.5kg
Barbell Row 5 x 47.5kg 4 x 50kg 3 x 52.5kg 3 x 52.5kg 3 x 52.5kg
B
Squat 5 x 77.5kg 4 x 80kg 3 x 85kg 3 x 85kg 3 x 85kg
Overhead Press 5 x 40kg 4 x 40kg 3 x 42.5kg 3 x 42.5kg 3 x 42.5kg
Deadlift 4 x 80kg
Week 12
A
Squat 4 x 82.5kg 4 x 82.5kg 4 x 82.5kg 3 x 85kg 3 x 85kg
Bench Press 4 x 62.5kg 4 x 62.5kg 4 x 62.5kg 3 x 62.5kg 3 x 62.5kg
Barbell Row 4 x 50kg 4 x 50kg 4 x 50kg 3 x 52.5kg 3 x 52.5kg
B
Squat 4 x 82.5kg 4 x 82.5kg 4 x 82.5kg 3 x 85kg 3 x 85kg
Overhead Press 4 x 40kg 4 x 40kg 4 x 40kg 3 x 42.5kg 3 x 42.5kg
Deadlift 4 x 82.5kg
----------------------------------------------------------------
Export the program as .html
or .tex
, then to .pdf
¶
A .html
file can be printed directly from your browser, or printed to a .pdf
from your browser.
[8]:
# Save the program as a HTML file
with open('Beginner5x5modified.html', 'w', encoding='utf-8') as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_html(table_width=8))
[ ]:
# Save the program as a TEX file
with open('Beginner5x5modified.tex', 'w', encoding='utf-8') as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_tex(table_width=8))
Use a .tex
to generate .pdf
if you have LaTeX installed, or use:
- latexbase.com from your browser.
[ ]:
# If you have LaTeX installed on your system, you can render a program to .tex
# Alternatively, you can paste the LaTeX into: https://latexbase.com/
print(program.to_tex(table_width=8))
Example - 3 day split¶
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
Imports¶
[2]:
from streprogen import Program, reps_to_intensity, progression_diffeq
import matplotlib.pyplot as plt
import functools
A custom periodization function¶
Let’s replace the default progression function with a wave function.
[3]:
plt.figure(figsize=(8, 4))
plt.title("Relationship between weeks and general strength progression")
duration = 8
weeks = list(range(1, duration + 1))
def progress(weeks, start_weight, final_weight, start_week, final_week):
"""Custom progress function.
You can define any function here, but it must have the signature:
func(weeks, start_weight, final_weight, start_week, final_week)
"""
# Setting k=0 below makes the function perfectly linear
# Setting k>0 makes the function increasingly non-linear
base = progression_diffeq(weeks, start_weight, final_weight, start_week, final_week, k=1)
period = 3
amplitude = 0.05
return (1 + amplitude*((weeks - 1) % period - period // 2) / (period - 1))*base
custom = [progress(w, start_weight=100, final_weight=120, start_week=1, final_week=duration) for w in weeks]
default = [Program._default_progression_func(w, start_weight=100, final_weight=120, start_week=1, final_week=duration) for w in weeks]
# Plot the two functions
plt.plot(weeks, custom, '-o', label="Custom progress function")
plt.plot(weeks, default, '-o', label="Default progress function")
plt.xlabel("Weeks"); plt.ylabel("Weight")
plt.legend(); plt.grid(); plt.tight_layout()

Program setup¶
Below is the code creating the program.
- It’s a relatively straightforward split program, mostly using defaults.
- You will have to add your own values for the exercises, i.e. the weights.
- We demonstrate some more advanced features and commented on them.
[4]:
program = Program(
# The name of the training program
name='3DaySplitWithPeriodization',
duration=duration,
# The baseline number of repetitions per dynamic exercise.
reps_per_exercise=22,
# Units for the weights, typically 'kg', 'lbs' or '' (empty)
units='kg',
# What the weights are rounded to (closest multiple of this number)
round_to=5,
# Set intensity
intensity=80,
# Override the default progression function with out own
progression_func=progress
)
# Use the random module to generate some random set/rep schemes
import random
random.seed(123)
def random_set_ret_scheme(week):
return random.choice(["3x12", "4x10", "5x8"])
# --------------------------------------------------
# ---- INPUT YOUR OWN 1RMs AS START WEIGHTS BELOW --
# ---- Carefully assess the program, then go back --
# ---- and adjust further if necessary. --
# --------------------------------------------------
with program.Day("Day A - Chest/tri"):
program.DynamicExercise(name="Bench", start_weight=100)
# BW stands for body weight, so if you weigh 80kg and it says 90kg,
# then you add 10kg in a belt
program.DynamicExercise(name="Dips", start_weight=105, min_reps=4)
# For this specific exercise we change the rounding
program.DynamicExercise(name="Incline bench", start_weight=80, round_to=2.5)
program.StaticExercise("French press", random_set_ret_scheme)
with program.Day("Day B - Back/bi"):
program.DynamicExercise(name="Light squats", start_weight=100, min_reps=4)
# Below we decrease the reps and increase the intensity of deadlifts a little
program.DynamicExercise(name="Deadlifts", start_weight=140, reps=15, max_reps=5, min_reps=2, intensity=89)
program.DynamicExercise(name="Seated rows", start_weight=90, min_reps=5, intensity=79)
program.StaticExercise("Chin ups", "4x8")
program.StaticExercise("Curls", random_set_ret_scheme)
with program.Day("Day C - Legs"):
program.DynamicExercise(name="Heavy Squats", start_weight=120)
program.DynamicExercise(name="Bench", start_weight=105)
program.DynamicExercise(name="Stiffleg DLs", start_weight=100)
program.StaticExercise("Chin ups", "3x10")
program.StaticExercise("Claf raises", random_set_ret_scheme)
Render the program¶
[5]:
# Do the computations and render a program. Might take a few seconds.
program.render()
/home/tommy/Desktop/github/streprogen/streprogen/program.py:357: UserWarning: WARNING: The exercise 'Seated rows' is restricted to repetitions in the range [5, 8].
This maps to intensities in the range [75.5, 84.3], but the goal average intensity is 75.0,
which is not achievable with this rep range.
SOLUTION: Either (1) change the repetition range, (2) change the desired intensity
or (3) ignore this message. The software will do it's best to remedy this.
warnings.warn(msg)
Print and save the program¶
[6]:
print(program)
----------------------------------------------------------------
Program: 3DaySplitWithPeriodization
Program parameters
duration: 8
reps_per_exercise: 22
intensity: 80
units: kg
----------------------------------------------------------------
Exercise information
Day A - Chest/tri
Bench 100kg -> 112kg
reps: [3, 8] weekly inc.: 1.5%
Dips 105kg -> 117.6kg
reps: [4, 8] weekly inc.: 1.5%
Incline bench 80kg -> 89.6kg
reps: [3, 8] weekly inc.: 1.5%
French press 3x12
Day B - Back/bi
Light squats 100kg -> 112kg
reps: [4, 8] weekly inc.: 1.5%
Deadlifts 140kg -> 156.8kg
reps: [2, 5] weekly inc.: 1.5%
Seated rows 90kg -> 100.8kg
reps: [5, 8] weekly inc.: 1.5%
Chin ups 4x8
Curls 4x10
Day C - Legs
Heavy Squats 120kg -> 134.4kg
reps: [3, 8] weekly inc.: 1.5%
Bench 105kg -> 117.6kg
reps: [3, 8] weekly inc.: 1.5%
Stiffleg DLs 100kg -> 112kg
reps: [3, 8] weekly inc.: 1.5%
Chin ups 3x10
Claf raises 3x12
----------------------------------------------------------------
Program
Week 1
Day A - Chest/tri
Bench 8 x 75kg 8 x 75kg 8 x 75kg
Dips 8 x 75kg 8 x 75kg 8 x 75kg
Incline bench 8 x 60kg 8 x 60kg 8 x 60kg
French press 4x10
Day B - Back/bi
Light squats 8 x 75kg 8 x 75kg 8 x 75kg
Deadlifts 5 x 115kg 5 x 115kg 5 x 115kg 4 x 120kg
Seated rows 8 x 65kg 8 x 65kg 8 x 65kg
Chin ups 4x8
Curls 4x10
Day C - Legs
Heavy Squats 8 x 90kg 8 x 90kg 8 x 90kg
Bench 8 x 75kg 8 x 75kg 8 x 75kg
Stiffleg DLs 8 x 75kg 8 x 75kg 8 x 75kg
Chin ups 3x10
Claf raises 3x12
Week 2
Day A - Chest/tri
Bench 8 x 75kg 8 x 75kg 8 x 75kg
Dips 8 x 80kg 8 x 80kg 8 x 80kg
Incline bench 8 x 62.5kg 8 x 62.5kg 8 x 62.5kg
French press 3x12
Day B - Back/bi
Light squats 8 x 75kg 8 x 75kg 8 x 75kg
Deadlifts 5 x 120kg 5 x 120kg 4 x 125kg 3 x 130kg
Seated rows 8 x 70kg 8 x 70kg 8 x 70kg
Chin ups 4x8
Curls 4x10
Day C - Legs
Heavy Squats 8 x 95kg 8 x 95kg 8 x 95kg
Bench 8 x 80kg 8 x 80kg 8 x 80kg
Stiffleg DLs 8 x 75kg 8 x 75kg 8 x 75kg
Chin ups 3x10
Claf raises 5x8
Week 3
Day A - Chest/tri
Bench 7 x 85kg 7 x 85kg 6 x 85kg 5 x 90kg
Dips 7 x 90kg 7 x 90kg 6 x 90kg 5 x 95kg
Incline bench 7 x 67.5kg 7 x 67.5kg 6 x 70kg 5 x 72.5kg
French press 5x8
Day B - Back/bi
Light squats 7 x 85kg 7 x 85kg 6 x 85kg 5 x 90kg
Deadlifts 5 x 125kg 4 x 130kg 4 x 130kg 3 x 135kg
Seated rows 8 x 75kg 8 x 75kg 7 x 75kg
Chin ups 4x8
Curls 4x10
Day C - Legs
Heavy Squats 7 x 100kg 7 x 100kg 6 x 105kg 5 x 110kg
Bench 7 x 90kg 7 x 90kg 6 x 90kg 5 x 95kg
Stiffleg DLs 7 x 85kg 7 x 85kg 6 x 85kg 5 x 90kg
Chin ups 3x10
Claf raises 4x10
Week 4
Day A - Chest/tri
Bench 7 x 80kg 6 x 85kg 6 x 85kg 5 x 85kg
Dips 7 x 85kg 6 x 90kg 6 x 90kg 5 x 90kg
Incline bench 7 x 65kg 6 x 67.5kg 6 x 67.5kg 5 x 70kg
French press 3x12
Day B - Back/bi
Light squats 7 x 80kg 6 x 85kg 6 x 85kg 5 x 85kg
Deadlifts 4 x 125kg 4 x 125kg 4 x 125kg 3 x 130kg
Seated rows 8 x 70kg 7 x 75kg 7 x 75kg
Chin ups 4x8
Curls 3x12
Day C - Legs
Heavy Squats 7 x 95kg 6 x 100kg 6 x 100kg 5 x 105kg
Bench 7 x 85kg 6 x 90kg 6 x 90kg 5 x 90kg
Stiffleg DLs 7 x 80kg 6 x 85kg 6 x 85kg 5 x 85kg
Chin ups 3x10
Claf raises 3x12
Week 5
Day A - Chest/tri
Bench 7 x 85kg 7 x 85kg 6 x 90kg
Dips 7 x 90kg 7 x 90kg 6 x 90kg
Incline bench 7 x 67.5kg 7 x 67.5kg 6 x 70kg
French press 4x10
Day B - Back/bi
Light squats 7 x 85kg 7 x 85kg 6 x 90kg
Deadlifts 4 x 130kg 4 x 130kg 3 x 135kg 2 x 140kg 2 x 140kg
Seated rows 7 x 75kg 7 x 75kg 6 x 80kg
Chin ups 4x8
Curls 5x8
Day C - Legs
Heavy Squats 7 x 100kg 7 x 100kg 6 x 105kg
Bench 7 x 90kg 7 x 90kg 6 x 90kg
Stiffleg DLs 7 x 85kg 7 x 85kg 6 x 90kg
Chin ups 3x10
Claf raises 4x10
Week 6
Day A - Chest/tri
Bench 6 x 90kg 6 x 90kg 5 x 95kg 4 x 100kg
Dips 6 x 95kg 6 x 95kg 5 x 100kg 4 x 105kg
Incline bench 6 x 72.5kg 6 x 72.5kg 5 x 75kg 4 x 77.5kg
French press 5x8
Day B - Back/bi
Light squats 6 x 90kg 6 x 90kg 5 x 95kg 4 x 100kg
Deadlifts 4 x 135kg 3 x 140kg 3 x 140kg 2 x 145kg 2 x 145kg
Seated rows 7 x 80kg 6 x 80kg 6 x 80kg
Chin ups 4x8
Curls 3x12
Day C - Legs
Heavy Squats 6 x 110kg 6 x 110kg 5 x 115kg 4 x 120kg
Bench 6 x 95kg 6 x 95kg 5 x 100kg 4 x 105kg
Stiffleg DLs 6 x 90kg 6 x 90kg 5 x 95kg 4 x 100kg
Chin ups 3x10
Claf raises 3x12
Week 7
Day A - Chest/tri
Bench 6 x 90kg 5 x 90kg 5 x 90kg 4 x 95kg
Dips 6 x 90kg 5 x 95kg 5 x 95kg 4 x 100kg
Incline bench 6 x 70kg 5 x 72.5kg 5 x 72.5kg 4 x 75kg
French press 3x12
Day B - Back/bi
Light squats 6 x 90kg 5 x 90kg 5 x 90kg 4 x 95kg
Deadlifts 3 x 135kg 3 x 135kg 3 x 135kg 2 x 140kg 2 x 140kg
Seated rows 6 x 80kg 6 x 80kg 6 x 80kg
Chin ups 4x8
Curls 4x10
Day C - Legs
Heavy Squats 6 x 105kg 5 x 110kg 5 x 110kg 4 x 115kg
Bench 6 x 90kg 5 x 95kg 5 x 95kg 4 x 100kg
Stiffleg DLs 6 x 90kg 5 x 90kg 5 x 90kg 4 x 95kg
Chin ups 3x10
Claf raises 3x12
Week 8
Day A - Chest/tri
Bench 6 x 90kg 5 x 95kg 4 x 100kg 4 x 100kg
Dips 6 x 95kg 5 x 100kg 4 x 105kg 4 x 105kg
Incline bench 6 x 72.5kg 5 x 75kg 4 x 77.5kg 4 x 77.5kg
French press 5x8
Day B - Back/bi
Light squats 6 x 90kg 5 x 95kg 4 x 100kg 4 x 100kg
Deadlifts 2 x 145kg 2 x 145kg 2 x 145kg 2 x 145kg 2 x 145kg 2 x 145kg
Seated rows 6 x 80kg 6 x 80kg 5 x 85kg
Chin ups 4x8
Curls 4x10
Day C - Legs
Heavy Squats 6 x 110kg 5 x 115kg 4 x 120kg 4 x 120kg
Bench 6 x 95kg 5 x 100kg 4 x 105kg 4 x 105kg
Stiffleg DLs 6 x 90kg 5 x 95kg 4 x 100kg 4 x 100kg
Chin ups 3x10
Claf raises 3x12
----------------------------------------------------------------
Export the program as .html
or .tex
, then to .pdf
¶
A .html
file can be printed directly from your browser, or printed to a .pdf
from your browser.
[7]:
# Save the program as a HTML file
with open('3DaySplitWithPeriodization.html', 'w', encoding='utf-8') as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_html(table_width=8))
[8]:
# Save the program as a TEX file
with open('3DaySplitWithPeriodization.tex', 'w', encoding='utf-8') as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_tex(table_width=8))
Use a .tex
to generate .pdf
if you have LaTeX installed, or use:
- latexbase.com from your browser.
[9]:
# If you have LaTeX installed on your system, you can render a program to .tex
# Alternatively, you can paste the LaTeX into: https://latexbase.com/
print(program.to_tex(table_width=8))
% -----------------------------------------------
% Package imports
% -----------------------------------------------
\documentclass[12pt, a4paper]{article}% 'twoside' for printing
\usepackage[utf8]{inputenc}% Allow input to be UTF-8
\usepackage[margin=2cm]{geometry}% May be used to set margins
% -----------------------------------------------
% Document start
% -----------------------------------------------
\begin{document}
\large
\section*{Program: 3DaySplitWithPeriodization}
This program was made using \verb|streprogen|,
the Python strength program generator.
The latest version can be found at \\
\verb|https://pypi.python.org/pypi/streprogen/|.
\section*{Program parameters}
\begin{tabular}{l|l}
\textbf{Parameter} & \textbf{Value} \\ \hline
\verb|duration| & 8 \\
\verb|reps_per_exercise| & 22 \\
\verb|intensity| & 80 \\
\verb|units| & kg
\end{tabular}
\section*{Exercise information}
\begin{tabular}{llllll}
\textbf{Exercise} & \textbf{Start} & \textbf{End} & \textbf{Reps min}
& \textbf{Reps max} & \textbf{Weekly increase} \\ \hline
\textbf{ Day A - Chest/tri } & & & & & \\ \hline
\hspace{0.5em}Bench &
100 kg &
112 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Dips &
105 kg &
117.6 kg &
4 & 8 &
1.5\%\\
\hspace{0.5em}Incline bench &
80 kg &
89.6 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}French press & \multicolumn{ 5 }{l}{ 4x10 } \\
\textbf{ Day B - Back/bi } & & & & & \\ \hline
\hspace{0.5em}Light squats &
100 kg &
112 kg &
4 & 8 &
1.5\%\\
\hspace{0.5em}Deadlifts &
140 kg &
156.8 kg &
2 & 5 &
1.5\%\\
\hspace{0.5em}Seated rows &
90 kg &
100.8 kg &
5 & 8 &
1.5\%\\
\hspace{0.5em}Chin ups & \multicolumn{ 5 }{l}{ 4x8 } \\
\hspace{0.5em}Curls & \multicolumn{ 5 }{l}{ 5x8 } \\
\textbf{ Day C - Legs } & & & & & \\ \hline
\hspace{0.5em}Heavy Squats &
120 kg &
134.4 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Bench &
105 kg &
117.6 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Stiffleg DLs &
100 kg &
112 kg &
3 & 8 &
1.5\%\\
\hspace{0.5em}Chin ups & \multicolumn{ 5 }{l}{ 3x10 } \\
\hspace{0.5em}Claf raises & \multicolumn{ 5 }{l}{ 4x10 } \\
\end{tabular}
\clearpage
\section*{Program}
\subsection*{\hspace{0.25em} Week 1 }
\subsection*{\hspace{0.5em} Day A - Chest/tri }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
&
&
\\
\hspace{0.75em} Dips
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
&
&
\\
\hspace{0.75em} Incline bench
& 8 x 60kg
& 8 x 60kg
& 8 x 60kg
&
&
&
&
\\
\hspace{0.75em} French press & \multicolumn{ 7 }{l}{ 3x12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day B - Back/bi }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Light squats
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
&
&
\\
\hspace{0.75em} Deadlifts
& 5 x 115kg
& 5 x 115kg
& 5 x 115kg
& 4 x 120kg
&
&
&
\\
\hspace{0.75em} Seated rows
& 8 x 65kg
& 8 x 65kg
& 8 x 65kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 4x8 } \\
\hspace{0.75em} Curls & \multicolumn{ 7 }{l}{ 5x8 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day C - Legs }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Heavy Squats
& 8 x 90kg
& 8 x 90kg
& 8 x 90kg
&
&
&
&
\\
\hspace{0.75em} Bench
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
&
&
\\
\hspace{0.75em} Stiffleg DLs
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 3x10 } \\
\hspace{0.75em} Claf raises & \multicolumn{ 7 }{l}{ 4x10 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 2 }
\subsection*{\hspace{0.5em} Day A - Chest/tri }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
&
&
\\
\hspace{0.75em} Dips
& 8 x 80kg
& 8 x 80kg
& 8 x 80kg
&
&
&
&
\\
\hspace{0.75em} Incline bench
& 8 x 62.5kg
& 8 x 62.5kg
& 8 x 62.5kg
&
&
&
&
\\
\hspace{0.75em} French press & \multicolumn{ 7 }{l}{ 4x10 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day B - Back/bi }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Light squats
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
&
&
\\
\hspace{0.75em} Deadlifts
& 5 x 120kg
& 5 x 120kg
& 4 x 125kg
& 3 x 130kg
&
&
&
\\
\hspace{0.75em} Seated rows
& 8 x 70kg
& 8 x 70kg
& 8 x 70kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 4x8 } \\
\hspace{0.75em} Curls & \multicolumn{ 7 }{l}{ 5x8 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day C - Legs }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Heavy Squats
& 8 x 95kg
& 8 x 95kg
& 8 x 95kg
&
&
&
&
\\
\hspace{0.75em} Bench
& 8 x 80kg
& 8 x 80kg
& 8 x 80kg
&
&
&
&
\\
\hspace{0.75em} Stiffleg DLs
& 8 x 75kg
& 8 x 75kg
& 8 x 75kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 3x10 } \\
\hspace{0.75em} Claf raises & \multicolumn{ 7 }{l}{ 4x10 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 3 }
\subsection*{\hspace{0.5em} Day A - Chest/tri }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 85kg
& 7 x 85kg
& 6 x 85kg
& 5 x 90kg
&
&
&
\\
\hspace{0.75em} Dips
& 7 x 90kg
& 7 x 90kg
& 6 x 90kg
& 5 x 95kg
&
&
&
\\
\hspace{0.75em} Incline bench
& 7 x 67.5kg
& 7 x 67.5kg
& 6 x 70kg
& 5 x 72.5kg
&
&
&
\\
\hspace{0.75em} French press & \multicolumn{ 7 }{l}{ 3x12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day B - Back/bi }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Light squats
& 7 x 85kg
& 7 x 85kg
& 6 x 85kg
& 5 x 90kg
&
&
&
\\
\hspace{0.75em} Deadlifts
& 5 x 125kg
& 4 x 130kg
& 4 x 130kg
& 3 x 135kg
&
&
&
\\
\hspace{0.75em} Seated rows
& 8 x 75kg
& 8 x 75kg
& 7 x 75kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 4x8 } \\
\hspace{0.75em} Curls & \multicolumn{ 7 }{l}{ 3x12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day C - Legs }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Heavy Squats
& 7 x 100kg
& 7 x 100kg
& 6 x 105kg
& 5 x 110kg
&
&
&
\\
\hspace{0.75em} Bench
& 7 x 90kg
& 7 x 90kg
& 6 x 90kg
& 5 x 95kg
&
&
&
\\
\hspace{0.75em} Stiffleg DLs
& 7 x 85kg
& 7 x 85kg
& 6 x 85kg
& 5 x 90kg
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 3x10 } \\
\hspace{0.75em} Claf raises & \multicolumn{ 7 }{l}{ 5x8 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 4 }
\subsection*{\hspace{0.5em} Day A - Chest/tri }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 80kg
& 6 x 85kg
& 6 x 85kg
& 5 x 85kg
&
&
&
\\
\hspace{0.75em} Dips
& 7 x 85kg
& 6 x 90kg
& 6 x 90kg
& 5 x 90kg
&
&
&
\\
\hspace{0.75em} Incline bench
& 7 x 65kg
& 6 x 67.5kg
& 6 x 67.5kg
& 5 x 70kg
&
&
&
\\
\hspace{0.75em} French press & \multicolumn{ 7 }{l}{ 3x12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day B - Back/bi }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Light squats
& 7 x 80kg
& 6 x 85kg
& 6 x 85kg
& 5 x 85kg
&
&
&
\\
\hspace{0.75em} Deadlifts
& 4 x 125kg
& 4 x 125kg
& 4 x 125kg
& 3 x 130kg
&
&
&
\\
\hspace{0.75em} Seated rows
& 8 x 70kg
& 7 x 75kg
& 7 x 75kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 4x8 } \\
\hspace{0.75em} Curls & \multicolumn{ 7 }{l}{ 5x8 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day C - Legs }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Heavy Squats
& 7 x 95kg
& 6 x 100kg
& 6 x 100kg
& 5 x 105kg
&
&
&
\\
\hspace{0.75em} Bench
& 7 x 85kg
& 6 x 90kg
& 6 x 90kg
& 5 x 90kg
&
&
&
\\
\hspace{0.75em} Stiffleg DLs
& 7 x 80kg
& 6 x 85kg
& 6 x 85kg
& 5 x 85kg
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 3x10 } \\
\hspace{0.75em} Claf raises & \multicolumn{ 7 }{l}{ 4x10 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 5 }
\subsection*{\hspace{0.5em} Day A - Chest/tri }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 7 x 85kg
& 7 x 85kg
& 6 x 90kg
&
&
&
&
\\
\hspace{0.75em} Dips
& 7 x 90kg
& 7 x 90kg
& 6 x 90kg
&
&
&
&
\\
\hspace{0.75em} Incline bench
& 7 x 67.5kg
& 7 x 67.5kg
& 6 x 70kg
&
&
&
&
\\
\hspace{0.75em} French press & \multicolumn{ 7 }{l}{ 3x12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day B - Back/bi }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Light squats
& 7 x 85kg
& 7 x 85kg
& 6 x 90kg
&
&
&
&
\\
\hspace{0.75em} Deadlifts
& 4 x 130kg
& 4 x 130kg
& 3 x 135kg
& 2 x 140kg
& 2 x 140kg
&
&
\\
\hspace{0.75em} Seated rows
& 7 x 75kg
& 7 x 75kg
& 6 x 80kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 4x8 } \\
\hspace{0.75em} Curls & \multicolumn{ 7 }{l}{ 4x10 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day C - Legs }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Heavy Squats
& 7 x 100kg
& 7 x 100kg
& 6 x 105kg
&
&
&
&
\\
\hspace{0.75em} Bench
& 7 x 90kg
& 7 x 90kg
& 6 x 90kg
&
&
&
&
\\
\hspace{0.75em} Stiffleg DLs
& 7 x 85kg
& 7 x 85kg
& 6 x 90kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 3x10 } \\
\hspace{0.75em} Claf raises & \multicolumn{ 7 }{l}{ 3x12 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 6 }
\subsection*{\hspace{0.5em} Day A - Chest/tri }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 90kg
& 6 x 90kg
& 5 x 95kg
& 4 x 100kg
&
&
&
\\
\hspace{0.75em} Dips
& 6 x 95kg
& 6 x 95kg
& 5 x 100kg
& 4 x 105kg
&
&
&
\\
\hspace{0.75em} Incline bench
& 6 x 72.5kg
& 6 x 72.5kg
& 5 x 75kg
& 4 x 77.5kg
&
&
&
\\
\hspace{0.75em} French press & \multicolumn{ 7 }{l}{ 4x10 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day B - Back/bi }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Light squats
& 6 x 90kg
& 6 x 90kg
& 5 x 95kg
& 4 x 100kg
&
&
&
\\
\hspace{0.75em} Deadlifts
& 4 x 135kg
& 3 x 140kg
& 3 x 140kg
& 2 x 145kg
& 2 x 145kg
&
&
\\
\hspace{0.75em} Seated rows
& 7 x 80kg
& 6 x 80kg
& 6 x 80kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 4x8 } \\
\hspace{0.75em} Curls & \multicolumn{ 7 }{l}{ 5x8 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day C - Legs }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Heavy Squats
& 6 x 110kg
& 6 x 110kg
& 5 x 115kg
& 4 x 120kg
&
&
&
\\
\hspace{0.75em} Bench
& 6 x 95kg
& 6 x 95kg
& 5 x 100kg
& 4 x 105kg
&
&
&
\\
\hspace{0.75em} Stiffleg DLs
& 6 x 90kg
& 6 x 90kg
& 5 x 95kg
& 4 x 100kg
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 3x10 } \\
\hspace{0.75em} Claf raises & \multicolumn{ 7 }{l}{ 5x8 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 7 }
\subsection*{\hspace{0.5em} Day A - Chest/tri }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 90kg
& 5 x 90kg
& 5 x 90kg
& 4 x 95kg
&
&
&
\\
\hspace{0.75em} Dips
& 6 x 90kg
& 5 x 95kg
& 5 x 95kg
& 4 x 100kg
&
&
&
\\
\hspace{0.75em} Incline bench
& 6 x 70kg
& 5 x 72.5kg
& 5 x 72.5kg
& 4 x 75kg
&
&
&
\\
\hspace{0.75em} French press & \multicolumn{ 7 }{l}{ 5x8 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day B - Back/bi }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Light squats
& 6 x 90kg
& 5 x 90kg
& 5 x 90kg
& 4 x 95kg
&
&
&
\\
\hspace{0.75em} Deadlifts
& 3 x 135kg
& 3 x 135kg
& 3 x 135kg
& 2 x 140kg
& 2 x 140kg
&
&
\\
\hspace{0.75em} Seated rows
& 6 x 80kg
& 6 x 80kg
& 6 x 80kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 4x8 } \\
\hspace{0.75em} Curls & \multicolumn{ 7 }{l}{ 3x12 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day C - Legs }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Heavy Squats
& 6 x 105kg
& 5 x 110kg
& 5 x 110kg
& 4 x 115kg
&
&
&
\\
\hspace{0.75em} Bench
& 6 x 90kg
& 5 x 95kg
& 5 x 95kg
& 4 x 100kg
&
&
&
\\
\hspace{0.75em} Stiffleg DLs
& 6 x 90kg
& 5 x 90kg
& 5 x 90kg
& 4 x 95kg
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 3x10 } \\
\hspace{0.75em} Claf raises & \multicolumn{ 7 }{l}{ 5x8 } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 8 }
\subsection*{\hspace{0.5em} Day A - Chest/tri }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench
& 6 x 90kg
& 5 x 95kg
& 4 x 100kg
& 4 x 100kg
&
&
&
\\
\hspace{0.75em} Dips
& 6 x 95kg
& 5 x 100kg
& 4 x 105kg
& 4 x 105kg
&
&
&
\\
\hspace{0.75em} Incline bench
& 6 x 72.5kg
& 5 x 75kg
& 4 x 77.5kg
& 4 x 77.5kg
&
&
&
\\
\hspace{0.75em} French press & \multicolumn{ 7 }{l}{ 4x10 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day B - Back/bi }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Light squats
& 6 x 90kg
& 5 x 95kg
& 4 x 100kg
& 4 x 100kg
&
&
&
\\
\hspace{0.75em} Deadlifts
& 2 x 145kg
& 2 x 145kg
& 2 x 145kg
& 2 x 145kg
& 2 x 145kg
& 2 x 145kg
&
\\
\hspace{0.75em} Seated rows
& 6 x 80kg
& 6 x 80kg
& 5 x 85kg
&
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 4x8 } \\
\hspace{0.75em} Curls & \multicolumn{ 7 }{l}{ 4x10 } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day C - Legs }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Heavy Squats
& 6 x 110kg
& 5 x 115kg
& 4 x 120kg
& 4 x 120kg
&
&
&
\\
\hspace{0.75em} Bench
& 6 x 95kg
& 5 x 100kg
& 4 x 105kg
& 4 x 105kg
&
&
&
\\
\hspace{0.75em} Stiffleg DLs
& 6 x 90kg
& 5 x 95kg
& 4 x 100kg
& 4 x 100kg
&
&
&
\\
\hspace{0.75em} Chin ups & \multicolumn{ 7 }{l}{ 3x10 } \\
\hspace{0.75em} Claf raises & \multicolumn{ 7 }{l}{ 5x8 } \\
\end{tabular}
\end{document}
Example - 3 day full body¶
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
[2]:
import functools
import matplotlib.pyplot as plt
[3]:
from streprogen import Program
from streprogen.utils import round_to_nearest
from streprogen.modeling import (reps_to_intensity_tight,
progression_diffeq,
progression_sawtooth)
[4]:
duration = 16
percent_inc_per_week = 1
period = 4
Create a custom sawtooth progress function with deloads¶
[5]:
def progression_sawtooth_clipped(week, start_weight,
final_weight, start_week, final_week, **kwargs):
"""Clipped progress function with deloading."""
# Standard sawtooth progression function from streprogen
ans = progression_sawtooth(week,
start_weight,
final_weight,
start_week,
final_week, **kwargs)
# Every `period` weeks, add a deloading week
if (week - 1) % period == 0:
ans = ans * 0.97 # Deload factor
# Clip the results and and return
return max(start_weight * 0.99, min(ans, final_weight * 1.01))
[6]:
# Parameters for the plot
weeks = list(range(1, duration+1))
start_weight = 100
final_weight = round(100 * (1 + duration * (percent_inc_per_week / 100)))
# Evaluate the function
params = {"period":period, "scale":0.022, "offset":0, "k":1.1}
y = [progression_sawtooth_clipped(
w,
start_weight=start_weight,
final_weight=final_weight,
start_week=1,
final_week=duration,
**params
) for w in weeks]
# Plot the general strength progression function
plt.title("Strength progression")
plt.plot(weeks, y, '-o')
plt.grid(True)
plt.show()

[7]:
progress = functools.partial(progression_sawtooth_clipped, **params)
Set up scaling functions for intensity and repetitions¶
[8]:
params = {"start_weight":1.0,
"final_weight":1.1,
"start_week":1,
"final_week":duration,
"period":period,
"scale":0.03}
intensity_scalers = [progression_sawtooth_clipped(w, **params) for w in weeks]
intensity_scaler_func = functools.partial(progression_sawtooth_clipped, **params)
params = {"start_weight":1 - 0.25,
"final_weight":1 + 0.25,
"start_week":1,
"final_week":duration,
"period":period,
"scale":0.2}
def inv_sawtooth(*args, **kwargs):
return 2 - progression_sawtooth(*args, **kwargs)
rep_scalers = [inv_sawtooth(w, **params) for w in weeks]
rep_scaler_func = functools.partial(inv_sawtooth, **params)
# Create a plot
plt.plot(weeks, intensity_scalers, '-o', label="intensity_scalers")
plt.plot(weeks, rep_scalers, '-o', label="rep_scalers")
plt.legend()
plt.grid(True)
plt.show()

Program setup¶
Below is the code creating the program.
[9]:
program = Program(name=f'3days{duration}weeks',
duration=duration,
percent_inc_per_week=percent_inc_per_week,
reps_per_exercise=22,
rep_scaler_func=rep_scaler_func,
intensity=reps_to_intensity_tight(6),
intensity_scaler_func=intensity_scaler_func,
progression_func=progress,
# Using the 'tight' function instead of the standard one
reps_to_intensity_func=reps_to_intensity_tight,
units='',
round_to=2.5,
verbose=True)
def lunges(w):
weight = 24 + ((w - 1) // 2) * 2
sets = 3 if (w % 2) else 4
weight = round_to_nearest(weight, 2)
return f"{sets} x 6 @ {weight} kg"
def military(w):
weight = 55 + ((w - 1) // 2) * 2.5
sets = 3 if (w % 2) else 4
weight = round_to_nearest(weight, 2.5)
return f"{sets} x 6 @ {weight} kg"
def deadlifts(w):
weight = progression_diffeq(
week=w,
start_weight=80,
final_weight=150,
start_week=1,
final_week=duration,
k=2,
)
weight = round_to_nearest(weight, 2.5)
return f"3 x 3 @ {weight} kg"
with program.Day("Day 1"):
program.DynamicExercise("Bench press", start_weight=140, min_reps=2, max_reps=7)
program.StaticExercise('Lunges', lunges)
program.StaticExercise('Deadlifts', deadlifts)
with program.Day("Day 2"):
program.DynamicExercise(name="Narrow-grip bench", start_weight=130, min_reps=2, max_reps=7)
# My bodyweight is 85 kilograms, so I use (85 + 60) as the start weight for
# chin ups. This means that my 1RM is 60kg in the belt.
program.DynamicExercise(name="Chins 85kg+ (heavy)", start_weight=(85 + 60),
min_reps=2, max_reps=7, round_to=5)
program.StaticExercise('Dumbbell rows', "4 x 10 @ 40kg")
with program.Day("Day 3"):
program.DynamicExercise(name="Chins 85kg+ (light)", start_weight=(85 + 45),
min_reps=2, max_reps=7, round_to=5)
program.DynamicExercise(name="Front squats", start_weight=120, final_weight=150,
min_reps=3, max_reps=7, intensity=82)
program.StaticExercise("Military press", military)
Render the program¶
[10]:
# Do the computations and render a program. Might take a few seconds.
program.render()
Rendered program in 0.09 seconds.
/home/tommy/Desktop/github/streprogen/streprogen/program.py:262: UserWarning:
WARNING: Average intensity is > 90.
warnings.warn("\nWARNING: Average intensity is > 90.")
/home/tommy/Desktop/github/streprogen/streprogen/program.py:273: UserWarning:
WARNING: Number of repetitions < 15.
warnings.warn("\nWARNING: Number of repetitions < 15.")
[11]:
print(program)
----------------------------------------------------------------
Program: 3days16weeks
Program parameters
duration: 16
reps_per_exercise: 22
intensity: 82.5
units:
----------------------------------------------------------------
Exercise information
Day 1
Bench press 140 -> 162.4
reps: [2, 7] weekly inc.: 1.0%
Lunges 3 x 6 @ 24 kg
Deadlifts 3 x 3 @ 80 kg
Day 2
Narrow-grip bench 130 -> 150.8
reps: [2, 7] weekly inc.: 1.0%
Chins 85kg+ (heavy) 145 -> 168.2
reps: [2, 7] weekly inc.: 1.0%
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 130 -> 150.8
reps: [2, 7] weekly inc.: 1.0%
Front squats 120 -> 150
reps: [3, 7] weekly inc.: 1.6%
Military press 3 x 6 @ 55 kg
----------------------------------------------------------------
Program
Week 1
Day 1
Bench press 7 x 110 7 x 110 6 x 115 6 x 115 5 x 117.5
Lunges 3 x 6 @ 24 kg
Deadlifts 3 x 3 @ 80 kg
Day 2
Narrow-grip bench 7 x 102.5 7 x 102.5 6 x 105 6 x 105 5 x 110
Chins 85kg+ (heavy) 7 x 115 7 x 115 6 x 120 6 x 120 5 x 120
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 7 x 105 7 x 105 6 x 105 6 x 105 5 x 110
Front squats 7 x 95 7 x 95 6 x 97.5 6 x 97.5 5 x 102.5
Military press 3 x 6 @ 55 kg
Week 2
Day 1
Bench press 7 x 112.5 6 x 117.5 5 x 120 5 x 120 5 x 120
Lunges 4 x 6 @ 24 kg
Deadlifts 3 x 3 @ 90 kg
Day 2
Narrow-grip bench 7 x 105 6 x 107.5 5 x 112.5 5 x 112.5 5 x 112.5
Chins 85kg+ (heavy) 7 x 115 6 x 120 5 x 125 5 x 125 5 x 125
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 7 x 105 6 x 110 5 x 110 5 x 110 5 x 110
Front squats 7 x 97.5 6 x 100 6 x 100 5 x 105 5 x 105
Military press 4 x 6 @ 55 kg
Week 3
Day 1
Bench press 6 x 120 6 x 120 5 x 125 4 x 127.5 4 x 127.5
Lunges 3 x 6 @ 26 kg
Deadlifts 3 x 3 @ 97.5 kg
Day 2
Narrow-grip bench 6 x 110 6 x 110 5 x 115 4 x 120 4 x 120
Chins 85kg+ (heavy) 6 x 125 6 x 125 5 x 130 4 x 135 4 x 135
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 6 x 110 6 x 110 5 x 115 4 x 120 4 x 120
Front squats 6 x 105 6 x 105 5 x 107.5 4 x 112.5 4 x 112.5
Military press 3 x 6 @ 57.5 kg
Week 4
Day 1
Bench press 5 x 127.5 5 x 127.5 5 x 127.5 4 x 132.5 3 x 135
Lunges 4 x 6 @ 26 kg
Deadlifts 3 x 3 @ 105 kg
Day 2
Narrow-grip bench 5 x 117.5 5 x 117.5 5 x 117.5 4 x 122.5 3 x 127.5
Chins 85kg+ (heavy) 5 x 130 5 x 130 5 x 130 4 x 135 3 x 140
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 5 x 120 5 x 120 5 x 120 4 x 120 3 x 125
Front squats 5 x 112.5 5 x 112.5 5 x 112.5 4 x 115 3 x 120
Military press 4 x 6 @ 57.5 kg
Week 5
Day 1
Bench press 7 x 112.5 6 x 115 6 x 115 5 x 120 5 x 120
Lunges 3 x 6 @ 28 kg
Deadlifts 3 x 3 @ 112.5 kg
Day 2
Narrow-grip bench 7 x 105 6 x 107.5 6 x 107.5 5 x 110 5 x 110
Chins 85kg+ (heavy) 7 x 115 6 x 120 6 x 120 5 x 125 5 x 125
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 7 x 105 6 x 105 6 x 105 5 x 110 5 x 110
Front squats 7 x 97.5 7 x 97.5 7 x 97.5 6 x 102.5
Military press 3 x 6 @ 60 kg
Week 6
Day 1
Bench press 6 x 122.5 6 x 122.5 5 x 127.5 4 x 130 4 x 130
Lunges 4 x 6 @ 28 kg
Deadlifts 3 x 3 @ 117.5 kg
Day 2
Narrow-grip bench 6 x 112.5 6 x 112.5 5 x 117.5 4 x 122.5 4 x 122.5
Chins 85kg+ (heavy) 6 x 125 6 x 125 5 x 130 4 x 135 4 x 135
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 6 x 115 6 x 115 5 x 115 4 x 120 4 x 120
Front squats 6 x 107.5 6 x 107.5 5 x 112.5 4 x 115 4 x 115
Military press 4 x 6 @ 60 kg
Week 7
Day 1
Bench press 5 x 130 5 x 130 5 x 130 4 x 135 3 x 137.5
Lunges 3 x 6 @ 30 kg
Deadlifts 3 x 3 @ 122.5 kg
Day 2
Narrow-grip bench 5 x 120 5 x 120 5 x 120 4 x 125 3 x 130
Chins 85kg+ (heavy) 5 x 135 5 x 135 5 x 135 4 x 140 3 x 145
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 5 x 120 5 x 120 5 x 120 4 x 125 3 x 130
Front squats 5 x 115 5 x 115 5 x 115 4 x 120 3 x 122.5
Military press 3 x 6 @ 62.5 kg
Week 8
Day 1
Bench press 5 x 132.5 4 x 137.5 3 x 142.5 3 x 142.5 3 x 142.5
Lunges 4 x 6 @ 30 kg
Deadlifts 3 x 3 @ 127.5 kg
Day 2
Narrow-grip bench 5 x 122.5 4 x 127.5 3 x 132.5 3 x 132.5 3 x 132.5
Chins 85kg+ (heavy) 5 x 140 4 x 140 3 x 145 3 x 145 3 x 145
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 5 x 125 4 x 130 3 x 130 3 x 130 3 x 130
Front squats 5 x 120 4 x 122.5 3 x 127.5 3 x 127.5 3 x 127.5
Military press 4 x 6 @ 62.5 kg
Week 9
Day 1
Bench press 7 x 117.5 7 x 117.5 6 x 120 6 x 120
Lunges 3 x 6 @ 32 kg
Deadlifts 3 x 3 @ 130 kg
Day 2
Narrow-grip bench 7 x 107.5 7 x 107.5 6 x 112.5 6 x 112.5
Chins 85kg+ (heavy) 7 x 120 7 x 120 6 x 125 6 x 125
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 7 x 110 7 x 110 6 x 110 6 x 110
Front squats 7 x 105 7 x 105 6 x 107.5 6 x 107.5
Military press 3 x 6 @ 65 kg
Week 10
Day 1
Bench press 5 x 132.5 5 x 132.5 5 x 132.5 4 x 135 3 x 140
Lunges 4 x 6 @ 32 kg
Deadlifts 3 x 3 @ 135 kg
Day 2
Narrow-grip bench 5 x 122.5 5 x 122.5 5 x 122.5 4 x 127.5 3 x 130
Chins 85kg+ (heavy) 5 x 135 5 x 135 5 x 135 4 x 140 3 x 145
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 5 x 120 5 x 120 5 x 120 4 x 125 3 x 130
Front squats 5 x 120 5 x 120 5 x 120 4 x 122.5 3 x 127.5
Military press 4 x 6 @ 65 kg
Week 11
Day 1
Bench press 4 x 140 4 x 140 4 x 140 4 x 140 3 x 145
Lunges 3 x 6 @ 34 kg
Deadlifts 3 x 3 @ 137.5 kg
Day 2
Narrow-grip bench 4 x 130 4 x 130 4 x 130 4 x 130 3 x 132.5
Chins 85kg+ (heavy) 4 x 145 4 x 145 4 x 145 4 x 145 3 x 150
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 4 x 130 4 x 130 4 x 130 4 x 130 3 x 135
Front squats 5 x 122.5 4 x 127.5 4 x 127.5 3 x 130 3 x 130
Military press 3 x 6 @ 67.5 kg
Week 12
Day 1
Bench press 3 x 147.5 3 x 147.5 3 x 147.5 3 x 147.5 3 x 147.5
Lunges 4 x 6 @ 34 kg
Deadlifts 3 x 3 @ 140 kg
Day 2
Narrow-grip bench 3 x 137.5 3 x 137.5 3 x 137.5 3 x 137.5 3 x 137.5
Chins 85kg+ (heavy) 3 x 150 3 x 150 3 x 150 3 x 150 3 x 150
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 3 x 135 3 x 135 3 x 135 3 x 135 3 x 135
Front squats 3 x 135 3 x 135 3 x 135 3 x 135 3 x 135
Military press 4 x 6 @ 67.5 kg
Week 13
Day 1
Bench press 6 x 125 6 x 125 6 x 125 5 x 127.5
Lunges 3 x 6 @ 36 kg
Deadlifts 3 x 3 @ 142.5 kg
Day 2
Narrow-grip bench 6 x 115 6 x 115 6 x 115 5 x 120
Chins 85kg+ (heavy) 6 x 130 6 x 130 6 x 130 5 x 135
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 6 x 115 6 x 115 6 x 115 5 x 120
Front squats 6 x 115 6 x 115 6 x 115 6 x 115
Military press 3 x 6 @ 70 kg
Week 14
Day 1
Bench press 4 x 140 4 x 140 4 x 140 4 x 140 4 x 140
Lunges 4 x 6 @ 36 kg
Deadlifts 3 x 3 @ 145 kg
Day 2
Narrow-grip bench 4 x 130 4 x 130 4 x 130 4 x 130 4 x 130
Chins 85kg+ (heavy) 4 x 145 4 x 145 4 x 145 4 x 145 4 x 145
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 4 x 130 4 x 130 4 x 130 4 x 130 4 x 130
Front squats 4 x 130 4 x 130 4 x 130 4 x 130 4 x 130
Military press 4 x 6 @ 70 kg
Week 15
Day 1
Bench press 3 x 147.5 3 x 147.5 3 x 147.5 3 x 147.5 3 x 147.5
Lunges 3 x 6 @ 38 kg
Deadlifts 3 x 3 @ 147.5 kg
Day 2
Narrow-grip bench 3 x 137.5 3 x 137.5 3 x 137.5 3 x 137.5 3 x 137.5
Chins 85kg+ (heavy) 3 x 155 3 x 155 3 x 155 3 x 155 3 x 155
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 3 x 140 3 x 140 3 x 140 3 x 140 3 x 140
Front squats 3 x 137.5 3 x 137.5 3 x 137.5 3 x 137.5 3 x 137.5
Military press 3 x 6 @ 72.5 kg
Week 16
Day 1
Bench press 3 x 150 3 x 150 3 x 150 2 x 155
Lunges 4 x 6 @ 38 kg
Deadlifts 3 x 3 @ 150 kg
Day 2
Narrow-grip bench 3 x 140 3 x 140 3 x 140 2 x 142.5
Chins 85kg+ (heavy) 3 x 155 3 x 155 3 x 155 2 x 160
Dumbbell rows 4 x 10 @ 40kg
Day 3
Chins 85kg+ (light) 3 x 140 3 x 140 3 x 140 2 x 145
Front squats 3 x 137.5 3 x 137.5 3 x 137.5 3 x 137.5
Military press 4 x 6 @ 72.5 kg
----------------------------------------------------------------
Export the program as .html
or .tex
, then to .pdf
¶
A .html
file can be printed directly from your browser, or printed to a .pdf
from your browser.
[12]:
# Save the program as a HTML file
with open(f'{program.name}.html', 'w', encoding='utf-8') as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_html(table_width=8))
[13]:
# Save the program as a TEX file
with open(f'{program.name}.tex', 'w', encoding='utf-8') as file:
file.write(program.to_tex(table_width=8))
Use a .tex
to generate .pdf
if you have LaTeX installed, or use:
- latexbase.com from your browser.
[14]:
# If you have LaTeX installed on your system, you can render a program to .tex
# Alternatively, you can paste the LaTeX into: https://latexbase.com/
print(program.to_tex(table_width=8))
% -----------------------------------------------
% Package imports
% -----------------------------------------------
\documentclass[12pt, a4paper]{article}% 'twoside' for printing
\usepackage[utf8]{inputenc}% Allow input to be UTF-8
\usepackage[margin=2cm]{geometry}% May be used to set margins
% -----------------------------------------------
% Document start
% -----------------------------------------------
\begin{document}
\large
\section*{Program: 3days16weeks}
This program was made using \verb|streprogen|,
the Python strength program generator.
The latest version can be found at \\
\verb|https://pypi.python.org/pypi/streprogen/|.
\section*{Program parameters}
\begin{tabular}{l|l}
\textbf{Parameter} & \textbf{Value} \\ \hline
\verb|duration| & 16 \\
\verb|reps_per_exercise| & 22 \\
\verb|intensity| & 82.5 \\
\verb|units| &
\end{tabular}
\section*{Exercise information}
\begin{tabular}{llllll}
\textbf{Exercise} & \textbf{Start} & \textbf{End} & \textbf{Reps min}
& \textbf{Reps max} & \textbf{Weekly increase} \\ \hline
\textbf{ Day 1 } & & & & & \\ \hline
\hspace{0.5em}Bench press &
140 &
162.4 &
2 & 7 &
1.0\%\\
\hspace{0.5em}Lunges & \multicolumn{ 5 }{l}{ 3 x 6 @ 24 kg } \\
\hspace{0.5em}Deadlifts & \multicolumn{ 5 }{l}{ 3 x 3 @ 80 kg } \\
\textbf{ Day 2 } & & & & & \\ \hline
\hspace{0.5em}Narrow-grip bench &
130 &
150.8 &
2 & 7 &
1.0\%\\
\hspace{0.5em}Chins 85kg+ (heavy) &
145 &
168.2 &
2 & 7 &
1.0\%\\
\hspace{0.5em}Dumbbell rows & \multicolumn{ 5 }{l}{ 4 x 10 @ 40kg } \\
\textbf{ Day 3 } & & & & & \\ \hline
\hspace{0.5em}Chins 85kg+ (light) &
130 &
150.8 &
2 & 7 &
1.0\%\\
\hspace{0.5em}Front squats &
120 &
150 &
3 & 7 &
1.6\%\\
\hspace{0.5em}Military press & \multicolumn{ 5 }{l}{ 3 x 6 @ 55 kg } \\
\end{tabular}
\clearpage
\section*{Program}
\subsection*{\hspace{0.25em} Week 1 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 7 x 110
& 7 x 110
& 6 x 115
& 6 x 115
& 5 x 117.5
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 3 x 6 @ 24 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 80 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 7 x 102.5
& 7 x 102.5
& 6 x 105
& 6 x 105
& 5 x 110
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 7 x 115
& 7 x 115
& 6 x 120
& 6 x 120
& 5 x 120
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 7 x 105
& 7 x 105
& 6 x 105
& 6 x 105
& 5 x 110
&
&
\\
\hspace{0.75em} Front squats
& 7 x 95
& 7 x 95
& 6 x 97.5
& 6 x 97.5
& 5 x 102.5
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 3 x 6 @ 55 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 2 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 7 x 112.5
& 6 x 117.5
& 5 x 120
& 5 x 120
& 5 x 120
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 4 x 6 @ 24 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 90 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 7 x 105
& 6 x 107.5
& 5 x 112.5
& 5 x 112.5
& 5 x 112.5
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 7 x 115
& 6 x 120
& 5 x 125
& 5 x 125
& 5 x 125
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 7 x 105
& 6 x 110
& 5 x 110
& 5 x 110
& 5 x 110
&
&
\\
\hspace{0.75em} Front squats
& 7 x 97.5
& 6 x 100
& 6 x 100
& 5 x 105
& 5 x 105
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 4 x 6 @ 55 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 3 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 6 x 120
& 6 x 120
& 5 x 125
& 4 x 127.5
& 4 x 127.5
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 3 x 6 @ 26 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 97.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 6 x 110
& 6 x 110
& 5 x 115
& 4 x 120
& 4 x 120
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 6 x 125
& 6 x 125
& 5 x 130
& 4 x 135
& 4 x 135
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 6 x 110
& 6 x 110
& 5 x 115
& 4 x 120
& 4 x 120
&
&
\\
\hspace{0.75em} Front squats
& 6 x 105
& 6 x 105
& 5 x 107.5
& 4 x 112.5
& 4 x 112.5
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 3 x 6 @ 57.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 4 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 5 x 127.5
& 5 x 127.5
& 5 x 127.5
& 4 x 132.5
& 3 x 135
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 4 x 6 @ 26 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 105 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 5 x 117.5
& 5 x 117.5
& 5 x 117.5
& 4 x 122.5
& 3 x 127.5
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 5 x 130
& 5 x 130
& 5 x 130
& 4 x 135
& 3 x 140
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 5 x 120
& 5 x 120
& 5 x 120
& 4 x 120
& 3 x 125
&
&
\\
\hspace{0.75em} Front squats
& 5 x 112.5
& 5 x 112.5
& 5 x 112.5
& 4 x 115
& 3 x 120
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 4 x 6 @ 57.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 5 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 7 x 112.5
& 6 x 115
& 6 x 115
& 5 x 120
& 5 x 120
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 3 x 6 @ 28 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 112.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 7 x 105
& 6 x 107.5
& 6 x 107.5
& 5 x 110
& 5 x 110
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 7 x 115
& 6 x 120
& 6 x 120
& 5 x 125
& 5 x 125
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 7 x 105
& 6 x 105
& 6 x 105
& 5 x 110
& 5 x 110
&
&
\\
\hspace{0.75em} Front squats
& 7 x 97.5
& 7 x 97.5
& 7 x 97.5
& 6 x 102.5
&
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 3 x 6 @ 60 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 6 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 6 x 122.5
& 6 x 122.5
& 5 x 127.5
& 4 x 130
& 4 x 130
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 4 x 6 @ 28 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 117.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 6 x 112.5
& 6 x 112.5
& 5 x 117.5
& 4 x 122.5
& 4 x 122.5
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 6 x 125
& 6 x 125
& 5 x 130
& 4 x 135
& 4 x 135
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 6 x 115
& 6 x 115
& 5 x 115
& 4 x 120
& 4 x 120
&
&
\\
\hspace{0.75em} Front squats
& 6 x 107.5
& 6 x 107.5
& 5 x 112.5
& 4 x 115
& 4 x 115
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 4 x 6 @ 60 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 7 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 5 x 130
& 5 x 130
& 5 x 130
& 4 x 135
& 3 x 137.5
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 3 x 6 @ 30 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 122.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 5 x 120
& 5 x 120
& 5 x 120
& 4 x 125
& 3 x 130
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 5 x 135
& 5 x 135
& 5 x 135
& 4 x 140
& 3 x 145
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 5 x 120
& 5 x 120
& 5 x 120
& 4 x 125
& 3 x 130
&
&
\\
\hspace{0.75em} Front squats
& 5 x 115
& 5 x 115
& 5 x 115
& 4 x 120
& 3 x 122.5
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 3 x 6 @ 62.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 8 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 5 x 132.5
& 4 x 137.5
& 3 x 142.5
& 3 x 142.5
& 3 x 142.5
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 4 x 6 @ 30 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 127.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 5 x 122.5
& 4 x 127.5
& 3 x 132.5
& 3 x 132.5
& 3 x 132.5
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 5 x 140
& 4 x 140
& 3 x 145
& 3 x 145
& 3 x 145
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 5 x 125
& 4 x 130
& 3 x 130
& 3 x 130
& 3 x 130
&
&
\\
\hspace{0.75em} Front squats
& 5 x 120
& 4 x 122.5
& 3 x 127.5
& 3 x 127.5
& 3 x 127.5
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 4 x 6 @ 62.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 9 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 7 x 117.5
& 7 x 117.5
& 6 x 120
& 6 x 120
&
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 3 x 6 @ 32 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 130 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 7 x 107.5
& 7 x 107.5
& 6 x 112.5
& 6 x 112.5
&
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 7 x 120
& 7 x 120
& 6 x 125
& 6 x 125
&
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 7 x 110
& 7 x 110
& 6 x 110
& 6 x 110
&
&
&
\\
\hspace{0.75em} Front squats
& 7 x 105
& 7 x 105
& 6 x 107.5
& 6 x 107.5
&
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 3 x 6 @ 65 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 10 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 5 x 132.5
& 5 x 132.5
& 5 x 132.5
& 4 x 135
& 3 x 140
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 4 x 6 @ 32 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 135 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 5 x 122.5
& 5 x 122.5
& 5 x 122.5
& 4 x 127.5
& 3 x 130
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 5 x 135
& 5 x 135
& 5 x 135
& 4 x 140
& 3 x 145
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 5 x 120
& 5 x 120
& 5 x 120
& 4 x 125
& 3 x 130
&
&
\\
\hspace{0.75em} Front squats
& 5 x 120
& 5 x 120
& 5 x 120
& 4 x 122.5
& 3 x 127.5
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 4 x 6 @ 65 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 11 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 4 x 140
& 4 x 140
& 4 x 140
& 4 x 140
& 3 x 145
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 3 x 6 @ 34 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 137.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 4 x 130
& 4 x 130
& 4 x 130
& 4 x 130
& 3 x 132.5
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 4 x 145
& 4 x 145
& 4 x 145
& 4 x 145
& 3 x 150
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 4 x 130
& 4 x 130
& 4 x 130
& 4 x 130
& 3 x 135
&
&
\\
\hspace{0.75em} Front squats
& 5 x 122.5
& 4 x 127.5
& 4 x 127.5
& 3 x 130
& 3 x 130
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 3 x 6 @ 67.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 12 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 3 x 147.5
& 3 x 147.5
& 3 x 147.5
& 3 x 147.5
& 3 x 147.5
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 4 x 6 @ 34 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 140 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 3 x 150
& 3 x 150
& 3 x 150
& 3 x 150
& 3 x 150
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 3 x 135
& 3 x 135
& 3 x 135
& 3 x 135
& 3 x 135
&
&
\\
\hspace{0.75em} Front squats
& 3 x 135
& 3 x 135
& 3 x 135
& 3 x 135
& 3 x 135
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 4 x 6 @ 67.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 13 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 6 x 125
& 6 x 125
& 6 x 125
& 5 x 127.5
&
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 3 x 6 @ 36 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 142.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 6 x 115
& 6 x 115
& 6 x 115
& 5 x 120
&
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 6 x 130
& 6 x 130
& 6 x 130
& 5 x 135
&
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 6 x 115
& 6 x 115
& 6 x 115
& 5 x 120
&
&
&
\\
\hspace{0.75em} Front squats
& 6 x 115
& 6 x 115
& 6 x 115
& 6 x 115
&
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 3 x 6 @ 70 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 14 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 4 x 140
& 4 x 140
& 4 x 140
& 4 x 140
& 4 x 140
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 4 x 6 @ 36 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 145 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 4 x 130
& 4 x 130
& 4 x 130
& 4 x 130
& 4 x 130
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 4 x 145
& 4 x 145
& 4 x 145
& 4 x 145
& 4 x 145
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 4 x 130
& 4 x 130
& 4 x 130
& 4 x 130
& 4 x 130
&
&
\\
\hspace{0.75em} Front squats
& 4 x 130
& 4 x 130
& 4 x 130
& 4 x 130
& 4 x 130
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 4 x 6 @ 70 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 15 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 3 x 147.5
& 3 x 147.5
& 3 x 147.5
& 3 x 147.5
& 3 x 147.5
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 3 x 6 @ 38 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 147.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 3 x 155
& 3 x 155
& 3 x 155
& 3 x 155
& 3 x 155
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 3 x 140
& 3 x 140
& 3 x 140
& 3 x 140
& 3 x 140
&
&
\\
\hspace{0.75em} Front squats
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 3 x 6 @ 72.5 kg } \\
\end{tabular}
\subsection*{\hspace{0.25em} Week 16 }
\subsection*{\hspace{0.5em} Day 1 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Bench press
& 3 x 150
& 3 x 150
& 3 x 150
& 2 x 155
&
&
&
\\
\hspace{0.75em} Lunges & \multicolumn{ 7 }{l}{ 4 x 6 @ 38 kg } \\
\hspace{0.75em} Deadlifts & \multicolumn{ 7 }{l}{ 3 x 3 @ 150 kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 2 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Narrow-grip bench
& 3 x 140
& 3 x 140
& 3 x 140
& 2 x 142.5
&
&
&
\\
\hspace{0.75em} Chins 85kg+ (heavy)
& 3 x 155
& 3 x 155
& 3 x 155
& 2 x 160
&
&
&
\\
\hspace{0.75em} Dumbbell rows & \multicolumn{ 7 }{l}{ 4 x 10 @ 40kg } \\
\end{tabular}
\subsection*{\hspace{0.5em} Day 3 }
\begin{tabular}{l|lllllll}
\hspace{0.75em} \textbf{Exercise} & \multicolumn{ 7 }{l}{ \textbf{Sets / reps} } \\ \hline
\hspace{0.75em} Chins 85kg+ (light)
& 3 x 140
& 3 x 140
& 3 x 140
& 2 x 145
&
&
&
\\
\hspace{0.75em} Front squats
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
& 3 x 137.5
&
&
&
\\
\hspace{0.75em} Military press & \multicolumn{ 7 }{l}{ 4 x 6 @ 72.5 kg } \\
\end{tabular}
\end{document}
Example - Block periodization¶
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
Imports¶
[2]:
from streprogen import (Program,
reps_to_intensity,
progression_diffeq,
progression_sawtooth,
progression_sinusoidal)
import matplotlib.pyplot as plt
import functools
[3]:
duration = 12
Set up periodization of intensity and repetitions¶
You can periodize intensity and repetitions by using progression_sawtooth
or progression_sinusoidal
or creating custom functions.
Below I show how to create custom functions.
[4]:
def rep_scaler_func(week:int):
"""Custom factors that are multiplied with the `reps_per_exercise`."""
index = week - 1
factors = [1.18] * 4 + [1.0] * 4 + [0.82] * 4
return factors[index % len(factors)]
def intensity_scaler_func(week:int):
"""Custom factors that are multiplied with the `intensity`."""
index = week - 1
factors = [0.94] * 4 + [1.0] * 4 + [1.06] * 4
return factors[index % len(factors)]
[5]:
plt.figure(figsize=(8, 4))
plt.title("Repetitions and intensity")
weeks = list(range(1, duration + 1))
y = [rep_scaler_func(w) for w in weeks]
plt.plot(weeks, y, '-o', label="Rep scalers (factors)")
y = [intensity_scaler_func(w) for w in weeks]
plt.plot(weeks, y, '-o', label="Intensity scalers (factors)")
plt.xlabel("Weeks"); plt.ylabel("Weight"); plt.grid(); plt.tight_layout()

Optional: Set up periodization of strength progression (weight lifted)¶
You can periodize progression by using progression_sawtooth
or progression_sinusoidal
or creating your own custom function. Below I show how to create a custom function.
[6]:
def progression_func(week, *args, **kwargs):
weight = progression_diffeq(week, *args, **kwargs, k=1)
# Multiply every 4th week by 0.95 for a deload week
if (week - 1) % 4 == 0:
return weight * 0.95
else:
return weight
[7]:
plt.figure(figsize=(8, 4))
plt.title("Relationship between weeks and general strength progression")
weeks = list(range(1, duration + 1))
y = [progression_func(w, start_weight=100, final_weight=120, start_week=1, final_week=12) for w in weeks]
plt.plot(weeks, y, '-o')
# Set up the plot and show it
plt.xlabel("Weeks"); plt.ylabel("Weight (relative)")
plt.grid(); plt.tight_layout()

While it’s possible to create any progression function, using tweaking defaults is often wise, e.g.,:
[8]:
plt.figure(figsize=(8, 4))
plt.title("Relationship between weeks and general strength progression")
weeks = list(range(1, duration + 1))
# Using the `progression_sawtooth` function, we can create out own progression
# function by specifying:
# - k: the non-linearity
# - period: the length of the period (in weeks)
# - scale: the amplitude of the sawtooth
progression_func = functools.partial(progression_sawtooth, k=2.0, period=4, scale=0.05)
y = [progression_func(w, start_weight=100, final_weight=120, start_week=1, final_week=12) for w in weeks]
plt.plot(weeks, y, '-o')
# Set up the plot and show it
plt.xlabel("Weeks"); plt.ylabel("Weight")
plt.grid(); plt.tight_layout()

Program setup¶
Below is the code creating the program.
The functions rep_scaler_func
, intensity_scaler_func
and progression_func
are created in the code above.
[9]:
program = Program(
name='BlockPeriodization',
duration=duration,
reps_per_exercise=20, # Baseline reps per exercise, multiplied by `rep_scaler_func(week)`
min_reps=1,
max_reps=8,
percent_inc_per_week=1,
intensity=84, # Baseline intensity, multiplied by `intensity_scaler_func(week)`
rep_scaler_func=rep_scaler_func,
intensity_scaler_func=intensity_scaler_func,
units='',
# Comment out the line below to use the default progression
progression_func=progression_func,
round_to=2.5,
)
# Here we only use a single day and exercise to show the periodization
# A realistic program would of course include more exercises :)
with program.Day("A"):
program.DynamicExercise(name="Squat", start_weight=100)
Render the program¶
[10]:
# Do the computations and render a program. Might take a few seconds.
program.render()
Print and save the program¶
[11]:
print(program)
----------------------------------------------------------------
Program: BlockPeriodization
Program parameters
duration: 12
reps_per_exercise: 20
intensity: 84
units:
----------------------------------------------------------------
Exercise information
A
Squat 100 -> 112
reps: [1, 8] weekly inc.: 1.0%
----------------------------------------------------------------
Program
Week 1
A
Squat 7 x 75 7 x 75 6 x 77.5 5 x 80
Week 2
A
Squat 7 x 77.5 7 x 77.5 6 x 82.5 5 x 85
Week 3
A
Squat 7 x 82.5 7 x 82.5 6 x 85 5 x 90
Week 4
A
Squat 7 x 87.5 7 x 87.5 6 x 90 5 x 92.5
Week 5
A
Squat 6 x 82.5 5 x 85 5 x 85 4 x 87.5
Week 6
A
Squat 6 x 85 5 x 90 5 x 90 4 x 92.5
Week 7
A
Squat 6 x 90 5 x 92.5 5 x 92.5 4 x 97.5
Week 8
A
Squat 6 x 92.5 5 x 97.5 5 x 97.5 4 x 100
Week 9
A
Squat 4 x 92.5 4 x 92.5 3 x 95 3 x 95 2 x 97.5
Week 10
A
Squat 4 x 95 4 x 95 3 x 100 3 x 100 2 x 102.5
Week 11
A
Squat 4 x 100 4 x 100 3 x 102.5 3 x 102.5 2 x 107.5
Week 12
A
Squat 4 x 102.5 4 x 102.5 3 x 107.5 3 x 107.5 2 x 110
----------------------------------------------------------------
Export the program as .html
or .tex
, then to .pdf
¶
A .html
file can be printed directly from your browser, or printed to a .pdf
from your browser.
[12]:
# Save the program as a HTML file
with open(f'{program.name}.html', 'w', encoding='utf-8') as file:
# Control table width (number of sets) by passing the 'table_width' argument
file.write(program.to_html(table_width=8))
[13]:
# Save the program as a TEX file
with open(f'{program.name}.tex', 'w', encoding='utf-8') as file:
file.write(program.to_tex(table_width=8))
Use a .tex
to generate .pdf
if you have LaTeX installed, or use:
- latexbase.com from your browser.
[14]:
# If you have LaTeX installed on your system, you can render a program to .tex
# Alternatively, you can paste the LaTeX into: https://latexbase.com/
# Remove the comment below to print the .tex file
# print(program.to_tex(table_width=8))
Example - Meal planning¶
This notebook shows features of streprogen, the Python strength program generator.
Contributions to the code are welcome. :)
[1]:
!pip install streprogen matplotlib --quiet
Imports¶
[2]:
from streprogen import Meal, Food, Mealplan
Set up foods¶
- The attributes
protein
,fat
,carbs
andkcal
below are per 100 grams. - I recommend ignoring foods that you only eat small quantities of, e.g. ketchup.
[3]:
all_foods = [
Food(name="burger", protein=15.0, fat=18.0, carbs=2.0, kcal=230,
price_per_product=87.3, grams_per_product=800),
Food(name="cottage cheese", protein=13.0, fat=2.0, carbs=2.1, kcal=79,
price_per_product=24.4, grams_per_product=400),
Food(name="egg", protein=13.0, fat=10.6, carbs=0.3, kcal=149,
price_per_product=32.9, grams_per_product=690),
Food(name="chicken filet", protein=19.0, fat=1.8, carbs=0.3, kcal=94,
price_per_product=260.0, grams_per_product=2500),
Food(name="bread", protein=11.0, fat=4.8, carbs=36.0, kcal=245,
price_per_product=39.5, grams_per_product=750),
Food(name="jasmin rice", protein=2.7, fat=0.1, carbs=31.1, kcal=136,
price_per_product=45.8, grams_per_product=1000),
Food(name="milk", protein=3.5, fat=0.5, carbs=4.5, kcal=37,
price_per_product=16.4, grams_per_product=1000),
Food(name="chocolate", protein=8.1, fat=33.0, carbs=55.0, kcal=550,
price_per_product=38.6, grams_per_product=200),
Food(name="muesli", protein=9.0, fat=4.8, carbs=63.0, kcal=351,
price_per_product=23.1, grams_per_product=750),
Food(name="PF whey", protein=71.8, fat=8.1, carbs=7.9, kcal=377,
price_per_product=599.0, grams_per_product=3000),
Food(name="sweet and sour sauce", protein=0.6, fat=0.1, carbs=20, kcal=85,
price_per_product=14.9, grams_per_product=500),
Food(name="mixed nuts", protein=13, fat=26, carbs=47, kcal=464,
price_per_product=39.7, grams_per_product=350),
Food(name="yogurt", protein=3.7, fat=3.1, carbs=10.5, kcal=84,
price_per_product=17.0, grams_per_product=600),
]
Aggregate foods to meals¶
- Once the foods are created, they are aggregated to meals.
- A meal consists of many foods.
[4]:
# A trick to look up food by name
foods = {food.name: food for food in all_foods}
[5]:
meals = [
# Mixed nuts from the store. It's not a discrete meal, since it's easy to weight up
# arbitrary weights of mixed nuts. Setting the base quantity to 10 grams makes it easier to
# work with. If the result is 7.3 x 'base meals' for this food, it means 73grams of nuts
Meal(name="mixed nuts", foods={foods["mixed nuts"]: 10}, discrete=False),
# This meal is created using two foods: 150g yogurt (one small container) and 40g muesli.
# The meal is discrete, since if you open a little yogurt you want to eat the entire thing.
Meal(name="yogurt w/ muesli",foods={foods["yogurt"]: 150, foods["muesli"]: 40}, discrete=True),
# A dinner-like meal. Here the proportions of the ingredients are normalized.
# Since 40.7 + 11.5 + 47.8 = 100, weighing up arbitrary meal sizes is easy.
# If the result is 3.1 x 'base meals', it means 310 grams
Meal(name="chicken w/ sweet&sour",
foods={
foods["chicken filet"]: 40.7,
foods["sweet and sour sauce"]: 11.5,
foods["jasmin rice"]: 47.8,
}, discrete=False,
),
# Hamburger with bread. Discrete since you either eat 0, 1, 2, 3, .....
Meal(name="hamburger", foods={foods["bread"]: 40, foods["burger"]: 80},discrete=True,),
# A really boring meal - but it's a demonstration after all
Meal(name="egg", foods={foods["egg"]: 70}, discrete=True),
# Protein shake. Easy to weigh up arbitrary portions, so not discrete
Meal(name="scoop of whey with milk",
foods={foods["PF whey"]: 25, foods["milk"]: 150},
discrete=False,
),
# One small container with yogurt and cottage cheese
Meal(name="yogurt w/ ct.cheese",
foods={foods["yogurt"]: 150, foods["cottage cheese"]: 100},
discrete=True,
),
# Let's add chocolate, just for fun
Meal(name="chocolate", foods={foods["chocolate"]: 100},discrete=False,)
]
Create a single-day meal plan¶
The meal plan will balance three considerations:
- The overall price of the meal plan (the importance of optimizing this is weighted by
weight_price
). - How well the dietary constraints are satisfied (weighted by
weight_nutrients
). - Equal meal sizes as measured in calories (weighted by
weight_range
).
[6]:
# Set dietary contraints.
# Valid keys are: 'kcal', 'protein', 'carbs', 'fat'
dietary_constraints = {"kcal": (1800, 1800), # Lower limit and upper limit at 1800 kcal per day
"protein": (100, None)} # At least 100 grams of protein per day
# Create a meal plan
meal_plan = Mealplan(meals,
dietary_constraints,
# The number of meals every day
num_meals=4,
# The number of days
num_days=1,
# Relative weighting for the optimization
# Higher weights mean higher priority
weight_price=0.1,
weight_nutrients=2.0,
weight_meal_sizes=0.75,
)
Run optimization and print results¶
- If you’re unhappy with these results, try changing the weights above and re-run.
[7]:
meal_plan.render()
print(meal_plan.to_txt(verbose=True))
----------------------------------------------------------------
Meal plan
Program parameters
dietary_constraints: {'kcal': (1800, 1800), 'protein': (100, None)}
num_meals: 4
num_days: 1
weight_price: 0.1
weight_nutrients: 2.0
weight_meal_sizes: 0.75
optimization_time: 0.291 s
optimization_iterations: 2551
----------------------------------------------------------------
Meal information (used meals only)
'chicken w/ sweet&sour' (100 grams)
- 40.7 grams of 'chicken filet'
- 11.5 grams of 'sweet and sour sauce'
- 47.8 grams of 'jasmin rice'
'chocolate' (100 grams)
- 100 grams of 'chocolate'
'mixed nuts' (10 grams)
- 10 grams of 'mixed nuts'
'scoop of whey with milk' (175 grams)
- 25 grams of 'PF whey'
- 150 grams of 'milk'
----------------------------------------------------------------
Daily meal plan statistics
- price: 76 [76]
- protein: 125 [125]
- fat: 64 [64]
- carbs: 186 [186]
- kcal: 1800 [1800]
----------------------------------------------------------------
Program
Day 1
- 4 x 'chicken w/ sweet&sour' (base meal of 100 grams)
- 9.7 x 'mixed nuts' (base meal of 10 grams)
- 0.8 x 'chocolate' (base meal of 100 grams)
- 3 x 'scoop of whey with milk' (base meal of 175 grams)
Statistics
- price: 76 [27, 11, 16, 22]
- protein: 125 [36, 13, 7, 70]
- fat: 64 [3, 25, 27, 8]
- carbs: 186 [69, 46, 45, 26]
- kcal: 1800 [450, 450, 450, 450]
----------------------------------------------------------------
Create a multi-day meal plan¶
The meal plan will balance three considerations:
- The overall price of the meal plan (weighted by
weight_price
) - How well the dietary constraints are satisfied (weighted by
weight_nutrients
) - Equal meal sizes as measured in calories (weighted by
weight_range
)
Notice the introduction of meal_limits
below. Without it, it makes no sense to create a multi-day meal program, since the optimal meal plan will be a single optimal day copied over several days.
Notes on computation¶
- The optimization routine solves an extremely difficult problem.
- The solution time depends crucially on the number of discrete meals. Non-discrete meals are easier computationally.
- The solver will return the best solution found within the time limit. Set the
time_limit_secs
parameter higher to increase solve time. - I recommend optimizing over 3-4 days and cycling those days.
[8]:
# Set dietary contraints.
# Valid keys are: 'kcal', 'protein', 'carbs', 'fat'
dietary_constraints = {"kcal": (1800, 1800), # Lower limit and upper limit at 1800 kcal per day
"protein": (100, None), # At least 100 grams of protein per day
"carbs": (None, 150)} # At most 150 grams of carbohydrates per day
meal_limits = {"chocolate": (None, 1), # Chocolate at most once
"hamburger": (1, None), # Hamburger at least once
"mixed nuts": (2, 2),} # Mixed nuts exactly twice
# Create a meal plan
multi_day_meal_plan = Mealplan(meals,
dietary_constraints,
# Limits on the meals
meal_limits=meal_limits,
# The number of meals every day
num_meals=4,
# The number of days
num_days=4,
# Relative weighting for the optimization
# Higher weights mean higher priority
weight_price=0.1,
weight_nutrients=2.0,
weight_meal_sizes=0.75,
)
Run optimization and print results¶
If you’re unhappy with these results:
- Try changing the weights above and re-run.
- Try changing the time limit and re-run. The solver will typically find great solutions in 10 seconds.
[9]:
multi_day_meal_plan.render(time_limit_secs=10)
print(multi_day_meal_plan.to_txt(verbose=True))
----------------------------------------------------------------
Meal plan
Program parameters
dietary_constraints: {'kcal': (1800, 1800), 'protein': (100, None), 'carbs': (None, 150)}
num_meals: 4
num_days: 4
weight_price: 0.1
weight_nutrients: 2.0
weight_meal_sizes: 0.75
optimization_time: 10.227 s
optimization_iterations: 111592
----------------------------------------------------------------
Meal information (used meals only)
'chicken w/ sweet&sour' (100 grams)
- 40.7 grams of 'chicken filet'
- 11.5 grams of 'sweet and sour sauce'
- 47.8 grams of 'jasmin rice'
'chocolate' (100 grams)
- 100 grams of 'chocolate'
'egg' (70 grams)
- 70 grams of 'egg'
'hamburger' (120 grams)
- 40 grams of 'bread'
- 80 grams of 'burger'
'mixed nuts' (10 grams)
- 10 grams of 'mixed nuts'
'scoop of whey with milk' (175 grams)
- 25 grams of 'PF whey'
- 150 grams of 'milk'
'yogurt w/ ct.cheese' (250 grams)
- 150 grams of 'yogurt'
- 100 grams of 'cottage cheese'
----------------------------------------------------------------
Daily meal plan statistics
- price: 312 [74, 75, 87, 75]
- protein: 611 [108, 158, 188, 158]
- fat: 278 [88, 67, 55, 67]
- carbs: 571 [142, 145, 139, 145]
- kcal: 7198 [1800, 1800, 1799, 1800]
----------------------------------------------------------------
Program
Day 1
- 4.2 x 'chicken w/ sweet&sour' (base meal of 100 grams)
- 0.9 x 'chocolate' (base meal of 100 grams)
- 1 x 'hamburger' (base meal of 120 grams)
- 5 x 'egg' (base meal of 70 grams)
Statistics
- price: 74 [28, 18, 11, 17]
- protein: 108 [38, 8, 16, 46]
- fat: 88 [3, 31, 16, 37]
- carbs: 142 [73, 52, 16, 1]
- kcal: 1800 [475, 522, 282, 522]
Day 2
- 4.1 x 'chicken w/ sweet&sour' (base meal of 100 grams)
- 9.9 x 'mixed nuts' (base meal of 10 grams)
- 3.1 x 'scoop of whey with milk' (base meal of 175 grams)
- 4 x 'egg' (base meal of 70 grams)
Statistics
- price: 75 [28, 11, 23, 13]
- protein: 158 [37, 13, 71, 36]
- fat: 67 [3, 26, 9, 30]
- carbs: 145 [70, 47, 27, 1]
- kcal: 1800 [461, 461, 461, 417]
Day 3
- 4.3 x 'chicken w/ sweet&sour' (base meal of 100 grams)
- 2 x 'yogurt w/ ct.cheese' (base meal of 250 grams)
- 3.2 x 'scoop of whey with milk' (base meal of 175 grams)
- 4 x 'egg' (base meal of 70 grams)
Statistics
- price: 87 [29, 21, 24, 13]
- protein: 188 [39, 37, 75, 36]
- fat: 55 [3, 13, 9, 30]
- carbs: 139 [74, 36, 28, 1]
- kcal: 1799 [486, 410, 486, 417]
Day 4
- 4.1 x 'chicken w/ sweet&sour' (base meal of 100 grams)
- 9.9 x 'mixed nuts' (base meal of 10 grams)
- 3.1 x 'scoop of whey with milk' (base meal of 175 grams)
- 4 x 'egg' (base meal of 70 grams)
Statistics
- price: 75 [28, 11, 23, 13]
- protein: 158 [37, 13, 71, 36]
- fat: 67 [3, 26, 9, 30]
- carbs: 145 [70, 47, 27, 1]
- kcal: 1800 [461, 461, 461, 417]
----------------------------------------------------------------
API: Classes¶
Brief introduction to classes¶
There are four classes available:
StaticExercise
: For exercises schemes such as “3 x 12”, “5 x 5 @ 80kg” or “stretch for 5 mins”. In other words, this class is merely a container for an exercise name and a string.DynamicExercise
: For exercises where you wish to render a dynamic set/rep scheme. TheDynamicExercise
class is part of what makes streprogen dynamic.Day
: ADay
class is a container for exercises associated with the same day.Program
: This is where the magic happens. TheProgram
class is a container forDay``s (and therefore also instances of ``StaticExercise
andDynamicExercise
). The algorithms used to render the program is also contained in theProgram
class. The most important method is theProgram.render()
method, which renders the dynamic exercises.
The DynamicExercise class¶
-
class
streprogen.
DynamicExercise
(name, start_weight=None, final_weight=None, min_reps=None, max_reps=None, percent_inc_per_week=None, reps=None, intensity=None, round_to=None, shift=0)¶ Class for dynamic exercises.
-
__init__
(name, start_weight=None, final_weight=None, min_reps=None, max_reps=None, percent_inc_per_week=None, reps=None, intensity=None, round_to=None, shift=0)¶ Initialize a new dynamic exercise. A dynamic exercise is rendered by the program, and the set/rep scheme will vary from week to week.
Parameters: - name – The name of the exercise, e.g. ‘Squats’.
- start_weight – Maximum weight you can lift at the start of the program, e.g. 80.
- final_weight – The goal weight to work towards during the program. This should be set in relation to the duration of the training program, e.g. 90. If set, this overrides the optional percent_inc_per_week parameter.
- min_reps – The minimum number of repetitions for this exercise, e.g. 3.
- max_reps – The maximum number of repetitions for this exercise, e.g. 8.
- percent_inc_per_week – If final_weight is not set, this value will be used. The increase is additive, not multipliactive. For instance, if the increase is set to percent_inc_per_week=2, then after 2 weeks the increase is 4, not (1.02 * 1.02 - 1) * 100 = 4.04. The final_weight parameter must be set to None for this parameter to have effect.
- reps – The number of baseline repetitions for this exercise. If this parameter is set, it will override the global ‘reps_per_exercise’ parameter for the training program. The repetitions will still be scaled by the rep_scaler_func parameter in the training program.
- intensity – The average intensity for this exercise. If set, this will override the intensity parameter in the training program. The intensity will still be scaled by the intensity_scaler_func parameter.
- round_to – Round the output to the closest multiple of this number, e.g. 2.5. Alternatively, a callable can be passed. The callable must take a number as input and return a rounded number as output.
- shift – Shift evaluation of repetitions, intensity and progress shift weeks ahead in time. An exercise shifted by 1 will have its reps, intensity and strength evalated at week i + 1 instead of in week i.
Examples
>>> bench = DynamicExercise('Bench press', 100, 120, 3, 8) >>> bench2 = DynamicExercise('Bench press', 100, 120, 3, 8) >>> bench == bench2 True
-
classmethod
deserialize
(data)¶ Create a new object from a dictionary.
-
max_reps
¶ Return max reps. If a Program attribute it set and the exercise attribute is None, use the program attribute.
-
min_reps
¶ Return min reps. If a Program attribute it set and the exercise attribute is None, use the program attribute.
-
serialize
()¶ Export the object to a dictionary.
Examples
>>> bench = DynamicExercise('Bench press', start_weight=100) >>> bench.serialize() == {'start_weight': 100, 'name': 'Bench press'} True
-
The StaticExercise class¶
-
class
streprogen.
StaticExercise
(name, sets_reps='4 x 10')¶ Class for static exercises.
-
__init__
(name, sets_reps='4 x 10')¶ Initialize a new static exercise. A static exercise is simply a placeholder for some text.
Parameters: - name – The name of the exercise, e.g. ‘Curls’.
- sets_reps – A static set/rep scheme, e.g. ‘4 x 10’, or ‘10 minutes’. This paramter can also be a function of one parameter, the current week. The function must return a string for that specific week.
Returns: A StaticExercise object.
Return type: Examples
>>> curls = StaticExercise('Curls', '4 x 10') >>> stretching = StaticExercise('Stretching', '10 minutes')
-
The Day class¶
-
class
streprogen.
Day
(name=None, exercises=None)¶ A day object is a container for exercises associated with the specific day.
-
__init__
(name=None, exercises=None)¶ Initialize a new day object.
Parameters: - name – The name of the day, e.g. ‘Day A’. If no name is given then the day will automatically be given a numeric name such as ‘Day 1’, ‘Day 2’, etc.
- exercises – A list of exercises. Exercises can also be associated with a day using the ‘add_exercises’ method later on.
Examples
>>> monday = Day(name='Monday') >>> curls = StaticExercise('Curls', '3 x 12') >>> monday.add_exercises(curls) >>> curls in monday.exercises True
-
add_exercises
(*exercises)¶ Add the exercises to the day. The method will automatically infer whether a static or dynamic exercise is passed to it.
Parameters: *exercises – An unpacked tuple of exercises. Examples
>>> monday = Day(name='Monday') >>> curls = StaticExercise('Curls', '3 x 12') >>> pulldowns = StaticExercise('Pulldowns', '4 x 10') >>> monday.add_exercises(curls, pulldowns) >>> curls in monday.exercises True >>> pulldowns in monday.exercises True
-
classmethod
deserialize
(data)¶ Create a new object from a dictionary.
-
serialize
()¶ Export the object to a dictionary.
-
The Program class¶
-
class
streprogen.
Program
(name: str = 'Untitled', duration: int = 8, reps_per_exercise: int = 25, min_reps: int = 3, max_reps: int = 8, rep_scaler_func: Callable[[int], float] = None, intensity: float = 83, intensity_scaler_func: Callable[[int], float] = None, units: str = 'kg', round_to: Union[float, Callable] = 2.5, percent_inc_per_week: float = 1.5, progression_func: Callable = None, reps_to_intensity_func: Callable[[int], float] = None, verbose: bool = False)¶ The program class is a container for days and exercises, along with the methods and functions used to create training programs.
-
__init__
(name: str = 'Untitled', duration: int = 8, reps_per_exercise: int = 25, min_reps: int = 3, max_reps: int = 8, rep_scaler_func: Callable[[int], float] = None, intensity: float = 83, intensity_scaler_func: Callable[[int], float] = None, units: str = 'kg', round_to: Union[float, Callable] = 2.5, percent_inc_per_week: float = 1.5, progression_func: Callable = None, reps_to_intensity_func: Callable[[int], float] = None, verbose: bool = False)¶ Initialize a new program.
Parameters: - name – The name of the training program, e.g. ‘TommyAugust2017’.
- duration – The duration of the training program in weeks, e.g. 8.
- reps_per_exercise – The baseline number of repetitions per dynamic exercise. Typically a value in the range [15, 30].
- min_reps – The minimum number of repetitions for the exercises, e.g. 3. This value can be set globally for the program, or for a specific dynamic exercise. If set at the dynamic exercise level, it will override the global program value.
- max_reps – The maximum number of repetitions for the exercises, e.g. 8. This value can be set globally for the program, or for a specific dynamic exercise. If set at the dynamic exercise level, it will override the global program value.
- rep_scaler_func – A function mapping from a week in the range [1, duration] to a scaling value (factor). The scaling value will be multiplied with the reps_per_exercise parameter for that week. Should typically return factors between 0.7 and 1.3. Alternatively, a list of length duration may be passed.
- intensity – The baseline intensity for each dynamic exercise. The intensity of an exercise for a given week is how heavy the average repetition is compared to the expected 1RM (max weight one can lift) for that given week. Typically a value around 80.
- intensity_scaler_func – A function mapping from a week in the range [1, duration] to a scaling value (factor). The scaling value will be multiplied with the intensity parameter for that week. Should typically return factors between 0.9 and 1.1. Alternatively, a list of length duration may be passed.
- units – The units used for exporting and printing the program, e.g. ‘kg’.
- round_to – Round the dynamic exercise to the nearest multiple of this parameter. Typically 2.5, 5 or 10. A callable can alternatively be passed. This value can be set globally for the program, or for a specific dynamic exercise. If set at the dynamic exercise level, it will override the global program value.
- percent_inc_per_week – If final_weight is not set, this value will be used. Percentage increase per week can be set globally for the program, or for each dynamic exercise. If set at the dynamic exercise level, it will override the global program value. The increase is additive, not multipliactive. For instance, if the increase is set to percent_inc_per_week=2, then after 2 weeks the increase is 4, not (1.02 * 1.02 - 1) * 100 = 4.04. The final_weight parameter must be set to None for this parameter to have effect.
- progression_func –
The function used to model overall 1RM progression in the training program. The function must have a signature like:
func(week, start_weight, final_weight, start_week, end_week) - reps_to_intensity_func – The function used to model the relationship between repetitions and intensity. Maps from a repetition to an intensity in the range 0-100.
- verbose – If True, information will be outputted as the program is created.
Returns: A Program instance.
Return type: Examples
>>> program = Program('My training program') >>> program._rendered False
-
Day
(name: str = None)¶ - A day object is a container for exercises associated with the specific day.
See streprogen.Day for accurate signature.
-
DynamicExercise
(name, start_weight=None, final_weight=None, min_reps=None, max_reps=None, percent_inc_per_week=None, reps=None, intensity=None, round_to=None, shift=0)¶ Class for dynamic exercises. See streprogen.DynamicExercise for accurate signature.
-
StaticExercise
(name, sets_reps='4 x 10')¶ - Class for static exercises.
See streprogen.StaticExercise for accurate signature.
-
add_days
(*days)¶ Add one or several days to the program.
Parameters: *days – Iterable containing streprogen.Day
instances.Examples
>>> program = Program('My training program') >>> day1, day2 = Day(), Day() >>> program.add_days(day1, day2) >>> program.add_days(day1)
-
classmethod
deserialize
(data: dict)¶ Create a new object from a dictionary.
-
render
(validate=True)¶ Render the training program to perform the calculations. The program can be rendered several times to produce new information given the same input parameters.
Parameters: validate – Boolean that indicates whether or not to run a validation heurestic on the program before rendering. The validation will warn the user if inputs seem unreasonable.
-
serialize
() → dict¶ Export the object to a dictionary.
-
set_optimization_params
(reps_slack=None, max_diff=None, max_unique=None)¶ Set default parameters.
Passing None for a paramter will get use the defaults in RepSchemeGenerator.
Parameters: - reps_slack (int, optional) – Maximum deviation from the repetition goal.
- max_diff (int, optional) – Maximum difference between two consecutive sets.
- max_unique (int, optional) – Maximum unique sets in the solution.
-
to_dict
()¶ Write the rendered program information to a dictionary.
-
to_html
(table_width=5)¶ Write the program information to HTML code, which can be saved, printed and brought to the gym.
Parameters: table_width – The table with of the HTML code. Returns: HTML code. Return type: string
-
to_tex
(text_size='large', table_width=5, clear_pages=False)¶ Write the program information to a .tex file, which can be rendered to .pdf running pdflatex. The program can then be printed and brought to the gym.
Parameters: - text_size – The tex text size, e.g. ‘small’, ‘normalsize’, ‘large’, ‘Large’ or ‘LARGE’.
- table_width – The table width of the .tex code.
- clear_pages – If True, the page will be cleared after each week is printed.
Returns: Program as tex.
Return type: string
-
to_txt
(verbose=False)¶ Write the program information to text, which can be printed in a terminal.
Parameters: verbose – If True, more information is shown. Returns: Program as text. Return type: string
-
API: Functions¶
Functions documented here.
Functions modeling reps/intensity mapping¶
reps_to_intensity¶
-
streprogen.
reps_to_intensity
(reps, slope=-3.5, constant=97.5, quadratic=True)¶ A mapping from repetitions in range [1, 12] to intensities in range [0, 100].
Parameters: - reps – The number of repetitions to map to the intensity range.
- slope – Slope for the linear function.
- constant – Constant for the linear function.
- quadratic – If ‘True’, add a slight quadratic offset.
Returns: An intensity value in the range from 0 to 100.
Return type: intensity
Examples
>>> reps_to_intensity(5, slope=-5, constant=100, quadratic=False) 80 >>> reps_to_intensity(8, slope=-5, constant=100, quadratic=True) 67.45 >>> reps_to_intensity(8, slope=-5, constant=100, quadratic=False) 65
Functions modeling progression¶
progression_linear¶
-
streprogen.
progression_diffeq
(week, start_weight, final_weight, start_week, final_week, k=0)¶ A linear/exponential progression function going through the points (‘start_week’, ‘start_weight’) and (‘end_week’, ‘final_weight’), evaluated in ‘week’.
Parameters: - week – The week to evaluate the linear function at.
- start_weight – The weight at ‘start_week’.
- final_weight – The weight at ‘final_week’.
- start_week – The number of the first week, typically 1.
- final_week – The number of the final week, e.g. 8.
- k – How much the function “bends”. k=0 is linear, k>0 bends it.
Returns: The weight at ‘week’.
Return type: weight
Examples
>>> progression_diffeq(week = 2, start_weight = 100, final_weight = 120, ... start_week = 1, final_week = 3) 110.0 >>> progression_diffeq(3, 100, 140, 1, 5) 120.0
progression_sinusoidal¶
-
streprogen.
progression_sinusoidal
(week, start_weight, final_weight, start_week, final_week, period=4, scale=0.025, offset=0, k=0, correct_boundaries=False)¶ A sinusoidal progression function going through the points (‘start_week’, ‘start_weight’) and (‘final_week’, ‘final_weight’), evaluated in ‘week’. This function calls a linear progression function and multiplies it by a sinusoid.
Parameters: - week – The week to evaluate the linear function at.
- start_weight – The weight at ‘start_week’.
- final_weight – The weight at ‘final_week’.
- start_week – The number of the first week, typically 1.
- final_week – The number of the final week, e.g. 8.
- period – The length of a period (cycle) in weeks.
- scale – The scale (amplitude) of the sinusoidal term.
- offset – The offset (shift) of the sinusoid.
- k – Exponential growth. Higher results in more exponential growth.
- correct_boundaries – If True, the function is adjusted to pass through the endpoints exactly.
Returns: The weight at ‘week’.
Return type: weight
Examples
>>> progression_sinusoidal(1, 123, 123, 1, 8, period=4) 123.0 >>> progression_sinusoidal(7, 123, 123, 1, 8, period=4) 123.0