Module: RacePredictor
- Included in:
- Calcpace
- Defined in:
- lib/calcpace/race_predictor.rb
Overview
Module for predicting race times based on performance at other distances
This module uses the Riegel formula to predict race times based on a known performance at a different distance. The formula accounts for the endurance fatigue factor that occurs as race distance increases.
Constant Summary collapse
- RIEGEL_EXPONENT =
Riegel formula exponent (represents endurance/fatigue factor)
1.06
Instance Method Summary collapse
-
#equivalent_performance(from_race, from_time, to_race) ⇒ Hash
Calculates the equivalent performance at a different distance.
-
#predict_pace(from_race, from_time, to_race) ⇒ Float
Predicts the pace per kilometer for a target race.
-
#predict_pace_clock(from_race, from_time, to_race) ⇒ String
Predicts the pace per kilometer and returns it as a clock time string.
-
#predict_time(from_race, from_time, to_race) ⇒ Float
Predicts race time for a target distance based on a known performance.
-
#predict_time_clock(from_race, from_time, to_race) ⇒ String
Predicts race time and returns it as a clock time string.
Instance Method Details
#equivalent_performance(from_race, from_time, to_race) ⇒ Hash
Calculates the equivalent performance at a different distance
This is useful for comparing performances across different race distances. For example, “My 10K time is equivalent to what 5K time?”
115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/calcpace/race_predictor.rb', line 115 def equivalent_performance(from_race, from_time, to_race) predicted_time = predict_time(from_race, from_time, to_race) predicted_pace = predict_pace(from_race, from_time, to_race) { time: predicted_time, time_clock: convert_to_clocktime(predicted_time), pace: predicted_pace, pace_clock: convert_to_clocktime(predicted_pace) } end |
#predict_pace(from_race, from_time, to_race) ⇒ Float
Predicts the pace per kilometer for a target race
76 77 78 79 80 |
# File 'lib/calcpace/race_predictor.rb', line 76 def predict_pace(from_race, from_time, to_race) predicted_seconds = predict_time(from_race, from_time, to_race) to_distance = race_distance(to_race) predicted_seconds / to_distance end |
#predict_pace_clock(from_race, from_time, to_race) ⇒ String
Predicts the pace per kilometer and returns it as a clock time string
92 93 94 95 |
# File 'lib/calcpace/race_predictor.rb', line 92 def predict_pace_clock(from_race, from_time, to_race) pace_seconds = predict_pace(from_race, from_time, to_race) convert_to_clocktime(pace_seconds) end |
#predict_time(from_race, from_time, to_race) ⇒ Float
Predicts race time for a target distance based on a known performance
Uses the Riegel formula: T2 = T1 × (D2/D1)^1.06 where:
-
T1 = time at known distance
-
D1 = known distance
-
T2 = predicted time at target distance
-
D2 = target distance
-
1.06 = endurance/fatigue factor (longer races require proportionally more time)
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/calcpace/race_predictor.rb', line 35 def predict_time(from_race, from_time, to_race) from_distance = race_distance(from_race) to_distance = race_distance(to_race) if from_distance == to_distance raise ArgumentError, "From and to races must be different distances (both are #{from_distance}km)" end time_seconds = from_time.is_a?(String) ? convert_to_seconds(from_time) : from_time check_positive(time_seconds, 'Time') # Riegel formula: T2 = T1 × (D2/D1)^1.06 time_seconds * ((to_distance / from_distance)**RIEGEL_EXPONENT) end |
#predict_time_clock(from_race, from_time, to_race) ⇒ String
Predicts race time and returns it as a clock time string
61 62 63 64 |
# File 'lib/calcpace/race_predictor.rb', line 61 def predict_time_clock(from_race, from_time, to_race) predicted_seconds = predict_time(from_race, from_time, to_race) convert_to_clocktime(predicted_seconds) end |