/** * 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; }
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); } } } }