/*

Please send corrections, questions and suggestions to:
    Alexander Kasiukov <kasiuka@sunysuffolk.edu>

These functions express probability distributions 
    in terms of the special functions defined in the file "special.js"

Depends on: "common.js", "special.js"

*/


//---------------------------------------NORMAL-----------------------------------

function cumulativeNormal( givenZ, givenMean, givenDeviation )
{
    if( givenDeviation <= 0 ) alert( "INVALID INPUT: Standard deviation of normal distribution must be positive!" );
    var standardZ = standardize( givenZ, givenMean, givenDeviation );
    var root2 = Math.sqrt( 2 );
    return ( 1 + errorFunction( standardZ / root2 )    ) / 2;
}
function standardize( givenZ, givenMean, givenDeviation )
{
    return ( givenZ - givenMean ) / givenDeviation;
}
var cumulativeStandardNormal = curryFirst( cumulativeNormal, [ 0, 1 ] );

function twoTailStandardNormal( givenZ )
{
    var leftTail = - Math.abs( givenZ );
    return 2 * cumulativeStandardNormal( leftTail );
}
var inverseTwoTailStandardNormal = invertFunction( twoTailStandardNormal );


//---------------------------------------STUDENT'S T-----------------------------------

function cumulativeStudent( givenT, givenD )
{
    var myX = givenD / ( givenD + givenT * givenT );
    if( givenT > 0 ) return 1 - incompleteBeta( myX, givenD / 2, 1 / 2 ) / 2;
    else return incompleteBeta( myX, givenD / 2, 1 / 2 ) / 2;
}
function twoTailStudent( givenT, givenD )
{
    var leftTail = - Math.abs( givenT );
    return 2 * cumulativeStudent( leftTail, givenD );

    // same as
    // var myX = givenD / ( givenD + givenT * givenT );
    // return incompleteBeta( myX, givenD / 2, 1 / 2 );
}
function inverseTwoTailStudent( givenP, givenD ) 
{ 
    var myFunc = invertFunction( curryFirst( twoTailStudent, [ givenD ] ) );
    return myFunc( givenP );
}


//---------------------------------------CHI SQUARE-----------------------------------

function cumulativeChiSquare( givenChi, givenD )
{
    if( givenD <= 0 ) alert( "INVALID INPUT: Degrees of freedom for Chi Square distribution must be a positive integer!" );
    if( givenChi <= 0 ) return 0;
    return lowerReducedGamma( givenD / 2, givenChi / 2 );
}
function rightTailChiSquare( givenChi, givenD )
{
    return 1 - cumulativeChiSquare( givenChi, givenD );
}
function inverseRightTailChiSquare( givenP, givenD ) 
{ 
    var myFunc = invertFunction( curryFirst( rightTailChiSquare, [ givenD ] ) );
    return myFunc( givenP );
}


//---------------------------------------FISHER'S F-----------------------------------

function cumulativeFisher( givenF, givenD1, givenD2 )
{   
    if( givenF <= 0 ) return 0;
    var myX = givenF * givenD1 / ( givenF * givenD1 + givenD2 );
    return incompleteBeta( myX, givenD1 / 2, givenD2 / 2 );
}
function rightTailFisher( givenF, givenD1, givenD2 )
{
    return 1 - cumulativeFisher( givenF, givenD1, givenD2 );
}
function inverseRightTailFisher( givenP, givenD1, givenD2 ) 
{ 
    var myFunc = invertFunction( curryFirst( rightTailFisher, [ givenD1, givenD2 ] ) );
    return myFunc( givenP );
}
