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 and Program. 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.

  1. Download Anaconda distribution of Python 3.x from the Anaconda Website.
  2. Install streprogen from PyPI.
    1. Windows: Open the Anaconda prompt from the start menu and run pip install streprogen.
    2. Linux: Open the terminal and run pip install streprogen.
  3. Open a Python Editor (such as Spyder, which comes with Anaconda).
  4. Write from streprogen import * to import everything from streprogen.

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()

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:

[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()
_images/examples_Intermediate_features_6_0.png

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()
_images/examples_Intermediate_features_8_0.png

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()

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:

[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()
_images/examples_Advanced_features_6_0.png

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()
_images/examples_Advanced_features_8_0.png

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()
_images/examples_Advanced_features_10_0.png

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()

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:

[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()
_images/examples_Beginner_5x5_6_0.png

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()

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:

[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()
_images/examples_Beginner_5x5_modified_6_0.png

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()

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:

[ ]:
# 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()
_images/examples_3_day_split_6_0.png

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)

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:

[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()
_images/examples_3_day_full_body_8_0.png
[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()
_images/examples_3_day_full_body_11_0.png

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:

[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()
_images/examples_Block_periodization_8_0.png

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()
_images/examples_Block_periodization_11_0.png

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()
_images/examples_Block_periodization_13_0.png

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()

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:

[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 and kcal 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. The DynamicExercise class is part of what makes streprogen dynamic.
  • Day: A Day class is a container for exercises associated with the same day.
  • Program: This is where the magic happens. The Program class is a container for Day``s (and therefore also instances of ``StaticExercise and DynamicExercise). The algorithms used to render the program is also contained in the Program class. The most important method is the Program.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:

StaticExercise

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:

Program

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

Indices and tables