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_adjusted(from_race, from_time, to_race) ⇒ Hash
Predicts race time adjusted for environmental conditions.
-
#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?"
114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/calcpace/race_predictor.rb', line 114 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
75 76 77 78 79 |
# File 'lib/calcpace/race_predictor.rb', line 75 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
91 92 93 94 |
# File 'lib/calcpace/race_predictor.rb', line 91 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)
37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/calcpace/race_predictor.rb', line 37 def predict_time(from_race, from_time, to_race) from_distance = race_distance(from_race) to_distance = race_distance(to_race) ensure_different_distances!(from_distance, to_distance) 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_adjusted(from_race, from_time, to_race) ⇒ Hash
Predicts race time adjusted for environmental conditions
140 141 142 143 |
# File 'lib/calcpace/race_predictor.rb', line 140 def predict_time_adjusted(from_race, from_time, to_race, **) predicted_seconds = predict_time(from_race, from_time, to_race) adjust_time(predicted_seconds, **) end |
#predict_time_clock(from_race, from_time, to_race) ⇒ String
Predicts race time and returns it as a clock time string
60 61 62 63 |
# File 'lib/calcpace/race_predictor.rb', line 60 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 |