    /**
     * Copyright (c) 2015, Jozef Stefan Institute, Quintelligence d.o.o. and contributors
     * All rights reserved.
     *
     * This source code is licensed under the FreeBSD license found in the
     * LICENSE file in the root directory of this source tree.
     */
    /**
    * Statistics module.
    * @module statistics
    * @example
    * // import the modules
    * var qm = require('qminer');
    * var statistics = qm.statistics;
    * // create a vector
    * var vec = new qm.la.Vector([0, 1, 2, -1, -2]);
    * // calculate the mean value of the vector
    * var mean = statistics.mean(vec); // returns 0
    */
    /**
    	* Calculates the mean value(s).
    	* @param {(module:la.Vector | module:la.Matrix)} input - The input the method is used on.
    	* @returns {(number | module:la.Vector)}
    	* &lt;br>1. If input is {@link module:la.Vector}, returns the mean of the vector.
        * &lt;br>2. If input is {@link module:la.Matrix}, returns a vector of where the i-th value is the mean of i-th column.
        * @example
        * // import modules
        * var qm = require('qminer');
        * var la = qm.la;
        * var statistics = qm.statistics;
        * // create a matrix
        * var mat = new la.Matrix([[1, 2, 1], [-1, 2, -1], [3, 2, 3]]);
        * // calculate the mean of the matrix columns
        * // vector contains the elements [1, 2, 1]
        * var mean = statistics.mean(mat);
    	*/
     exports.mean = function (input) { return input instanceof Object.create(require('qminer').la.Vector) ? 0.0 : Object.create(require('qminer').la.Vector.prototype); }
    /**
    	* Calculates the standard deviation(s).
    	* @param {(module:la.Vector | module:la.Matrix)} X - The input the method is used on.
    	* @param {number} [flag=0] - If set to to 0, it normalizes X by n-1; If set to 1 to, it normalizes by n.
    	* @param {number} [dim=1] - Computes the standard deviations along the dimension of X specified by parameter `dim`.
        * If set to 1, calculates the column standard deviation. If set to 2, calculates the row standard deviation.
    	* @returns {(number | module:la.Vector)}
    	* &lt;br>1. If X is {@link module:la.Vector}, returns standard deviation of the vector.
        * &lt;br>2. If X is {@link module:la.Matrix}, returns a vector where the i-th value is the standard deviation of the i-th column(row).
        * @example
        * // import modules
        * var qm = require('qminer');
        * var la = qm.la;
        * var statistics = qm.statistics;
        * // create a matrix
        * var mat = new la.Matrix([[1, 2, 1], [-1, 2, -1], [3, 2, 3]]);
        * // calculate the standard deviation of the matrix columns
        * var mean = statistics.std(mat);
    	*/
     exports.std = function (X, flag, dim) { return input instanceof Object.create(require('qminer').la.Vector) ? 0.0 : Object.create(require('qminer').la.Vector.prototype); }
    /**
    	* Returns an object containing the standard deviation of each column of matrix, mean vector and z-score matrix.
    	* @param {module:la.Matrix} mat - The matrix.
    	* @param {number} [flag=0] - If set to 0, it normalizes mat by n-1; if set to 1, it normalizes by n.
    	* @param {number} [dim=1] - Computes the standard deviations along the dimension of mat specified by parameter `dim`.
        * If set to 1, calculates the column standard deviation. If set to 2, calculates the row standard deviation.
    	* @returns {Object} The object `zscoreResult` containing:
    	* &lt;br>`zscoreResult.sigma` - {@link module:la.Vector} of standard deviations of mat used to compute the z-scores.
    	* &lt;br>`zscoreResult.mu` - {@link module:la.Vector} of mean values of mat used to compute the z-scores.
    	* &lt;br>`zscoreResult.Z` - {@link module:la.Matrix} of z-scores that has mean 0 and variance 1.
        * @example
        * // import modules
        * var qm = require('qminer');
        * var la = qm.la;
        * var statistics = qm.statistics;
        * // create a matrix
        * var mat = new la.Matrix([[1, 2, 1], [-1, 2, -1], [3, 2, 3]]);
        * // calculate the standard deviation of the matrix columns
        * var mean = statistics.zscore(mat);
    	*/
     exports.zscore = function (mat, flag, dim) { return {sigma: Object.create(require('qminer').la.Vector.prototype), mu: Object.create(require('qminer').la.Vector.prototype), Z: Object.create(require('qminer').la.Matrix.prototype)}; }
    /**
    	* function studentCdf calculates Student's t cumulative distribution function (PDF integral from -inf to t)
    	* function studentCdf returns 'Alpha' as in the p-value of a Student t-test
    	* If you already have a t-value than the studentCdf function has 2 inputs: t-value and degrees of freedom
    	* @param {number} val - The t-value value of the sample you want to calculate the p-value for
    	* @param {number} df - Degrees of freedom for the sample (if your sample is big n than degrees of freedom in n-1)
    	* If you don't have the t-value than studentCdf function has 4 inputs: Value, Mean, Standard deviation and degrees of freedom
    	* @param {number} val - The average value of the sample you want to calculate the p-value for
    	* @param {number} mean - The mean value of the sample you want to calculate the p-value for
    	* @param {number} std - The sample standard deviation of the sample you want to calculate the p-value for
    	* @param {number} df - Degrees of freedom for the sample (if your sample is n big then degrees of freedom is n-1)
    	* @returns {Alpha}
    	*/

        /**
    	 * Calculates the z-score for a point sampled from a Gaussian distribution. The z-score indicates
    	 * how many standard deviations an element is from the meam and can be calculated using
    	 * the following formula: `z = (x - mu) / sigma`.
    	 * @param {Number} x - The sampled point.
    	 * @param {Number} mu - Mean of the distribution.
    	 * @param {Number} sigma - Variance of the distribution.
         * @returns {number} The z-score of the sampled point.
         * @example
         * // import modules
         * var stat = require('qminer').statistics;
         * // calculate the z-score of the sampled point
         * var point = 10;
         * var mu    = 5;
         * var sigma = 5;
         * var zScore = stat.getZScore(point, mu, sigma); // returns 1
    	 */
        exports.getZScore = function (x, mu, sigma) {
        	return (x - mu) / sigma;
        }