    /* <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> */