/* <CoffeeScript>
multiRegression = {}


multiRegression.calculateA = (data) ->
</CoffeeScript> */
  /**
   * @method calculateA
   * @member Lumenize
   *   Calculates the coefficient matrix for gaussian elimination solution
   */
/* <CoffeeScript>
  numOfVariables = data[0].length
  n = data.length
  a = []
  for i in [0..numOfVariables - 1]
    a.push([])
    for j in [0..numOfVariables]
      a[i].push(0)
      for k in [0..n - 1]
        a[i][j] += (if i is 0 then 1 else data[k][i - 1]) * (if j is 0 then 1 else data[k][j - 1])
  return a


multiRegression.swapRows = (a, firstRowIndex, secondRowIndex) ->
  for j in [0..a[0].length - 1]
    temp = a[firstRowIndex][j]
    a[firstRowIndex][j] = a[secondRowIndex][j]
    a[secondRowIndex][j] = temp



#		static double Predict(double[,] Data, double[] Inputs, ref double Range70, ref double Range90, ref double Variance, ref string ResultString)
predict = (data, inputs) ->
</CoffeeScript> */
  /**
   * @method predict
   * @member Lumenize
   * @param {[][]} data A two-dimensional array
   * @param
   * 
   * Returns a prediction of the output based upon historical data and input "estimates"
   * The last column of the Data array is the value we are trying to predict. The other
   * columns are the inputs.  The input array will order-wise coorespond to the first
   * n-1 columns of the data array.
   * 
   * @return {Object}
   * 
   * returns {A, Beta, variance, prediction}
   */
/* <CoffeeScript>

#			int Rows=Data.GetLength(0);

#			int Columns=Data.GetLength(1);
#			if ( Columns>=Rows )
#			{
#				ResultString="Not enough data points.";
#				return -1;
#			}
#			if ( Columns<2 )
#			{
#				ResultString="Not enough columns.";
#				return -1;
#			}
#			double[,] a;
#			double[] x, Averages, RangeSums;
#			CalculateA(Data, out a);
#			ResultString=GuassSolve(a, out x);
#			if ( ResultString != "")
#			{
#				return -1;
#			}
#			double Answer=0;
#			double Multiplier=0;
#			for (int i=0; i<=a.GetLength(0)-1; i++)
#			{
#				if ( i==0 )
#					Multiplier=1;
#				else
#					Multiplier=Inputs[i-1];
#				Answer+=Multiplier*x[i];
#			}
#		    CalculateAverages(Data, out Averages);
#			CalculateRangeSums(Data, Averages, out RangeSums);
#			double Temp=0;
#			double Sum = 1.0 + (1.0/Rows);
#			for ( int j=0;j<=Columns-2;j++ )
#			{
#				Temp=Inputs[j]-Averages[j];
#				Sum+=(Temp*Temp)/RangeSums[j];
#			}
#			double SqrtSum=Math.Sqrt(Sum);
#			Variance=CalculateVariance(Data,x);
#			Range70=TWhenTDistIntegralEquals(.35, Rows-Columns)*Variance*SqrtSum;
#			Range90=TWhenTDistIntegralEquals(.45, Rows-Columns)*Variance*SqrtSum;
#			return Answer;
#		}

exports.multiRegression = multiRegression
</CoffeeScript> */