ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
trendClass.php
Go to the documentation of this file.
1<?php
29require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/linearBestFitClass.php';
30require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/logarithmicBestFitClass.php';
31require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/exponentialBestFitClass.php';
32require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/powerBestFitClass.php';
33require_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 :
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;
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;
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
An exception for terminatinating execution or to throw for unit testing.
getError()
returns error @access public
const TREND_LINEAR
Definition: trendClass.php:45
const TREND_POLYNOMIAL_3
Definition: trendClass.php:50
const TREND_LOGARITHMIC
Definition: trendClass.php:46
static calculate($trendType=self::TREND_BEST_FIT, $yValues, $xValues=array(), $const=True)
Definition: trendClass.php:87
const TREND_BEST_FIT_NO_POLY
Definition: trendClass.php:55
const TREND_BEST_FIT
Definition: trendClass.php:54
const TREND_EXPONENTIAL
Definition: trendClass.php:47
const TREND_POWER
Definition: trendClass.php:48
static $_trendCache
Definition: trendClass.php:84
const TREND_POLYNOMIAL_2
Definition: trendClass.php:49
const TREND_POLYNOMIAL_4
Definition: trendClass.php:51
static $_trendTypes
Definition: trendClass.php:62
static $_trendTypePolyOrders
Definition: trendClass.php:72
const TREND_POLYNOMIAL_6
Definition: trendClass.php:53
const TREND_POLYNOMIAL_5
Definition: trendClass.php:52