/common/libraries/plugin/phpexcel/PHPExcel/Shared/trend/trendClass.php
PHP | 113 lines | 96 code | 9 blank | 8 comment | 9 complexity | 326442fba3a83a7d220ff87c5a2e5a67 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-2.1, LGPL-3.0, GPL-3.0, MIT
- <?php
-
- require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/linearBestFitClass.php';
- require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/logarithmicBestFitClass.php';
- require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/exponentialBestFitClass.php';
- require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/powerBestFitClass.php';
- require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/polynomialBestFitClass.php';
-
- class trendClass
- {
- const TREND_LINEAR = 'Linear';
- const TREND_LOGARITHMIC = 'Logarithmic';
- const TREND_EXPONENTIAL = 'Exponential';
- const TREND_POWER = 'Power';
- const TREND_POLYNOMIAL_2 = 'Polynomial_2';
- const TREND_POLYNOMIAL_3 = 'Polynomial_3';
- const TREND_POLYNOMIAL_4 = 'Polynomial_4';
- const TREND_POLYNOMIAL_5 = 'Polynomial_5';
- const TREND_POLYNOMIAL_6 = 'Polynomial_6';
- const TREND_BEST_FIT = 'Bestfit';
- const TREND_BEST_FIT_NO_POLY = 'Bestfit_no_Polynomials';
-
- private static $_trendTypes = array(self :: TREND_LINEAR, self :: TREND_LOGARITHMIC, self :: TREND_EXPONENTIAL,
- self :: TREND_POWER);
- private static $_trendTypePolyOrders = array(self :: TREND_POLYNOMIAL_2, self :: TREND_POLYNOMIAL_3,
- self :: TREND_POLYNOMIAL_4, self :: TREND_POLYNOMIAL_5, self :: TREND_POLYNOMIAL_6);
-
- private static $_trendCache = array();
-
- public static function calculate($trendType = self::TREND_BEST_FIT, $yValues, $xValues = array(), $const = True)
- {
- // Calculate number of points in each dataset
- $nY = count($yValues);
- $nX = count($xValues);
-
- // Define X Values if necessary
- if ($nX == 0)
- {
- $xValues = range(1, $nY);
- $nX = $nY;
- }
- elseif ($nY != $nX)
- {
- // Ensure both arrays of points are the same size
- trigger_error("trend(): Number of elements in coordinate arrays do not match.", E_USER_ERROR);
- }
-
- $key = md5($trendType . $const . serialize($yValues) . serialize($xValues));
- // Determine which trend method has been requested
- switch ($trendType)
- {
- // Instantiate and return the class for the requested trend method
- case self :: TREND_LINEAR :
- case self :: TREND_LOGARITHMIC :
- case self :: TREND_EXPONENTIAL :
- case self :: TREND_POWER :
- if (! isset(self :: $_trendCache[$key]))
- {
- $className = 'PHPExcel_' . $trendType . '_Best_Fit';
- self :: $_trendCache[$key] = new $className($yValues, $xValues, $const);
- }
- return self :: $_trendCache[$key];
- break;
- case self :: TREND_POLYNOMIAL_2 :
- case self :: TREND_POLYNOMIAL_3 :
- case self :: TREND_POLYNOMIAL_4 :
- case self :: TREND_POLYNOMIAL_5 :
- case self :: TREND_POLYNOMIAL_6 :
- if (! isset(self :: $_trendCache[$key]))
- {
- $order = substr($trendType, - 1);
- self :: $_trendCache[$key] = new PHPExcel_Polynomial_Best_Fit($order, $yValues, $xValues, $const);
- }
- return self :: $_trendCache[$key];
- break;
- case self :: TREND_BEST_FIT :
- case self :: TREND_BEST_FIT_NO_POLY :
- // If the request is to determine the best fit regression, then we test each trend line in turn
- // Start by generating an instance of each available trend method
- foreach (self :: $_trendTypes as $trendMethod)
- {
- $className = 'PHPExcel_' . $trendMethod . 'BestFit';
- $bestFit[$trendMethod] = new $className($yValues, $xValues, $const);
- $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit();
- }
- if ($trendType != self :: TREND_BEST_FIT_NO_POLY)
- {
- foreach (self :: $_trendTypePolyOrders as $trendMethod)
- {
- $order = substr($trendMethod, - 1);
- $bestFit[$trendMethod] = new PHPExcel_Polynomial_Best_Fit($order, $yValues, $xValues, $const);
- if ($bestFit[$trendMethod]->getError())
- {
- unset($bestFit[$trendMethod]);
- }
- else
- {
- $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit();
- }
- }
- }
- // Determine which of our trend lines is the best fit, and then we return the instance of that trend class
- arsort($bestFitValue);
- $bestFitType = key($bestFitValue);
- return $bestFit[$bestFitType];
- break;
- default :
- return false;
- }
- } // function calculate()
-
-
- } // class trendClass