ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
trendClass.php
Go to the documentation of this file.
1 <?php
29 require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/linearBestFitClass.php';
30 require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/logarithmicBestFitClass.php';
31 require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/exponentialBestFitClass.php';
32 require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/powerBestFitClass.php';
33 require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/polynomialBestFitClass.php';
34 
35 
44 {
45  const TREND_LINEAR = 'Linear';
46  const TREND_LOGARITHMIC = 'Logarithmic';
47  const TREND_EXPONENTIAL = 'Exponential';
48  const TREND_POWER = 'Power';
49  const TREND_POLYNOMIAL_2 = 'Polynomial_2';
50  const TREND_POLYNOMIAL_3 = 'Polynomial_3';
51  const TREND_POLYNOMIAL_4 = 'Polynomial_4';
52  const TREND_POLYNOMIAL_5 = 'Polynomial_5';
53  const TREND_POLYNOMIAL_6 = 'Polynomial_6';
54  const TREND_BEST_FIT = 'Bestfit';
55  const TREND_BEST_FIT_NO_POLY = 'Bestfit_no_Polynomials';
56 
62  private static $_trendTypes = array( self::TREND_LINEAR,
63  self::TREND_LOGARITHMIC,
64  self::TREND_EXPONENTIAL,
65  self::TREND_POWER
66  );
72  private static $_trendTypePolyOrders = array( self::TREND_POLYNOMIAL_2,
73  self::TREND_POLYNOMIAL_3,
74  self::TREND_POLYNOMIAL_4,
75  self::TREND_POLYNOMIAL_5,
76  self::TREND_POLYNOMIAL_6
77  );
78 
84  private static $_trendCache = array();
85 
86 
87  public static function calculate($trendType=self::TREND_BEST_FIT, $yValues, $xValues=array(), $const=True) {
88  // Calculate number of points in each dataset
89  $nY = count($yValues);
90  $nX = count($xValues);
91 
92  // Define X Values if necessary
93  if ($nX == 0) {
94  $xValues = range(1,$nY);
95  $nX = $nY;
96  } elseif ($nY != $nX) {
97  // Ensure both arrays of points are the same size
98  trigger_error("trend(): Number of elements in coordinate arrays do not match.", E_USER_ERROR);
99  }
100 
101  $key = md5($trendType.$const.serialize($yValues).serialize($xValues));
102  // Determine which trend method has been requested
103  switch ($trendType) {
104  // Instantiate and return the class for the requested trend method
105  case self::TREND_LINEAR :
106  case self::TREND_LOGARITHMIC :
107  case self::TREND_EXPONENTIAL :
108  case self::TREND_POWER :
109  if (!isset(self::$_trendCache[$key])) {
110  $className = 'PHPExcel_'.$trendType.'_Best_Fit';
111  self::$_trendCache[$key] = new $className($yValues,$xValues,$const);
112  }
113  return self::$_trendCache[$key];
114  break;
115  case self::TREND_POLYNOMIAL_2 :
116  case self::TREND_POLYNOMIAL_3 :
117  case self::TREND_POLYNOMIAL_4 :
118  case self::TREND_POLYNOMIAL_5 :
119  case self::TREND_POLYNOMIAL_6 :
120  if (!isset(self::$_trendCache[$key])) {
121  $order = substr($trendType,-1);
122  self::$_trendCache[$key] = new PHPExcel_Polynomial_Best_Fit($order,$yValues,$xValues,$const);
123  }
124  return self::$_trendCache[$key];
125  break;
126  case self::TREND_BEST_FIT :
127  case self::TREND_BEST_FIT_NO_POLY :
128  // If the request is to determine the best fit regression, then we test each trend line in turn
129  // Start by generating an instance of each available trend method
130  foreach(self::$_trendTypes as $trendMethod) {
131  $className = 'PHPExcel_'.$trendMethod.'BestFit';
132  $bestFit[$trendMethod] = new $className($yValues,$xValues,$const);
133  $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit();
134  }
135  if ($trendType != self::TREND_BEST_FIT_NO_POLY) {
136  foreach(self::$_trendTypePolyOrders as $trendMethod) {
137  $order = substr($trendMethod,-1);
138  $bestFit[$trendMethod] = new PHPExcel_Polynomial_Best_Fit($order,$yValues,$xValues,$const);
139  if ($bestFit[$trendMethod]->getError()) {
140  unset($bestFit[$trendMethod]);
141  } else {
142  $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit();
143  }
144  }
145  }
146  // Determine which of our trend lines is the best fit, and then we return the instance of that trend class
147  arsort($bestFitValue);
148  $bestFitType = key($bestFitValue);
149  return $bestFit[$bestFitType];
150  break;
151  default :
152  return false;
153  }
154  } // function calculate()
155 
156 } // class trendClass
const TREND_POLYNOMIAL_3
Definition: trendClass.php:50
const TREND_POLYNOMIAL_6
Definition: trendClass.php:53
const TREND_EXPONENTIAL
Definition: trendClass.php:47
const TREND_BEST_FIT_NO_POLY
Definition: trendClass.php:55
static calculate($trendType=self::TREND_BEST_FIT, $yValues, $xValues=array(), $const=True)
Definition: trendClass.php:87
static $_trendTypes
Definition: trendClass.php:62
Resolve range
const TREND_POWER
Definition: trendClass.php:48
static $_trendCache
Definition: trendClass.php:84
const TREND_BEST_FIT
Definition: trendClass.php:54
static $_trendTypePolyOrders
Definition: trendClass.php:72
Create styles array
The data for the language used.
const TREND_POLYNOMIAL_4
Definition: trendClass.php:51
const TREND_LINEAR
Definition: trendClass.php:45
const TREND_POLYNOMIAL_2
Definition: trendClass.php:49
const TREND_LOGARITHMIC
Definition: trendClass.php:46
$key
Definition: croninfo.php:18
const TREND_POLYNOMIAL_5
Definition: trendClass.php:52