Example #1
0
 /**
  * Calculate pace array
  * @return array
  */
 public function calculate()
 {
     if (null !== $this->Smoother) {
         $this->Pace = $this->Smoother->smooth(0.001, PaceSmoother::MODE_DISTANCE);
     }
     return $this->Pace;
 }
 /**
  * @return array
  */
 protected function computeZones()
 {
     // TODO
     // - move this a calculation class
     // - make zones configurable
     $Zones = array();
     $SmoothTrackdata = clone $this->Context->trackdata();
     $Smoother = new PaceSmoother($SmoothTrackdata, true);
     $SmoothTrackdata->set(Trackdata\Object::PACE, $Smoother->smooth(self::STEP_SIZE, PaceSmoother::MODE_STEP));
     $hasHR = $this->Context->trackdata()->has(Trackdata\Object::HEARTRATE);
     $Distribution = new TimeSeriesForTrackdata($SmoothTrackdata, Trackdata\Object::PACE, array(Trackdata\Object::DISTANCE), $hasHR ? array(Trackdata\Object::HEARTRATE) : array());
     $Data = $Distribution->data();
     foreach ($Distribution->histogram() as $paceInSeconds => $seconds) {
         $pace = $this->zoneFor($paceInSeconds);
         if (!isset($Zones[$pace])) {
             $Zones[$pace] = array('time' => $seconds, 'distance' => $Data[$paceInSeconds][Trackdata\Object::DISTANCE], 'hr' => $hasHR ? $Data[$paceInSeconds][Trackdata\Object::HEARTRATE] * $seconds : 0);
         } else {
             $Zones[$pace]['time'] += $seconds;
             $Zones[$pace]['distance'] += $Data[$paceInSeconds][Trackdata\Object::DISTANCE];
             $Zones[$pace]['hr'] += $hasHR ? $Data[$paceInSeconds][Trackdata\Object::HEARTRATE] * $seconds : 0;
         }
     }
     ksort($Zones, SORT_NUMERIC);
     return $Zones;
 }
Example #3
0
 public function testKeepingArraySize()
 {
     $arraySizes = range(15, 35);
     $stepSizes = range(2, 11);
     $modes = array('step' => PaceSmoother::MODE_STEP, 'time' => PaceSmoother::MODE_TIME, 'distance' => PaceSmoother::MODE_DISTANCE);
     foreach ($arraySizes as $arraySize) {
         $Smoother = new PaceSmoother(new Object(array(Object::TIME => range(0, $arraySize - 1), Object::DISTANCE => range(0, $arraySize - 1))), true);
         foreach ($stepSizes as $stepSize) {
             foreach ($modes as $name => $mode) {
                 $this->assertEquals($arraySize, count($Smoother->smooth($stepSize, $mode)), 'Wrong array size for mode = ' . $name . ', arraySize = ' . $arraySize . ' and stepSize = ' . $stepSize);
             }
         }
     }
 }