12281 lines
338 KiB
JavaScript
12281 lines
338 KiB
JavaScript
/*
|
||
* (c) Copyright Ascensio System SIA 2010-2024
|
||
*
|
||
* This program is a free software product. You can redistribute it and/or
|
||
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
||
* version 3 as published by the Free Software Foundation. In accordance with
|
||
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
||
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
||
* of any third-party rights.
|
||
*
|
||
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
||
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||
*
|
||
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
|
||
* street, Riga, Latvia, EU, LV-1050.
|
||
*
|
||
* The interactive user interfaces in modified source and object code versions
|
||
* of the Program must display Appropriate Legal Notices, as required under
|
||
* Section 5 of the GNU AGPL version 3.
|
||
*
|
||
* Pursuant to Section 7(b) of the License you must retain the original Product
|
||
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
||
* grant you any rights under trademark law for use of our trademarks.
|
||
*
|
||
* All the Product's GUI elements, including illustrations and icon sets, as
|
||
* well as technical writing content are licensed under the terms of the
|
||
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
||
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||
*
|
||
*/
|
||
|
||
"use strict";
|
||
|
||
(/**
|
||
* @param {Window} window
|
||
* @param {undefined} undefined
|
||
*/
|
||
function (window, undefined) {
|
||
var cDate = Asc.cDate;
|
||
var fSortAscending = AscCommon.fSortAscending;
|
||
var gc_nMaxRow0 = AscCommon.gc_nMaxRow0;
|
||
var gc_nMaxCol0 = AscCommon.gc_nMaxCol0;
|
||
|
||
var cElementType = AscCommonExcel.cElementType;
|
||
var cErrorType = AscCommonExcel.cErrorType;
|
||
var cNumber = AscCommonExcel.cNumber;
|
||
var cString = AscCommonExcel.cString;
|
||
var cBool = AscCommonExcel.cBool;
|
||
var cError = AscCommonExcel.cError;
|
||
var cArea = AscCommonExcel.cArea;
|
||
var cArea3D = AscCommonExcel.cArea3D;
|
||
var cRef = AscCommonExcel.cRef;
|
||
var cRef3D = AscCommonExcel.cRef3D;
|
||
var cEmpty = AscCommonExcel.cEmpty;
|
||
var cArray = AscCommonExcel.cArray;
|
||
var cBaseFunction = AscCommonExcel.cBaseFunction;
|
||
var checkTypeCell = AscCommonExcel.checkTypeCell;
|
||
var cFormulaFunctionGroup = AscCommonExcel.cFormulaFunctionGroup;
|
||
var argType = Asc.c_oAscFormulaArgumentType;
|
||
|
||
var _func = AscCommonExcel._func;
|
||
var matching = AscCommonExcel.matching;
|
||
var getMatchingFunction = AscCommonExcel.getMatchingFunction;
|
||
|
||
var maxGammaArgument = 171.624376956302;
|
||
|
||
var g_cCharDelimiter = AscCommon.g_cCharDelimiter;
|
||
|
||
cFormulaFunctionGroup['Statistical'] = cFormulaFunctionGroup['Statistical'] || [];
|
||
cFormulaFunctionGroup['Statistical'].push(cAVEDEV, cAVERAGE, cAVERAGEA, cAVERAGEIF, cAVERAGEIFS, cBETADIST,
|
||
cBETA_DIST, cBETA_INV, cBETAINV, cBINOMDIST, cBINOM_DIST, cBINOM_DIST_RANGE, cBINOM_INV, cCHIDIST, cCHIINV, cCHISQ_DIST,
|
||
cCHISQ_DIST_RT, cCHISQ_INV, cCHISQ_INV_RT, cCHITEST, cCHISQ_TEST, cCONFIDENCE, cCONFIDENCE_NORM, cCONFIDENCE_T,
|
||
cCORREL, cCOUNT, cCOUNTA, cCOUNTBLANK, cCOUNTIF, cCOUNTIFS, cCOVAR, cCOVARIANCE_P, cCOVARIANCE_S, cCRITBINOM,
|
||
cDEVSQ, cEXPON_DIST, cEXPONDIST, cF_DIST, cFDIST, cF_DIST_RT, cF_INV, cFINV, cF_INV_RT, cFISHER, cFISHERINV,
|
||
cFORECAST, cFORECAST_ETS, cFORECAST_ETS_CONFINT, cFORECAST_ETS_SEASONALITY, cFORECAST_ETS_STAT,
|
||
cFORECAST_LINEAR, cFREQUENCY, cFTEST, cF_TEST, cGAMMA, cGAMMA_DIST, cGAMMADIST, cGAMMA_INV, cGAMMAINV, cGAMMALN,
|
||
cGAMMALN_PRECISE, cGAUSS, cGEOMEAN, cGROWTH, cHARMEAN, cHYPGEOMDIST, cHYPGEOM_DIST, cINTERCEPT, cKURT, cLARGE,
|
||
cLINEST, cLOGEST, cLOGINV, cLOGNORM_DIST, cLOGNORM_INV, cLOGNORMDIST, cMAX, cMAXA, cMAXIFS, cMEDIAN, cMIN,
|
||
cMINA, cMINIFS, cMODE, cMODE_MULT, cMODE_SNGL, cNEGBINOMDIST, cNEGBINOM_DIST, cNORMDIST, cNORM_DIST, cNORMINV,
|
||
cNORM_INV, cNORMSDIST, cNORM_S_DIST, cNORMSINV, cNORM_S_INV, cPEARSON, cPERCENTILE, cPERCENTILE_EXC,
|
||
cPERCENTILE_INC, cPERCENTRANK, cPERCENTRANK_EXC, cPERCENTRANK_INC, cPERMUT, cPERMUTATIONA, cPHI, cPOISSON,
|
||
cPOISSON_DIST, cPROB, cQUARTILE, cQUARTILE_EXC, cQUARTILE_INC, cRANK, cRANK_AVG, cRANK_EQ, cRSQ, cSKEW, cSKEW_P,
|
||
cSLOPE, cSMALL, cSTANDARDIZE, cSTDEV, cSTDEV_S, cSTDEVA, cSTDEVP, cSTDEV_P, cSTDEVPA, cSTEYX, cTDIST, cT_DIST,
|
||
cT_DIST_2T, cT_DIST_RT, cT_INV, cT_INV_2T, cTINV, cTREND, cTRIMMEAN, cTTEST, cT_TEST, cVAR, cVARA, cVARP,
|
||
cVAR_P, cVAR_S, cVARPA, cWEIBULL, cWEIBULL_DIST, cZTEST, cZ_TEST);
|
||
|
||
function integralPhi(x) { // Using gauss(x)+0.5 has severe cancellation errors for x<-4
|
||
return 0.5 * AscCommonExcel.rtl_math_erfc(-x * 0.7071067811865475); // * 1/sqrt(2)
|
||
}
|
||
|
||
function phi(x) {
|
||
return 0.39894228040143268 * Math.exp(-(x * x) / 2);
|
||
}
|
||
|
||
function gauss(x) {
|
||
var t0 = [0.39894228040143268, -0.06649038006690545, 0.00997355701003582, -0.00118732821548045,
|
||
0.00011543468761616, -0.00000944465625950, 0.00000066596935163, -0.00000004122667415, 0.00000000227352982,
|
||
0.00000000011301172, 0.00000000000511243, -0.00000000000021218],
|
||
t2 = [0.47724986805182079, 0.05399096651318805, -0.05399096651318805, 0.02699548325659403,
|
||
-0.00449924720943234, -0.00224962360471617, 0.00134977416282970, -0.00011783742691370,
|
||
-0.00011515930357476, 0.00003704737285544, 0.00000282690796889, -0.00000354513195524,
|
||
0.00000037669563126, 0.00000019202407921, -0.00000005226908590, -0.00000000491799345,
|
||
0.00000000366377919, -0.00000000015981997, -0.00000000017381238, 0.00000000002624031,
|
||
0.00000000000560919, -0.00000000000172127, -0.00000000000008634, 0.00000000000007894],
|
||
t4 = [0.49996832875816688, 0.00013383022576489, -0.00026766045152977, 0.00033457556441221,
|
||
-0.00028996548915725, 0.00018178605666397, -0.00008252863922168, 0.00002551802519049,
|
||
-0.00000391665839292, -0.00000074018205222, 0.00000064422023359, -0.00000017370155340,
|
||
0.00000000909595465, 0.00000000944943118, -0.00000000329957075, 0.00000000029492075,
|
||
0.00000000011874477, -0.00000000004420396, 0.00000000000361422, 0.00000000000143638,
|
||
-0.00000000000045848];
|
||
var asympt = [-1, 1, -3, 15, -105], xabs = Math.abs(x), xshort = Math.floor(xabs), nval = 0;
|
||
if (xshort == 0) {
|
||
nval = taylor(t0, 11, (xabs * xabs)) * xabs;
|
||
} else if ((xshort >= 1) && (xshort <= 2)) {
|
||
nval = taylor(t2, 23, (xabs - 2));
|
||
} else if ((xshort >= 3) && (xshort <= 4)) {
|
||
nval = taylor(t4, 20, (xabs - 4));
|
||
} else {
|
||
nval = 0.5 + phi(xabs) * taylor(asympt, 4, 1 / (xabs * xabs)) / xabs;
|
||
}
|
||
if (x < 0) {
|
||
return -nval;
|
||
} else {
|
||
return nval;
|
||
}
|
||
}
|
||
|
||
function taylor(pPolynom, nMax, x) {
|
||
var nVal = pPolynom[nMax];
|
||
for (var i = nMax - 1; i >= 0; i--) {
|
||
nVal = pPolynom[i] + (nVal * x);
|
||
}
|
||
return nVal;
|
||
}
|
||
|
||
function gaussinv(x) {
|
||
var q, t, z;
|
||
|
||
q = x - 0.5;
|
||
|
||
if (Math.abs(q) <= .425) {
|
||
t = 0.180625 - q * q;
|
||
z = q * (
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
t * 2509.0809287301226727 + 33430.575583588128105
|
||
) * t + 67265.770927008700853
|
||
) * t + 45921.953931549871457
|
||
) * t + 13731.693765509461125
|
||
) * t + 1971.5909503065514427
|
||
) * t + 133.14166789178437745
|
||
) * t + 3.387132872796366608
|
||
) / (
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
t * 5226.495278852854561 + 28729.085735721942674
|
||
) * t + 39307.89580009271061
|
||
) * t + 21213.794301586595867
|
||
) * t + 5394.1960214247511077
|
||
) * t + 687.1870074920579083
|
||
) * t + 42.313330701600911252
|
||
) * t + 1
|
||
);
|
||
} else {
|
||
if (q > 0) {
|
||
t = 1 - x;
|
||
} else {
|
||
t = x;
|
||
}
|
||
|
||
t = Math.sqrt(-Math.log(t));
|
||
|
||
if (t <= 5) {
|
||
t += -1.6;
|
||
z = (
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
t * 7.7454501427834140764e-4 + 0.0227238449892691845833
|
||
) * t + 0.24178072517745061177
|
||
) * t + 1.27045825245236838258
|
||
) * t + 3.64784832476320460504
|
||
) * t + 5.7694972214606914055
|
||
) * t + 4.6303378461565452959
|
||
) * t + 1.42343711074968357734
|
||
) / (
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
t * 1.05075007164441684324e-9 + 5.475938084995344946e-4
|
||
) * t + 0.0151986665636164571966
|
||
) * t + 0.14810397642748007459
|
||
) * t + 0.68976733498510000455
|
||
) * t + 1.6763848301838038494
|
||
) * t + 2.05319162663775882187
|
||
) * t + 1
|
||
);
|
||
} else {
|
||
t += -5;
|
||
z = (
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
t * 2.01033439929228813265e-7 + 2.71155556874348757815e-5
|
||
) * t + 0.0012426609473880784386
|
||
) * t + 0.026532189526576123093
|
||
) * t + 0.29656057182850489123
|
||
) * t + 1.7848265399172913358
|
||
) * t + 5.4637849111641143699
|
||
) * t + 6.6579046435011037772
|
||
) / (
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
(
|
||
t * 2.04426310338993978564e-15 + 1.4215117583164458887e-7
|
||
) * t + 1.8463183175100546818e-5
|
||
) * t + 7.868691311456132591e-4
|
||
) * t + 0.0148753612908506148525
|
||
) * t + 0.13692988092273580531
|
||
) * t + 0.59983220655588793769
|
||
) * t + 1
|
||
);
|
||
}
|
||
|
||
if (q < 0) {
|
||
z = -z;
|
||
}
|
||
}
|
||
|
||
return z;
|
||
}
|
||
|
||
function getLanczosSum(fZ) {
|
||
var num = [23531376880.41075968857200767445163675473, 42919803642.64909876895789904700198885093,
|
||
35711959237.35566804944018545154716670596, 17921034426.03720969991975575445893111267,
|
||
6039542586.35202800506429164430729792107, 1439720407.311721673663223072794912393972,
|
||
248874557.8620541565114603864132294232163, 31426415.58540019438061423162831820536287,
|
||
2876370.628935372441225409051620849613599, 186056.2653952234950402949897160456992822,
|
||
8071.672002365816210638002902272250613822, 210.8242777515793458725097339207133627117,
|
||
2.506628274631000270164908177133837338626],
|
||
denom = [0, 39916800, 120543840, 150917976, 105258076, 45995730, 13339535, 2637558, 357423, 32670, 1925, 66,
|
||
1];
|
||
// Horner scheme
|
||
var sumNum, sumDenom, i, zInv;
|
||
if (fZ <= 1) {
|
||
sumNum = num[12];
|
||
sumDenom = denom[12];
|
||
for (i = 11; i >= 0; --i) {
|
||
sumNum *= fZ;
|
||
sumNum += num[i];
|
||
sumDenom *= fZ;
|
||
sumDenom += denom[i];
|
||
}
|
||
} else
|
||
// Cancel down with fZ^12; Horner scheme with reverse coefficients
|
||
{
|
||
zInv = 1 / fZ;
|
||
sumNum = num[0];
|
||
sumDenom = denom[0];
|
||
for (i = 1; i <= 12; ++i) {
|
||
sumNum *= zInv;
|
||
sumNum += num[i];
|
||
sumDenom *= zInv;
|
||
sumDenom += denom[i];
|
||
}
|
||
}
|
||
return sumNum / sumDenom;
|
||
}
|
||
|
||
/** You must ensure fZ>0; fZ>171.624376956302 will overflow. */
|
||
function getGammaHelper(fZ) {
|
||
var gamma = getLanczosSum(fZ), fg = 6.024680040776729583740234375, zgHelp = fZ + fg - 0.5;
|
||
// avoid intermediate overflow
|
||
var halfpower = Math.pow(zgHelp, fZ / 2 - 0.25);
|
||
gamma *= halfpower;
|
||
gamma /= Math.exp(zgHelp);
|
||
gamma *= halfpower;
|
||
if (fZ <= 20 && fZ == Math.floor(fZ)) {
|
||
gamma = Math.round(gamma);
|
||
}
|
||
return gamma;
|
||
}
|
||
|
||
/** You must ensure fZ>0 */
|
||
function getLogGammaHelper(fZ) {
|
||
var _fg = 6.024680040776729583740234375, zgHelp = fZ + _fg - 0.5;
|
||
return Math.log(getLanczosSum(fZ)) + (fZ - 0.5) * Math.log(zgHelp) - zgHelp;
|
||
}
|
||
|
||
function getLogGamma(fZ) {
|
||
if (fZ >= maxGammaArgument) {
|
||
return getLogGammaHelper(fZ);
|
||
}
|
||
if (fZ >= 0) {
|
||
return Math.log(getGammaHelper(fZ));
|
||
}
|
||
if (fZ >= 0.5) {
|
||
return Math.log(getGammaHelper(fZ + 1) / fZ);
|
||
}
|
||
return getLogGammaHelper(fZ + 2) - Math.log(fZ + 1) - Math.log(fZ);
|
||
}
|
||
|
||
function getPercentile(values, alpha, isSorted) {
|
||
values = isSorted ? values : values.sort(fSortAscending);
|
||
|
||
var nSize = values.length;
|
||
if (nSize === 0) {
|
||
return new cError(cErrorType.not_available);
|
||
} else {
|
||
if (nSize === 1) {
|
||
return new cNumber(values[0]);
|
||
} else {
|
||
var nIndex = Math.floor(alpha * (nSize - 1));
|
||
var fDiff = alpha * (nSize - 1) - Math.floor(alpha * (nSize - 1));
|
||
if (fDiff === 0.0) {
|
||
return new cNumber(values[nIndex]);
|
||
} else {
|
||
return new cNumber(values[nIndex] + fDiff * (values[nIndex + 1] - values[nIndex]));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
function getPercentileExclusive(values, alpha, isSorted) {
|
||
values = isSorted ? values : values.sort(fSortAscending);
|
||
|
||
var nSize1 = values.length + 1;
|
||
if (nSize1 == 1) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
if (alpha * nSize1 < 1 || alpha * nSize1 > nSize1 - 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var nIndex = Math.floor(alpha * nSize1 - 1);
|
||
var fDiff = alpha * nSize1 - 1 - Math.floor(alpha * nSize1 - 1);
|
||
if (fDiff === 0.0) {
|
||
return new cNumber(values[nIndex]);
|
||
} else {
|
||
return new cNumber(values[nIndex] + fDiff * (values[nIndex + 1] - values[nIndex]));
|
||
}
|
||
}
|
||
|
||
function percentrank(tA, fNum, k, bInclusive) {
|
||
|
||
tA.sort(fSortAscending);
|
||
|
||
var nSize = tA.length;
|
||
if (k < 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else if (tA.length < 1 || nSize === 0) {
|
||
return new cError(cErrorType.not_available);
|
||
} else {
|
||
if (fNum < tA[0] || fNum > tA[nSize - 1]) {
|
||
return new cError(cErrorType.not_available);
|
||
} else if (nSize === 1) {
|
||
return new cNumber(1);
|
||
} else {
|
||
|
||
if (fNum === tA[0]) {
|
||
if (bInclusive) {
|
||
fRes = 0;
|
||
} else {
|
||
fRes = 1 / (nSize + 1);
|
||
}
|
||
} else {
|
||
var fRes, nOldCount = 0, fOldVal = tA[0], i;
|
||
for (i = 1; i < nSize && tA[i] < fNum; i++) {
|
||
if (tA[i] !== fOldVal) {
|
||
nOldCount = i;
|
||
fOldVal = tA[i];
|
||
}
|
||
}
|
||
if (tA[i] !== fOldVal) {
|
||
nOldCount = i;
|
||
}
|
||
if (fNum === tA[i]) {
|
||
if (bInclusive) {
|
||
fRes = nOldCount / (nSize - 1);
|
||
} else {
|
||
fRes = (i + 1) / (nSize + 1);
|
||
}
|
||
} else {
|
||
if (nOldCount === 0) {
|
||
fRes = 0;
|
||
} else {
|
||
var fFract = (fNum - tA[nOldCount - 1]) / (tA[nOldCount] - tA[nOldCount - 1]);
|
||
|
||
if (bInclusive) {
|
||
fRes = (nOldCount - 1 + fFract) / (nSize - 1);
|
||
} else {
|
||
fRes = (nOldCount + fFract) / (nSize + 1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return new cNumber(fRes.toString().substr(0, fRes.toString().indexOf(".") + 1 + k) - 0);
|
||
}
|
||
}
|
||
}
|
||
|
||
function getMedian(rArray) {
|
||
rArray.sort(fSortAscending);
|
||
|
||
var nSize = rArray.length;
|
||
if (nSize == 0) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (nSize % 2 === 0) {
|
||
return new cNumber((rArray[nSize / 2 - 1] + rArray[nSize / 2]) / 2);
|
||
} else {
|
||
return new cNumber(rArray[(nSize - 1) / 2]);
|
||
}
|
||
}
|
||
|
||
function getGamma(fZ) {
|
||
var fLogPi = Math.log(Math.PI);
|
||
var fLogDblMax = Math.log(2.22507e+308);
|
||
|
||
if (fZ > maxGammaArgument) {
|
||
//SetError(FormulaError::IllegalFPOperation);
|
||
//return HUGE_VAL;
|
||
return;
|
||
}
|
||
|
||
if (fZ >= 1.0) {
|
||
return getGammaHelper(fZ);
|
||
}
|
||
|
||
if (fZ >= 0.5) {
|
||
return getGammaHelper(fZ + 1) / fZ;
|
||
}
|
||
|
||
if (fZ >= -0.5) {
|
||
var fLogTest = getLogGammaHelper(fZ + 2) - Math.log1p(fZ) - Math.log(Math.abs(fZ));
|
||
if (fLogTest >= fLogDblMax) {
|
||
//SetError(FormulaError::IllegalFPOperation);
|
||
//return HUGE_VAL;
|
||
return;
|
||
}
|
||
return getGammaHelper(fZ + 2) / (fZ + 1) / fZ;
|
||
}
|
||
|
||
var fLogDivisor = getLogGammaHelper(1 - fZ) + Math.log(Math.abs(Math.sin(Math.PI * fZ)));
|
||
if (fLogDivisor - fLogPi >= fLogDblMax) {
|
||
return 0;
|
||
}
|
||
|
||
if (fLogDivisor < 0) {
|
||
if (fLogPi - fLogDivisor > fLogDblMax) {
|
||
//SetError(FormulaError::IllegalFPOperation);
|
||
//return HUGE_VAL;
|
||
return;
|
||
}
|
||
}
|
||
|
||
return Math.exp(fLogPi - fLogDivisor) * ((Math.sin(Math.PI * fZ) < 0) ? -1 : 1);
|
||
}
|
||
|
||
function getGammaDist(fX, fAlpha, fLambda) {
|
||
if (fX <= 0) {
|
||
return 0;
|
||
} else {
|
||
return GetLowRegIGamma(fAlpha, fX / fLambda);
|
||
}
|
||
}
|
||
|
||
function GetLowRegIGamma(fA, fX) {
|
||
var fLnFactor = fA * Math.log(fX) - fX - getLogGamma(fA);
|
||
var fFactor = Math.exp(fLnFactor);
|
||
|
||
if (fX > fA + 1) {
|
||
return 1 - fFactor * getGammaContFraction(fA, fX);
|
||
} else {
|
||
return fFactor * getGammaSeries(fA, fX);
|
||
}
|
||
}
|
||
|
||
function getGammaContFraction(fA, fX) {
|
||
var fBigInv = 2.22045e-016;//epsilon
|
||
var fHalfMachEps = fBigInv / 2;
|
||
var fBig = 1 / fBigInv;
|
||
var fCount = 0;
|
||
var fY = 1 - fA;
|
||
var fDenom = fX + 2 - fA;
|
||
var fPkm1 = fX + 1;
|
||
var fPkm2 = 1;
|
||
var fQkm1 = fDenom * fX;
|
||
var fQkm2 = fX;
|
||
var fApprox = fPkm1 / fQkm1;
|
||
var bFinished = false;
|
||
|
||
do {
|
||
fCount = fCount + 1;
|
||
fY = fY + 1;
|
||
var fNum = fY * fCount;
|
||
fDenom = fDenom + 2;
|
||
var fPk = fPkm1 * fDenom - fPkm2 * fNum;
|
||
var fQk = fQkm1 * fDenom - fQkm2 * fNum;
|
||
if (fQk !== 0) {
|
||
var fR = fPk / fQk;
|
||
bFinished = (Math.abs((fApprox - fR) / fR) <= fHalfMachEps);
|
||
fApprox = fR;
|
||
}
|
||
fPkm2 = fPkm1;
|
||
fPkm1 = fPk;
|
||
fQkm2 = fQkm1;
|
||
fQkm1 = fQk;
|
||
if (Math.abs(fPk) > fBig) {
|
||
// reduce a fraction does not change the value
|
||
fPkm2 = fPkm2 * fBigInv;
|
||
fPkm1 = fPkm1 * fBigInv;
|
||
fQkm2 = fQkm2 * fBigInv;
|
||
fQkm1 = fQkm1 * fBigInv;
|
||
}
|
||
} while (!bFinished && fCount < 10000);
|
||
|
||
if (!bFinished) {
|
||
//SetError(FormulaError::NoConvergence);
|
||
return;
|
||
}
|
||
return fApprox;
|
||
}
|
||
|
||
function getGammaSeries(fA, fX) {
|
||
var fHalfMachEps = 2.22045e-016 / 2;
|
||
var fDenomfactor = fA;
|
||
var fSummand = 1 / fA;
|
||
var fSum = fSummand;
|
||
var nCount = 1;
|
||
do {
|
||
fDenomfactor = fDenomfactor + 1;
|
||
fSummand = fSummand * fX / fDenomfactor;
|
||
fSum = fSum + fSummand;
|
||
nCount = nCount + 1;
|
||
} while (fSummand / fSum > fHalfMachEps && nCount <= 10000);
|
||
|
||
if (nCount > 10000) {
|
||
//SetError(FormulaError::NoConvergence);
|
||
return;
|
||
}
|
||
|
||
return fSum;
|
||
}
|
||
|
||
function getGammaDistPDF(fX, fAlpha, fLambda) {
|
||
if (fX < 0) {
|
||
return 0;
|
||
} else if (fX === 0) {
|
||
if (fAlpha < 1.0) {
|
||
//SetError(FormulaError::DivisionByZero); // should be #DIV/0
|
||
//return HUGE_VAL;
|
||
return;
|
||
} else if (fAlpha === 1) {
|
||
return (1 / fLambda);
|
||
} else {
|
||
return 0;
|
||
}
|
||
} else {
|
||
var fXr = fX / fLambda;
|
||
|
||
if (fXr > 1) {
|
||
var fLogDblMax = Math.log(2.22507e+308);
|
||
|
||
if (Math.log(fXr) * (fAlpha - 1) < fLogDblMax && fAlpha < maxGammaArgument) {
|
||
return Math.pow(fXr, fAlpha - 1) * Math.exp(-fXr) / fLambda / getGamma(fAlpha);
|
||
} else {
|
||
return Math.exp((fAlpha - 1) * Math.log(fXr) - fXr - Math.log(fLambda) - getLogGamma(fAlpha));
|
||
}
|
||
} else {
|
||
if (fAlpha < maxGammaArgument) {
|
||
return Math.pow(fXr, fAlpha - 1) * Math.exp(-fXr) / fLambda / getGamma(fAlpha);
|
||
} else {
|
||
return Math.pow(fXr, fAlpha - 1) * Math.exp(-fXr) / fLambda / Math.exp(getLogGamma(fAlpha));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
function getChiDist(fX, fDF) {
|
||
if (fX <= 0.0) {
|
||
return 1.0;
|
||
} else {
|
||
return getUpRegIGamma(fDF / 2.0, fX / 2.0);
|
||
}
|
||
}
|
||
|
||
function getUpRegIGamma(fA, fX) {
|
||
var fLnFactor = fA * Math.log(fX) - fX - getLogGamma(fA);
|
||
var fFactor = Math.exp(fLnFactor);
|
||
if (fX > fA + 1) {
|
||
return fFactor * getGammaContFraction(fA, fX);
|
||
} else {
|
||
return 1 - fFactor * getGammaSeries(fA, fX);
|
||
}
|
||
}
|
||
|
||
function getChiSqDistCDF(fX, fDF) {
|
||
if (fX <= 0) {
|
||
return 0;
|
||
} else {
|
||
return GetLowRegIGamma(fDF / 2, fX / 2);
|
||
}
|
||
}
|
||
|
||
function getChiSqDistPDF(fX, fDF) {
|
||
var fValue;
|
||
if (fX <= 0) {
|
||
return 0;
|
||
}
|
||
if (fDF * fX > 1391000) {
|
||
fValue = Math.exp((0.5 * fDF - 1) * Math.log(fX * 0.5) - 0.5 * fX - Math.log(2) - getLogGamma(0.5 * fDF));
|
||
} else {
|
||
var fCount;
|
||
if (Math.fmod(fDF, 2) < 0.5) {
|
||
fValue = 0.5;
|
||
fCount = 2;
|
||
} else {
|
||
fValue = 1 / Math.sqrt(fX * 2 * Math.PI);
|
||
fCount = 1;
|
||
}
|
||
|
||
while (fCount < fDF) {
|
||
fValue *= (fX / fCount);
|
||
fCount += 2;
|
||
}
|
||
if (fX >= 1425) {
|
||
fValue = Math.exp(Math.log(fValue) - fX / 2);
|
||
} else {
|
||
fValue *= Math.exp(-fX / 2);
|
||
}
|
||
}
|
||
return fValue;
|
||
}
|
||
|
||
function chiTest(pMat1, pMat2) {
|
||
if (!pMat1 || !pMat2) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
var nC1 = pMat1.length;
|
||
var nC2 = pMat2.length;
|
||
var nR1 = pMat1[0].length;
|
||
var nR2 = pMat2[0].length;
|
||
|
||
if (nR1 !== nR2 || nC1 !== nC2) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
var fChi = 0.0;
|
||
var bEmpty = true;
|
||
for (var i = 0; i < nC1; i++) {
|
||
for (var j = 0; j < nR1; j++) {
|
||
if (pMat1[i][j] && pMat2[i][j]) {
|
||
bEmpty = false;
|
||
|
||
//MS выдает ошибку только если первый элемент строка. LO - если любой.
|
||
if (i === 0 && j === 0 && cElementType.string === pMat1[i][j].type) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
if (cElementType.number !== pMat1[i][j].type || cElementType.number !== pMat2[i][j].type) {
|
||
continue;
|
||
}
|
||
|
||
var fValX = pMat1[i][j].getValue();
|
||
var fValE = pMat2[i][j].getValue();
|
||
if (fValE === 0.0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
var fTemp1 = (fValX - fValE) * (fValX - fValE);
|
||
var fTemp2 = fTemp1;
|
||
fChi += fTemp2 / fValE;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (bEmpty) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
var fDF;
|
||
if (nC1 === 1 || nR1 === 1) {
|
||
fDF = nC1 * nR1 - 1;
|
||
if (fDF === 0) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
} else {
|
||
fDF = (nC1 - 1) * (nR1 - 1);
|
||
}
|
||
|
||
if (fDF < 1 || fChi < 0 || fDF > Math.pow(10, 10)) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = getChiDist(fChi, fDF);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
function tTest(pMat1, pMat2, fTails, fTyp) {
|
||
var fT, fF;
|
||
var nC1 = pMat1.length;
|
||
var nC2 = pMat2.length;
|
||
var nR1 = pMat1[0].length;
|
||
var nR2 = pMat2[0].length;
|
||
|
||
var calcTest = null;
|
||
if (fTyp === 1.0) {
|
||
if (nC1 !== nC2 || nR1 !== nR2) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
var fCount = 0.0;
|
||
var fSum1 = 0.0;
|
||
var fSum2 = 0.0;
|
||
var fSumSqrD = 0.0;
|
||
var fVal1, fVal2;
|
||
for (var i = 0; i < nC1; i++) {
|
||
for (var j = 0; j < nR1; j++) {
|
||
if (cElementType.number !== pMat1[i][j].type || cElementType.number !== pMat2[i][j].type) {
|
||
continue;
|
||
}
|
||
|
||
fVal1 = pMat1[i][j].getValue();
|
||
fVal2 = pMat2[i][j].getValue();
|
||
fSum1 += fVal1;
|
||
fSum2 += fVal2;
|
||
fSumSqrD += (fVal1 - fVal2) * (fVal1 - fVal2);
|
||
fCount++;
|
||
}
|
||
}
|
||
|
||
if (fCount < 1.0) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
var fSumD = fSum1 - fSum2;
|
||
var fDivider = (fCount * fSumSqrD - fSumD * fSumD);
|
||
if (fDivider === 0.0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
fT = Math.abs(fSumD) * Math.sqrt((fCount - 1.0) / fDivider);
|
||
fF = fCount - 1.0;
|
||
} else if (fTyp === 2.0) {
|
||
calcTest = CalculateTest(false, nC1, nC2, nR1, nR2, pMat1, pMat2, fT, fF);
|
||
} else if (fTyp === 3.0) {
|
||
calcTest = CalculateTest(true, nC1, nC2, nR1, nR2, pMat1, pMat2, fT, fF);
|
||
} else {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
if (null !== calcTest) {
|
||
if (false === calcTest) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
fT = calcTest.fT;
|
||
fF = calcTest.fF;
|
||
}
|
||
}
|
||
|
||
var res = getTDist(fT, fF, fTails);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
function fTest(pMat1, pMat2) {
|
||
|
||
var getMatrixValues = function (matrix) {
|
||
var mfFirst = 1;
|
||
var mfFirstSqr = 1;
|
||
var mfRest = 0;
|
||
var mfRestSqr = 0;
|
||
var mnCount = 0;
|
||
var bFirst = false;
|
||
for (var i = 0; i < matrix.length; i++) {
|
||
for (var j = 0; j < matrix[i].length; j++) {
|
||
if (cElementType.number !== matrix[i][j].type) {
|
||
continue;
|
||
}
|
||
mnCount++;
|
||
if (!bFirst) {
|
||
bFirst = true;
|
||
mfFirst = matrix[i][j].getValue();
|
||
mfFirstSqr = matrix[i][j].getValue() * matrix[i][j].getValue();
|
||
continue;
|
||
}
|
||
|
||
mfRest += matrix[i][j].getValue();
|
||
mfRestSqr += matrix[i][j].getValue() * matrix[i][j].getValue();
|
||
}
|
||
}
|
||
return {mfFirst: mfFirst, mfRest: mfRest, mfRestSqr: mfRestSqr, mnCount: mnCount, mfFirstSqr: mfFirstSqr};
|
||
};
|
||
|
||
var matVals1 = getMatrixValues(pMat1);
|
||
var fSum1 = matVals1.mfFirst + matVals1.mfRest;
|
||
var fSumSqr1 = matVals1.mfFirstSqr + matVals1.mfRestSqr;
|
||
var fCount1 = matVals1.mnCount;
|
||
|
||
var matVals2 = getMatrixValues(pMat2);
|
||
var fSum2 = matVals2.mfFirst + matVals2.mfRest;
|
||
var fSumSqr2 = matVals2.mfFirstSqr + matVals2.mfRestSqr;
|
||
var fCount2 = matVals2.mnCount;
|
||
|
||
if (fCount1 < 2.0 || fCount2 < 2.0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
var fS1 = (fSumSqr1 - fSum1 * fSum1 / fCount1) / (fCount1 - 1.0);
|
||
var fS2 = (fSumSqr2 - fSum2 * fSum2 / fCount2) / (fCount2 - 1.0);
|
||
if (fS1 === 0.0 || fS2 === 0.0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
var fF, fF1, fF2;
|
||
if (fS1 > fS2) {
|
||
fF = fS1 / fS2;
|
||
fF1 = fCount1 - 1.0;
|
||
fF2 = fCount2 - 1.0;
|
||
} else {
|
||
fF = fS2 / fS1;
|
||
fF1 = fCount2 - 1.0;
|
||
fF2 = fCount1 - 1.0;
|
||
}
|
||
|
||
var fFcdf = getFDist(fF, fF1, fF2);
|
||
var res = 2.0 * Math.min(fFcdf, 1.0 - fFcdf);
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
function CalculateTest(bTemplin, nC1, nC2, nR1, nR2, pMat1, pMat2, fT, fF) {
|
||
var fCount1 = 0.0;
|
||
var fCount2 = 0.0;
|
||
var fSum1 = 0.0;
|
||
var fSumSqr1 = 0.0;
|
||
var fSum2 = 0.0;
|
||
var fSumSqr2 = 0.0;
|
||
var fVal;
|
||
|
||
for (var i = 0; i < nC1; i++) {
|
||
for (var j = 0; j < nR1; j++) {
|
||
if (cElementType.string !== pMat1[i][j].type) {
|
||
fVal = pMat1[i][j].getValue();
|
||
fSum1 += fVal;
|
||
fSumSqr1 += fVal * fVal;
|
||
fCount1++;
|
||
}
|
||
}
|
||
}
|
||
|
||
for (var i = 0; i < nC2; i++) {
|
||
for (var j = 0; j < nR2; j++) {
|
||
if (cElementType.string !== pMat2[i][j].type) {
|
||
fVal = pMat2[i][j].getValue();
|
||
fSum2 += fVal;
|
||
fSumSqr2 += fVal * fVal;
|
||
fCount2++;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (fCount1 < 2.0 || fCount2 < 2.0) {
|
||
return false;
|
||
}
|
||
if (bTemplin) {
|
||
var fS1 = (fSumSqr1 - fSum1 * fSum1 / fCount1) / (fCount1 - 1.0) / fCount1;
|
||
var fS2 = (fSumSqr2 - fSum2 * fSum2 / fCount2) / (fCount2 - 1.0) / fCount2;
|
||
if (fS1 + fS2 === 0.0) {
|
||
return false;
|
||
}
|
||
|
||
var c = fS1 / (fS1 + fS2);
|
||
fT = Math.abs(fSum1 / fCount1 - fSum2 / fCount2) / Math.sqrt(fS1 + fS2);
|
||
fF = 1.0 / (c * c / (fCount1 - 1.0) + (1.0 - c) * (1.0 - c) / (fCount2 - 1.0));
|
||
} else {
|
||
var fS1 = (fSumSqr1 - fSum1 * fSum1 / fCount1) / (fCount1 - 1.0);
|
||
var fS2 = (fSumSqr2 - fSum2 * fSum2 / fCount2) / (fCount2 - 1.0);
|
||
|
||
fT =
|
||
Math.abs(fSum1 / fCount1 - fSum2 / fCount2) / Math.sqrt((fCount1 - 1.0) * fS1 + (fCount2 - 1.0) * fS2) *
|
||
Math.sqrt(fCount1 * fCount2 * (fCount1 + fCount2 - 2) / (fCount1 + fCount2));
|
||
fF = fCount1 + fCount2 - 2;
|
||
}
|
||
|
||
return {fT: fT, fF: fF};
|
||
}
|
||
|
||
//BETA DISTRIBUTION
|
||
function getBetaDist(fXin, fAlpha, fBeta) {
|
||
if (fXin <= 0) {
|
||
return 0;
|
||
}
|
||
if (fXin >= 1) {
|
||
return 1;
|
||
}
|
||
if (fBeta === 1) {
|
||
return Math.pow(fXin, fAlpha);
|
||
}
|
||
if (fAlpha === 1) {
|
||
return -Math.expm1(fBeta * Math.log1p(-fXin));
|
||
}
|
||
|
||
var fResult;
|
||
var fY = (0.5 - fXin) + 0.5;
|
||
var flnY = Math.log1p(-fXin);
|
||
var fX = fXin;
|
||
var flnX = Math.log(fXin);
|
||
var fA = fAlpha;
|
||
var fB = fBeta;
|
||
var bReflect = fXin > fAlpha / (fAlpha + fBeta);
|
||
if (bReflect) {
|
||
fA = fBeta;
|
||
fB = fAlpha;
|
||
fX = fY;
|
||
fY = fXin;
|
||
flnX = flnY;
|
||
flnY = Math.log(fXin);
|
||
}
|
||
fResult = getBetaHelperContFrac(fX, fA, fB);
|
||
fResult = fResult / fA;
|
||
var fP = fA / (fA + fB);
|
||
var fQ = fB / (fA + fB);
|
||
|
||
var fTemp;
|
||
if (fA > 1 && fB > 1 && fP < 0.97 && fQ < 0.97) {
|
||
fTemp = getBetaDistPDF(fX, fA, fB) * fX * fY;
|
||
} else {
|
||
fTemp = Math.exp(fA * flnX + fB * flnY - getLogBeta(fA, fB));
|
||
}
|
||
|
||
fResult *= fTemp;
|
||
if (bReflect) {
|
||
fResult = 0.5 - fResult + 0.5;
|
||
}
|
||
if (fResult > 1) {
|
||
fResult = 1;
|
||
}
|
||
if (fResult < 0) {
|
||
fResult = 0;
|
||
}
|
||
|
||
return fResult;
|
||
}
|
||
|
||
// beta distribution probability density function
|
||
function getTDist(T, fDF, nType) {
|
||
var res = null;
|
||
switch (nType) {
|
||
case 1: {
|
||
res = 0.5 * getBetaDist(fDF / (fDF + T * T), fDF / 2, 0.5);
|
||
break;
|
||
}
|
||
case 2: {
|
||
res = getBetaDist(fDF / (fDF + T * T), fDF / 2, 0.5);
|
||
break;
|
||
}
|
||
case 3: {
|
||
res = Math.pow(1 + (T * T / fDF), -(fDF + 1) / 2) / (Math.sqrt(fDF) * getBeta(0.5, fDF / 2.0));
|
||
break;
|
||
}
|
||
case 4: {
|
||
var X = fDF / (T * T + fDF);
|
||
var R = 0.5 * getBetaDist(X, 0.5 * fDF, 0.5);
|
||
res = (T < 0 ? R : 1 - R);
|
||
break;
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
|
||
function getBetaDistPDF(fX, fA, fB) {
|
||
// special cases
|
||
if (fA === 1) {
|
||
if (fB === 1) {
|
||
return 1;
|
||
}
|
||
if (fB === 2) {
|
||
return -2 * fX + 2;
|
||
}
|
||
if (fX === 1 && fB < 1) {
|
||
//SetError(FormulaError::IllegalArgument);
|
||
//return HUGE_VAL;
|
||
return;
|
||
}
|
||
|
||
if (fX <= 0.01) {
|
||
return fB + fB * Math.expm1((fB - 1) * Math.log1p(-fX));
|
||
} else {
|
||
return fB * Math.pow(0.5 - fX + 0.5, fB - 1);
|
||
}
|
||
}
|
||
if (fB === 1) {
|
||
if (fA === 2) {
|
||
return fA * fX;
|
||
}
|
||
if (fX === 0 && fA < 1) {
|
||
//SetError(FormulaError::IllegalArgument);
|
||
//return HUGE_VAL;
|
||
return;
|
||
}
|
||
return fA * Math.pow(fX, fA - 1);
|
||
}
|
||
if (fX <= 0) {
|
||
if (fA < 1 && fX === 0) {
|
||
//SetError(FormulaError::IllegalArgument);
|
||
//return HUGE_VAL;
|
||
return;
|
||
} else {
|
||
return 0;
|
||
}
|
||
}
|
||
if (fX >= 1) {
|
||
if (fB < 1 && fX === 1) {
|
||
//SetError(FormulaError::IllegalArgument);
|
||
//return HUGE_VAL;
|
||
return;
|
||
} else {
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
|
||
var fLogDblMax = Math.log(2.22507e+308);
|
||
var fLogDblMin = Math.log(2.22507e-308);
|
||
var fLogY = (fX < 0.1) ? Math.log1p(-fX) : Math.log(0.5 - fX + 0.5);
|
||
var fLogX = Math.log(fX);
|
||
var fAm1LogX = (fA - 1) * fLogX;
|
||
var fBm1LogY = (fB - 1) * fLogY;
|
||
var fLogBeta = getLogBeta(fA, fB);
|
||
|
||
if (fAm1LogX < fLogDblMax && fAm1LogX > fLogDblMin && fBm1LogY < fLogDblMax && fBm1LogY > fLogDblMin &&
|
||
fLogBeta < fLogDblMax && fLogBeta > fLogDblMin && fAm1LogX + fBm1LogY < fLogDblMax &&
|
||
fAm1LogX + fBm1LogY > fLogDblMin) {
|
||
return Math.pow(fX, fA - 1) * Math.pow(0.5 - fX + 0.5, fB - 1) / getBeta(fA, fB);
|
||
} else {
|
||
return Math.exp(fAm1LogX + fBm1LogY - fLogBeta);
|
||
}
|
||
}
|
||
|
||
function getBeta(fAlpha, fBeta) {
|
||
var fA;
|
||
var fB;
|
||
if (fAlpha > fBeta) {
|
||
fA = fAlpha;
|
||
fB = fBeta;
|
||
} else {
|
||
fA = fBeta;
|
||
fB = fAlpha;
|
||
}
|
||
|
||
if (fA + fB < maxGammaArgument) {
|
||
return getGamma(fA) / getGamma(fA + fB) * getGamma(fB);
|
||
}
|
||
|
||
var fg = 6.024680040776729583740234375;
|
||
var fgm = fg - 0.5;
|
||
var fLanczos = getLanczosSum(fA);
|
||
fLanczos /= getLanczosSum(fA + fB);
|
||
fLanczos *= getLanczosSum(fB);
|
||
var fABgm = fA + fB + fgm;
|
||
fLanczos *= Math.sqrt((fABgm / (fA + fgm)) / (fB + fgm));
|
||
var fTempA = fB / (fA + fgm);
|
||
var fTempB = fA / (fB + fgm);
|
||
var fResult = Math.exp(-fA * Math.log1p(fTempA) - fB * Math.log1p(fTempB) - fgm);
|
||
fResult *= fLanczos;
|
||
return fResult;
|
||
}
|
||
|
||
function getBetaHelperContFrac(fX, fA, fB) {
|
||
var a1, b1, a2, b2, fnorm, cfnew, cf;
|
||
a1 = 1;
|
||
b1 = 1;
|
||
b2 = 1 - (fA + fB) / (fA + 1) * fX;
|
||
if (b2 === 0) {
|
||
a2 = 0;
|
||
fnorm = 1;
|
||
cf = 1;
|
||
} else {
|
||
a2 = 1;
|
||
fnorm = 1 / b2;
|
||
cf = a2 * fnorm;
|
||
}
|
||
cfnew = 1;
|
||
var rm = 1;
|
||
|
||
var fMaxIter = 50000;
|
||
var fMachEps = 2.22045e-016;
|
||
var bfinished = false;
|
||
do {
|
||
var apl2m = fA + 2 * rm;
|
||
var d2m = rm * (fB - rm) * fX / ((apl2m - 1) * apl2m);
|
||
var d2m1 = -(fA + rm) * (fA + fB + rm) * fX / (apl2m * (apl2m + 1));
|
||
a1 = (a2 + d2m * a1) * fnorm;
|
||
b1 = (b2 + d2m * b1) * fnorm;
|
||
a2 = a1 + d2m1 * a2 * fnorm;
|
||
b2 = b1 + d2m1 * b2 * fnorm;
|
||
if (b2 !== 0) {
|
||
fnorm = 1 / b2;
|
||
cfnew = a2 * fnorm;
|
||
bfinished = (Math.abs(cf - cfnew) < Math.abs(cf) * fMachEps);
|
||
}
|
||
cf = cfnew;
|
||
rm += 1;
|
||
} while (rm < fMaxIter && !bfinished);
|
||
return cf;
|
||
}
|
||
|
||
function getLogBeta(fAlpha, fBeta) {
|
||
var fA;
|
||
var fB;
|
||
if (fAlpha > fBeta) {
|
||
fA = fAlpha;
|
||
fB = fBeta;
|
||
} else {
|
||
fA = fBeta;
|
||
fB = fAlpha;
|
||
}
|
||
|
||
var fg = 6.024680040776729583740234375;
|
||
var fgm = fg - 0.5;
|
||
var fLanczos = getLanczosSum(fA);
|
||
fLanczos /= getLanczosSum(fA + fB);
|
||
fLanczos *= getLanczosSum(fB);
|
||
var fLogLanczos = Math.log(fLanczos);
|
||
var fABgm = fA + fB + fgm;
|
||
fLogLanczos += 0.5 * (Math.log(fABgm) - Math.log(fA + fgm) - Math.log(fB + fgm));
|
||
var fTempA = fB / (fA + fgm);
|
||
var fTempB = fA / (fB + fgm);
|
||
var fResult = -fA * Math.log1p(fTempA) - fB * Math.log1p(fTempB) - fgm;
|
||
fResult += fLogLanczos;
|
||
return fResult;
|
||
}
|
||
|
||
function getFDist(x, fF1, fF2) {
|
||
var arg = fF2 / (fF2 + fF1 * x);
|
||
var alpha = fF2 / 2;
|
||
var beta = fF1 / 2;
|
||
return getBetaDist(arg, alpha, beta);
|
||
}
|
||
|
||
function iterateInverse(rFunction, fAx, fBx) {
|
||
var rConvError = false;
|
||
var fYEps = 1.0E-307;
|
||
var fXEps = 2.22045e-016;
|
||
|
||
var fAy = rFunction.GetValue(fAx);
|
||
var fBy = rFunction.GetValue(fBx);
|
||
var fTemp;
|
||
var nCount;
|
||
for (nCount = 0; nCount < 1000 && !hasChangeOfSign(fAy, fBy); nCount++) {
|
||
if (Math.abs(fAy) <= Math.abs(fBy)) {
|
||
fTemp = fAx;
|
||
fAx += 2 * (fAx - fBx);
|
||
if (fAx < 0) {
|
||
fAx = 0;
|
||
}
|
||
fBx = fTemp;
|
||
fBy = fAy;
|
||
fAy = rFunction.GetValue(fAx);
|
||
} else {
|
||
fTemp = fBx;
|
||
fBx += 2 * (fBx - fAx);
|
||
fAx = fTemp;
|
||
fAy = fBy;
|
||
fBy = rFunction.GetValue(fBx);
|
||
}
|
||
}
|
||
|
||
if (fAy === 0) {
|
||
return {val: fAx, bError: rConvError};
|
||
}
|
||
if (fBy === 0) {
|
||
return {val: fBx, bError: rConvError};
|
||
}
|
||
if (!hasChangeOfSign(fAy, fBy)) {
|
||
rConvError = true;
|
||
return {val: 0, bError: rConvError};
|
||
}
|
||
// inverse quadric interpolation with additional brackets
|
||
// set three points
|
||
var fPx = fAx;
|
||
var fPy = fAy;
|
||
var fQx = fBx;
|
||
var fQy = fBy;
|
||
var fRx = fAx;
|
||
var fRy = fAy;
|
||
var fSx = 0.5 * (fAx + fBx);
|
||
var bHasToInterpolate = true;
|
||
|
||
nCount = 0;
|
||
while (nCount < 500 && Math.abs(fRy) > fYEps && (fBx - fAx) > Math.max(Math.abs(fAx), Math.abs(fBx)) * fXEps) {
|
||
if (bHasToInterpolate) {
|
||
if (fPy !== fQy && fQy !== fRy && fRy !== fPy) {
|
||
fSx = fPx * fRy * fQy / (fRy - fPy) / (fQy - fPy) + fRx * fQy * fPy / (fQy - fRy) / (fPy - fRy) +
|
||
fQx * fPy * fRy / (fPy - fQy) / (fRy - fQy);
|
||
bHasToInterpolate = (fAx < fSx) && (fSx < fBx); // inside the brackets?
|
||
} else {
|
||
bHasToInterpolate = false;
|
||
}
|
||
}
|
||
if (!bHasToInterpolate) {
|
||
fSx = 0.5 * (fAx + fBx);
|
||
|
||
fQx = fBx;
|
||
fQy = fBy;
|
||
bHasToInterpolate = true;
|
||
}
|
||
|
||
fPx = fQx;
|
||
fQx = fRx;
|
||
fRx = fSx;
|
||
fPy = fQy;
|
||
fQy = fRy;
|
||
fRy = rFunction.GetValue(fSx);
|
||
|
||
if (hasChangeOfSign(fAy, fRy)) {
|
||
fBx = fRx;
|
||
fBy = fRy;
|
||
} else {
|
||
fAx = fRx;
|
||
fAy = fRy;
|
||
}
|
||
|
||
bHasToInterpolate = bHasToInterpolate && (Math.abs(fRy) * 2 <= Math.abs(fQy));
|
||
++nCount;
|
||
}
|
||
return {val: fRx, bError: rConvError};
|
||
}
|
||
|
||
function hasChangeOfSign(u, w) {
|
||
return (u < 0 && w > 0) || (u > 0 && w < 0);
|
||
}
|
||
|
||
function rank(fVal, aSortArray, bAscending, bAverage) {
|
||
//sort array
|
||
aSortArray.sort(function sortArr(a, b) {
|
||
return a - b;
|
||
});
|
||
|
||
var nSize = aSortArray.length;
|
||
var res;
|
||
|
||
if (nSize == 0 /*|| nGlobalError != FormulaError::NONE*/) {
|
||
res = null;
|
||
} else {
|
||
if (fVal < aSortArray[0] || fVal > aSortArray[nSize - 1]) {
|
||
res = null;
|
||
} else {
|
||
var fLastPos = 0;
|
||
var fFirstPos = -1.0;
|
||
var bFinished = false;
|
||
var i;
|
||
for (i = 0; i < nSize && !bFinished /*&& nGlobalError == FormulaError::NONE*/; i++) {
|
||
if (aSortArray[i] === fVal) {
|
||
if (fFirstPos < 0) {
|
||
fFirstPos = i + 1.0;
|
||
}
|
||
} else {
|
||
if (aSortArray[i] > fVal) {
|
||
fLastPos = i;
|
||
bFinished = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!bFinished) {
|
||
fLastPos = i;
|
||
}
|
||
if (!bAverage) {
|
||
if (bAscending) {
|
||
res = fFirstPos;
|
||
} else {
|
||
res = nSize + 1.0 - fLastPos;
|
||
}
|
||
} else {
|
||
if (bAscending) {
|
||
res = (fFirstPos + fLastPos) / 2.0;
|
||
} else {
|
||
res = nSize + 1.0 - (fFirstPos + fLastPos) / 2.0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
function skew(x, bSkewp) {
|
||
|
||
var sumSQRDeltaX = 0, _x = 0, xLength = 0, sumSQRDeltaXDivstandDev = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
_x += x[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
}
|
||
|
||
if (xLength <= 2) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
sumSQRDeltaX += Math.pow(x[i].getValue() - _x, 2);
|
||
}
|
||
|
||
}
|
||
|
||
var standDev;
|
||
if (bSkewp) {
|
||
standDev = Math.sqrt(sumSQRDeltaX / (xLength));
|
||
} else {
|
||
standDev = Math.sqrt(sumSQRDeltaX / (xLength - 1));
|
||
}
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
sumSQRDeltaXDivstandDev += Math.pow((x[i].getValue() - _x) / standDev, 3);
|
||
}
|
||
|
||
}
|
||
|
||
var res;
|
||
if (bSkewp) {
|
||
res = sumSQRDeltaXDivstandDev / xLength;
|
||
} else {
|
||
res = xLength / (xLength - 1) / (xLength - 2) * sumSQRDeltaXDivstandDev;
|
||
}
|
||
|
||
return new cNumber(res);
|
||
}
|
||
|
||
function convertToMatrix(val) {
|
||
var matrix;
|
||
if (undefined !== val.getMatrix) {
|
||
matrix = val.getMatrix();
|
||
} else {
|
||
val = val.tocNumber();
|
||
if (cElementType.error === val.type) {
|
||
return val;
|
||
}
|
||
matrix = [[val]];
|
||
}
|
||
return matrix;
|
||
}
|
||
|
||
/*function forEachMatrixElem(matrix, func){
|
||
for(var i = 0; i < matrix.length; i++){
|
||
for(var j = 0; j < matrix[i].length; j++){
|
||
|
||
}
|
||
}
|
||
}*/
|
||
|
||
function GetNewMat(c, r) {
|
||
var matrix = [];
|
||
for (var i = 0; i < c; i++) {
|
||
for (var j = 0; j < r; j++) {
|
||
if (!matrix[i]) {
|
||
matrix[i] = [];
|
||
}
|
||
|
||
matrix[i][j] = 0;
|
||
}
|
||
}
|
||
return matrix;
|
||
}
|
||
|
||
function matrixClone(matrix) {
|
||
var cloneMatrix = [];
|
||
for (var i = 0; i < matrix.length; i++) {
|
||
if (!matrix[i]) {
|
||
continue;
|
||
}
|
||
for (var j = 0; j < matrix[i].length; j++) {
|
||
if (!cloneMatrix[i]) {
|
||
cloneMatrix[i] = [];
|
||
}
|
||
|
||
cloneMatrix[i][j] = matrix[i][j];
|
||
}
|
||
}
|
||
return cloneMatrix;
|
||
}
|
||
|
||
function CheckMatrix(_bLOG, pMatX, pMatY, error) {
|
||
let nCase;
|
||
let i, j;
|
||
let nCX = 0,
|
||
nCY = 0,
|
||
nRX = 0,
|
||
nRY = 0,
|
||
M = 0,
|
||
N = 0;
|
||
|
||
if (!pMatY || !pMatY[0]) {
|
||
return false;
|
||
}
|
||
|
||
nRY = pMatY.length;
|
||
nCY = pMatY[0].length;
|
||
|
||
let nCountY = nCY * nRY;
|
||
let _pMatY = [];
|
||
let pMatOriginalY = [];
|
||
let pMatOriginalX = [];
|
||
|
||
for (i = 0; i < pMatY.length; i++) {
|
||
for (j = 0; j < pMatY[i].length; j++) {
|
||
if (!pMatY[i][j]) {
|
||
//PushIllegalArgument();
|
||
return false;
|
||
} else {
|
||
if (!_pMatY[j]) {
|
||
_pMatY[j] = [];
|
||
}
|
||
_pMatY[j][i] = pMatY[i][j].getValue();
|
||
}
|
||
}
|
||
}
|
||
|
||
pMatOriginalY = _pMatY.slice();
|
||
|
||
if (_bLOG) {
|
||
let pNewY = [];
|
||
|
||
for (i = 0; i < pMatY.length; i++) {
|
||
for (j = 0; j < pMatY[i].length; j++) {
|
||
let fVal = pMatY[i][j];
|
||
if (fVal <= 0.0) {
|
||
//PushIllegalArgument();
|
||
return false;
|
||
} else {
|
||
if (!pNewY[j]) {
|
||
pNewY[j] = [];
|
||
}
|
||
pNewY[j][i] = Math.log(fVal);
|
||
}
|
||
}
|
||
}
|
||
_pMatY = pNewY;
|
||
}
|
||
|
||
let _pMatX;
|
||
if (pMatX) {
|
||
_pMatX = [];
|
||
nRX = pMatX.length;
|
||
nCX = pMatX[0].length;
|
||
let nCountX = nCX * nRX;
|
||
for (i = 0; i < pMatX.length; i++) {
|
||
for (j = 0; j < pMatX[i].length; j++) {
|
||
if (!pMatX[i][j]) {
|
||
//PushIllegalArgument();
|
||
return false;
|
||
} else {
|
||
if (!_pMatX[j]) {
|
||
_pMatX[j] = [];
|
||
}
|
||
_pMatX[j][i] = pMatX[i][j].getValue();
|
||
}
|
||
}
|
||
}
|
||
|
||
if (nCX === nCY && nRX === nRY) {
|
||
nCase = 1; // simple regression
|
||
M = 1;
|
||
N = nCountY;
|
||
} else if (nCY !== 1 && nRY !== 1) {
|
||
//PushIllegalArgument();
|
||
if (Array.isArray(error)) {
|
||
error.push(new cError(cErrorType.bad_reference));
|
||
}
|
||
return false;
|
||
} else if (nCY === 1) {
|
||
if (nRX !== nRY) {
|
||
//PushIllegalArgument();
|
||
if (Array.isArray(error)) {
|
||
error.push(new cError(cErrorType.bad_reference));
|
||
}
|
||
return false;
|
||
} else {
|
||
nCase = 2; // Y is column
|
||
N = nRY;
|
||
M = nCX;
|
||
}
|
||
} else if (nCX !== nCY) {
|
||
//PushIllegalArgument();
|
||
if (Array.isArray(error)) {
|
||
error.push(new cError(cErrorType.bad_reference));
|
||
}
|
||
return false;
|
||
} else {
|
||
nCase = 3; // Y is row
|
||
N = nCY;
|
||
M = nRX;
|
||
}
|
||
} else {
|
||
_pMatX = GetNewMat(nCY, nRY);
|
||
nCX = nCY;
|
||
nRX = nRY;
|
||
|
||
let num = 1;
|
||
for (i = 0; i < nRY; i++) {
|
||
for (j = 0; j < nCY; j++) {
|
||
if (!_pMatX[j]) {
|
||
_pMatX[j] = [];
|
||
}
|
||
_pMatX[j][i] = num;
|
||
num++;
|
||
}
|
||
}
|
||
|
||
nCase = 1;
|
||
N = nCountY;
|
||
M = 1;
|
||
}
|
||
|
||
return {nCase: nCase, nCX: nCX, nCY: nCY, nRX: nRX, nRY: nRY, M: M, N: N, pMatX: _pMatX, pMatY: _pMatY, pMatOriginalX: _pMatX, pMatOriginalY: pMatOriginalY};
|
||
}
|
||
|
||
function lcl_GetMeanOverAll(pMat, nN) {
|
||
let fSum = 0.0;
|
||
for (let i = 0; i < pMat.length; i++) {
|
||
for (let j = 0; j < pMat[i].length; j++) {
|
||
// if at least one value in the matrix is not a number, return undefined
|
||
if (typeof(pMat[i][j]) !== "number") {
|
||
return
|
||
}
|
||
|
||
fSum += pMat[i][j];
|
||
}
|
||
}
|
||
|
||
return fSum / nN;
|
||
}
|
||
|
||
function lcl_GetSumProduct(pMatA, pMatB, nM) {
|
||
var fSum = 0.0;
|
||
for (var i = 0; i < nM; i++) {
|
||
fSum += getDouble(pMatA, i) * getDouble(pMatB, i);
|
||
}
|
||
return fSum;
|
||
}
|
||
|
||
function approxSub(a, b) {
|
||
if (((a < 0.0 && b < 0.0) || (a > 0.0 && b > 0.0)) && Math.abs(a - b) < 2.22045e-016) {
|
||
return 0.0;
|
||
}
|
||
return a - b;
|
||
}
|
||
|
||
|
||
function lcl_CalculateColumnMeans(pX, pResMat, nC, nR) {
|
||
for (var i = 0; i < nC; i++) {
|
||
var fSum = 0.0;
|
||
for (var k = 0; k < nR; k++) {
|
||
fSum += pX[i][k];// GetDouble(Column,Row)
|
||
}
|
||
putDouble(pResMat, i, fSum / nR, i);
|
||
}
|
||
}
|
||
|
||
function lcl_CalculateColumnsDelta(pMat, pColumnMeans, nC, nR) {
|
||
for (var i = 0; i < nC; i++) {
|
||
for (var k = 0; k < nR; k++) {
|
||
pMat[i][k] = approxSub(pMat[i][k], getDouble(pColumnMeans, i));
|
||
}
|
||
}
|
||
}
|
||
|
||
function lcl_TGetColumnMaximumNorm(pMatA, nR, nC, nN) {
|
||
var fNorm = 0.0;
|
||
for (var col = nC; col < nN; col++) {
|
||
if (fNorm < Math.abs(pMatA[nR][col])) {
|
||
fNorm = Math.abs(pMatA[nR][col]);
|
||
}
|
||
}
|
||
|
||
return fNorm;
|
||
}
|
||
|
||
function lcl_TGetColumnEuclideanNorm(pMatA, nR, nC, nN) {
|
||
var fNorm = 0.0;
|
||
for (var col = nC; col < nN; col++) {
|
||
fNorm += (pMatA[col][nR]) * (pMatA[col][nR]);
|
||
}
|
||
|
||
return Math.sqrt(fNorm);
|
||
}
|
||
|
||
function lcl_GetSign(fValue) {
|
||
return (fValue >= 0.0 ? 1.0 : -1.0);
|
||
}
|
||
|
||
function lcl_TGetColumnSumProduct(pMatA, nRa, pMatB, nRb, nC, nN) {
|
||
var fResult = 0.0;
|
||
for (var col = nC; col < nN; col++) {
|
||
fResult += pMatA[col][nRa] * pMatB[col][nRb];
|
||
}
|
||
return fResult;
|
||
}
|
||
|
||
// same with transposed matrix A, N is count of columns, K count of rows
|
||
function lcl_TCalculateQRdecomposition(pMatA, pVecR, nK, nN) {
|
||
|
||
|
||
var fSum;
|
||
// ScMatrix matrices are zero based, index access (column,row)
|
||
for (var row = 0; row < nK; row++) {
|
||
// calculate vector u of the householder transformation
|
||
var fScale = lcl_TGetColumnMaximumNorm(pMatA, row, row, nN);
|
||
if (fScale === 0.0) {
|
||
// A is singular
|
||
return false;
|
||
}
|
||
for (var col = row; col < nN; col++) {
|
||
pMatA[col][row] = pMatA[col][row] / fScale;
|
||
}
|
||
|
||
var fEuclid = lcl_TGetColumnEuclideanNorm(pMatA, row, row, nN);
|
||
var fFactor = 1.0 / fEuclid / (fEuclid + Math.abs(pMatA[row][row]));
|
||
var fSignum = lcl_GetSign(pMatA[row][row]);
|
||
pMatA[row][row] = pMatA[row][row] + fSignum * fEuclid;
|
||
pVecR[row] = -fSignum * fScale * fEuclid;
|
||
|
||
// apply Householder transformation to A
|
||
for (var r = row + 1; r < nK; r++) {
|
||
fSum = lcl_TGetColumnSumProduct(pMatA, row, pMatA, r, row, nN);
|
||
for (var col = row; col < nN; col++) {
|
||
pMatA[col][r] = pMatA[col][r] - fSum * fFactor * pMatA[col][row];
|
||
}
|
||
}
|
||
|
||
}
|
||
return true;
|
||
}
|
||
|
||
function lcl_ApplyHouseholderTransformation(pMatA, nC, pMatY, nN) {
|
||
// ScMatrix matrices are zero based, index access (column,row)
|
||
var fDenominator = lcl_GetColumnSumProduct(pMatA, nC, pMatA, nC, nC, nN);
|
||
var fNumerator = lcl_GetColumnSumProduct(pMatA, nC, pMatY, 0, nC, nN);
|
||
var fFactor = 2.0 * (fNumerator / fDenominator);
|
||
for (var row = nC; row < nN; row++) {
|
||
putDouble(pMatY, row, getDouble(pMatY, row) - fFactor * pMatA[nC][row]);
|
||
}
|
||
}
|
||
|
||
function lcl_GetColumnSumProduct(pMatA, nCa, pMatB, nCb, nR, nN) {
|
||
var fResult = 0.0;
|
||
for (var row = nR; row < nN; row++) {
|
||
fResult += pMatA[nCa][row] * pMatB[nCb][row];
|
||
}
|
||
return fResult;
|
||
}
|
||
|
||
function lcl_SolveWithUpperRightTriangle(pMatA, pVecR, pMatS, nK, bIsTransposed) {
|
||
// ScMatrix matrices are zero based, index access (column,row)
|
||
var row;
|
||
// SCSIZE is never negative, therefore test with rowp1=row+1
|
||
for (var rowp1 = nK; rowp1 > 0; rowp1--) {
|
||
row = rowp1 - 1;
|
||
var fSum = getDouble(pMatS, row);
|
||
for (var col = rowp1; col < nK; col++) {
|
||
if (bIsTransposed) {
|
||
fSum -= pMatA[row][col] * getDouble(pMatS, col);
|
||
} else {
|
||
fSum -= pMatA[col][row] * getDouble(pMatS, col);
|
||
}
|
||
}
|
||
|
||
putDouble(pMatS, row, fSum / pVecR[row]);
|
||
}
|
||
}
|
||
|
||
// Multiply n x m Mat A with m x l Mat B to n x l Mat R
|
||
function lcl_MFastMult(pA, pB, pR, n, m, l) {
|
||
var sum;
|
||
for (var row = 0; row < n; row++) {
|
||
for (var col = 0; col < l; col++) { // result element(col, row) =sum[ (row of A) * (column of B)]
|
||
sum = 0.0;
|
||
for (var k = 0; k < m; k++) {
|
||
sum += pA[k][row] * pB[col][k];
|
||
}
|
||
pR[col][row] = sum;
|
||
}
|
||
}
|
||
}
|
||
|
||
function lcl_CalculateRowMeans(pX, pResMat, nC, nR) {
|
||
for (let k = 0; k < nR; k++) {
|
||
let fSum = 0.0;
|
||
for (let i = 0; i < nC; i++) {
|
||
fSum += pX[i][k];
|
||
}
|
||
// GetDouble(Column,Row)
|
||
if (pResMat.length === 1 && pResMat[0].length > 1) {
|
||
// single row
|
||
pResMat[0][k] = fSum / nC;
|
||
} else if (pResMat.length > 1 && pResMat[0].length === 1) {
|
||
// single col
|
||
pResMat[k][0] = fSum / nC;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
function lcl_CalculateRowsDelta(pMat, pRowMeans, nC, nR) {
|
||
for (let k = 0; k < nR; k++) {
|
||
for (let i = 0; i < nC; i++) {
|
||
// pMat[i][k] = approxSub(pMat[i][k], pRowMeans[k][0]);
|
||
|
||
if (pRowMeans.length === 1 && pRowMeans[0].length > 1) {
|
||
// single row
|
||
pMat[i][k] = approxSub(pMat[i][k], pRowMeans[0][k]);
|
||
} else if (pRowMeans.length > 1 && pRowMeans[0].length === 1) {
|
||
// single col
|
||
pMat[i][k] = approxSub(pMat[i][k], pRowMeans[k][0]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
function lcl_TApplyHouseholderTransformation(pMatA, nR, pMatY, nN) {
|
||
// ScMatrix matrices are zero based, index access (column,row)
|
||
var fDenominator = lcl_TGetColumnSumProduct(pMatA, nR, pMatA, nR, nR, nN);
|
||
var fNumerator = lcl_TGetColumnSumProduct(pMatA, nR, pMatY, 0, nR, nN);
|
||
var fFactor = 2.0 * (fNumerator / fDenominator);
|
||
for (var col = nR; col < nN; col++) {
|
||
putDouble(pMatY, col, getDouble(pMatY, col) - fFactor * pMatA[col][nR]);
|
||
}
|
||
}
|
||
|
||
function lcl_GetColumnMaximumNorm(pMatA, nC, nR, nN) {
|
||
var fNorm = 0.0;
|
||
for (var row = nR; row < nN; row++) {
|
||
if (fNorm < Math.abs(pMatA[nC][row])) {
|
||
fNorm = Math.abs(pMatA[nC][row]);
|
||
}
|
||
}
|
||
return fNorm;
|
||
}
|
||
|
||
function lcl_GetColumnEuclideanNorm(pMatA, nC, nR, nN) {
|
||
var fNorm = 0.0;
|
||
for (var row = nR; row < nN; row++) {
|
||
fNorm += pMatA[nC][row] * pMatA[nC][row];
|
||
}
|
||
return Math.sqrt(fNorm);
|
||
}
|
||
|
||
function lcl_CalculateQRdecomposition(pMatA, pVecR, nK, nN) {
|
||
// ScMatrix matrices are zero based, index access (column,row)
|
||
for (var col = 0; col < nK; col++) {
|
||
// calculate vector u of the householder transformation
|
||
var fScale = lcl_GetColumnMaximumNorm(pMatA, col, col, nN);
|
||
if (fScale === 0.0) {
|
||
// A is singular
|
||
return false;
|
||
}
|
||
for (var row = col; row < nN; row++) {
|
||
pMatA[col][row] = pMatA[col][row] / fScale;
|
||
}
|
||
|
||
var fEuclid = lcl_GetColumnEuclideanNorm(pMatA, col, col, nN);
|
||
var fFactor = 1.0 / fEuclid / (fEuclid + Math.abs(pMatA[col][col]));
|
||
var fSignum = lcl_GetSign(pMatA[col][col]);
|
||
pMatA[col][col] = pMatA[col][col] + fSignum * fEuclid;
|
||
pVecR[col] = -fSignum * fScale * fEuclid;
|
||
|
||
// apply Householder transformation to A
|
||
for (var c = col + 1; c < nK; c++) {
|
||
var fSum = lcl_GetColumnSumProduct(pMatA, col, pMatA, c, col, nN);
|
||
for (var row = col; row < nN; row++) {
|
||
pMatA[c][row] = pMatA[c][row] - fSum * fFactor * pMatA[col][row];
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
function prepeareGrowthTrendCalculation(t, arg) {
|
||
//если первое значение число
|
||
arg[0] = tryNumberToArray(arg[0]);
|
||
if (arg[1]) {
|
||
arg[1] = tryNumberToArray(arg[1]);
|
||
}
|
||
if (arg[2]) {
|
||
arg[2] = tryNumberToArray(arg[2]);
|
||
}
|
||
|
||
var types = [cElementType.array];
|
||
if (arg[1] && arg[1].type !== cElementType.empty) {
|
||
types.push(cElementType.array);
|
||
}
|
||
if (arg[2] && arg[2].type !== cElementType.empty) {
|
||
types.push(cElementType.array);
|
||
}
|
||
var oArguments = t._prepareArguments(arg, arguments[1], true, types);
|
||
var argClone = oArguments.args;
|
||
|
||
var argError;
|
||
if (argError = t._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var pMatY = argClone[0];
|
||
var pMatX = argClone[1];
|
||
if (pMatX && !pMatX.length && pMatX.type === cElementType.empty) {
|
||
pMatX = undefined;
|
||
}
|
||
var pMatNewX = argClone[2];
|
||
if (pMatNewX && pMatNewX.length) {
|
||
var _pMatNewX = [];
|
||
for (var i = 0; i < pMatNewX.length; i++) {
|
||
for (var j = 0; j < pMatNewX[i].length; j++) {
|
||
if (!_pMatNewX[j]) {
|
||
_pMatNewX[j] = [];
|
||
}
|
||
_pMatNewX[j][i] = pMatNewX[i][j];
|
||
}
|
||
}
|
||
pMatNewX = _pMatNewX;
|
||
} else if (pMatNewX && pMatNewX.type === cElementType.empty) {
|
||
pMatNewX = undefined;
|
||
}
|
||
|
||
var bConstant = undefined !== argClone[3] ? argClone[3].tocBool().toBool() : true;
|
||
|
||
return {pMatY: pMatY, pMatX: pMatX, pMatNewX: pMatNewX, bConstant: bConstant};
|
||
}
|
||
|
||
function CalculateTrendGrowth(pMatY, pMatX, pMatNewX, bConstant, _bGrowth) {
|
||
let error = [];
|
||
let getMatrixParams = CheckMatrix(_bGrowth, pMatX, pMatY, error);
|
||
if (error.length > 0) {
|
||
return error[0];
|
||
} else if (!getMatrixParams) {
|
||
return;
|
||
}
|
||
|
||
const identicalValuesTrend = 1;
|
||
// 1 = simple; 2 = multiple with Y as column; 3 = multiple with Y as row
|
||
let nCase = getMatrixParams.nCase;
|
||
let nCX = getMatrixParams.nCX, nCY = getMatrixParams.nCY; // number of columns
|
||
let nRX = getMatrixParams.nRX, nRY = getMatrixParams.nRY; //number of rows
|
||
let K = getMatrixParams.M, N = getMatrixParams.N; // K=number of variables X, N=number of data samples
|
||
pMatX = getMatrixParams.pMatX;
|
||
pMatY = getMatrixParams.pMatY;
|
||
|
||
// Enough data samples?
|
||
// if ((bConstant && (N < K + 1)) || (!bConstant && (N < K)) || (N < 1) || (K < 1)) {
|
||
// return;
|
||
// }
|
||
|
||
if ((!bConstant && (N < K)) || (N < 1) || (K < 1)) {
|
||
return;
|
||
}
|
||
|
||
let i, j;
|
||
|
||
// Set default pMatNewX if necessary
|
||
let nCXN, nRXN;
|
||
let nCountXN;
|
||
if (!pMatNewX) {
|
||
nCXN = nCX;
|
||
nRXN = nRX;
|
||
nCountXN = nCXN * nRXN;
|
||
pMatNewX = matrixClone(pMatX); // pMatX will be changed to X-meanX
|
||
} else {
|
||
nRXN = pMatNewX[0].length;
|
||
nCXN = pMatNewX.length;
|
||
if ((nCase === 2 && K !== nCXN) || (nCase === 3 && K !== nRXN)) {
|
||
return;
|
||
}
|
||
nCountXN = nCXN * nRXN;
|
||
for (i = 0; i < pMatNewX.length; i++) {
|
||
for (j = 0; j < pMatNewX[i].length; j++) {
|
||
if (!pMatNewX[i][j]) {
|
||
//PushIllegalArgument();
|
||
return false;
|
||
} else {
|
||
pMatNewX[i][j] = pMatNewX[i][j].getValue();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
let pResMat; // size depends on nCase
|
||
if (nCase === 1) {
|
||
pResMat = GetNewMat(nCXN, nRXN);
|
||
} else {
|
||
if (nCase === 2) {
|
||
pResMat = GetNewMat(1, nRXN);
|
||
} else {
|
||
pResMat = GetNewMat(nCXN, 1);
|
||
}
|
||
}
|
||
if (!pResMat) {
|
||
//PushError(FormulaError::CodeOverflow);
|
||
return;
|
||
}
|
||
|
||
// Uses sum(x-MeanX)^2 and not [sum x^2]-N * MeanX^2 in case bConstant.
|
||
// Clone constant matrices, so that Mat = Mat - Mean is possible.
|
||
let fMeanY = 0.0;
|
||
if (bConstant) {
|
||
let pCopyX = matrixClone(pMatX);
|
||
let pCopyY = matrixClone(pMatY);
|
||
if (!pCopyX || !pCopyY) {
|
||
//PushError(FormulaError::MatrixSize);
|
||
return;
|
||
}
|
||
pMatX = pCopyX;
|
||
pMatY = pCopyY;
|
||
// DeltaY is possible here; DeltaX depends on nCase, so later
|
||
fMeanY = lcl_GetMeanOverAll(pMatY, N);
|
||
if (fMeanY === undefined) { // explicit check for undefined is necessary since the number can be 0
|
||
return
|
||
}
|
||
for (i = 0; i < pMatY.length; i++) {
|
||
for (j = 0; j < pMatY[i].length; j++) {
|
||
pMatY[i][j] = approxSub(pMatY[i][j], fMeanY);
|
||
}
|
||
}
|
||
}
|
||
|
||
let aVecR, pMeans, pSlopes, bIsSingular, col, fIntercept, row;
|
||
if (nCase === 1) {
|
||
// calculate simple regression
|
||
let fMeanX = 0.0;
|
||
if (bConstant) { // Mat = Mat - Mean
|
||
fMeanX = lcl_GetMeanOverAll(pMatX, N);
|
||
if (fMeanX === undefined) { // explicit check for undefined is necessary since the number can be 0
|
||
return
|
||
}
|
||
for (i = 0; i < pMatX.length; i++) {
|
||
for (j = 0; j < pMatX[i].length; j++) {
|
||
pMatX[i][j] = approxSub(pMatX[i][j], fMeanX);
|
||
}
|
||
}
|
||
}
|
||
let fSumXY = lcl_GetSumProduct(pMatX, pMatY, N);
|
||
let fSumX2 = lcl_GetSumProduct(pMatX, pMatX, N);
|
||
if (fSumX2 === 0.0) {
|
||
//PushNoValue(); // all x-values are identical
|
||
// return;
|
||
fSumX2 = identicalValuesTrend;
|
||
}
|
||
let fSlope = fSumXY / fSumX2;
|
||
let fHelp;
|
||
if (bConstant) {
|
||
fIntercept = fMeanY - fSlope * fMeanX;
|
||
for (i = 0; i < pResMat.length; i++) {
|
||
for (j = 0; j < pResMat[i].length; j++) {
|
||
fHelp = pMatNewX[i][j] * fSlope + fIntercept;
|
||
pResMat[i][j] = _bGrowth ? Math.exp(fHelp) : fHelp;
|
||
}
|
||
}
|
||
} else {
|
||
for (i = 0; i < pResMat.length; i++) {
|
||
for (j = 0; j < pResMat[i].length; j++) {
|
||
fHelp = pMatNewX[i][j] * fSlope;
|
||
pResMat[i][j] = _bGrowth ? Math.exp(fHelp) : fHelp;
|
||
}
|
||
}
|
||
}
|
||
} else // calculate multiple regression;
|
||
{
|
||
if (nCase === 2) // Y is column
|
||
{
|
||
aVecR = []; // for QR decomposition
|
||
// Enough memory for needed matrices?
|
||
pMeans = GetNewMat(K, 1); // mean of each column
|
||
pSlopes = GetNewMat(1, K); // from b1 to bK
|
||
if (!pMeans || !pSlopes) {
|
||
//PushError(FormulaError::CodeOverflow);
|
||
return;
|
||
}
|
||
if (bConstant) {
|
||
lcl_CalculateColumnMeans(pMatX, pMeans, K, N);
|
||
lcl_CalculateColumnsDelta(pMatX, pMeans, K, N);
|
||
}
|
||
if (!lcl_CalculateQRdecomposition(pMatX, aVecR, K, N)) {
|
||
//PushNoValue();
|
||
return;
|
||
}
|
||
// Later on we will divide by elements of aVecR, so make sure
|
||
// that they aren't zero.
|
||
bIsSingular = false;
|
||
for (row = 0; row < K && !bIsSingular; row++) {
|
||
bIsSingular = bIsSingular || aVecR[row] === 0.0;
|
||
}
|
||
|
||
if (bIsSingular) {
|
||
//PushNoValue();
|
||
return;
|
||
}
|
||
// Z := Q' Y; Y is overwritten with result Z
|
||
for (col = 0; col < K; col++) {
|
||
lcl_ApplyHouseholderTransformation(pMatX, col, pMatY, N);
|
||
}
|
||
// B = R^(-1) * Q' * Y <=> B = R^(-1) * Z <=> R * B = Z
|
||
// result Z should have zeros for index>=K; if not, ignore values
|
||
for (col = 0; col < K; col++) {
|
||
putDouble(pSlopes, col, getDouble(pMatY, col));
|
||
}
|
||
lcl_SolveWithUpperRightTriangle(pMatX, aVecR, pSlopes, K, false);
|
||
|
||
// Fill result matrix
|
||
lcl_MFastMult(pMatNewX, pSlopes, pResMat, nRXN, K, 1);
|
||
if (bConstant) {
|
||
fIntercept = fMeanY - lcl_GetSumProduct(pMeans, pSlopes, K);
|
||
for (row = 0; row < nRXN; row++) {
|
||
pResMat[0][row] = pResMat[0][row] + fIntercept;
|
||
}
|
||
|
||
}
|
||
if (_bGrowth) {
|
||
for (i = 0; i < nRXN; i++) {
|
||
putDouble(pResMat, i, Math.exp(getDouble(pResMat, i)));
|
||
}
|
||
}
|
||
} else { // nCase == 3, Y is row, all matrices are transposed
|
||
|
||
aVecR = []; // for QR decomposition
|
||
// Enough memory for needed matrices?
|
||
pMeans = GetNewMat(K, 1); // mean of each row
|
||
pSlopes = GetNewMat(K, 1); // row from b1 to bK
|
||
if (!pMeans || !pSlopes) {
|
||
//PushError(FormulaError::CodeOverflow);
|
||
return;
|
||
}
|
||
|
||
if (bConstant) {
|
||
lcl_CalculateRowMeans(pMatX, pMeans, N, K);
|
||
lcl_CalculateRowsDelta(pMatX, pMeans, N, K);
|
||
}
|
||
if (!lcl_TCalculateQRdecomposition(pMatX, aVecR, K, N)) {
|
||
//PushNoValue();
|
||
return;
|
||
}
|
||
// Later on we will divide by elements of aVecR, so make sure
|
||
// that they aren't zero.
|
||
bIsSingular = false;
|
||
for (row = 0; row < K && !bIsSingular; row++) {
|
||
bIsSingular = bIsSingular || aVecR[row] === 0.0;
|
||
}
|
||
if (bIsSingular) {
|
||
//PushNoValue();
|
||
return;
|
||
}
|
||
// Z := Q' Y; Y is overwritten with result Z
|
||
for (row = 0; row < K; row++) {
|
||
lcl_TApplyHouseholderTransformation(pMatX, row, pMatY, N);
|
||
}
|
||
// B = R^(-1) * Q' * Y <=> B = R^(-1) * Z <=> R * B = Z
|
||
// result Z should have zeros for index>=K; if not, ignore values
|
||
for (col = 0; col < K; col++) {
|
||
putDouble(pSlopes, col, getDouble(pMatY, col));
|
||
}
|
||
lcl_SolveWithUpperRightTriangle(pMatX, aVecR, pSlopes, K, true);
|
||
|
||
// Fill result matrix
|
||
lcl_MFastMult(pSlopes, pMatNewX, pResMat, 1, K, nCXN);
|
||
if (bConstant) {
|
||
fIntercept = fMeanY - lcl_GetSumProduct(pMeans, pSlopes, K);
|
||
for (col = 0; col < nCXN; col++) {
|
||
pResMat[col][0] = pResMat[col][0] + fIntercept;
|
||
}
|
||
|
||
}
|
||
if (_bGrowth) {
|
||
for (i = 0; i < nCXN; i++) {
|
||
putDouble(pResMat, i, Math.exp(getDouble(pResMat, i)));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return pResMat;
|
||
}
|
||
|
||
function lcl_ApplyUpperRightTriangle(pMatA, pVecR, pMatB, pMatZ, nK, bIsTransposed) {
|
||
// ScMatrix matrices are zero based, index access (column,row)
|
||
for (var row = 0; row < nK; row++) {
|
||
var fSum = pVecR[row] * getDouble(pMatB, row);
|
||
for (var col = row + 1; col < nK; col++) {
|
||
if (bIsTransposed) {
|
||
fSum += pMatA[row][col] * getDouble(pMatB, col);
|
||
} else {
|
||
fSum += pMatA[col][row] * getDouble(pMatB, col);
|
||
}
|
||
}
|
||
|
||
putDouble(pMatZ, row, fSum);
|
||
}
|
||
}
|
||
|
||
function lcl_SolveWithLowerLeftTriangle(pMatA, pVecR, pMatT, nK, bIsTransposed) {
|
||
// ScMatrix matrices are zero based, index access (column,row)
|
||
for (var row = 0; row < nK; row++) {
|
||
var fSum = getDouble(pMatT, row);
|
||
for (var col = 0; col < row; col++) {
|
||
if (bIsTransposed) {
|
||
fSum -= pMatA[col][row] * getDouble(pMatT, col);
|
||
} else {
|
||
fSum -= pMatA[row][col] * getDouble(pMatT, col);
|
||
}
|
||
}
|
||
putDouble(pMatT, row, fSum / pVecR[row]);
|
||
}
|
||
}
|
||
|
||
function lcl_GetSSresid(pMatX, pMatY, fSlope, nN) {
|
||
var fSum = 0.0;
|
||
for (var i = 0; i < nN; i++) {
|
||
var fTemp = getDouble(pMatY, i) - fSlope * getDouble(pMatX, i);
|
||
fSum += fTemp * fTemp;
|
||
}
|
||
return fSum;
|
||
}
|
||
|
||
function CalculateRGPRKP(pMatY, pMatX, bConstant, bStats, _bRKP) {
|
||
let error = [];
|
||
let getMatrixParams = CheckMatrix(_bRKP, pMatX, pMatY, error);
|
||
|
||
if (error.length > 0) {
|
||
return error[0];
|
||
} else if (!getMatrixParams) {
|
||
return;
|
||
}
|
||
|
||
const identicalValuesTrend = 1;
|
||
// 1 = simple; 2 = multiple with Y as column; 3 = multiple with Y as row
|
||
let nCase = getMatrixParams.nCase;
|
||
let nCX = getMatrixParams.nCX, nCY = getMatrixParams.nCY; // number of columns
|
||
let nRX = getMatrixParams.nRX, nRY = getMatrixParams.nRY; //number of rows
|
||
let K = getMatrixParams.M, N = getMatrixParams.N; // K=number of variables X, N=number of data samples
|
||
pMatX = getMatrixParams.pMatX;
|
||
pMatY = getMatrixParams.pMatY;
|
||
let pMatOriginalX = getMatrixParams.pMatOriginalX;
|
||
let pMatOriginalY = getMatrixParams.pMatOriginalY;
|
||
let i, j;
|
||
|
||
// Enough data samples?
|
||
// if ((bConstant && (N < K + 1)) || (!bConstant && (N < K)) || (N < 1) || (K < 1)) {
|
||
// //PushIllegalParameter();
|
||
// return;
|
||
// }
|
||
|
||
if ((!bConstant && (N < K)) || (N < 1) || (K < 1)) {
|
||
//PushIllegalParameter();
|
||
return;
|
||
}
|
||
|
||
let pResMat;
|
||
if (bStats) {
|
||
pResMat = GetNewMat(K + 1, 5);
|
||
} else {
|
||
pResMat = GetNewMat(K + 1, 1);
|
||
}
|
||
if (!pResMat) {
|
||
//PushError(FormulaError::CodeOverflow);
|
||
return;
|
||
}
|
||
|
||
|
||
//********
|
||
// Fill unused cells in pResMat; order (column,row)
|
||
if (bStats) {
|
||
for (i = 2; i < K + 1; i++) {
|
||
pResMat[i][2] = null;//->PutError( FormulaError::NotAvailable, i, 2);
|
||
pResMat[i][3] = null;//->PutError( FormulaError::NotAvailable, i, 3);
|
||
pResMat[i][4] = null;//->PutError( FormulaError::NotAvailable, i, 4);
|
||
}
|
||
}
|
||
|
||
|
||
// Uses sum(x-MeanX)^2 and not [sum x^2]-N * MeanX^2 in case bConstant.
|
||
// Clone constant matrices, so that Mat = Mat - Mean is possible.
|
||
let fMeanY = 0.0;
|
||
if (bConstant) {
|
||
let pNewX = matrixClone(pMatX);
|
||
let pNewY = matrixClone(pMatY);
|
||
if (!pNewX || !pNewY) {
|
||
//PushError(FormulaError::MatrixSize);
|
||
return;
|
||
}
|
||
pMatX = pNewX;
|
||
pMatY = pNewY;
|
||
// DeltaY is possible here; DeltaX depends on nCase, so later
|
||
fMeanY = lcl_GetMeanOverAll(pMatY, N);
|
||
if (fMeanY === undefined) { // explicit check for undefined is necessary since the number can be 0
|
||
return
|
||
}
|
||
for (i = 0; i < pMatY.length; i++) {
|
||
for (j = 0; j < pMatY[i].length; j++) {
|
||
pMatY[i][j] = approxSub(pMatY[i][j], fMeanY);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
let fIntercept, fSSreg, fDegreesFreedom, fSSresid, fFstatistic, fRMSE, fSigmaSlope, fSigmaIntercept, fR2;
|
||
let aVecR, pMeans, pMatZ, pSlopes, bIsSingular, row, col, fPart;
|
||
if (nCase === 1) {
|
||
// calculate simple regression
|
||
let fMeanX = 0.0;
|
||
if (bConstant) { // Mat = Mat - Mean
|
||
fMeanX = lcl_GetMeanOverAll(pMatX, N);
|
||
if (fMeanX === undefined) { // explicit check for undefined is necessary since the number can be 0
|
||
return
|
||
}
|
||
for (i = 0; i < pMatX.length; i++) {
|
||
for (j = 0; j < pMatX[i].length; j++) {
|
||
pMatX[i][j] = approxSub(pMatX[i][j], fMeanX);
|
||
}
|
||
}
|
||
}
|
||
let fSumXY = lcl_GetSumProduct(pMatX, pMatY, N),
|
||
fSumX2 = lcl_GetSumProduct(pMatX, pMatX, N);
|
||
|
||
if (fSumX2 === 0.0) {
|
||
//PushNoValue(); // all x-values are identical
|
||
// return;
|
||
fSumX2 = identicalValuesTrend;
|
||
}
|
||
let fSlope = fSumXY / fSumX2;
|
||
fIntercept = 0.0;
|
||
|
||
if (bConstant) {
|
||
fIntercept = fMeanY - fSlope * fMeanX;
|
||
}
|
||
|
||
pResMat[1][0] = _bRKP ? Math.exp(fIntercept) : fIntercept;
|
||
pResMat[0][0] = _bRKP ? Math.exp(fSlope) : fSlope;
|
||
|
||
if (bStats) {
|
||
fSSreg = fSlope * fSlope * fSumX2;
|
||
pResMat[0][4] = fSSreg;
|
||
|
||
fDegreesFreedom = bConstant ? N - 2 : N - 1;
|
||
pResMat[1][3] = fDegreesFreedom;
|
||
|
||
fSSresid = lcl_GetSSresid(pMatX, pMatY, fSlope, N);
|
||
pResMat[1][4] = fSSresid;
|
||
|
||
if (fDegreesFreedom === 0.0 || fSSresid === 0.0 || fSSreg === 0.0) { // exact fit; test SSreg too, because SSresid might be
|
||
// unequal zero due to round of errors
|
||
pResMat[1][4] = 0;
|
||
pResMat[0][3] = null;//->PutError( FormulaError::NotAvailable, 0, 3); // F
|
||
pResMat[1][2] = 0;
|
||
pResMat[0][1] = 0;
|
||
if (bConstant) {
|
||
pResMat[1][1] = 0;
|
||
} else {
|
||
pResMat[1][1] = null;
|
||
}//->PutError( FormulaError::NotAvailable, 1, 1);
|
||
|
||
pResMat[0][2] = 1;//->PutDouble(1.0, 0, 2); // R^2
|
||
} else {
|
||
fFstatistic = (fSSreg / K) / (fSSresid / fDegreesFreedom);
|
||
pResMat[0][3] = fFstatistic;//->PutDouble(fFstatistic, 0, 3);
|
||
|
||
// standard error of estimate
|
||
fRMSE = Math.sqrt(fSSresid / fDegreesFreedom);
|
||
pResMat[1][2] = fRMSE;
|
||
|
||
fSigmaSlope = fRMSE / Math.sqrt(fSumX2);
|
||
pResMat[0][1] = fSigmaSlope;
|
||
|
||
if (bConstant) {
|
||
fSigmaIntercept = fRMSE * Math.sqrt(fMeanX * fMeanX / fSumX2 + 1.0 / N);
|
||
pResMat[1][1] = fSigmaIntercept;
|
||
} else {
|
||
pResMat[1][1] = null;//->PutError( FormulaError::NotAvailable, 1, 1);
|
||
}
|
||
|
||
fR2 = fSSreg / (fSSreg + fSSresid);
|
||
pResMat[0][2] = fR2;
|
||
}
|
||
}
|
||
|
||
} else {
|
||
// Uses a QR decomposition X = QR. The solution B = (X'X)^(-1) * X' * Y
|
||
// becomes B = R^(-1) * Q' * Y
|
||
if (nCase === 2) // Y is column
|
||
{
|
||
aVecR = []; // for QR decomposition
|
||
// Enough memory for needed matrices?
|
||
pMeans = GetNewMat(K, 1); // mean of each column
|
||
|
||
if (bStats) {
|
||
pMatZ = matrixClone(pMatY);
|
||
}// Y is used in statistic, keep it
|
||
else {
|
||
pMatZ = pMatY;
|
||
} // Y can be overwritten
|
||
|
||
pSlopes = GetNewMat(1, K); // from b1 to bK
|
||
if (!pMeans || !pMatZ || !pSlopes) {
|
||
//PushError(FormulaError::CodeOverflow);
|
||
return;
|
||
}
|
||
if (bConstant) {
|
||
lcl_CalculateColumnMeans(pMatX, pMeans, K, N);
|
||
lcl_CalculateColumnsDelta(pMatX, pMeans, K, N);
|
||
}
|
||
if (!lcl_CalculateQRdecomposition(pMatX, aVecR, K, N)) {
|
||
//PushNoValue();
|
||
return;
|
||
}
|
||
// Later on we will divide by elements of aVecR, so make sure
|
||
// that they aren't zero.
|
||
bIsSingular = false;
|
||
for (row = 0; row < K && !bIsSingular; row++) {
|
||
bIsSingular = bIsSingular || aVecR[row] === 0;
|
||
}
|
||
|
||
if (bIsSingular) {
|
||
//PushNoValue();
|
||
return;
|
||
}
|
||
// Z = Q' Y;
|
||
for (col = 0; col < K; col++) {
|
||
lcl_ApplyHouseholderTransformation(pMatX, col, pMatZ, N);
|
||
}
|
||
// B = R^(-1) * Q' * Y <=> B = R^(-1) * Z <=> R * B = Z
|
||
// result Z should have zeros for index>=K; if not, ignore values
|
||
for (col = 0; col < K; col++) {
|
||
putDouble(pSlopes, col, getDouble(pMatZ, col));
|
||
}
|
||
lcl_SolveWithUpperRightTriangle(pMatX, aVecR, pSlopes, K, false);
|
||
fIntercept = 0.0;
|
||
if (bConstant) {
|
||
fIntercept = fMeanY - lcl_GetSumProduct(pMeans, pSlopes, K);
|
||
}
|
||
// Fill first line in result matrix
|
||
pResMat[K][0] = _bRKP ? Math.exp(fIntercept) : fIntercept;
|
||
for (i = 0; i < K; i++) {
|
||
pResMat[K - 1 - i][0] = _bRKP ? Math.exp(getDouble(pSlopes, i)) : getDouble(pSlopes, i);
|
||
}
|
||
|
||
|
||
if (bStats) {
|
||
fSSreg = 0.0;
|
||
fSSresid = 0.0;
|
||
// re-use memory of Z;
|
||
|
||
|
||
//*********
|
||
fillDouble(pMatZ, 0.0, 0, 0, 0, N - 1);
|
||
|
||
|
||
// Z = R * Slopes
|
||
lcl_ApplyUpperRightTriangle(pMatX, aVecR, pSlopes, pMatZ, K, false);
|
||
// Z = Q * Z, that is Q * R * Slopes = X * Slopes
|
||
for (var colp1 = K; colp1 > 0; colp1--) {
|
||
lcl_ApplyHouseholderTransformation(pMatX, colp1 - 1, pMatZ, N);
|
||
}
|
||
fSSreg = lcl_GetSumProduct(pMatZ, pMatZ, N);
|
||
|
||
|
||
//********
|
||
// re-use Y for residuals, Y = Y-Z
|
||
for (row = 0; row < N; row++) {
|
||
putDouble(pMatY, row, getDouble(pMatY, row) - getDouble(pMatZ, row));
|
||
}
|
||
|
||
|
||
fSSresid = lcl_GetSumProduct(pMatY, pMatY, N);
|
||
pResMat[0][4] = fSSreg;
|
||
pResMat[1][4] = fSSresid;
|
||
|
||
fDegreesFreedom = (bConstant) ? N - K - 1 : N - K;
|
||
pResMat[1][3] = fDegreesFreedom;
|
||
|
||
if (fDegreesFreedom === 0.0 || fSSresid === 0.0 || fSSreg === 0.0) {
|
||
pResMat[1][4] = 0;
|
||
pResMat[0][3] = null; //->PutError( FormulaError::NotAvailable, 0, 3); // F
|
||
pResMat[1][2] = 0;//->PutDouble(0.0, 1, 2); // RMSE
|
||
|
||
|
||
//********
|
||
for (i = 0; i < K; i++) {
|
||
pResMat[K - 1 - i][1] = 0;//->PutDouble(0.0, K-1-i, 1);
|
||
}
|
||
|
||
|
||
// SigmaIntercept = RMSE * sqrt(...) = 0
|
||
if (bConstant) {
|
||
pResMat[K][1] = 0;
|
||
} else {
|
||
pResMat[K][1] = null;
|
||
}//->PutError( FormulaError::NotAvailable, K, 1);
|
||
|
||
// R^2 = SSreg / (SSreg + SSresid) = 1.0
|
||
pResMat[0][2] = 1; // R^2
|
||
} else {
|
||
fFstatistic = (fSSreg / (K)) / (fSSresid / fDegreesFreedom);
|
||
pResMat[0][3] = fFstatistic;
|
||
|
||
// standard error of estimate = root mean SSE
|
||
fRMSE = Math.sqrt(fSSresid / fDegreesFreedom);
|
||
pResMat[1][2] = fRMSE;
|
||
|
||
// standard error of slopes
|
||
// = RMSE * sqrt(diagonal element of (R' R)^(-1) )
|
||
// standard error of intercept
|
||
// = RMSE * sqrt( Xmean * (R' R)^(-1) * Xmean' + 1/N)
|
||
// (R' R)^(-1) = R^(-1) * (R')^(-1). Do not calculate it as
|
||
// a whole matrix, but iterate over unit vectors.
|
||
fSigmaIntercept = 0.0;
|
||
|
||
|
||
//********
|
||
for (col = 0; col < K; col++) {
|
||
//re-use memory of MatZ
|
||
//pMatZ->FillDouble(0.0,0,0,0,K-1); // Z = unit vector e
|
||
fillDouble(pMatZ, 0.0, 0, 0, 0, K - 1);
|
||
putDouble(pMatZ, col, 1);//->PutDouble(1.0, col);
|
||
//Solve R' * Z = e
|
||
lcl_SolveWithLowerLeftTriangle(pMatX, aVecR, pMatZ, K, false);
|
||
// Solve R * Znew = Zold
|
||
lcl_SolveWithUpperRightTriangle(pMatX, aVecR, pMatZ, K, false);
|
||
// now Z is column col in (R' R)^(-1)
|
||
fSigmaSlope = fRMSE * Math.sqrt(getDouble(pMatZ, col));
|
||
pResMat[K - 1 - col][1] = fSigmaSlope//->PutDouble(fSigmaSlope, K-1-col, 1);
|
||
// (R' R) ^(-1) is symmetric
|
||
if (bConstant) {
|
||
fPart = lcl_GetSumProduct(pMeans, pMatZ, K);
|
||
fSigmaIntercept += fPart * getDouble(pMeans, col);
|
||
}
|
||
}
|
||
|
||
|
||
if (bConstant) {
|
||
fSigmaIntercept = fRMSE * Math.sqrt(fSigmaIntercept + 1.0 / N);
|
||
pResMat[K][1] = fSigmaIntercept;
|
||
} else {
|
||
pResMat[K][1] = null;//->PutError( FormulaError::NotAvailable, K, 1);
|
||
}
|
||
|
||
fR2 = fSSreg / (fSSreg + fSSresid);
|
||
pResMat[0][2] = fR2;
|
||
}
|
||
}
|
||
} else {
|
||
// nCase == 3
|
||
aVecR = []; // for QR decomposition
|
||
// Enough memory for needed matrices?
|
||
pMeans = GetNewMat(1, K); // mean of each row
|
||
|
||
if (bStats) {
|
||
pMatZ = matrixClone(pMatY);
|
||
}// Y is used in statistic, keep it
|
||
else {
|
||
pMatZ = pMatY;
|
||
} // Y can be overwritten
|
||
pSlopes = GetNewMat(K, 1); // from b1 to bK
|
||
if (!pMeans || !pMatZ || !pSlopes) {
|
||
//PushError(FormulaError::CodeOverflow);
|
||
return;
|
||
}
|
||
if (bConstant) {
|
||
lcl_CalculateRowMeans(pMatX, pMeans, N, K);
|
||
lcl_CalculateRowsDelta(pMatX, pMeans, N, K);
|
||
}
|
||
|
||
if (!lcl_TCalculateQRdecomposition(pMatX, aVecR, K, N)) {
|
||
//PushNoValue();
|
||
return;
|
||
}
|
||
|
||
// Later on we will divide by elements of aVecR, so make sure
|
||
// that they aren't zero.
|
||
bIsSingular = false;
|
||
for (row = 0; row < K && !bIsSingular; row++) {
|
||
bIsSingular = bIsSingular || aVecR[row] === 0.0;
|
||
}
|
||
if (bIsSingular) {
|
||
//PushNoValue();
|
||
return;
|
||
}
|
||
// Z = Q' Y
|
||
for (row = 0; row < K; row++) {
|
||
lcl_TApplyHouseholderTransformation(pMatX, row, pMatZ, N);
|
||
}
|
||
|
||
|
||
//*******
|
||
// B = R^(-1) * Q' * Y <=> B = R^(-1) * Z <=> R * B = Z
|
||
// result Z should have zeros for index>=K; if not, ignore values
|
||
for (col = 0; col < K; col++) {
|
||
pSlopes[col][0] = pMatZ[col][0];
|
||
}
|
||
|
||
|
||
lcl_SolveWithUpperRightTriangle(pMatX, aVecR, pSlopes, K, true);
|
||
fIntercept = 0.0;
|
||
if (bConstant) {
|
||
fIntercept = fMeanY - lcl_GetSumProduct(pMeans, pSlopes, K);
|
||
}
|
||
// Fill first line in result matrix
|
||
pResMat[K][0] = _bRKP ? Math.exp(fIntercept) : fIntercept;//->PutDouble(_bRKP ? exp(fIntercept) : fIntercept, K, 0 );
|
||
for (i = 0; i < K; i++) {
|
||
pResMat[K - 1 - i][0] = _bRKP ? Math.exp(pSlopes[i][0]) : pSlopes[i][0];
|
||
}
|
||
|
||
if (bStats) {
|
||
fSSreg = 0.0;
|
||
fSSresid = 0.0;
|
||
// re-use memory of Z;
|
||
|
||
|
||
//*********
|
||
//pMatZ->FillDouble(0.0, 0, 0, N-1, 0);
|
||
|
||
|
||
// Z = R * Slopes
|
||
lcl_ApplyUpperRightTriangle(pMatX, aVecR, pSlopes, pMatZ, K, true);
|
||
// Z = Q * Z, that is Q * R * Slopes = X * Slopes
|
||
for (var rowp1 = K; rowp1 > 0; rowp1--) {
|
||
lcl_TApplyHouseholderTransformation(pMatX, rowp1 - 1, pMatZ, N);
|
||
}
|
||
fSSreg = lcl_GetSumProduct(pMatZ, pMatZ, N);
|
||
|
||
|
||
//********
|
||
// re-use Y for residuals, Y = Y-Z
|
||
for (col = 0; col < N; col++) {
|
||
pMatY[0][col] = pMatY[0][col] - pMatZ[0][col];
|
||
}
|
||
|
||
|
||
fSSresid = lcl_GetSumProduct(pMatY, pMatY, N);
|
||
pResMat[0][4] = fSSreg;
|
||
pResMat[1][4] = fSSresid;
|
||
|
||
fDegreesFreedom = bConstant ? N - K - 1 : N - K;
|
||
pResMat[1][3] = fDegreesFreedom;
|
||
|
||
if (fDegreesFreedom === 0.0 || fSSresid === 0.0 || fSSreg === 0.0) { // exact fit; incl. case observed values Y are identical
|
||
pResMat[1][4] = 0; // SSresid
|
||
// F = (SSreg/K) / (SSresid/df) = #DIV/0!
|
||
pResMat[0][3] = null; // F
|
||
// RMSE = sqrt(SSresid / df) = sqrt(0 / df) = 0
|
||
pResMat[1][2] = 0; // RMSE
|
||
// SigmaSlope[i] = RMSE * sqrt(matrix[i,i]) = 0 * sqrt(...) = 0
|
||
|
||
|
||
for (i = 0; i < K; i++) {
|
||
pResMat[K - 1 - i][1] = 0;
|
||
}
|
||
|
||
|
||
// SigmaIntercept = RMSE * sqrt(...) = 0
|
||
if (bConstant) {
|
||
pResMat[K][1] = 0;
|
||
}//SigmaIntercept
|
||
else {
|
||
pResMat[K][1] = null;
|
||
}//->PutError( FormulaError::NotAvailable, K, 1);
|
||
|
||
// R^2 = SSreg / (SSreg + SSresid) = 1.0
|
||
pResMat[0][2] = 1; // R^2
|
||
} else {
|
||
fFstatistic = (fSSreg / K) / (fSSresid / fDegreesFreedom);
|
||
pResMat[0][3] = fFstatistic;
|
||
|
||
// standard error of estimate = root mean SSE
|
||
fRMSE = Math.sqrt(fSSresid / fDegreesFreedom);
|
||
pResMat[1][2] = fRMSE;
|
||
|
||
// standard error of slopes
|
||
// = RMSE * sqrt(diagonal element of (R' R)^(-1) )
|
||
// standard error of intercept
|
||
// = RMSE * sqrt( Xmean * (R' R)^(-1) * Xmean' + 1/N)
|
||
// (R' R)^(-1) = R^(-1) * (R')^(-1). Do not calculate it as
|
||
// a whole matrix, but iterate over unit vectors.
|
||
// (R' R) ^(-1) is symmetric
|
||
|
||
|
||
//********
|
||
fSigmaIntercept = 0.0;
|
||
|
||
for (row = 0; row < K; row++) {
|
||
//re-use memory of MatZ
|
||
//pMatZ->FillDouble(0.0,0,0,K-1,0); // Z = unit vector e
|
||
pMatZ[0][row] = 1;//->PutDouble(1.0, row);
|
||
//Solve R' * Z = e
|
||
lcl_SolveWithLowerLeftTriangle(pMatX, aVecR, pMatZ, K, true);
|
||
// Solve R * Znew = Zold
|
||
lcl_SolveWithUpperRightTriangle(pMatX, aVecR, pMatZ, K, true);
|
||
// now Z is column col in (R' R)^(-1)
|
||
fSigmaSlope = fRMSE * Math.sqrt(pMatZ[0][row]);
|
||
pResMat[K - 1 - row][1] = fSigmaSlope;
|
||
if (bConstant) {
|
||
fPart = lcl_GetSumProduct(pMeans, pMatZ, K);
|
||
fSigmaIntercept += fPart * pMeans[0][row];
|
||
}
|
||
}
|
||
|
||
|
||
if (bConstant) {
|
||
fSigmaIntercept = fRMSE * Math.sqrt(fSigmaIntercept + 1.0 / N);
|
||
pResMat[K][1] = fSigmaIntercept;
|
||
} else {
|
||
pResMat[K][1] = null;
|
||
}
|
||
|
||
fR2 = fSSreg / (fSSreg + fSSresid);
|
||
pResMat[0][2] = fR2;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return pResMat;
|
||
}
|
||
|
||
function getDouble(matrix, nIndex) {
|
||
var position = calcPosition(matrix, nIndex);
|
||
return matrix[position.col][position.row];
|
||
}
|
||
|
||
function putDouble(matrix, nIndex, val) {
|
||
var position = calcPosition(matrix, nIndex);
|
||
matrix[position.col][position.row] = val;
|
||
}
|
||
|
||
function calcPosition(matrix, nIndex) {
|
||
var rowSize = matrix[0].length;
|
||
var col = parseInt(rowSize > 1 ? nIndex / rowSize : nIndex);
|
||
var row = nIndex - col * rowSize;
|
||
return {row: row, col: col};
|
||
}
|
||
|
||
function fillDouble(matrix, val, nC1, nR1, nC2, nR2) {
|
||
for (var i = nC1; i <= nC2; i++) {
|
||
for (var j = nR1; j <= nR2; j++) {
|
||
matrix[i][j] = val;
|
||
}
|
||
}
|
||
}
|
||
|
||
function getBoolValue(val, defaultValue) {
|
||
var res = undefined !== defaultValue ? defaultValue : null;
|
||
|
||
if (!val) {
|
||
return res;
|
||
}
|
||
|
||
if (cElementType.number === val.type) {
|
||
res = val.tocBool().value;
|
||
} else if (cElementType.bool === val.type) {
|
||
res = val.value;
|
||
}
|
||
return res;
|
||
}
|
||
|
||
function GAMMADISTFUNCTION(fp, fAlpha, fBeta) {
|
||
this.fp = fp;
|
||
this.fAlpha = fAlpha;
|
||
this.fBeta = fBeta;
|
||
}
|
||
|
||
GAMMADISTFUNCTION.prototype.GetValue = function (x) {
|
||
var res;
|
||
var gammaDistVal = getGammaDist(x, this.fAlpha, this.fBeta);
|
||
res = this.fp - gammaDistVal;
|
||
return res;
|
||
};
|
||
|
||
function BETADISTFUNCTION(fp, fAlpha, fBeta) {
|
||
this.fp = fp;
|
||
this.fAlpha = fAlpha;
|
||
this.fBeta = fBeta;
|
||
}
|
||
|
||
BETADISTFUNCTION.prototype.GetValue = function (x) {
|
||
var res;
|
||
var betaDistVal = getBetaDist(x, this.fAlpha, this.fBeta);
|
||
res = this.fp - betaDistVal;
|
||
return res;
|
||
};
|
||
|
||
function CHIDISTFUNCTION(fp, fDF) {
|
||
this.fp = fp;
|
||
this.fDF = fDF;
|
||
}
|
||
|
||
CHIDISTFUNCTION.prototype.GetValue = function (x) {
|
||
var res;
|
||
var betaDistVal = getChiDist(x, this.fDF);
|
||
res = this.fp - betaDistVal;
|
||
return res;
|
||
};
|
||
|
||
function CHISQDISTFUNCTION(fp, fDF) {
|
||
this.fp = fp;
|
||
this.fDF = fDF;
|
||
}
|
||
|
||
CHISQDISTFUNCTION.prototype.GetValue = function (x) {
|
||
var res;
|
||
var betaDistVal = getChiSqDistCDF(x, this.fDF);
|
||
res = this.fp - betaDistVal;
|
||
return res;
|
||
};
|
||
|
||
function FDISTFUNCTION(fp, fF1, fF2) {
|
||
this.fp = fp;
|
||
this.fF1 = fF1;
|
||
this.fF2 = fF2;
|
||
}
|
||
|
||
FDISTFUNCTION.prototype.GetValue = function (x) {
|
||
var res;
|
||
var betaDistVal = getFDist(x, this.fF1, this.fF2);
|
||
res = this.fp - betaDistVal;
|
||
return res;
|
||
};
|
||
|
||
function TDISTFUNCTION(fp, fDF, nT) {
|
||
this.fp = fp;
|
||
this.fDF = fDF;
|
||
this.nT = nT;
|
||
}
|
||
|
||
TDISTFUNCTION.prototype.GetValue = function (x) {
|
||
var res;
|
||
var betaDistVal = getTDist(x, this.fDF, this.nT);
|
||
res = this.fp - betaDistVal;
|
||
return res;
|
||
};
|
||
|
||
|
||
function ScETSForecastCalculation(nSize) {
|
||
//SvNumberFormatter* mpFormatter;
|
||
this.maRange = []; // data (X, Y)
|
||
this.mpBase = []; // calculated base value array
|
||
this.mpTrend = []; // calculated trend factor array
|
||
this.mpPerIdx = []; // calculated periodical deviation array, not used with eds
|
||
this.mpForecast = []; // forecasted value array
|
||
this.mnSmplInPrd = 0; // samples per period
|
||
this.mfStepSize = 0; // increment of X in maRange
|
||
this.mfAlpha, this.mfBeta, this.mfGamma; // constants to minimise the RMSE in the ES-equations
|
||
this.mnCount = nSize; // No of data points
|
||
this.mbInitialised;
|
||
this.mnMonthDay; // n-month X-interval, value is day of month
|
||
// accuracy indicators
|
||
this.mfMAE; // mean absolute error
|
||
this.mfMASE; // mean absolute scaled error
|
||
this.mfMSE; // mean squared error (variation)
|
||
this.mfRMSE; // root mean squared error (standard deviation)
|
||
this.mfSMAPE; // symmetric mean absolute error
|
||
//FormulaError mnErrorValue;
|
||
this.bAdditive; // true: additive method, false: multiplicative method
|
||
this.bEDS; // true: EDS, false: ETS
|
||
|
||
// constants used in determining best fit for alpha, beta, gamma
|
||
this.cfMinABCResolution = 0.001; // minimum change of alpha, beta, gamma
|
||
this.cnScenarios = 1000; // No. of scenarios to calculate for PI calculations
|
||
|
||
/*bool initData();
|
||
bool prefillBaseData();
|
||
bool prefillTrendData();
|
||
bool prefillPerIdx();
|
||
bool initCalc();
|
||
void refill();
|
||
SCSIZE CalcPeriodLen();
|
||
void CalcAlphaBetaGamma();
|
||
void CalcBetaGamma();
|
||
void CalcGamma();
|
||
void calcAccuracyIndicators();
|
||
bool GetForecast( double fTarget, double& rForecast );
|
||
double RandDev();
|
||
double convertXtoMonths( double x );*/
|
||
}
|
||
|
||
/*ScETSForecastCalculation::ScETSForecastCalculation( nSize, pFormatter )
|
||
: mpFormatter(pFormatter)
|
||
, mpBase(nullptr)
|
||
, mpTrend(nullptr)
|
||
, mpPerIdx(nullptr)
|
||
, mpForecast(nullptr)
|
||
, mnSmplInPrd(0)
|
||
, mfStepSize(0.0)
|
||
, mfAlpha(0.0)
|
||
, mfBeta(0.0)
|
||
, mfGamma(0.0)
|
||
, mnCount(nSize)
|
||
, mbInitialised(false)
|
||
, mnMonthDay(0)
|
||
, mfMAE(0.0)
|
||
, mfMASE(0.0)
|
||
, mfMSE(0.0)
|
||
, mfRMSE(0.0)
|
||
, mfSMAPE(0.0)
|
||
, mnErrorValue(FormulaError::NONE)
|
||
, bAdditive(false)
|
||
, bEDS(false)
|
||
{
|
||
maRange.reserve( mnCount );
|
||
}*/
|
||
|
||
ScETSForecastCalculation.prototype = Object.create(ScETSForecastCalculation.prototype);
|
||
ScETSForecastCalculation.prototype.constructor = ScETSForecastCalculation;
|
||
|
||
|
||
ScETSForecastCalculation.prototype.PreprocessDataRange =
|
||
function (rMatX, rMatY, rSmplInPrd, bDataCompletion, nAggregation, rTMat, eETSType) {
|
||
var nColMatX = rMatX.length;
|
||
var nRowMatX = rMatX[0].length;
|
||
var nColMatY = rMatY.length;
|
||
var nRowMatY = rMatY[0].length;
|
||
|
||
if (nColMatX !== nColMatY || nRowMatX !== nRowMatY && !checkNumericMatrix(rMatX) ||
|
||
!checkNumericMatrix(rMatY)) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
this.bEDS = (rSmplInPrd === 0);
|
||
this.bAdditive = /*( eETSType == etsAdd || eETSType == etsPIAdd || eETSType == etsStatAdd )*/true;
|
||
|
||
this.mnCount = rMatX.length;
|
||
var maRange = this.maRange;
|
||
for (var i = 0; i < this.mnCount; i++) {
|
||
maRange.push({X: rMatX[i][0].value, Y: rMatY[i][0].value});
|
||
}
|
||
|
||
maRange.sort(function (a, b) {
|
||
return a.X - b.X;
|
||
});
|
||
|
||
if (rTMat) {
|
||
if (/*eETSType != etsPIAdd && eETSType != etsPIMult*/true) {
|
||
if (rTMat[0][0].getValue() < maRange[0].X) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
} else {
|
||
if (rTMat[0] < maRange[this.mnCount - 1].X) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
}
|
||
}
|
||
|
||
var aDate = cDate.prototype.getDateFromExcel(maRange[0].X);
|
||
this.mnMonthDay = aDate.getDate();
|
||
for (var i = 1; i < this.mnCount && this.mnMonthDay; i++) {
|
||
var aDate1 = cDate.prototype.getDateFromExcel(maRange[i].X);
|
||
if (aDate !== aDate1) {
|
||
if (aDate1.getDate() !== this.mnMonthDay) {
|
||
this.mnMonthDay = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
this.mfStepSize = Number.MAX_VALUE;
|
||
if (this.mnMonthDay) {
|
||
for (var i = 0; i < this.mnCount; i++) {
|
||
var aDate = cDate.prototype.getDateFromExcel(maRange[i].X);
|
||
maRange[i].X = aDate.getUTCFullYear() * 12 + aDate.getMonth();
|
||
}
|
||
}
|
||
|
||
for (var i = 1; i < this.mnCount; i++) {
|
||
|
||
var fStep = maRange[i].X - maRange[i - 1].X;
|
||
if (fStep === 0.0) {
|
||
if (nAggregation === 0) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
var fTmp = maRange[i - 1].Y;
|
||
var nCounter = 1;
|
||
switch (nAggregation) {
|
||
case 1 : // AVERAGE (default)
|
||
while (i < this.mnCount && maRange[i].X === maRange[i - 1].X) {
|
||
maRange.splice(i, 1);
|
||
--this.mnCount;
|
||
}
|
||
break;
|
||
case 7 : // SUM
|
||
while (i < this.mnCount && maRange[i].X === maRange[i - 1].X) {
|
||
fTmp += maRange[i].Y;
|
||
maRange.splice(i, 1);
|
||
--this.mnCount;
|
||
}
|
||
maRange[i - 1].Y = fTmp;
|
||
break;
|
||
|
||
case 2 : // COUNT
|
||
case 3 : // COUNTA (same as COUNT as there are no non-numeric Y-values)
|
||
while (i < this.mnCount && maRange[i].X === maRange[i - 1].X) {
|
||
nCounter++;
|
||
maRange.splice(i, 1);
|
||
--this.mnCount;
|
||
}
|
||
maRange[i - 1].Y = nCounter;
|
||
break;
|
||
|
||
case 4 : // MAX
|
||
while (i < this.mnCount && maRange[i].X === maRange[i - 1].X) {
|
||
if (maRange[i].Y > fTmp) {
|
||
fTmp = maRange[i].Y;
|
||
}
|
||
maRange.splice(i, 1);
|
||
--this.mnCount;
|
||
}
|
||
maRange[i - 1].Y = fTmp;
|
||
break;
|
||
|
||
case 5 : // MEDIAN
|
||
|
||
var aTmp = [];
|
||
aTmp.push(maRange[i - 1].Y);
|
||
while (i < this.mnCount && maRange[i].X === maRange[i - 1].X) {
|
||
aTmp.push(maRange[i].Y);
|
||
nCounter++;
|
||
maRange.splice(i, 1);
|
||
--this.mnCount;
|
||
}
|
||
|
||
//sort( aTmp.begin(), aTmp.end() );
|
||
|
||
if (nCounter % 2) {
|
||
maRange[i - 1].Y = aTmp[nCounter / 2];
|
||
} else {
|
||
maRange[i - 1].Y = (aTmp[nCounter / 2] + aTmp[nCounter / 2 - 1]) / 2.0;
|
||
}
|
||
|
||
break;
|
||
|
||
case 6 : // MIN
|
||
while (i < this.mnCount && maRange[i].X === maRange[i - 1].X) {
|
||
if (maRange[i].Y < fTmp) {
|
||
fTmp = maRange[i].Y;
|
||
}
|
||
maRange.splice(i, 1);
|
||
--this.mnCount;
|
||
}
|
||
maRange[i - 1].Y = fTmp;
|
||
break;
|
||
}
|
||
|
||
if (i < this.mnCount - 1) {
|
||
fStep = maRange[i].X - maRange[i - 1].X;
|
||
} else {
|
||
fStep = this.mfStepSize;
|
||
}
|
||
}
|
||
|
||
if (fStep > 0 && fStep < this.mfStepSize) {
|
||
this.mfStepSize = fStep;
|
||
}
|
||
}
|
||
|
||
// step must be constant (or gap multiple of step)
|
||
var bHasGap = false;
|
||
for (var i = 1; i < this.mnCount && !bHasGap; i++) {
|
||
var fStep = maRange[i].X - maRange[i - 1].X;
|
||
|
||
if (fStep != this.mfStepSize) {
|
||
if (Math.fmod(fStep, this.mfStepSize) !== 0.0) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
bHasGap = true;
|
||
}
|
||
}
|
||
|
||
if (bHasGap) {
|
||
var nMissingXCount = 0;
|
||
var fOriginalCount = this.mnCount;
|
||
if (this.mnMonthDay) {
|
||
aDate = cDate.prototype.getDateFromExcel(maRange[0].X);
|
||
}
|
||
|
||
for (var i = 1; i < this.mnCount; i++) {
|
||
var fDist;
|
||
if (this.mnMonthDay) {
|
||
var aDate1 = cDate.prototype.getDateFromExcel(maRange[i].X);
|
||
fDist = 12 * (aDate1.getUTCFullYear() - aDate.getUTCFullYear()) +
|
||
(aDate1.getMonth() - aDate.getMonth());
|
||
aDate = aDate1;
|
||
} else {
|
||
fDist = maRange[i].X - maRange[i - 1].X;
|
||
}
|
||
|
||
if (fDist > this.mfStepSize) {
|
||
// gap, insert missing data points
|
||
var fYGap = (maRange[i].Y + maRange[i - 1].Y) / 2.0;
|
||
for (var fXGap = maRange[i - 1].X + this.mfStepSize; fXGap < maRange[i].X;
|
||
fXGap += this.mfStepSize) {
|
||
var newAddElem = {X: fXGap, Y: (bDataCompletion ? fYGap : 0.0)};
|
||
maRange.splice(i, 1, newAddElem);
|
||
i++;
|
||
this.mnCount++;
|
||
nMissingXCount++;
|
||
if (nMissingXCount / fOriginalCount > 0.3) {
|
||
// maximum of 30% missing points exceeded
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (rSmplInPrd !== 1) {
|
||
this.mnSmplInPrd = rSmplInPrd;
|
||
} else {
|
||
this.mnSmplInPrd = this.CalcPeriodLen();
|
||
if (this.mnSmplInPrd === 1) {
|
||
this.bEDS = true; // period length 1 means no periodic data: EDS suffices
|
||
}
|
||
}
|
||
|
||
if (!this.initData()) {
|
||
return false; // note: mnErrorValue is set in called function(s)
|
||
}
|
||
|
||
return true;
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.initData = function () {
|
||
// give various vectors size and initial value
|
||
this.mpBase = [];
|
||
fillArray(this.mpBase, 0, this.mnCount);
|
||
|
||
this.mpTrend = [];
|
||
fillArray(this.mpTrend, 0, this.mnCount);
|
||
|
||
if (!this.bEDS) {
|
||
this.mpPerIdx = [];
|
||
fillArray(this.mpPerIdx, 0, this.mnCount);
|
||
}
|
||
|
||
this.mpForecast = [];
|
||
fillArray(this.mpForecast, 0, this.mnCount);
|
||
this.mpForecast[0] = this.maRange[0].Y;
|
||
|
||
if (this.prefillTrendData()) {
|
||
if (this.prefillPerIdx()) {
|
||
if (this.prefillBaseData()) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
|
||
ScETSForecastCalculation.prototype.prefillTrendData = function () {
|
||
if (this.bEDS) {
|
||
this.mpTrend[0] = (this.maRange[this.mnCount - 1].Y - this.maRange[0].Y) / (this.mnCount - 1);
|
||
} else {
|
||
// we need at least 2 periods in the data range
|
||
if (this.mnCount < 2 * this.mnSmplInPrd) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
var fSum = 0.0;
|
||
for (var i = 0; i < this.mnSmplInPrd; i++) {
|
||
fSum += this.maRange[i + this.mnSmplInPrd].Y - this.maRange[i].Y;
|
||
}
|
||
var fTrend = fSum / (this.mnSmplInPrd * this.mnSmplInPrd);
|
||
|
||
this.mpTrend[0] = fTrend;
|
||
}
|
||
|
||
return true;
|
||
};
|
||
|
||
ScETSForecastCalculation.prototype.prefillPerIdx = function () {
|
||
if (!this.bEDS) {
|
||
// use as many complete periods as available
|
||
if (this.mnSmplInPrd == 0) {
|
||
// should never happen; if mnSmplInPrd equals 0, bEDS is true
|
||
//mnErrorValue = FormulaError::UnknownState;
|
||
return false;
|
||
}
|
||
|
||
var nPeriods = parseInt(this.mnCount / this.mnSmplInPrd);//scsize
|
||
|
||
var aPeriodAverage = [];
|
||
for (var i = 0; i < nPeriods; i++) {
|
||
aPeriodAverage[i] = 0;
|
||
for (var j = 0; j < this.mnSmplInPrd; j++) {
|
||
aPeriodAverage[i] += this.maRange[i * this.mnSmplInPrd + j].Y;
|
||
}
|
||
aPeriodAverage[i] /= this.mnSmplInPrd;
|
||
if (aPeriodAverage[i] === 0.0) {
|
||
//SAL_WARN( "sc.core", "prefillPerIdx(), average of 0 will cause divide by zero error, quitting calculation" );
|
||
//mnErrorValue = FormulaError::DivisionByZero;
|
||
return false;
|
||
}
|
||
}
|
||
|
||
for (var j = 0; j < this.mnSmplInPrd; j++) {
|
||
var fI = 0.0;
|
||
for (var i = 0; i < nPeriods; i++) {
|
||
// adjust average value for position within period
|
||
if (this.bAdditive) {
|
||
fI += (this.maRange[i * this.mnSmplInPrd + j].Y -
|
||
(aPeriodAverage[i] + (j - 0.5 * (this.mnSmplInPrd - 1)) * this.mpTrend[0]));
|
||
} else {
|
||
fI += (this.maRange[i * this.mnSmplInPrd + j].Y /
|
||
(aPeriodAverage[i] + (j - 0.5 * (this.mnSmplInPrd - 1)) * this.mpTrend[0]));
|
||
}
|
||
}
|
||
this.mpPerIdx[j] = fI / nPeriods;
|
||
}
|
||
}
|
||
return true;
|
||
};
|
||
|
||
ScETSForecastCalculation.prototype.randDev = function () {
|
||
return this.mfRMSE * gaussinv(0.57426331936068653);
|
||
};
|
||
|
||
ScETSForecastCalculation.prototype.prefillBaseData = function () {
|
||
if (this.bEDS) {
|
||
this.mpBase[0] = this.maRange[0].Y;
|
||
} else {
|
||
this.mpBase[0] = this.maRange[0].Y / this.mpPerIdx[0];
|
||
}
|
||
|
||
return true;
|
||
};
|
||
|
||
ScETSForecastCalculation.prototype.initCalc = function () {
|
||
if (!this.mbInitialised) {
|
||
this.CalcAlphaBetaGamma();
|
||
|
||
this.mbInitialised = true;
|
||
this.calcAccuracyIndicators();
|
||
}
|
||
return true;
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.calcAccuracyIndicators = function () {
|
||
var fSumAbsErr = 0.0;
|
||
var fSumDivisor = 0.0;
|
||
var fSumErrSq = 0.0;
|
||
var fSumAbsPercErr = 0.0;
|
||
|
||
for (var i = 1; i < this.mnCount; i++) {
|
||
var fError = this.mpForecast[i] - this.maRange[i].Y;
|
||
fSumAbsErr += Math.abs(fError);
|
||
fSumErrSq += fError * fError;
|
||
fSumAbsPercErr += Math.abs(fError) / (Math.abs(this.mpForecast[i]) + Math.abs(this.maRange[i].Y));
|
||
}
|
||
|
||
for (var i = 2; i < this.mnCount; i++) {
|
||
fSumDivisor += Math.abs(this.maRange[i].Y - this.maRange[i - 1].Y);
|
||
}
|
||
|
||
var nCalcCount = this.mnCount - 1;
|
||
this.mfMAE = fSumAbsErr / nCalcCount;
|
||
this.mfMASE = fSumAbsErr / (nCalcCount * fSumDivisor / (nCalcCount - 1));
|
||
this.mfMSE = fSumErrSq / nCalcCount;
|
||
this.mfRMSE = Math.sqrt(this.mfMSE);
|
||
this.mfSMAPE = fSumAbsPercErr * 2.0 / nCalcCount;
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.CalcPeriodLen = function () {
|
||
var nBestVal = this.mnCount;
|
||
var fBestME = Number.MAX_VALUE;
|
||
var maRange = this.maRange;
|
||
|
||
for (var nPeriodLen = parseInt(this.mnCount / 2); nPeriodLen >= 1; nPeriodLen--) {
|
||
var fMeanError = 0.0;
|
||
var nPeriods = parseInt(this.mnCount / nPeriodLen);
|
||
var nStart = parseInt(this.mnCount - (nPeriods * nPeriodLen) + 1);
|
||
for (var i = nStart; i < (this.mnCount - nPeriodLen); i++) {
|
||
fMeanError += Math.abs((maRange[i].Y - maRange[i - 1].Y) -
|
||
(maRange[nPeriodLen + i].Y - maRange[nPeriodLen + i - 1].Y));
|
||
}
|
||
fMeanError /= (nPeriods - 1) * nPeriodLen - 1;
|
||
|
||
if (fMeanError <= fBestME || fMeanError === 0.0) {
|
||
nBestVal = nPeriodLen;
|
||
fBestME = fMeanError;
|
||
}
|
||
}
|
||
return nBestVal;
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.CalcAlphaBetaGamma = function () {
|
||
var f0 = 0.0;
|
||
this.mfAlpha = f0;
|
||
if (this.bEDS) {
|
||
this.mfBeta = 0.0; // beta is not used with EDS
|
||
this.CalcGamma();
|
||
} else {
|
||
this.CalcBetaGamma();
|
||
}
|
||
this.refill();
|
||
var fE0 = this.mfMSE;
|
||
|
||
var f2 = 1.0;
|
||
this.mfAlpha = f2;
|
||
if (this.bEDS) {
|
||
this.CalcGamma();
|
||
} else {
|
||
this.CalcBetaGamma();
|
||
}
|
||
this.refill();
|
||
var fE2 = this.mfMSE;
|
||
|
||
var f1 = 0.5;
|
||
this.mfAlpha = f1;
|
||
if (this.bEDS) {
|
||
this.CalcGamma();
|
||
} else {
|
||
this.CalcBetaGamma();
|
||
}
|
||
this.refill();
|
||
|
||
if (fE0 === this.mfMSE && this.mfMSE === fE2) {
|
||
this.mfAlpha = 0;
|
||
if (this.bEDS) {
|
||
this.CalcGamma();
|
||
} else {
|
||
this.CalcBetaGamma();
|
||
}
|
||
this.refill();
|
||
return;
|
||
}
|
||
|
||
while ((f2 - f1) > this.cfMinABCResolution) {
|
||
if (fE2 > fE0) {
|
||
f2 = f1;
|
||
fE2 = this.mfMSE;
|
||
f1 = (f0 + f1) / 2;
|
||
} else {
|
||
f0 = f1;
|
||
fE0 = this.mfMSE;
|
||
f1 = (f1 + f2) / 2;
|
||
}
|
||
this.mfAlpha = f1;
|
||
if (this.bEDS) {
|
||
this.CalcGamma();
|
||
} else {
|
||
this.CalcBetaGamma();
|
||
}
|
||
this.refill();
|
||
}
|
||
if (fE2 > fE0) {
|
||
if (fE0 < this.mfMSE) {
|
||
this.mfAlpha = f0;
|
||
if (this.bEDS) {
|
||
this.CalcGamma();
|
||
} else {
|
||
this.CalcBetaGamma();
|
||
}
|
||
this.refill();
|
||
}
|
||
} else {
|
||
if (fE2 < this.mfMSE) {
|
||
this.mfAlpha = f2;
|
||
if (this.bEDS) {
|
||
this.CalcGamma();
|
||
} else {
|
||
this.CalcBetaGamma();
|
||
}
|
||
this.refill();
|
||
}
|
||
}
|
||
this.calcAccuracyIndicators();
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.CalcBetaGamma = function () {
|
||
var f0 = 0.0;
|
||
this.mfBeta = f0;
|
||
this.CalcGamma();
|
||
this.refill();
|
||
var fE0 = this.mfMSE;
|
||
|
||
var f2 = 1.0;
|
||
this.mfBeta = f2;
|
||
this.CalcGamma();
|
||
this.refill();
|
||
var fE2 = this.mfMSE;
|
||
|
||
var f1 = 0.5;
|
||
this.mfBeta = f1;
|
||
this.CalcGamma();
|
||
this.refill();
|
||
|
||
if (fE0 === this.mfMSE && this.mfMSE === fE2) {
|
||
this.mfBeta = 0;
|
||
this.CalcGamma();
|
||
this.refill();
|
||
return;
|
||
}
|
||
while ((f2 - f1) > this.cfMinABCResolution) {
|
||
if (fE2 > fE0) {
|
||
f2 = f1;
|
||
fE2 = this.mfMSE;
|
||
f1 = (f0 + f1) / 2;
|
||
} else {
|
||
f0 = f1;
|
||
fE0 = this.mfMSE;
|
||
f1 = (f1 + f2) / 2;
|
||
}
|
||
this.mfBeta = f1;
|
||
this.CalcGamma();
|
||
this.refill();
|
||
}
|
||
if (fE2 > fE0) {
|
||
if (fE0 < this.mfMSE) {
|
||
this.mfBeta = f0;
|
||
this.CalcGamma();
|
||
this.refill();
|
||
}
|
||
} else {
|
||
if (fE2 < this.mfMSE) {
|
||
this.mfBeta = f2;
|
||
this.CalcGamma();
|
||
this.refill();
|
||
}
|
||
}
|
||
};
|
||
|
||
ScETSForecastCalculation.prototype.CalcGamma = function () {
|
||
var f0 = 0.0;
|
||
this.mfGamma = f0;
|
||
this.refill();
|
||
var fE0 = this.mfMSE;
|
||
|
||
var f2 = 1.0;
|
||
this.mfGamma = f2;
|
||
this.refill();
|
||
var fE2 = this.mfMSE;
|
||
|
||
var f1 = 0.5;
|
||
this.mfGamma = f1;
|
||
this.refill();
|
||
|
||
if (fE0 === this.mfMSE && this.mfMSE === fE2) {
|
||
this.mfGamma = 0;
|
||
this.refill();
|
||
return;
|
||
}
|
||
while ((f2 - f1) > this.cfMinABCResolution) {
|
||
if (fE2 > fE0) {
|
||
f2 = f1;
|
||
fE2 = this.mfMSE;
|
||
f1 = (f0 + f1) / 2;
|
||
} else {
|
||
f0 = f1;
|
||
fE0 = this.mfMSE;
|
||
f1 = (f1 + f2) / 2;
|
||
}
|
||
this.mfGamma = f1;
|
||
this.refill();
|
||
}
|
||
if (fE2 > fE0) {
|
||
if (fE0 < this.mfMSE) {
|
||
this.mfGamma = f0;
|
||
this.refill();
|
||
}
|
||
} else {
|
||
if (fE2 < this.mfMSE) {
|
||
this.mfGamma = f2;
|
||
this.refill();
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.refill = function () {
|
||
// refill mpBase, mpTrend, mpPerIdx and mpForecast with values
|
||
// using the calculated mfAlpha, (mfBeta), mfGamma
|
||
// forecast 1 step ahead
|
||
for (var i = 1; i < this.mnCount; i++) {
|
||
if (this.bEDS) {
|
||
this.mpBase[i] = this.mfAlpha * this.maRange[i].Y + (1 - this.mfAlpha) *
|
||
(this.mpBase[i - 1] + this.mpTrend[i - 1]);
|
||
this.mpTrend[i] =
|
||
this.mfGamma * (this.mpBase[i] - this.mpBase[i - 1]) + (1 - this.mfGamma) * this.mpTrend[i - 1];
|
||
this.mpForecast[i] = this.mpBase[i - 1] + this.mpTrend[i - 1];
|
||
} else {
|
||
var nIdx;
|
||
if (this.bAdditive) {
|
||
nIdx = (i > this.mnSmplInPrd ? i - this.mnSmplInPrd : i);
|
||
this.mpBase[i] = this.mfAlpha * (this.maRange[i].Y - this.mpPerIdx[nIdx]) + (1 - this.mfAlpha) *
|
||
(this.mpBase[i - 1] + this.mpTrend[i - 1]);
|
||
this.mpPerIdx[i] = this.mfBeta * (this.maRange[i].Y - this.mpBase[i]) + (1 - this.mfBeta) *
|
||
this.mpPerIdx[nIdx];
|
||
} else {
|
||
nIdx = (i >= this.mnSmplInPrd ? i - this.mnSmplInPrd : i);
|
||
this.mpBase[i] = this.mfAlpha * (this.maRange[i].Y / this.mpPerIdx[nIdx]) + (1 - this.mfAlpha) *
|
||
(this.mpBase[i - 1] + this.mpTrend[i - 1]);
|
||
this.mpPerIdx[i] = this.mfBeta * (this.maRange[i].Y / this.mpBase[i]) + (1 - this.mfBeta) *
|
||
this.mpPerIdx[this.nIdx];
|
||
}
|
||
this.mpTrend[i] =
|
||
this.mfGamma * (this.mpBase[i] - this.mpBase[i - 1]) + (1 - this.mfGamma) * this.mpTrend[i - 1];
|
||
|
||
if (this.bAdditive) {
|
||
this.mpForecast[i] = this.mpBase[i - 1] + this.mpTrend[i - 1] + this.mpPerIdx[nIdx];
|
||
} else {
|
||
this.mpForecast[i] = (this.mpBase[i - 1] + this.mpTrend[i - 1]) * this.mpPerIdx[nIdx];
|
||
}
|
||
}
|
||
}
|
||
this.calcAccuracyIndicators();
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.convertXtoMonths = function (x) {
|
||
//Date aNullDate = *( mpFormatter->GetNullDate() );
|
||
var aDate = cDate.prototype.getDateFromExcel(x);
|
||
var nYear = aDate.getUTCFullYear();
|
||
var nMonth = aDate.getMonth();
|
||
var fMonthLength;
|
||
switch (nMonth) {
|
||
case 1 :
|
||
case 3 :
|
||
case 5 :
|
||
case 7 :
|
||
case 8 :
|
||
case 10 :
|
||
case 12 :
|
||
fMonthLength = 31.0;
|
||
break;
|
||
case 2 :
|
||
fMonthLength = (aDate.isLeapYear() ? 29.0 : 28.0);
|
||
break;
|
||
default :
|
||
fMonthLength = 30.0;
|
||
}
|
||
return (12.0 * nYear + nMonth + (aDate.getDate() - this.mnMonthDay) / fMonthLength);
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.GetForecast = function (fTarget, rForecast) {
|
||
if (!this.initCalc()) {
|
||
return false;
|
||
}
|
||
|
||
if (fTarget <= this.maRange[this.mnCount - 1].X) {
|
||
var n = (fTarget - this.maRange[0].X) / this.mfStepSize;
|
||
var fInterpolate = Math.fmod(fTarget - this.maRange[0].X, this.mfStepSize);
|
||
// rForecast = this.maRange[n].Y;
|
||
rForecast = this.maRange[n] ? this.maRange[n].Y : 0;
|
||
|
||
if (fInterpolate >= this.cfMinABCResolution) {
|
||
var fInterpolateFactor = fInterpolate / this.mfStepSize;
|
||
var fFc_1 = this.mpForecast[n + 1];
|
||
rForecast = rForecast + fInterpolateFactor * (fFc_1 - rForecast);
|
||
}
|
||
} else {
|
||
var n = Math.round((fTarget - this.maRange[this.mnCount - 1].X) / this.mfStepSize);
|
||
var fInterpolate = parseInt(Math.fmod(fTarget - this.maRange[this.mnCount - 1].X, this.mfStepSize));
|
||
|
||
if (this.bEDS) {
|
||
rForecast = this.mpBase[this.mnCount - 1] + n * this.mpTrend[this.mnCount - 1];
|
||
} else if (this.bAdditive) {
|
||
rForecast = this.mpBase[this.mnCount - 1] + n * this.mpTrend[this.mnCount - 1] +
|
||
this.mpPerIdx[this.mnCount - 1 - this.mnSmplInPrd + (n % this.mnSmplInPrd)];
|
||
} else {
|
||
rForecast = (this.mpBase[this.mnCount - 1] + n * this.mpTrend[this.mnCount - 1]) *
|
||
this.mpPerIdx[this.mnCount - 1 - this.mnSmplInPrd + (n % this.mnSmplInPrd)];
|
||
}
|
||
|
||
if (fInterpolate >= this.cfMinABCResolution) {
|
||
var fInterpolateFactor = fInterpolate / this.mfStepSize;
|
||
var fFc_1;
|
||
if (this.bEDS) {
|
||
fFc_1 = this.mpBase[this.mnCount - 1] + (n + 1) * this.mpTrend[this.mnCount - 1];
|
||
} else if (this.bAdditive) {
|
||
fFc_1 = this.mpBase[this.mnCount - 1] + (n + 1) * this.mpTrend[this.mnCount - 1] +
|
||
this.mpPerIdx[this.mnCount - 1 - this.mnSmplInPrd + ((n + 1) % this.mnSmplInPrd)];
|
||
} else {
|
||
fFc_1 = (this.mpBase[this.mnCount - 1] + (n + 1) * this.mpTrend[this.mnCount - 1]) *
|
||
this.mpPerIdx[this.mnCount - 1 - this.mnSmplInPrd + ((n + 1) % this.mnSmplInPrd)];
|
||
}
|
||
rForecast = rForecast + fInterpolateFactor * (fFc_1 - rForecast);
|
||
}
|
||
}
|
||
return rForecast;
|
||
};
|
||
|
||
ScETSForecastCalculation.prototype.GetForecastRange = function (rTMat) {
|
||
var nC = rTMat.length, nR = rTMat[0].length;
|
||
|
||
var rFcMat = [];
|
||
|
||
for (var i = 0; i < nR; i++) {
|
||
for (var j = 0; j < nC; j++) {
|
||
var fTarget;
|
||
if (this.mnMonthDay) {
|
||
fTarget = this.convertXtoMonths(rTMat[j][i].getValue());
|
||
} else {
|
||
fTarget = rTMat[j][i].getValue();
|
||
}
|
||
var fForecast;
|
||
if (fForecast = this.GetForecast(fTarget)) {
|
||
if (!rFcMat[j]) {
|
||
rFcMat[j] = [];
|
||
}
|
||
rFcMat[j][i] = fForecast;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
return rFcMat;
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.GetStatisticValue = function (rTypeMat) {
|
||
if (!this.initCalc()) {
|
||
return false;
|
||
}
|
||
|
||
var nC = rTypeMat.length, nR = rTypeMat[0].length;
|
||
var rStatMat = [];
|
||
for (var i = 0; i < nR; i++) {
|
||
for (var j = 0; j < nC; j++) {
|
||
if (!rStatMat[j]) {
|
||
rStatMat[j] = [];
|
||
}
|
||
switch (rTypeMat[j][i].getValue()) {
|
||
case 1 : // alpha
|
||
rStatMat[j][i] = this.mfAlpha;
|
||
break;
|
||
case 2 : // gamma
|
||
rStatMat[j][i] = this.mfGamma;
|
||
break;
|
||
case 3 : // beta
|
||
rStatMat[j][i] = this.mfBeta;
|
||
break;
|
||
case 4 : // MASE
|
||
rStatMat[j][i] = this.mfMASE;
|
||
break;
|
||
case 5 : // SMAPE
|
||
rStatMat[j][i] = this.mfSMAPE;
|
||
break;
|
||
case 6 : // MAE
|
||
rStatMat[j][i] = this.mfMAE;
|
||
break;
|
||
case 7 : // RMSE
|
||
rStatMat[j][i] = this.mfRMSE;
|
||
break;
|
||
case 8 : // step size
|
||
rStatMat[j][i] = this.mfStepSize;
|
||
break;
|
||
case 9 : // samples in period
|
||
rStatMat[j][i] = this.mnSmplInPrd;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return rStatMat;
|
||
};
|
||
|
||
ScETSForecastCalculation.prototype.GetETSPredictionIntervals = function (rTMat, fPILevel) {
|
||
if (!this.initCalc()) {
|
||
return false;
|
||
}
|
||
|
||
var rPIMat = null;
|
||
var nC = rTMat.length, nR = rTMat[0].length;
|
||
|
||
// find maximum target value and calculate size of coefficient- array c
|
||
var fMaxTarget = rTMat[0][0].value;
|
||
for (var i = 0; i < nR; i++) {
|
||
for (var j = 0; j < nC; j++) {
|
||
if (fMaxTarget < rTMat[j][i].value) {
|
||
fMaxTarget = rTMat[j][i].value;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (this.mnMonthDay) {
|
||
fMaxTarget = this.convertXtoMonths(fMaxTarget) - this.maRange[this.mnCount - 1].X;
|
||
} else {
|
||
fMaxTarget -= this.maRange[this.mnCount - 1].X;
|
||
}
|
||
|
||
var nSize = (fMaxTarget / this.mfStepSize);
|
||
if (Math.fmod(fMaxTarget, this.mfStepSize) !== 0.0) {
|
||
nSize++;
|
||
}
|
||
|
||
var xScenRange = [];
|
||
var xScenBase = [];
|
||
var xScenTrend = [];
|
||
var xScenPerIdx = [];
|
||
var aPredictions = [];
|
||
|
||
// fill scenarios
|
||
for (var k = 0; k < this.cnScenarios; k++) {
|
||
// fill array with forecasts, with RandDev() added to xScenRange
|
||
if (this.bAdditive) {
|
||
// calculation based on additive model
|
||
xScenRange[0] = this.mpBase[this.mnCount - 1] + this.mpTrend[this.mnCount - 1] +
|
||
this.mpPerIdx[this.mnCount - this.mnSmplInPrd] + this.randDev();
|
||
|
||
if (!aPredictions[0]) {
|
||
aPredictions[0] = [];
|
||
}
|
||
aPredictions[0][k] = xScenRange[0];
|
||
xScenBase[0] = this.mfAlpha * (xScenRange[0] - this.mpPerIdx[this.mnCount - this.mnSmplInPrd]) +
|
||
(1 - this.mfAlpha) * (this.mpBase[this.mnCount - 1] + this.mpTrend[this.mnCount - 1]);
|
||
xScenTrend[0] = this.mfGamma * (xScenBase[0] - this.mpBase[this.mnCount - 1]) + (1 - this.mfGamma) *
|
||
this.mpTrend[this.mnCount - 1];
|
||
xScenPerIdx[0] = this.mfBeta * (xScenRange[0] - xScenBase[0]) + (1 - this.mfBeta) *
|
||
this.mpPerIdx[this.mnCount - this.mnSmplInPrd];
|
||
for (var i = 1; i < nSize; i++) {
|
||
var fPerIdx;
|
||
if (i < this.mnSmplInPrd) {
|
||
fPerIdx = this.mpPerIdx[this.mnCount + i - this.mnSmplInPrd];
|
||
} else {
|
||
fPerIdx = xScenPerIdx[i - this.mnSmplInPrd];
|
||
}
|
||
xScenRange[i] = xScenBase[i - 1] + xScenTrend[i - 1] + fPerIdx + this.randDev();
|
||
|
||
if (!aPredictions[i]) {
|
||
aPredictions[i] = [];
|
||
}
|
||
aPredictions[i][k] = xScenRange[i];
|
||
xScenBase[i] = this.mfAlpha * (xScenRange[i] - fPerIdx) + (1 - this.mfAlpha) *
|
||
(xScenBase[i - 1] + xScenTrend[i - 1]);
|
||
xScenTrend[i] =
|
||
this.mfGamma * (xScenBase[i] - xScenBase[i - 1]) + (1 - this.mfGamma) * xScenTrend[i - 1];
|
||
xScenPerIdx[i] = this.mfBeta * (xScenRange[i] - xScenBase[i]) + (1 - this.mfBeta) * fPerIdx;
|
||
}
|
||
} else {
|
||
// calculation based on multiplicative model
|
||
xScenRange[0] = (this.mpBase[this.mnCount - 1] + this.mpTrend[this.mnCount - 1]) *
|
||
this.mpPerIdx[this.mnCount - this.mnSmplInPrd] + this.randDev();
|
||
|
||
if (!aPredictions[0]) {
|
||
aPredictions[0] = [];
|
||
}
|
||
aPredictions[0][k] = xScenRange[0];
|
||
xScenBase[0] = this.mfAlpha * (xScenRange[0] / this.mpPerIdx[this.mnCount - this.mnSmplInPrd]) +
|
||
(1 - this.mfAlpha) * (this.mpBase[this.mnCount - 1] + this.mpTrend[this.mnCount - 1]);
|
||
xScenTrend[0] = this.mfGamma * (xScenBase[0] - this.mpBase[this.mnCount - 1]) + (1 - this.mfGamma) *
|
||
this.mpTrend[this.mnCount - 1];
|
||
xScenPerIdx[0] = this.mfBeta * (xScenRange[0] / xScenBase[0]) + (1 - this.mfBeta) *
|
||
this.mpPerIdx[this.mnCount - this.mnSmplInPrd];
|
||
for (var i = 1; i < nSize; i++) {
|
||
var fPerIdx;
|
||
if (i < this.mnSmplInPrd) {
|
||
fPerIdx = this.mpPerIdx[this.mnCount + i - this.mnSmplInPrd];
|
||
} else {
|
||
fPerIdx = xScenPerIdx[i - this.mnSmplInPrd];
|
||
}
|
||
xScenRange[i] = (xScenBase[i - 1] + xScenTrend[i - 1]) * fPerIdx + this.randDev();
|
||
|
||
if (!aPredictions[i]) {
|
||
aPredictions[i] = [];
|
||
}
|
||
aPredictions[i][k] = xScenRange[i];
|
||
xScenBase[i] = this.mfAlpha * (xScenRange[i] / fPerIdx) + (1 - this.mfAlpha) *
|
||
(xScenBase[i - 1] + xScenTrend[i - 1]);
|
||
xScenTrend[i] =
|
||
this.mfGamma * (xScenBase[i] - xScenBase[i - 1]) + (1 - this.mfGamma) * xScenTrend[i - 1];
|
||
xScenPerIdx[i] = this.mfBeta * (xScenRange[i] / xScenBase[i]) + (1 - this.mfBeta) * fPerIdx;
|
||
}
|
||
}
|
||
}
|
||
|
||
// create array of Percentile values;
|
||
var xPercentile = [];
|
||
for (var i = 0; i < nSize; i++) {
|
||
xPercentile[i] = getPercentile(aPredictions[i], (1 + fPILevel) / 2) - getPercentile(aPredictions[i], 0.5);
|
||
}
|
||
|
||
for (var i = 0; i < nR; i++) {
|
||
for (var j = 0; j < nC; j++) {
|
||
var fTarget;
|
||
if (this.mnMonthDay) {
|
||
fTarget = this.convertXtoMonths(rTMat[j][i].value) - this.maRange[this.mnCount - 1].X;
|
||
} else {
|
||
fTarget = rTMat[j][i].value - this.maRange[this.mnCount - 1].X;
|
||
}
|
||
var nSteps = (fTarget / this.mfStepSize) - 1;
|
||
var fFactor = Math.fmod(fTarget, this.mfStepSize);
|
||
var fPI = xPercentile[nSteps];
|
||
if (fFactor != 0.0) {
|
||
// interpolate
|
||
var fPI1 = xPercentile[nSteps + 1];
|
||
fPI = fPI + fFactor * (fPI1 - fPI);
|
||
}
|
||
if (!rPIMat) {
|
||
rPIMat = [];
|
||
}
|
||
if (!rPIMat[j]) {
|
||
rPIMat[j] = [];
|
||
}
|
||
|
||
rPIMat[j][i] = fPI;
|
||
}
|
||
}
|
||
|
||
return rPIMat;
|
||
};
|
||
|
||
|
||
ScETSForecastCalculation.prototype.GetEDSPredictionIntervals = function (rTMat, fPILevel) {
|
||
if (!this.initCalc()) {
|
||
return false;
|
||
}
|
||
|
||
var rPIMat = null;
|
||
var nC = rTMat.length, nR = rTMat[0].length;
|
||
|
||
// find maximum target value and calculate size of coefficient- array c
|
||
var fMaxTarget = rTMat[0][0];
|
||
for (var i = 0; i < nR; i++) {
|
||
for (var j = 0; j < nC; j++) {
|
||
if (fMaxTarget < rTMat[j][i]) {
|
||
fMaxTarget = rTMat[j][i];
|
||
}
|
||
}
|
||
}
|
||
|
||
if (this.mnMonthDay) {
|
||
fMaxTarget = this.convertXtoMonths(fMaxTarget) - this.maRange[this.mnCount - 1].X;
|
||
} else {
|
||
fMaxTarget -= this.maRange[this.mnCount - 1].X;
|
||
}
|
||
|
||
var nSize = (fMaxTarget / this.mfStepSize);
|
||
if (Math.fmod(fMaxTarget, this.mfStepSize) !== 0.0) {
|
||
nSize++;
|
||
}
|
||
|
||
var z = gaussinv((1.0 + fPILevel) / 2.0);
|
||
var o = 1 - fPILevel;
|
||
//std::vector< double > c( nSize );
|
||
var c = [];
|
||
for (var i = 0; i < nSize; i++) {
|
||
c[i] = Math.sqrt(1 + (fPILevel / Math.pow(1 + o, 3.0)) *
|
||
((1 + 4 * o + 5 * o * o) + 2 * (i) * fPILevel * (1 + 3 * o) + 2 * (i * i) * fPILevel *
|
||
fPILevel));
|
||
}
|
||
|
||
|
||
for (var i = 0; i < nR; i++) {
|
||
for (var j = 0; j < nC; j++) {
|
||
var fTarget;
|
||
if (this.mnMonthDay) {
|
||
fTarget = this.convertXtoMonths(rTMat[j][i]) - this.maRange[this.mnCount - 1].X;
|
||
} else {
|
||
fTarget = rTMat[j][i] - this.maRange[this.mnCount - 1].X;
|
||
}
|
||
var nSteps = (fTarget / this.mfStepSize) - 1;
|
||
var fFactor = Math.fmod(fTarget, this.mfStepSize);
|
||
var fPI = z * this.mfRMSE * c[nSteps] / c[0];
|
||
if (fFactor !== 0.0) {
|
||
// interpolate
|
||
var fPI1 = z * this.mfRMSE * c[nSteps + 1] / c[0];
|
||
fPI = fPI + fFactor * (fPI1 - fPI);
|
||
}
|
||
|
||
if (!rPIMat) {
|
||
rPIMat = [];
|
||
}
|
||
if (!rPIMat[j]) {
|
||
rPIMat[j] = [];
|
||
}
|
||
|
||
rPIMat[j][i] = fPI;
|
||
}
|
||
}
|
||
|
||
return rPIMat;
|
||
};
|
||
|
||
function checkNumericMatrix(matrix) {
|
||
if (!matrix) {
|
||
return false;
|
||
}
|
||
|
||
for (var i = 0; i < matrix.length; i++) {
|
||
for (var j = 0; j < matrix[i].length; j++) {
|
||
var type = matrix[i][j].type;
|
||
if (!(cElementType.number === type || cElementType.bool === type)) {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
function fillArray(array, val, length) {
|
||
for (var i = 0; i < length - 1; i++) {
|
||
array[i] = val;
|
||
}
|
||
}
|
||
|
||
function tryNumberToArray(arg) {
|
||
if (arg) {
|
||
var tempNumber;
|
||
if (cElementType.number === arg.type) {
|
||
tempNumber = arg;
|
||
arg = new cArray();
|
||
arg.addElement(tempNumber);
|
||
} else if (cElementType.cell === arg.type || cElementType.cell3D === arg.type) {
|
||
tempNumber = arg.getValue();
|
||
arg = new cArray();
|
||
arg.addElement(tempNumber);
|
||
}
|
||
}
|
||
|
||
return arg;
|
||
}
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cAVEDEV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cAVEDEV.prototype = Object.create(cBaseFunction.prototype);
|
||
cAVEDEV.prototype.constructor = cAVEDEV;
|
||
cAVEDEV.prototype.name = 'AVEDEV';
|
||
cAVEDEV.prototype.argumentsMin = 1;
|
||
cAVEDEV.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cAVEDEV.prototype.argumentsType = [[argType.number]];
|
||
cAVEDEV.prototype.Calculate = function (arg) {
|
||
var count = 0, sum = new cNumber(0), arrX = [], i;
|
||
for (i = 0; i < arg.length; i++) {
|
||
var _arg = arg[i];
|
||
if (_arg instanceof cRef || _arg instanceof cRef3D) {
|
||
var _argV = _arg.getValue();
|
||
if (_argV instanceof cNumber) {
|
||
arrX.push(_argV);
|
||
count++;
|
||
}
|
||
} else if (_arg instanceof cArea || _arg instanceof cArea3D) {
|
||
var _argAreaValue = _arg.getValue();
|
||
for (var j = 0; j < _argAreaValue.length; j++) {
|
||
var __arg = _argAreaValue[j];
|
||
if (__arg instanceof cNumber) {
|
||
arrX.push(__arg);
|
||
count++;
|
||
}
|
||
}
|
||
} else if (_arg instanceof cArray) {
|
||
_arg.foreach(function (elem) {
|
||
var e = elem.tocNumber();
|
||
if (e instanceof cNumber) {
|
||
arrX.push(e);
|
||
count++;
|
||
}
|
||
})
|
||
} else {
|
||
if (_arg instanceof cError) {
|
||
continue;
|
||
}
|
||
arrX.push(_arg);
|
||
count++;
|
||
}
|
||
}
|
||
|
||
for (i = 0; i < arrX.length; i++) {
|
||
sum = _func[sum.type][arrX[i].type](sum, arrX[i], "+");
|
||
}
|
||
sum = new cNumber(sum.getValue() / count);
|
||
var a = 0;
|
||
for (i = 0; i < arrX.length; i++) {
|
||
a += Math.abs(_func[sum.type][arrX[i].type](sum, arrX[i], "-").getValue());
|
||
}
|
||
|
||
return new cNumber(a / count);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cAVERAGE() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cAVERAGE.prototype = Object.create(cBaseFunction.prototype);
|
||
cAVERAGE.prototype.constructor = cAVERAGE;
|
||
cAVERAGE.prototype.name = 'AVERAGE';
|
||
cAVERAGE.prototype.argumentsMin = 1;
|
||
cAVERAGE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cAVERAGE.prototype.inheritFormat = true;
|
||
cAVERAGE.prototype.argumentsType = [[argType.number]];
|
||
cAVERAGE.prototype.Calculate = function (arg) {
|
||
var count = 0, sum = new cNumber(0);
|
||
for (var i = 0; i < arg.length; i++) {
|
||
var _arg = arg[i];
|
||
if (cElementType.cell === _arg.type || cElementType.cell3D === _arg.type) {
|
||
if (!this.checkExclude || !_arg.isHidden(this.excludeHiddenRows)) {
|
||
var _argV = _arg.getValue();
|
||
if (cElementType.string === _argV.type || cElementType.empty === _argV.type ||
|
||
cElementType.bool === _argV.type) {
|
||
continue;
|
||
} else if (cElementType.number === _argV.type) {
|
||
sum = _func[sum.type][_argV.type](sum, _argV, "+");
|
||
count++;
|
||
} else if (cElementType.error === _argV.type) {
|
||
return _argV;
|
||
}
|
||
}
|
||
} else if (cElementType.cellsRange === _arg.type || cElementType.cellsRange3D === _arg.type) {
|
||
var _argAreaValue = _arg.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal,
|
||
this.excludeNestedStAg);
|
||
for (var j = 0; j < _argAreaValue.length; j++) {
|
||
var __arg = _argAreaValue[j];
|
||
if (cElementType.string === __arg.type || cElementType.empty === __arg.type ||
|
||
cElementType.bool === __arg.type) {
|
||
continue;
|
||
} else if (cElementType.number === __arg.type) {
|
||
sum = _func[sum.type][__arg.type](sum, __arg, "+");
|
||
count++;
|
||
} else if (cElementType.error === __arg.type) {
|
||
return __arg;
|
||
}
|
||
}
|
||
} else if (cElementType.array === _arg.type) {
|
||
_arg.foreach(function (elem) {
|
||
if (cElementType.string === elem.type || cElementType.empty === elem.type ||
|
||
cElementType.bool === elem.type) {
|
||
return false;
|
||
}
|
||
var e = elem.tocNumber();
|
||
if (cElementType.number === e.type) {
|
||
sum = _func[sum.type][e.type](sum, e, "+");
|
||
count++;
|
||
}
|
||
})
|
||
} else {
|
||
_arg = _arg.tocNumber();
|
||
if (cElementType.error === _arg.type) {
|
||
return _arg;
|
||
}
|
||
sum = _func[sum.type][_arg.type](sum, _arg, "+");
|
||
count++;
|
||
}
|
||
}
|
||
return new cNumber(sum.getValue() / count);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cAVERAGEA() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cAVERAGEA.prototype = Object.create(cBaseFunction.prototype);
|
||
cAVERAGEA.prototype.constructor = cAVERAGEA;
|
||
cAVERAGEA.prototype.name = 'AVERAGEA';
|
||
cAVERAGEA.prototype.argumentsMin = 1;
|
||
cAVERAGEA.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cAVERAGEA.prototype.argumentsType = [[argType.number]];
|
||
cAVERAGEA.prototype.Calculate = function (arg) {
|
||
var count = 0, sum = new cNumber(0);
|
||
for (var i = 0; i < arg.length; i++) {
|
||
var _arg = arg[i];
|
||
if (cElementType.cell === _arg.type || cElementType.cell3D === _arg.type) {
|
||
var _argV = _arg.getValue();
|
||
if (cElementType.number === _argV.type || cElementType.bool === _argV.type) {
|
||
sum = _func[sum.type][_argV.type](sum, _argV, "+");
|
||
count++;
|
||
} else if (cElementType.string === _argV.type) {
|
||
count++;
|
||
}
|
||
} else if (cElementType.cellsRange === _arg.type || cElementType.cellsRange3D === _arg.type) {
|
||
var _argAreaValue = _arg.getValue();
|
||
for (var j = 0; j < _argAreaValue.length; j++) {
|
||
var __arg = _argAreaValue[j];
|
||
if (cElementType.number === __arg.type || cElementType.bool === __arg.type) {
|
||
sum = _func[sum.type][__arg.type](sum, __arg, "+");
|
||
count++;
|
||
} else if (cElementType.string === __arg.type) {
|
||
count++;
|
||
}
|
||
}
|
||
} else if (cElementType.array === _arg.type) {
|
||
_arg.foreach(function (elem) {
|
||
|
||
if (cElementType.string === elem.type || cElementType.empty === elem.type) {
|
||
return false;
|
||
}
|
||
|
||
var e = elem.tocNumber();
|
||
if (cElementType.number === e.type) {
|
||
sum = _func[sum.type][e.type](sum, e, "+");
|
||
count++;
|
||
}
|
||
})
|
||
} else {
|
||
_arg = _arg.tocNumber();
|
||
if (cElementType.error === _arg.type) {
|
||
return _arg;
|
||
}
|
||
sum = _func[sum.type][_arg.type](sum, _arg, "+");
|
||
count++;
|
||
}
|
||
}
|
||
return new cNumber(sum.getValue() / count);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cAVERAGEIF() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cAVERAGEIF.prototype = Object.create(cBaseFunction.prototype);
|
||
cAVERAGEIF.prototype.constructor = cAVERAGEIF;
|
||
cAVERAGEIF.prototype.name = 'AVERAGEIF';
|
||
cAVERAGEIF.prototype.argumentsMin = 2;
|
||
cAVERAGEIF.prototype.argumentsMax = 3;
|
||
cAVERAGEIF.prototype.arrayIndexes = {0: 1, 2: 1};
|
||
cAVERAGEIF.prototype.exactTypes = {0: 1, 2: 1};
|
||
cAVERAGEIF.prototype.argumentsType = [argType.reference, argType.any, argType.reference];
|
||
cAVERAGEIF.prototype.Calculate = function (arg) {
|
||
let arg0 = arg[0], arg1 = arg[1], arg2 = arg[2] ? arg[2] : arg[0], _sum = 0, _count = 0, matchingInfo, ws;
|
||
if ((cElementType.cell !== arg0.type && cElementType.cell3D !== arg0.type && cElementType.cellsRange !==
|
||
arg0.type && cElementType.cellsRange3D !== arg0.type) ||
|
||
(cElementType.cell !== arg2.type && cElementType.cell3D !== arg2.type && cElementType.cellsRange !==
|
||
arg2.type && cElementType.cellsRange3D !== arg2.type)) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (cElementType.cellsRange === arg1.type || cElementType.cellsRange3D === arg1.type) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (cElementType.array === arg1.type) {
|
||
arg1 = arg1.getElementRowCol(0, 0);
|
||
}
|
||
|
||
arg1 = arg1.tocString();
|
||
|
||
if (cElementType.string !== arg1.type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
let r = arg0.getRange(), r2 = arg2.getRange();
|
||
|
||
ws = arg0.getWS();
|
||
matchingInfo = AscCommonExcel.matchingValue(arg1);
|
||
if (cElementType.cellsRange === arg0.type || cElementType.cellsRange3D === arg0.type) {
|
||
arg0.foreach2(function (v, cell, row, col) {
|
||
if (matching(v, matchingInfo)) {
|
||
let val;
|
||
if ((r2.bbox.r1 === 0 && r2.bbox.r2 === gc_nMaxRow0) ||
|
||
(r2.bbox.c1 === 0 && r2.bbox.c2 === gc_nMaxCol0)) {
|
||
let targetRow = row;
|
||
let targetCol = col;
|
||
|
||
if (r2.bbox.r1 === 0 && r2.bbox.r2 === gc_nMaxRow0) {
|
||
targetCol = r2.bbox.c1 + (col - r.bbox.c1);
|
||
if (targetCol < r2.bbox.c1 || targetCol > r2.bbox.c2) {
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (r2.bbox.c1 === 0 && r2.bbox.c2 === gc_nMaxCol0) {
|
||
targetRow = r2.bbox.r1 + (row - r.bbox.r1);
|
||
if (targetRow < r2.bbox.r1 || targetRow > r2.bbox.r2) {
|
||
return;
|
||
}
|
||
}
|
||
|
||
ws._getCellNoEmpty(targetRow, targetCol, function (cell) {
|
||
val = checkTypeCell(cell);
|
||
});
|
||
} else {
|
||
let offset = new AscCommon.CellBase(row - r.bbox.r1, col - r.bbox.c1);
|
||
r2.setOffset(offset);
|
||
|
||
ws._getCellNoEmpty(r2.bbox.r1, r2.bbox.c1, function (cell) {
|
||
val = checkTypeCell(cell);
|
||
});
|
||
|
||
offset.col *= -1;
|
||
offset.row *= -1;
|
||
r2.setOffset(offset);
|
||
}
|
||
|
||
if (cElementType.number === val.type) {
|
||
_sum += val.getValue();
|
||
_count++;
|
||
}
|
||
}
|
||
})
|
||
} else {
|
||
if (matching(arg0.getValue(), matchingInfo)) {
|
||
let val = arg2.getFirstElement ? arg2.getFirstElement() : arg2.getValue();
|
||
if (cElementType.number === val.type) {
|
||
_sum += val.getValue();
|
||
_count++;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (0 === _count) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
return new cNumber(_sum / _count);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cAVERAGEIFS() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cAVERAGEIFS.prototype = Object.create(cBaseFunction.prototype);
|
||
cAVERAGEIFS.prototype.constructor = cAVERAGEIFS;
|
||
cAVERAGEIFS.prototype.name = 'AVERAGEIFS';
|
||
cAVERAGEIFS.prototype.argumentsMin = 3;
|
||
cAVERAGEIFS.prototype.arrayIndexes = {0: 1, 1: 1, 3: 1, 5: 1, 7: 1, 9: 1};
|
||
cAVERAGEIFS.prototype.getArrayIndex = function (index) {
|
||
if (index === 0) {
|
||
return 1;
|
||
}
|
||
return index % 2 !== 0 ? 1 : undefined;
|
||
};
|
||
cAVERAGEIFS.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.area_to_ref;
|
||
cAVERAGEIFS.prototype.argumentsType = [argType.reference, [argType.reference, argType.any]];
|
||
cAVERAGEIFS.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0];
|
||
if (cElementType.cell !== arg0.type && cElementType.cell3D !== arg0.type &&
|
||
cElementType.cellsRange !== arg0.type && cElementType.cellsRange3D !== arg0.type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
var arg0Matrix = arg0.getMatrix();
|
||
var i, j, arg1, arg2, matchingInfo;
|
||
for (var k = 1; k < arg.length; k += 2) {
|
||
arg1 = arg[k];
|
||
arg2 = arg[k + 1];
|
||
|
||
if (cElementType.cell !== arg1.type && cElementType.cell3D !== arg1.type && cElementType.cellsRange !==
|
||
arg1.type && cElementType.cellsRange3D !== arg1.type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (cElementType.cellsRange === arg2.type || cElementType.cellsRange3D === arg2.type) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (cElementType.array === arg2.type) {
|
||
arg2 = arg2.getElementRowCol(0, 0);
|
||
}
|
||
|
||
arg2 = arg2.tocString();
|
||
if (cElementType.string !== arg2.type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
matchingInfo = AscCommonExcel.matchingValue(arg2);
|
||
|
||
var arg1Matrix = arg1.getMatrix();
|
||
if (arg0Matrix.length !== arg1Matrix.length) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
for (i = 0; i < arg1Matrix.length; ++i) {
|
||
if (arg0Matrix[i].length !== arg1Matrix[i].length) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
for (j = 0; j < arg1Matrix[i].length; ++j) {
|
||
var arg1Val = arg1Matrix[i][j] && arg1Matrix[i][j][0] ? arg1Matrix[i][j][0] : arg1Matrix[i][j];
|
||
if (arg0Matrix[i][j] && !AscCommonExcel.matching(arg1Val, matchingInfo)) {
|
||
arg0Matrix[i][j] = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
var _sum = 0, _count = 0;
|
||
var valMatrix0;
|
||
for (i = 0; i < arg0Matrix.length; ++i) {
|
||
for (j = 0; j < arg0Matrix[i].length; ++j) {
|
||
valMatrix0 = arg0Matrix[i][j] && arg0Matrix[i][j][0] ? arg0Matrix[i][j][0] : arg0Matrix[i][j];
|
||
if (valMatrix0 && cElementType.number === valMatrix0.type) {
|
||
_sum += valMatrix0.getValue();
|
||
++_count;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
if (0 === _count) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
return new cNumber(_sum / _count);
|
||
}
|
||
};
|
||
cAVERAGEIFS.prototype.checkArguments = function (countArguments) {
|
||
return 1 === countArguments % 2 && cBaseFunction.prototype.checkArguments.apply(this, arguments);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cBETADIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cBETADIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cBETADIST.prototype.constructor = cBETADIST;
|
||
cBETADIST.prototype.name = 'BETADIST';
|
||
cBETADIST.prototype.argumentsMin = 3;
|
||
cBETADIST.prototype.argumentsMax = 5;
|
||
cBETADIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number];
|
||
cBETADIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
argClone[3] = argClone[3] ? argClone[3].tocNumber() : new cNumber(0);
|
||
argClone[4] = argClone[4] ? argClone[4].tocNumber() : new cNumber(1);
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcBeta = function (argArray) {
|
||
var x = argArray[0];
|
||
var alpha = argArray[1];
|
||
var beta = argArray[2];
|
||
var fLowerBound = argArray[3];
|
||
var fUpperBound = argArray[4];
|
||
|
||
var fScale = fUpperBound - fLowerBound;
|
||
if (fScale <= 0 || alpha <= 0 || beta <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = null;
|
||
if (x < fLowerBound) {
|
||
res = 0;
|
||
} else if (x > fUpperBound) {
|
||
res = 1;
|
||
} else {
|
||
x = (x - fLowerBound) / fScale;
|
||
res = getBetaDist(x, alpha, beta);
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcBeta);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cBETA_DIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cBETA_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cBETA_DIST.prototype.constructor = cBETA_DIST;
|
||
cBETA_DIST.prototype.name = 'BETA.DIST';
|
||
cBETA_DIST.prototype.argumentsMin = 4;
|
||
cBETA_DIST.prototype.argumentsMax = 6;
|
||
cBETA_DIST.prototype.isXLFN = true;
|
||
cBETA_DIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical,
|
||
argType.number, argType.number];
|
||
cBETA_DIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
argClone[3] = argClone[3].tocNumber();
|
||
|
||
argClone[4] = argClone[4] ? argClone[4].tocNumber() : new cNumber(0);
|
||
argClone[5] = argClone[5] ? argClone[5].tocNumber() : new cNumber(1);
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcBeta = function (argArray) {
|
||
var x = argArray[0];
|
||
var alpha = argArray[1];
|
||
var beta = argArray[2];
|
||
var bIsCumulative = argArray[3];
|
||
var fLowerBound = argArray[4];
|
||
var fUpperBound = argArray[5];
|
||
|
||
var res = null;
|
||
if (alpha <= 0 || beta <= 0 || x < fLowerBound || x > fUpperBound) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
var fScale = fUpperBound - fLowerBound;
|
||
x = (x - fLowerBound) / fScale;
|
||
if (bIsCumulative) {
|
||
res = getBetaDist(x, alpha, beta);
|
||
} else {
|
||
res = getBetaDistPDF(x, alpha, beta) / fScale;
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcBeta);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cBETA_INV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cBETA_INV.prototype = Object.create(cBaseFunction.prototype);
|
||
cBETA_INV.prototype.constructor = cBETA_INV;
|
||
cBETA_INV.prototype.name = 'BETA.INV';
|
||
cBETA_INV.prototype.argumentsMin = 3;
|
||
cBETA_INV.prototype.argumentsMax = 5;
|
||
cBETA_INV.prototype.isXLFN = true;
|
||
cBETA_INV.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number,
|
||
argType.number];
|
||
cBETA_INV.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
argClone[3] = argClone[3] ? argClone[3].tocNumber() : new cNumber(0);
|
||
argClone[4] = argClone[4] ? argClone[4].tocNumber() : new cNumber(1);
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcGamma = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fAlpha = argArray[1];
|
||
var fBeta = argArray[2];
|
||
var fA = argArray[3];
|
||
var fB = argArray[4];
|
||
|
||
if (fP < 0 || fP > 1 || fA >= fB || fAlpha <= 0 || fBeta <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aFunc = new BETADISTFUNCTION(fP, fAlpha, fBeta);
|
||
var oVal = iterateInverse(aFunc, 0, 1);
|
||
var bConvError = oVal.bError;
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
//SetError(FormulaError::NoConvergence);
|
||
}
|
||
var res = fA + oVal.val * (fB - fA);
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcGamma);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cBETA_INV}
|
||
*/
|
||
function cBETAINV() {
|
||
}
|
||
|
||
cBETAINV.prototype = Object.create(cBETA_INV.prototype);
|
||
cBETAINV.prototype.constructor = cBETAINV;
|
||
cBETAINV.prototype.name = 'BETAINV';
|
||
cBETAINV.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cBINOMDIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cBINOMDIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cBINOMDIST.prototype.constructor = cBINOMDIST;
|
||
cBINOMDIST.prototype.name = 'BINOMDIST';
|
||
cBINOMDIST.prototype.argumentsMin = 4;
|
||
cBINOMDIST.prototype.argumentsMax = 4;
|
||
cBINOMDIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
cBINOMDIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
argClone[3] = argClone[3].tocNumber();//bool
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function binomdist(x, n, p) {
|
||
x = parseInt(x);
|
||
n = parseInt(n);
|
||
return Math.binomCoeff(n, x) * Math.pow(p, x) * Math.pow(1 - p, n - x);
|
||
}
|
||
|
||
var calcBinom = function (argArray) {
|
||
var arg0 = argArray[0];
|
||
var arg1 = argArray[1];
|
||
var arg2 = argArray[2];
|
||
var arg3 = argArray[3];
|
||
|
||
if (arg0 < 0 || arg0 > arg1 || arg2 < 0 || arg2 > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
if (arg3) {
|
||
var x = parseInt(arg0), n = parseInt(arg1), p = arg2, bm = 0;
|
||
|
||
for (var y = 0; y <= x; y++) {
|
||
bm += binomdist(y, n, p);
|
||
}
|
||
|
||
return new cNumber(bm);
|
||
} else {
|
||
return new cNumber(binomdist(arg0, arg1, arg2));
|
||
}
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcBinom);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cBINOMDIST}
|
||
*/
|
||
function cBINOM_DIST() {
|
||
}
|
||
|
||
cBINOM_DIST.prototype = Object.create(cBINOMDIST.prototype);
|
||
cBINOM_DIST.prototype.constructor = cBINOM_DIST;
|
||
cBINOM_DIST.prototype.name = 'BINOM.DIST';
|
||
cBINOM_DIST.prototype.isXLFN = true;
|
||
cBINOM_DIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cBINOM_DIST_RANGE() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cBINOM_DIST_RANGE.prototype = Object.create(cBaseFunction.prototype);
|
||
cBINOM_DIST_RANGE.prototype.constructor = cBINOM_DIST_RANGE;
|
||
cBINOM_DIST_RANGE.prototype.name = 'BINOM.DIST.RANGE';
|
||
cBINOM_DIST_RANGE.prototype.argumentsMin = 3;
|
||
cBINOM_DIST_RANGE.prototype.argumentsMax = 4;
|
||
cBINOM_DIST_RANGE.prototype.isXLFN = true;
|
||
cBINOM_DIST_RANGE.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number];
|
||
cBINOM_DIST_RANGE.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
argClone[3] = argClone[3] ? argClone[3].tocNumber() : argClone[2];
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function binomdist(x, n, p) {
|
||
x = parseInt(x);
|
||
n = parseInt(n);
|
||
return Math.binomCoeff(n, x) * Math.pow(p, x) * Math.pow(1 - p, n - x);
|
||
}
|
||
|
||
var calcBinom = function (argArray) {
|
||
var arg0 = argArray[0];
|
||
var arg1 = argArray[1];
|
||
var arg2 = argArray[2];
|
||
var arg3 = argArray[3];
|
||
|
||
if (arg0 < 0 || arg1 < 0 || arg1 > 1 || arg2 < 0 || arg2 > arg0 || arg3 < arg2 || arg3 > arg0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var summ = 0;
|
||
for (var i = arg2; i <= arg3; i++) {
|
||
summ += binomdist(i, arg0, arg1);
|
||
}
|
||
return new cNumber(summ);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcBinom);
|
||
};
|
||
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCHIDIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCHIDIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cCHIDIST.prototype.constructor = cCHIDIST;
|
||
cCHIDIST.prototype.name = "CHIDIST";
|
||
cCHIDIST.prototype.argumentsMin = 2;
|
||
cCHIDIST.prototype.argumentsMax = 2;
|
||
cCHIDIST.prototype.argumentsType = [argType.number, argType.number];
|
||
cCHIDIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var fChi = argArray[0];
|
||
var fDF = parseInt(argArray[1]);
|
||
|
||
if (fDF < 1 || fChi < 0 || fDF > Math.pow(10, 10)) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = getChiDist(fChi, fDF);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCHIINV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCHIINV.prototype = Object.create(cBaseFunction.prototype);
|
||
cCHIINV.prototype.constructor = cCHIINV;
|
||
cCHIINV.prototype.name = 'CHIINV';
|
||
cCHIINV.prototype.argumentsMin = 2;
|
||
cCHIINV.prototype.argumentsMax = 2;
|
||
cCHIINV.prototype.argumentsType = [argType.number, argType.number];
|
||
cCHIINV.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fDF = parseInt(argArray[1]);
|
||
|
||
if (fDF < 1 || fP <= 0 || fP > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aFunc = new CHIDISTFUNCTION(fP, fDF);
|
||
var oVal = iterateInverse(aFunc, fDF * 0.5, fDF);
|
||
var bConvError = oVal.bError;
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = oVal.val;
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCHISQ_DIST() {
|
||
}
|
||
|
||
cCHISQ_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cCHISQ_DIST.prototype.constructor = cCHISQ_DIST;
|
||
cCHISQ_DIST.prototype.name = 'CHISQ.DIST';
|
||
cCHISQ_DIST.prototype.argumentsMin = 3;
|
||
cCHISQ_DIST.prototype.argumentsMax = 3;
|
||
cCHISQ_DIST.prototype.isXLFN = true;
|
||
cCHISQ_DIST.prototype.argumentsType = [argType.number, argType.number, argType.logical];
|
||
cCHISQ_DIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var fX = argArray[0];
|
||
var fDF = parseInt(argArray[1]);
|
||
var bCumulative = argArray[2];
|
||
|
||
var res = null;
|
||
if (fDF < 1 || fDF > 1E10 || fX < 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
if (bCumulative) {
|
||
res = getChiSqDistCDF(fX, fDF);
|
||
} else {
|
||
res = getChiSqDistPDF(fX, fDF);
|
||
}
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
if (argClone[1].getValue() < 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cCHIDIST}
|
||
*/
|
||
function cCHISQ_DIST_RT() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCHISQ_DIST_RT.prototype = Object.create(cCHIDIST.prototype);
|
||
cCHISQ_DIST_RT.prototype.constructor = cCHISQ_DIST_RT;
|
||
cCHISQ_DIST_RT.prototype.name = 'CHISQ.DIST.RT';
|
||
cCHISQ_DIST_RT.prototype.isXLFN = true;
|
||
cCHISQ_DIST_RT.prototype.argumentsType = [argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCHISQ_INV() {
|
||
}
|
||
|
||
cCHISQ_INV.prototype = Object.create(cBaseFunction.prototype);
|
||
cCHISQ_INV.prototype.constructor = cCHISQ_INV;
|
||
cCHISQ_INV.prototype.name = 'CHISQ.INV';
|
||
cCHISQ_INV.prototype.argumentsMin = 2;
|
||
cCHISQ_INV.prototype.argumentsMax = 2;
|
||
cCHISQ_INV.prototype.isXLFN = true;
|
||
cCHISQ_INV.prototype.argumentsType = [argType.number, argType.number];
|
||
cCHISQ_INV.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fDF = parseInt(argArray[1]);
|
||
|
||
if (fDF < 1 || fP < 0 || fP >= 1 || fDF > 1.0E10) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aFunc = new CHISQDISTFUNCTION(fP, fDF);
|
||
var oVal = iterateInverse(aFunc, fDF * 0.5, fDF);
|
||
var bConvError = oVal.bError;
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = oVal.val;
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCHISQ_INV_RT() {
|
||
}
|
||
|
||
//***array-formula***
|
||
//TODO check max 64 iterations(from documentaion)
|
||
cCHISQ_INV_RT.prototype = Object.create(cBaseFunction.prototype);
|
||
cCHISQ_INV_RT.prototype.constructor = cCHISQ_INV_RT;
|
||
cCHISQ_INV_RT.prototype.name = 'CHISQ.INV.RT';
|
||
cCHISQ_INV_RT.prototype.argumentsMin = 2;
|
||
cCHISQ_INV_RT.prototype.argumentsMax = 2;
|
||
cCHISQ_INV_RT.prototype.isXLFN = true;
|
||
cCHISQ_INV_RT.prototype.argumentsType = [argType.number, argType.number];
|
||
cCHISQ_INV_RT.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fDF = parseInt(argArray[1]);
|
||
|
||
if (fDF < 1 || fP <= 0 || fP > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aFunc = new CHIDISTFUNCTION(fP, fDF);
|
||
var oVal = iterateInverse(aFunc, fDF * 0.5, fDF);
|
||
var bConvError = oVal.bError;
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = oVal.val;
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCHITEST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCHITEST.prototype = Object.create(cBaseFunction.prototype);
|
||
cCHITEST.prototype.constructor = cCHITEST;
|
||
cCHITEST.prototype.name = 'CHITEST';
|
||
cCHITEST.prototype.argumentsMin = 2;
|
||
cCHITEST.prototype.argumentsMax = 2;
|
||
cCHITEST.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cCHITEST.prototype.argumentsType = [argType.array, argType.array];
|
||
cCHITEST.prototype.Calculate = function (arg) {
|
||
|
||
var arg2 = [arg[0], arg[1]];
|
||
//если первое или второе значение строка
|
||
if (cElementType.string === arg[0].type || cElementType.bool === arg[0].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
if (cElementType.string === arg[1].type || cElementType.bool === arg[1].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
//если первое или второе значение число
|
||
if (cElementType.number === arg[0].type) {
|
||
arg2[0] = new cArray();
|
||
arg2[0].addElement(arg[0]);
|
||
}
|
||
if (cElementType.number === arg[1].type) {
|
||
arg2[1] = new cArray();
|
||
arg2[1].addElement(arg[1]);
|
||
}
|
||
|
||
var oArguments = this._prepareArguments(arg2, arguments[1], true, [cElementType.array, cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function calcChitest(argArray) {
|
||
|
||
var arg1 = argArray[0];
|
||
var arg2 = argArray[1];
|
||
|
||
return chiTest(arg1, arg2);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcChitest);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cCHITEST}
|
||
*/
|
||
function cCHISQ_TEST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCHISQ_TEST.prototype = Object.create(cCHITEST.prototype);
|
||
cCHISQ_TEST.prototype.constructor = cCHISQ_TEST;
|
||
cCHISQ_TEST.prototype.name = 'CHISQ.TEST';
|
||
cCHISQ_TEST.prototype.isXLFN = true;
|
||
cCHISQ_TEST.prototype.argumentsType = [argType.array, argType.array];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCONFIDENCE() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCONFIDENCE.prototype = Object.create(cBaseFunction.prototype);
|
||
cCONFIDENCE.prototype.constructor = cCONFIDENCE;
|
||
cCONFIDENCE.prototype.name = 'CONFIDENCE';
|
||
cCONFIDENCE.prototype.argumentsMin = 3;
|
||
cCONFIDENCE.prototype.argumentsMax = 3;
|
||
cCONFIDENCE.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cCONFIDENCE.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcConfidence = function (argArray) {
|
||
var alpha = argArray[0];
|
||
var stdev_sigma = argArray[1];
|
||
var size = parseInt(argArray[2]);
|
||
|
||
if (alpha <= 0 || alpha >= 1 || stdev_sigma <= 0 || size < 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return new cNumber(gaussinv(1 - alpha / 2) * stdev_sigma / Math.sqrt(size));
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcConfidence);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cCONFIDENCE}
|
||
*/
|
||
function cCONFIDENCE_NORM() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCONFIDENCE_NORM.prototype = Object.create(cCONFIDENCE.prototype);
|
||
cCONFIDENCE_NORM.prototype.constructor = cCONFIDENCE_NORM;
|
||
cCONFIDENCE_NORM.prototype.name = 'CONFIDENCE.NORM';
|
||
cCONFIDENCE_NORM.prototype.isXLFN = true;
|
||
cCONFIDENCE_NORM.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCONFIDENCE_T() {
|
||
}
|
||
|
||
cCONFIDENCE_T.prototype = Object.create(cBaseFunction.prototype);
|
||
cCONFIDENCE_T.prototype.constructor = cCONFIDENCE_T;
|
||
cCONFIDENCE_T.prototype.name = 'CONFIDENCE.T';
|
||
cCONFIDENCE_T.prototype.argumentsMin = 3;
|
||
cCONFIDENCE_T.prototype.argumentsMax = 3;
|
||
cCONFIDENCE_T.prototype.isXLFN = true;
|
||
cCONFIDENCE_T.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cCONFIDENCE_T.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcConfidence = function (argArray) {
|
||
var alpha = argArray[0];
|
||
var stdev_sigma = argArray[1];
|
||
var size = parseInt(argArray[2]);
|
||
|
||
if (alpha <= 0 || alpha >= 1 || stdev_sigma <= 0 || size < 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aFunc = new TDISTFUNCTION(alpha, size - 1, 2);
|
||
var oVal = iterateInverse(aFunc, size * 0.5, size);
|
||
var bConvError = oVal.bError;
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = (stdev_sigma * oVal.val) / Math.sqrt(size);
|
||
return new cNumber(res);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcConfidence);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCORREL() {
|
||
}
|
||
|
||
cCORREL.prototype = Object.create(cBaseFunction.prototype);
|
||
cCORREL.prototype.constructor = cCORREL;
|
||
cCORREL.prototype.name = 'CORREL';
|
||
cCORREL.prototype.argumentsMin = 2;
|
||
cCORREL.prototype.argumentsMax = 2;
|
||
cCORREL.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cCORREL.prototype.argumentsType = [argType.array, argType.array];
|
||
cCORREL.prototype.Calculate = function (arg) {
|
||
|
||
function correl(x, y) {
|
||
|
||
var s1 = 0, s2 = 0, s3 = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
if (x.length != y.length) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
s1 += (x[i].getValue() - _x) * (y[i].getValue() - _y);
|
||
s2 += (x[i].getValue() - _x) * (x[i].getValue() - _x);
|
||
s3 += (y[i].getValue() - _y) * (y[i].getValue() - _y);
|
||
|
||
}
|
||
|
||
if (s2 == 0 || s3 == 0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
return new cNumber(s1 / Math.sqrt(s2 * s3));
|
||
}
|
||
}
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arr0 = [], arr1 = [];
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arr0 = arg0.getValue();
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem) {
|
||
arr0.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arr1 = arg1.getValue();
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1.foreach(function (elem) {
|
||
arr1.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
return correl(arr0, arr1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCOUNT() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCOUNT.prototype = Object.create(cBaseFunction.prototype);
|
||
cCOUNT.prototype.constructor = cCOUNT;
|
||
cCOUNT.prototype.name = 'COUNT';
|
||
cCOUNT.prototype.argumentsMin = 1;
|
||
cCOUNT.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cCOUNT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cCOUNT.prototype.argumentsType = [[argType.number]];
|
||
cCOUNT.prototype.Calculate = function (arg) {
|
||
var count = 0;
|
||
for (var i = 0; i < arg.length; i++) {
|
||
var _arg = arg[i];
|
||
if (cElementType.cell === _arg.type || cElementType.cell3D === _arg.type) {
|
||
if (!this.checkExclude || !_arg.isHidden(this.excludeHiddenRows)) {
|
||
var _argV = _arg.getValue();
|
||
if (cElementType.number === _argV.type) {
|
||
count++;
|
||
}
|
||
}
|
||
} else if (cElementType.cellsRange === _arg.type || cElementType.cellsRange3D === _arg.type) {
|
||
var _argAreaValue = _arg.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal,
|
||
this.excludeNestedStAg);
|
||
for (var j = 0; j < _argAreaValue.length; j++) {
|
||
if (cElementType.number === _argAreaValue[j].type) {
|
||
count++;
|
||
}
|
||
}
|
||
} else if (cElementType.number === _arg.type || cElementType.bool === _arg.type ||
|
||
cElementType.empty === _arg.type) {
|
||
count++;
|
||
} else if (cElementType.string === _arg.type) {
|
||
if (cElementType.number === _arg.tocNumber().type) {
|
||
count++;
|
||
}
|
||
} else if (cElementType.array === _arg.type) {
|
||
_arg.foreach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
count++;
|
||
}
|
||
})
|
||
}
|
||
}
|
||
return new cNumber(count);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCOUNTA() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCOUNTA.prototype = Object.create(cBaseFunction.prototype);
|
||
cCOUNTA.prototype.constructor = cCOUNTA;
|
||
cCOUNTA.prototype.name = 'COUNTA';
|
||
cCOUNTA.prototype.argumentsMin = 1;
|
||
cCOUNTA.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cCOUNTA.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cCOUNTA.prototype.argumentsType = [[argType.number]];
|
||
cCOUNTA.prototype.Calculate = function (arg) {
|
||
var element, count = 0;
|
||
for (var i = 0; i < arg.length; i++) {
|
||
element = arg[i];
|
||
if (cElementType.cell === element.type || cElementType.cell3D === element.type) {
|
||
if (!this.checkExclude || !element.isHidden(this.excludeHiddenRows)) {
|
||
var _argV = element.getValue();
|
||
if (cElementType.empty !== _argV.type) {
|
||
count++;
|
||
}
|
||
}
|
||
} else if (cElementType.cellsRange === element.type || cElementType.cellsRange3D === element.type) {
|
||
var _argAreaValue = element.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal,
|
||
this.excludeNestedStAg);
|
||
for (var j = 0; j < _argAreaValue.length; j++) {
|
||
if (cElementType.empty !== _argAreaValue[j].type) {
|
||
count++;
|
||
}
|
||
}
|
||
} else if (cElementType.array === element.type) {
|
||
element.foreach(function (elem) {
|
||
if (cElementType.empty !== elem.type) {
|
||
count++;
|
||
}
|
||
})
|
||
} else if (cElementType.empty !== element.type) {
|
||
count++;
|
||
}
|
||
}
|
||
return new cNumber(count);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCOUNTBLANK() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCOUNTBLANK.prototype = Object.create(cBaseFunction.prototype);
|
||
cCOUNTBLANK.prototype.constructor = cCOUNTBLANK;
|
||
cCOUNTBLANK.prototype.name = 'COUNTBLANK';
|
||
cCOUNTBLANK.prototype.argumentsMin = 1;
|
||
cCOUNTBLANK.prototype.argumentsMax = 1;
|
||
cCOUNTBLANK.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cCOUNTBLANK.prototype.arrayIndexes = {0: 1};
|
||
cCOUNTBLANK.prototype.argumentsType = [argType.reference];
|
||
cCOUNTBLANK.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0];
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
return arg0.countCells();
|
||
} else if (arg0 instanceof cRef || arg0 instanceof cRef3D) {
|
||
return cElementType.empty === arg0.getValue().type ? new cNumber(1) : new cNumber(0);
|
||
} else {
|
||
return new cError(cErrorType.bad_reference);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCOUNTIF() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCOUNTIF.prototype = Object.create(cBaseFunction.prototype);
|
||
cCOUNTIF.prototype.constructor = cCOUNTIF;
|
||
cCOUNTIF.prototype.name = 'COUNTIF';
|
||
cCOUNTIF.prototype.argumentsMin = 2;
|
||
cCOUNTIF.prototype.argumentsMax = 2;
|
||
cCOUNTIF.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cCOUNTIF.prototype.arrayIndexes = {0: 1};
|
||
cCOUNTIF.prototype.argumentsType = [argType.reference, argType.any];
|
||
cCOUNTIF.prototype.Calculate = function (arg) {
|
||
return g_oCountIfCache.calculate(arg, arguments[1]);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCOUNTIFS() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCOUNTIFS.prototype = Object.create(cBaseFunction.prototype);
|
||
cCOUNTIFS.prototype.constructor = cCOUNTIFS;
|
||
cCOUNTIFS.prototype.name = 'COUNTIFS';
|
||
cCOUNTIFS.prototype.argumentsMin = 2;
|
||
cCOUNTIFS.prototype.argumentsMax = 254;
|
||
cCOUNTIFS.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cCOUNTIFS.prototype.arrayIndexes = {0: 1, 2: 1, 4: 1, 6: 1, 8: 1};
|
||
cCOUNTIFS.prototype.getArrayIndex = function (index) {
|
||
return index % 2 === 0 ? 1 : undefined;
|
||
};
|
||
cCOUNTIFS.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.area_to_ref;
|
||
cCOUNTIFS.prototype.argumentsType = [[argType.reference, argType.any]];
|
||
cCOUNTIFS.prototype.Calculate = function (arg) {
|
||
let i, j, arg0, arg1, matchingInfo, arg0Matrix, arg1Matrix, _count = 0, argBaseDimension, argNextDimension;
|
||
let resArrayLength = 0;
|
||
for (let k = 0; k < arg.length; k += 2) {
|
||
arg0 = arg[k];
|
||
arg1 = arg[k + 1];
|
||
if (cElementType.cell !== arg0.type && cElementType.cell3D !== arg0.type &&
|
||
cElementType.cellsRange !== arg0.type &&
|
||
!(cElementType.cellsRange3D === arg0.type && arg0.isSingleSheet())) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (cElementType.cellsRange === arg1.type || cElementType.cellsRange3D === arg1.type) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (cElementType.array === arg1.type) {
|
||
arg1 = arg1.getElementRowCol(0, 0);
|
||
}
|
||
|
||
if (arg1.type === cElementType.cell || arg1.type === cElementType.cell3D) {
|
||
arg1 = arg1.getValue();
|
||
}
|
||
|
||
if (arg1.type === cElementType.empty) {
|
||
arg1 = arg1.tocNumber();
|
||
}
|
||
|
||
argNextDimension = arg0.getDimensions();
|
||
matchingInfo = AscCommonExcel.matchingValue(arg1);
|
||
|
||
if (arg1.value === "") {
|
||
arg1Matrix = arg0.getMatrix();
|
||
} else {
|
||
arg1Matrix = arg0.getMatrixNoEmpty ? arg0.getMatrixNoEmpty() : arg0.getMatrix();
|
||
}
|
||
if (cElementType.cellsRange3D === arg0.type) {
|
||
arg1Matrix = arg1Matrix[0];
|
||
}
|
||
if (!arg0Matrix) {
|
||
arg0Matrix = matrixClone(arg1Matrix);
|
||
argBaseDimension = argNextDimension;
|
||
resArrayLength = arg0Matrix.length;
|
||
}
|
||
if (argNextDimension.row !== argBaseDimension.row || argNextDimension.col !== argBaseDimension.col) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
resArrayLength = resArrayLength > arg1Matrix.length ? arg1Matrix.length : resArrayLength;
|
||
for (i = 0; i < arg1Matrix.length; ++i) {
|
||
if (!arg1Matrix[i]) {
|
||
if (arg0Matrix[i]) {
|
||
arg0Matrix[i] = null;
|
||
}
|
||
continue;
|
||
}
|
||
for (j = 0; j < arg1Matrix[i].length; ++j) {
|
||
if (arg0Matrix[i] && arg0Matrix[i][j] && arg1Matrix[i] && arg1Matrix[i][j] && !matching(arg1Matrix[i][j], matchingInfo, true, true)) {
|
||
arg0Matrix[i][j] = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
for (i = 0; i < resArrayLength; ++i) {
|
||
if (!arg0Matrix[i]) {
|
||
continue;
|
||
}
|
||
for (j = 0; j < arg0Matrix[i].length; ++j) {
|
||
if (arg0Matrix[i] && arg0Matrix[i][j]) {
|
||
++_count;
|
||
}
|
||
}
|
||
}
|
||
return new cNumber(_count);
|
||
};
|
||
cCOUNTIFS.prototype.checkArguments = function (countArguments) {
|
||
return 0 === countArguments % 2 && cBaseFunction.prototype.checkArguments.apply(this, arguments);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCOVAR() {
|
||
}
|
||
|
||
cCOVAR.prototype = Object.create(cBaseFunction.prototype);
|
||
cCOVAR.prototype.constructor = cCOVAR;
|
||
cCOVAR.prototype.name = 'COVAR';
|
||
cCOVAR.prototype.argumentsMin = 2;
|
||
cCOVAR.prototype.argumentsMax = 2;
|
||
cCOVAR.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cCOVAR.prototype.argumentsType = [argType.array, argType.array];
|
||
cCOVAR.prototype.Calculate = function (arg) {
|
||
|
||
function covar(x, y) {
|
||
|
||
var s1 = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
if (xLength == 0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
s1 += (x[i].getValue() - _x) * (y[i].getValue() - _y);
|
||
|
||
}
|
||
return new cNumber(s1 / xLength);
|
||
}
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arr0 = [], arr1 = [];
|
||
|
||
if (arg0 instanceof cArea) {
|
||
arr0 = arg0.getValue();
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem) {
|
||
arr0.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (arg1 instanceof cArea) {
|
||
arr1 = arg1.getValue();
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1.foreach(function (elem) {
|
||
arr1.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
return covar(arr0, arr1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCOVARIANCE_P() {
|
||
}
|
||
|
||
cCOVARIANCE_P.prototype = Object.create(cBaseFunction.prototype);
|
||
cCOVARIANCE_P.prototype.constructor = cCOVARIANCE_P;
|
||
cCOVARIANCE_P.prototype.name = 'COVARIANCE.P';
|
||
cCOVARIANCE_P.prototype.argumentsMin = 2;
|
||
cCOVARIANCE_P.prototype.argumentsMax = 2;
|
||
cCOVARIANCE_P.prototype.isXLFN = true;
|
||
cCOVARIANCE_P.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cCOVARIANCE_P.prototype.argumentsType = [argType.array, argType.array];
|
||
cCOVARIANCE_P.prototype.Calculate = function (arg) {
|
||
|
||
var arg2 = [arg[0], arg[1]];
|
||
//если первое или второе значение строка
|
||
if (cElementType.string === arg[0].type || cElementType.bool === arg[0].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
if (cElementType.string === arg[1].type || cElementType.bool === arg[1].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
//если первое или второе значение число
|
||
if (cElementType.number === arg[0].type) {
|
||
arg2[0] = new cArray();
|
||
arg2[0].addElement(arg[0]);
|
||
}
|
||
if (cElementType.number === arg[1].type) {
|
||
arg2[1] = new cArray();
|
||
arg2[1].addElement(arg[1]);
|
||
}
|
||
|
||
var oArguments = this._prepareArguments(arg2, arguments[1], true, [cElementType.array, cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function pearson(argArray) {
|
||
|
||
var arg1 = argArray[0];
|
||
var arg2 = argArray[1];
|
||
var x = [];
|
||
var y = [];
|
||
|
||
for (var i = 0; i < arg1.length; i++) {
|
||
for (var j = 0; j < arg1[i].length; j++) {
|
||
x.push(arg1[i][j]);
|
||
}
|
||
}
|
||
for (var i = 0; i < arg2.length; i++) {
|
||
for (var j = 0; j < arg2[i].length; j++) {
|
||
y.push(arg2[i][j]);
|
||
}
|
||
}
|
||
|
||
var sumXDeltaYDelta = 0, sqrXDelta = 0, sqrYDelta = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
|
||
if (x.length !== y.length) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
sumXDeltaYDelta += (x[i].getValue() - _x) * (y[i].getValue() - _y);
|
||
}
|
||
|
||
return new cNumber(sumXDeltaYDelta / xLength);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, pearson);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCOVARIANCE_S() {
|
||
}
|
||
|
||
cCOVARIANCE_S.prototype = Object.create(cBaseFunction.prototype);
|
||
cCOVARIANCE_S.prototype.constructor = cCOVARIANCE_S;
|
||
cCOVARIANCE_S.prototype.name = 'COVARIANCE.S';
|
||
cCOVARIANCE_S.prototype.argumentsMin = 2;
|
||
cCOVARIANCE_S.prototype.argumentsMax = 2;
|
||
cCOVARIANCE_S.prototype.isXLFN = true;
|
||
cCOVARIANCE_S.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cCOVARIANCE_S.prototype.argumentsType = [argType.array, argType.array];
|
||
cCOVARIANCE_S.prototype.Calculate = function (arg) {
|
||
|
||
var arg2 = [arg[0], arg[1]];
|
||
//если первое или второе значение строка
|
||
if (cElementType.string === arg[0].type || cElementType.bool === arg[0].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
if (cElementType.string === arg[1].type || cElementType.bool === arg[1].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
//если первое или второе значение число
|
||
if (cElementType.number === arg[0].type) {
|
||
arg2[0] = new cArray();
|
||
arg2[0].addElement(arg[0]);
|
||
}
|
||
if (cElementType.number === arg[1].type) {
|
||
arg2[1] = new cArray();
|
||
arg2[1].addElement(arg[1]);
|
||
}
|
||
|
||
var oArguments = this._prepareArguments(arg2, arguments[1], true, [cElementType.array, cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function pearson(argArray) {
|
||
|
||
var arg1 = argArray[0];
|
||
var arg2 = argArray[1];
|
||
var x = [];
|
||
var y = [];
|
||
|
||
for (var i = 0; i < arg1.length; i++) {
|
||
for (var j = 0; j < arg1[i].length; j++) {
|
||
x.push(arg1[i][j]);
|
||
}
|
||
}
|
||
for (var i = 0; i < arg2.length; i++) {
|
||
for (var j = 0; j < arg2[i].length; j++) {
|
||
y.push(arg2[i][j]);
|
||
}
|
||
}
|
||
|
||
var sumXDeltaYDelta = 0, sqrXDelta = 0, sqrYDelta = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
|
||
if (x.length !== y.length) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
if (xLength < 2.0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
sumXDeltaYDelta += (x[i].getValue() - _x) * (y[i].getValue() - _y);
|
||
}
|
||
|
||
return new cNumber(sumXDeltaYDelta / (xLength - 1));
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, pearson);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cCRITBINOM() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cCRITBINOM.prototype = Object.create(cBaseFunction.prototype);
|
||
cCRITBINOM.prototype.constructor = cCRITBINOM;
|
||
cCRITBINOM.prototype.name = 'CRITBINOM';
|
||
cCRITBINOM.prototype.argumentsMin = 3;
|
||
cCRITBINOM.prototype.argumentsMax = 3;
|
||
cCRITBINOM.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cCRITBINOM.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function critbinom(argArray) {
|
||
var n = argArray[0];
|
||
var p = argArray[1];
|
||
var alpha = argArray[2];
|
||
|
||
if (n < 0 || alpha <= 0 || alpha >= 1 || p < 0 || p > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
var q = 1 - p, factor = Math.pow(q, n), i, sum, max;
|
||
if (factor == 0) {
|
||
factor = Math.pow(p, n);
|
||
if (factor == 0.0) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
} else {
|
||
sum = 1 - factor;
|
||
max = n;
|
||
|
||
for (i = 0; i < max && sum >= alpha; i++) {
|
||
factor *= (n - i) / (i + 1) * q / p;
|
||
sum -= factor;
|
||
}
|
||
return new cNumber(n - i);
|
||
}
|
||
} else {
|
||
sum = factor;
|
||
max = n;
|
||
|
||
for (i = 0; i < max && sum < alpha; i++) {
|
||
factor *= (n - i) / (i + 1) * p / q;
|
||
sum += factor;
|
||
}
|
||
return new cNumber(i);
|
||
}
|
||
}
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, critbinom);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cCRITBINOM}
|
||
*/
|
||
function cBINOM_INV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cBINOM_INV.prototype = Object.create(cCRITBINOM.prototype);
|
||
cBINOM_INV.prototype.constructor = cBINOM_INV;
|
||
cBINOM_INV.prototype.name = 'BINOM.INV';
|
||
cBINOM_INV.prototype.isXLFN = true;
|
||
cBINOM_INV.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cDEVSQ() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cDEVSQ.prototype = Object.create(cBaseFunction.prototype);
|
||
cDEVSQ.prototype.constructor = cDEVSQ;
|
||
cDEVSQ.prototype.name = 'DEVSQ';
|
||
cDEVSQ.prototype.argumentsMin = 1;
|
||
cDEVSQ.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cDEVSQ.prototype.argumentsType = [[argType.number]];
|
||
cDEVSQ.prototype.Calculate = function (arg) {
|
||
|
||
function devsq(x) {
|
||
|
||
var s1 = 0, _x = 0, xLength = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
_x += x[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
s1 += Math.pow(x[i].getValue() - _x, 2);
|
||
}
|
||
|
||
}
|
||
|
||
return new cNumber(s1);
|
||
}
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber) {
|
||
arr0.push(a);
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString) {
|
||
continue;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return devsq(arr0);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cEXPON_DIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cEXPON_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cEXPON_DIST.prototype.constructor = cEXPON_DIST;
|
||
cEXPON_DIST.prototype.name = 'EXPON.DIST';
|
||
cEXPON_DIST.prototype.argumentsMin = 3;
|
||
cEXPON_DIST.prototype.argumentsMax = 3;
|
||
cEXPON_DIST.prototype.isXLFN = true;
|
||
cEXPON_DIST.prototype.argumentsType = [argType.number, argType.number, argType.logical];
|
||
cEXPON_DIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcFDist = function (argArray) {
|
||
var arg0 = argArray[0];
|
||
var arg1 = argArray[1];
|
||
var arg2 = argArray[2];
|
||
|
||
if (arg0 < 0 || arg1 <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = null;
|
||
if (arg2) {
|
||
res = 1 - Math.exp(-arg1 * arg0);
|
||
} else {
|
||
res = arg1 * Math.exp(-arg1 * arg0);
|
||
}
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcFDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cEXPONDIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cEXPONDIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cEXPONDIST.prototype.constructor = cEXPONDIST;
|
||
cEXPONDIST.prototype.name = 'EXPONDIST';
|
||
cEXPONDIST.prototype.argumentsMin = 3;
|
||
cEXPONDIST.prototype.argumentsMax = 3;
|
||
cEXPONDIST.prototype.argumentsType = [argType.number, argType.number, argType.logical];
|
||
cEXPONDIST.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0], arg1 = arg[1], arg2 = arg[2], arg3 = arg[3];
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0 = arg0.getElement(0);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1 = arg1.getElement(0);
|
||
}
|
||
|
||
if (arg2 instanceof cArea || arg2 instanceof cArea3D) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (arg2 instanceof cArray) {
|
||
arg2 = arg2.getElement(0);
|
||
}
|
||
|
||
arg0 = arg0.tocNumber();
|
||
arg1 = arg1.tocNumber();
|
||
arg2 = arg2.tocBool();
|
||
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
}
|
||
if (arg1 instanceof cError) {
|
||
return arg1;
|
||
}
|
||
if (arg2 instanceof cError) {
|
||
return arg2;
|
||
}
|
||
|
||
if (arg0.getValue() < 0 || arg2.getValue() <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
if (arg2.toBool()) {
|
||
return new cNumber(1 - Math.exp(-arg1.getValue() * arg0.getValue()));
|
||
} else {
|
||
return new cNumber(arg1.getValue() * Math.exp(-arg1.getValue() * arg0.getValue()));
|
||
}
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cF_DIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cF_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cF_DIST.prototype.constructor = cF_DIST;
|
||
cF_DIST.prototype.name = "F.DIST";
|
||
cF_DIST.prototype.argumentsMin = 4;
|
||
cF_DIST.prototype.argumentsMax = 4;
|
||
cF_DIST.prototype.isXLFN = true;
|
||
cF_DIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
cF_DIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
argClone[3] = argClone[3] ? argClone[3].tocNumber() : new cBool(true);
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcFDist = function (argArray) {
|
||
var fF = argArray[0];
|
||
var fF1 = argArray[1];
|
||
var fF2 = argArray[2];
|
||
var bCum = argArray[3];
|
||
|
||
if (fF < 0 || fF1 < 1 || fF2 < 1 || fF1 >= 1.0E10 || fF2 >= 1.0E10) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res;
|
||
if (bCum) {
|
||
res = 1 - getFDist(fF, fF1, fF2);
|
||
} else {
|
||
res = Math.pow(fF1 / fF2, fF1 / 2) * Math.pow(fF, (fF1 / 2) - 1) /
|
||
(Math.pow((1 + (fF * fF1 / fF2)), (fF1 + fF2) / 2) * getBeta(fF1 / 2, fF2 / 2));
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcFDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cF_DIST_RT() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cF_DIST_RT.prototype = Object.create(cBaseFunction.prototype);
|
||
cF_DIST_RT.prototype.constructor = cF_DIST_RT;
|
||
cF_DIST_RT.prototype.name = "F.DIST.RT";
|
||
cF_DIST_RT.prototype.argumentsMin = 3;
|
||
cF_DIST_RT.prototype.argumentsMax = 3;
|
||
cF_DIST_RT.prototype.isXLFN = true;
|
||
cF_DIST_RT.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cF_DIST_RT.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcFDist = function (argArray) {
|
||
var fF = argArray[0];
|
||
var fF1 = argArray[1];
|
||
var fF2 = argArray[2];
|
||
|
||
if (fF < 0 || fF1 < 1 || fF2 < 1 || fF1 >= 1.0E10 || fF2 >= 1.0E10) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = getFDist(fF, fF1, fF2);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
if (argClone[1].getValue() < 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcFDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cF_DIST_RT}
|
||
*/
|
||
function cFDIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cFDIST.prototype = Object.create(cF_DIST_RT.prototype);
|
||
cFDIST.prototype.constructor = cFDIST;
|
||
cFDIST.prototype.name = 'FDIST';
|
||
cFDIST.prototype.isXLFN = true;
|
||
cFDIST.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cF_INV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cF_INV.prototype = Object.create(cBaseFunction.prototype);
|
||
cF_INV.prototype.constructor = cF_INV;
|
||
cF_INV.prototype.name = 'F.INV';
|
||
cF_INV.prototype.argumentsMin = 3;
|
||
cF_INV.prototype.argumentsMax = 3;
|
||
cF_INV.prototype.isXLFN = true;
|
||
cF_INV.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cF_INV.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcFDist = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fF1 = parseInt(argArray[1]);
|
||
var fF2 = parseInt(argArray[2]);
|
||
|
||
if (fP <= 0 || fF1 < 1 || fF2 < 1 || fF1 >= 1.0E10 || fF2 >= 1.0E10 || fP > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aFunc = new FDISTFUNCTION(1 - fP, fF1, fF2);
|
||
var oVal = iterateInverse(aFunc, fF1 * 0.5, fF1);
|
||
var bConvError = oVal.bError;
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = oVal.val;
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
if (argClone[1].getValue() < 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcFDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFINV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cFINV.prototype = Object.create(cBaseFunction.prototype);
|
||
cFINV.prototype.constructor = cFINV;
|
||
cFINV.prototype.name = "FINV";
|
||
cFINV.prototype.argumentsMin = 3;
|
||
cFINV.prototype.argumentsMax = 3;
|
||
cFINV.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cFINV.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcFDist = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fF1 = parseInt(argArray[1]);
|
||
var fF2 = parseInt(argArray[2]);
|
||
|
||
if (fP <= 0 || fF1 < 1 || fF2 < 1 || fF1 >= 1.0E10 || fF2 >= 1.0E10 || fP > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aFunc = new FDISTFUNCTION(fP, fF1, fF2);
|
||
var oVal = iterateInverse(aFunc, fF1 * 0.5, fF1);
|
||
var bConvError = oVal.bError;
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = oVal.val;
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
if (argClone[1].getValue() < 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcFDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cFINV}
|
||
*/
|
||
function cF_INV_RT() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cF_INV_RT.prototype = Object.create(cFINV.prototype);
|
||
cF_INV_RT.prototype.constructor = cF_INV_RT;
|
||
cF_INV_RT.prototype.name = 'F.INV.RT';
|
||
cF_INV_RT.prototype.isXLFN = true;
|
||
cF_INV_RT.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFISHER() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cFISHER.prototype = Object.create(cBaseFunction.prototype);
|
||
cFISHER.prototype.constructor = cFISHER;
|
||
cFISHER.prototype.name = 'FISHER';
|
||
cFISHER.prototype.argumentsMin = 1;
|
||
cFISHER.prototype.argumentsMax = 1;
|
||
cFISHER.prototype.argumentsType = [argType.number];
|
||
cFISHER.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0];
|
||
|
||
function fisher(x) {
|
||
return 0.5 * Math.ln((1 + x) / (1 - x));
|
||
}
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
}
|
||
arg0 = arg0.tocNumber();
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem, r, c) {
|
||
if (elem instanceof cNumber) {
|
||
var a = fisher(elem.getValue());
|
||
this.array[r][c] = isNaN(a) ? new cError(cErrorType.not_numeric) : new cNumber(a);
|
||
} else {
|
||
this.array[r][c] = new cError(cErrorType.wrong_value_type);
|
||
}
|
||
})
|
||
} else {
|
||
var a = fisher(arg0.getValue());
|
||
return isNaN(a) ? new cError(cErrorType.not_numeric) : new cNumber(a);
|
||
}
|
||
return arg0;
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFISHERINV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cFISHERINV.prototype = Object.create(cBaseFunction.prototype);
|
||
cFISHERINV.prototype.constructor = cFISHERINV;
|
||
cFISHERINV.prototype.name = 'FISHERINV';
|
||
cFISHERINV.prototype.argumentsMin = 1;
|
||
cFISHERINV.prototype.argumentsMax = 1;
|
||
cFISHERINV.prototype.argumentsType = [argType.number];
|
||
cFISHERINV.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0];
|
||
|
||
function fisherInv(x) {
|
||
return (Math.exp(2 * x) - 1) / (Math.exp(2 * x) + 1);
|
||
}
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
}
|
||
arg0 = arg0.tocNumber();
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem, r, c) {
|
||
if (elem instanceof cNumber) {
|
||
var a = fisherInv(elem.getValue());
|
||
this.array[r][c] = isNaN(a) ? new cError(cErrorType.not_numeric) : new cNumber(a);
|
||
} else {
|
||
this.array[r][c] = new cError(cErrorType.wrong_value_type);
|
||
}
|
||
})
|
||
} else {
|
||
var a = fisherInv(arg0.getValue());
|
||
return isNaN(a) ? new cError(cErrorType.not_numeric) : new cNumber(a);
|
||
}
|
||
return arg0;
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFORECAST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cFORECAST.prototype = Object.create(cBaseFunction.prototype);
|
||
cFORECAST.prototype.constructor = cFORECAST;
|
||
cFORECAST.prototype.name = 'FORECAST';
|
||
cFORECAST.prototype.argumentsMin = 3;
|
||
cFORECAST.prototype.argumentsMax = 3;
|
||
cFORECAST.prototype.arrayIndexes = {1: 1, 2: 1};
|
||
cFORECAST.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cFORECAST.prototype.argumentsType = [argType.number, argType.array, argType.array];
|
||
cFORECAST.prototype.Calculate = function (arg) {
|
||
|
||
function forecast(fx, y, x) {
|
||
|
||
let fSumDeltaXDeltaY = 0, fSumSqrDeltaX = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
if (x.length !== y.length) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i].type === cElementType.number && y[i].type === cElementType.number)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i].type === cElementType.number && y[i].type === cElementType.number)) {
|
||
continue;
|
||
}
|
||
|
||
let fValX = x[i].getValue();
|
||
let fValY = y[i].getValue();
|
||
|
||
fSumDeltaXDeltaY += (fValX - _x) * (fValY - _y);
|
||
fSumSqrDeltaX += (fValX - _x) * (fValX - _x);
|
||
|
||
}
|
||
|
||
if (fSumDeltaXDeltaY == 0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
return new cNumber(_y + fSumDeltaXDeltaY / fSumSqrDeltaX * (fx.getValue() - _x));
|
||
}
|
||
|
||
}
|
||
|
||
let arg0 = arg[0], arg1 = arg[1], arg2 = arg[2], arr0 = [], arr1 = [];
|
||
if (arg0.type === cElementType.cellsRange || arg0.type === cElementType.cellsRange3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
} else if (arg0.type === cElementType.array) {
|
||
arg0 = arg0.getElement(0);
|
||
}
|
||
|
||
arg0 = arg0.tocNumber();
|
||
if (arg0.type === cElementType.error) {
|
||
return arg0;
|
||
}
|
||
|
||
if (arg1.type === cElementType.cellsRange || arg1.type === cElementType.cellsRange3D) {
|
||
arr0 = arg1.getValue();
|
||
} else if (arg1.type === cElementType.array) {
|
||
arg1.foreach(function (elem) {
|
||
arr0.push(elem);
|
||
});
|
||
} else if (arg1.type === cElementType.error) {
|
||
return arg1;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (arg2.type === cElementType.cellsRange || arg2.type === cElementType.cellsRange3D) {
|
||
arr1 = arg2.getValue();
|
||
} else if (arg2.type === cElementType.array) {
|
||
arg2.foreach(function (elem) {
|
||
arr1.push(elem);
|
||
});
|
||
} else if (arg2.type === cElementType.error) {
|
||
return arg2;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
return forecast(arg0, arr0, arr1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFORECAST_ETS() {
|
||
}
|
||
|
||
cFORECAST_ETS.prototype = Object.create(cBaseFunction.prototype);
|
||
cFORECAST_ETS.prototype.constructor = cFORECAST_ETS;
|
||
cFORECAST_ETS.prototype.name = 'FORECAST.ETS';
|
||
cFORECAST_ETS.prototype.argumentsMin = 3;
|
||
cFORECAST_ETS.prototype.argumentsMax = 6;
|
||
cFORECAST_ETS.prototype.arrayIndexes = {1: 1, 2: 1};
|
||
cFORECAST_ETS.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cFORECAST_ETS.prototype.argumentsType = [argType.number, argType.reference, argType.reference, argType.number, argType.number, argType.number];
|
||
cFORECAST_ETS.prototype.Calculate = function (arg) {
|
||
|
||
// The results of this function correspond to the results of LO, but differ from MS!!!
|
||
let oArguments = this._prepareArguments(arg, arguments[1], true,
|
||
[null, cElementType.array, cElementType.array]);
|
||
let argClone = oArguments.args;
|
||
|
||
if (!argClone[0]) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
if (argClone[0].type && argClone[0].type !== cElementType.number) {
|
||
argClone[0] = argClone[0].tocNumber();
|
||
}
|
||
|
||
argClone[3] = argClone[3] ? argClone[3].tocNumber() : new cNumber(1);
|
||
argClone[4] = argClone[4] ? argClone[4].tocNumber() : new cNumber(1);
|
||
argClone[5] = argClone[5] ? argClone[5].tocNumber() : new cNumber(1);
|
||
|
||
let argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
/* if the first argument is not an array or range, then convert it to a standard two-dimensional array with one value */
|
||
argClone[0] = argClone[0].getMatrix ? argClone[0].getMatrix() : argClone[0].toArray();
|
||
|
||
let pTMat = argClone[0],
|
||
pMatY = argClone[1],
|
||
pMatX = argClone[2],
|
||
nSmplInPrd = argClone[3].getValue(),
|
||
bDataCompletion = argClone[4].getValue(),
|
||
nAggregation = argClone[5].getValue();
|
||
|
||
if (pMatY.length === 0 || pMatX.length === 0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
if (nAggregation < 1 || nAggregation > 7) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
if (bDataCompletion !== 1 && bDataCompletion !== 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
let aETSCalc = new ScETSForecastCalculation(pMatX.length);
|
||
let isError = aETSCalc.PreprocessDataRange(pMatX, pMatY, nSmplInPrd, bDataCompletion, nAggregation, pTMat);
|
||
if (!isError) {
|
||
///*,( eETSType != etsStatAdd && eETSType != etsStatMult ? pTMat : nullptr ),eETSType )
|
||
return new cError(cErrorType.wrong_value_type);
|
||
} else if (isError && cElementType.error === isError.type) {
|
||
return isError;
|
||
}
|
||
|
||
|
||
// todo bug 36721:
|
||
// The prediction result differs from ms - due to different smoothing coefficients (alpha, beta, gamma)
|
||
// Error values are interpreted differently in MS, and because of this, the values of the smoothing coefficients do not match, which at the end affects the result
|
||
// Although the selection and comparison method is the same as in LO and as in the main formula, but the result is still different.
|
||
// Most likely ms has behavior that is not specified in the documentation when calculating the forecast since the ETS(AAA) method produces a different result
|
||
// Note:in the current solution, if there are less than 7 values in the range, then the coefficients are omitted (equal to 0) and the function is performed in EDS mode
|
||
// By manually substituting coefficients to match the values of the FORECAST.ETS formula and the Holt-Winters model, it was found
|
||
// that ms does not calculate the smallest forecast error MAE, MSE, RMSE, but (supposedly) uses some other method of analysis and selection of smoothing coefficients
|
||
// for example, for short-term forecasts one coefficients and calculation model can be used, and for long-term ones completely different.
|
||
// An alternative to this approach is dynamic change smoothing parameters.
|
||
// In methods of evolution and simplex planning adaptation parameters are constantly changing at every step.
|
||
// For each the smoothing parameter generates several values.
|
||
// https://otexts.com/fpp2/holt-winters.html
|
||
|
||
let pFcMat = aETSCalc.GetForecastRange(pTMat);
|
||
|
||
return pFcMat && pFcMat[0] ? new cNumber(pFcMat[0][0]) : new cError(cErrorType.not_numeric);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFORECAST_ETS_CONFINT() {
|
||
}
|
||
|
||
cFORECAST_ETS_CONFINT.prototype = Object.create(cBaseFunction.prototype);
|
||
cFORECAST_ETS_CONFINT.prototype.constructor = cFORECAST_ETS_CONFINT;
|
||
cFORECAST_ETS_CONFINT.prototype.name = 'FORECAST.ETS.CONFINT';
|
||
cFORECAST_ETS_CONFINT.prototype.argumentsMin = 3;
|
||
cFORECAST_ETS_CONFINT.prototype.argumentsMax = 7;
|
||
cFORECAST_ETS_CONFINT.prototype.arrayIndexes = {1: 1, 2: 1};
|
||
cFORECAST_ETS_CONFINT.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cFORECAST_ETS_CONFINT.prototype.argumentsType = [argType.number, argType.reference, argType.reference, argType.number, argType.number,
|
||
argType.number, argType.number];
|
||
cFORECAST_ETS_CONFINT.prototype.Calculate = function (arg) {
|
||
//результаты данной фукнции соответсвуют результатам LO, но отличаются от MS!!!
|
||
|
||
let oArguments = this._prepareArguments(arg, arguments[1], true,
|
||
[null, cElementType.array, cElementType.array]);
|
||
let argClone = oArguments.args;
|
||
|
||
if (!argClone[0]) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
if (argClone[0].type && argClone[0].type !== cElementType.number) {
|
||
argClone[0] = argClone[0].tocNumber();
|
||
}
|
||
|
||
argClone[3] = argClone[3] ? argClone[3].tocNumber() : new cNumber(0.95);
|
||
argClone[4] = argClone[4] ? argClone[4].tocNumber() : new cNumber(1);
|
||
argClone[5] = argClone[5] ? argClone[5].tocNumber() : new cNumber(1);
|
||
argClone[6] = argClone[6] ? argClone[6].tocNumber() : new cNumber(1);
|
||
|
||
let argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
/* if the first argument is not an array or range, then convert it to a standard two-dimensional array with one value */
|
||
argClone[0] = argClone[0].getMatrix ? argClone[0].getMatrix() : argClone[0].toArray();
|
||
|
||
let pTMat = argClone[0],
|
||
pMatY = argClone[1],
|
||
pMatX = argClone[2],
|
||
fPILevel = argClone[3].getValue(),
|
||
nSmplInPrd = argClone[4].getValue(),
|
||
bDataCompletion = argClone[5].getValue(),
|
||
nAggregation = argClone[6].getValue();
|
||
|
||
if (pMatY.length === 0 || pMatX.length === 0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
if (fPILevel < 0 || fPILevel > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
if (nAggregation < 1 || nAggregation > 7) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
if (bDataCompletion !== 1 && bDataCompletion !== 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
let aETSCalc = new ScETSForecastCalculation(pMatX.length);
|
||
let isError = aETSCalc.PreprocessDataRange(pMatX, pMatY, nSmplInPrd, bDataCompletion, nAggregation, pTMat);
|
||
if (!isError) {
|
||
///*,( eETSType != etsStatAdd && eETSType != etsStatMult ? pTMat : nullptr ),eETSType )
|
||
return new cError(cErrorType.wrong_value_type);
|
||
} else if (isError && cElementType.error === isError.type) {
|
||
return isError;
|
||
}
|
||
|
||
/*SCSIZE nC, nR;
|
||
pTMat->GetDimensions( nC, nR );
|
||
ScMatrixRef pPIMat = GetNewMat( nC, nR );*/
|
||
let pPIMat = null;
|
||
if (nSmplInPrd === 0) {
|
||
pPIMat = aETSCalc.GetEDSPredictionIntervals(pTMat, fPILevel);
|
||
} else {
|
||
pPIMat = aETSCalc.GetETSPredictionIntervals(pTMat, fPILevel);
|
||
}
|
||
|
||
if (null === pPIMat) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
return new cNumber(pPIMat[0][0]);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFORECAST_ETS_SEASONALITY() {
|
||
}
|
||
|
||
cFORECAST_ETS_SEASONALITY.prototype = Object.create(cBaseFunction.prototype);
|
||
cFORECAST_ETS_SEASONALITY.prototype.constructor = cFORECAST_ETS_SEASONALITY;
|
||
cFORECAST_ETS_SEASONALITY.prototype.name = 'FORECAST.ETS.SEASONALITY';
|
||
cFORECAST_ETS_SEASONALITY.prototype.argumentsMin = 2;
|
||
cFORECAST_ETS_SEASONALITY.prototype.argumentsMax = 4;
|
||
cFORECAST_ETS_SEASONALITY.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cFORECAST_ETS_SEASONALITY.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cFORECAST_ETS_SEASONALITY.prototype.argumentsType = [argType.reference, argType.reference, argType.number, argType.number];
|
||
cFORECAST_ETS_SEASONALITY.prototype.Calculate = function (arg) {
|
||
|
||
//результаты данной фукнции соответсвуют результатам LO, но отличаются от MS!!!
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[2] = argClone[2] ? argClone[2].tocNumber() : new cNumber(1);
|
||
argClone[3] = argClone[3] ? argClone[3].tocNumber() : new cNumber(1);
|
||
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var pMatY = argClone[0];
|
||
var pMatX = argClone[1];
|
||
var bDataCompletion = argClone[2].getValue();
|
||
var nAggregation = argClone[3].getValue();
|
||
|
||
if (nAggregation < 1 || nAggregation > 7) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
if (bDataCompletion !== 1 && bDataCompletion !== 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aETSCalc = new ScETSForecastCalculation(pMatX.length);
|
||
var isError = aETSCalc.PreprocessDataRange(pMatX, pMatY, 1, bDataCompletion, nAggregation);
|
||
if (!isError) {
|
||
///*,( eETSType != etsStatAdd && eETSType != etsStatMult ? pTMat : nullptr ),eETSType )
|
||
return new cError(cErrorType.wrong_value_type);
|
||
} else if (isError && cElementType.error === isError.type) {
|
||
return isError;
|
||
}
|
||
|
||
var res = aETSCalc.mnSmplInPrd;
|
||
|
||
return new cNumber(res);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFORECAST_ETS_STAT() {
|
||
}
|
||
|
||
cFORECAST_ETS_STAT.prototype = Object.create(cBaseFunction.prototype);
|
||
cFORECAST_ETS_STAT.prototype.constructor = cFORECAST_ETS_STAT;
|
||
cFORECAST_ETS_STAT.prototype.name = 'FORECAST.ETS.STAT';
|
||
cFORECAST_ETS_STAT.prototype.argumentsMin = 3;
|
||
cFORECAST_ETS_STAT.prototype.argumentsMax = 6;
|
||
cFORECAST_ETS_STAT.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cFORECAST_ETS_STAT.prototype.argumentsType = [argType.reference, argType.reference, argType.number, argType.number,
|
||
argType.number, argType.number];
|
||
cFORECAST_ETS_STAT.prototype.Calculate = function (arg) {
|
||
|
||
// The results of this function correspond to the results of LO, but differ from MS!!!
|
||
let oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, cElementType.array]);
|
||
let argClone = oArguments.args;
|
||
|
||
argClone[3] = argClone[3] ? argClone[3].tocNumber() : new cNumber(1);
|
||
argClone[4] = argClone[4] ? argClone[4].tocNumber() : new cNumber(1);
|
||
argClone[5] = argClone[5] ? argClone[5].tocNumber() : new cNumber(1);
|
||
|
||
argClone[2] = convertToMatrix(argClone[2]);
|
||
|
||
let argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
let pMatY = argClone[0],
|
||
pMatX = argClone[1],
|
||
pTypeMat = argClone[2],
|
||
nSmplInPrd = argClone[3].getValue(),
|
||
bDataCompletion = argClone[4].getValue(),
|
||
nAggregation = argClone[5].getValue();
|
||
|
||
if (nAggregation < 1 || nAggregation > 7) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
if (bDataCompletion !== 1 && bDataCompletion !== 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
let aETSCalc = new ScETSForecastCalculation(pMatX.length);
|
||
let isError = aETSCalc.PreprocessDataRange(pMatX, pMatY, nSmplInPrd, bDataCompletion, nAggregation);
|
||
if (!isError) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
} else if (isError && cElementType.error === isError.type) {
|
||
return isError;
|
||
}
|
||
|
||
// todo bug 36416:
|
||
// Same problem as in bug 36721 - differences in error analysis and, as a result, different calculations of smoothing coefficients that affect the final result
|
||
|
||
let pFcMat = aETSCalc.GetStatisticValue(pTypeMat);
|
||
let res = null;
|
||
if (!pFcMat) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
} else {
|
||
res = pFcMat[0][0];
|
||
}
|
||
|
||
return null !== res ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cFORECAST}
|
||
*/
|
||
function cFORECAST_LINEAR() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cFORECAST_LINEAR.prototype = Object.create(cFORECAST.prototype);
|
||
cFORECAST_LINEAR.prototype.constructor = cFORECAST_LINEAR;
|
||
cFORECAST_LINEAR.prototype.name = 'FORECAST.LINEAR';
|
||
cFORECAST_LINEAR.prototype.isXLFN = true;
|
||
cFORECAST_LINEAR.prototype.argumentsType = [argType.number, argType.array, argType.array];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFREQUENCY() {
|
||
}
|
||
|
||
cFREQUENCY.prototype = Object.create(cBaseFunction.prototype);
|
||
cFREQUENCY.prototype.constructor = cFREQUENCY;
|
||
cFREQUENCY.prototype.name = 'FREQUENCY';
|
||
cFREQUENCY.prototype.argumentsMin = 2;
|
||
cFREQUENCY.prototype.argumentsMax = 2;
|
||
cFREQUENCY.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cFREQUENCY.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cFREQUENCY.prototype.argumentsType = [argType.reference, argType.reference];
|
||
cFREQUENCY.prototype.Calculate = function (arg) {
|
||
|
||
function frequency(A, B) {
|
||
|
||
var tA = [], tB = [Number.NEGATIVE_INFINITY], i, j;
|
||
|
||
for (i = 0; i < A.length; i++) {
|
||
for (j = 0; j < A[i].length; j++) {
|
||
if (A[i][j] instanceof cError) {
|
||
return A[i][j];
|
||
} else if (A[i][j] instanceof cNumber) {
|
||
tA.push(A[i][j].getValue());
|
||
} else if (A[i][j] instanceof cBool) {
|
||
tA.push(A[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
for (i = 0; i < B.length; i++) {
|
||
for (j = 0; j < B[i].length; j++) {
|
||
if (B[i][j] instanceof cError) {
|
||
return B[i][j];
|
||
} else if (B[i][j] instanceof cNumber) {
|
||
tB.push(B[i][j].getValue());
|
||
} else if (B[i][j] instanceof cBool) {
|
||
tB.push(B[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
tA.sort(fSortAscending);
|
||
tB.push(Number.POSITIVE_INFINITY);
|
||
tB.sort(fSortAscending);
|
||
|
||
var C = [[]], k = 0;
|
||
for (i = 1; i < tB.length; i++, k++) {
|
||
if (!C[k]) {
|
||
C[k] = [];
|
||
}
|
||
C[k][0] = new cNumber(0);
|
||
for (j = 0; j < tA.length; j++) {
|
||
if (tA[j] > tB[i - 1] && tA[j] <= tB[i]) {
|
||
var a = C[k][0].getValue();
|
||
C[k][0] = new cNumber(++a);
|
||
}
|
||
}
|
||
}
|
||
var res = new cArray();
|
||
res.fillFromArray(C);
|
||
return res;
|
||
}
|
||
|
||
var arg0 = arg[0], arg1 = arg[1];
|
||
if (arg0 instanceof cArea || arg0 instanceof cArray) {
|
||
arg0 = arg0.getMatrix();
|
||
} else if (arg0 instanceof cArea3D) {
|
||
arg0 = arg0.getMatrix()[0];
|
||
} else {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArray) {
|
||
arg1 = arg1.getMatrix();
|
||
} else if (arg1 instanceof cArea3D) {
|
||
arg1 = arg1.getMatrix()[0];
|
||
} else {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
return frequency(arg0, arg1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cFTEST() {
|
||
}
|
||
|
||
cFTEST.prototype = Object.create(cBaseFunction.prototype);
|
||
cFTEST.prototype.constructor = cFTEST;
|
||
cFTEST.prototype.name = 'FTEST';
|
||
cFTEST.prototype.argumentsMin = 2;
|
||
cFTEST.prototype.argumentsMax = 2;
|
||
cFTEST.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cFTEST.prototype.argumentsType = [argType.array, argType.array];
|
||
cFTEST.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcFTest = function (argArray) {
|
||
var arg0 = argArray[0];
|
||
var arg1 = argArray[1];
|
||
|
||
return fTest(arg0, arg1);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcFTest);
|
||
};
|
||
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cFTEST}
|
||
*/
|
||
function cF_TEST() {
|
||
}
|
||
|
||
cF_TEST.prototype = Object.create(cFTEST.prototype);
|
||
cF_TEST.prototype.constructor = cF_TEST;
|
||
cF_TEST.prototype.isXLFN = true;
|
||
cF_TEST.prototype.name = 'F.TEST';
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cGAMMA() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGAMMA.prototype = Object.create(cBaseFunction.prototype);
|
||
cGAMMA.prototype.constructor = cGAMMA;
|
||
cGAMMA.prototype.name = 'GAMMA';
|
||
cGAMMA.prototype.argumentsMin = 1;
|
||
cGAMMA.prototype.argumentsMax = 1;
|
||
cGAMMA.prototype.isXLFN = true;
|
||
cGAMMA.prototype.argumentsType = [argType.number];
|
||
cGAMMA.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcGamma = function (argArray) {
|
||
if (argArray[0] <= 0 && Number.isInteger(argArray[0])) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
var res = getGamma(argArray[0]);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcGamma);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cGAMMA_DIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGAMMA_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cGAMMA_DIST.prototype.constructor = cGAMMA_DIST;
|
||
cGAMMA_DIST.prototype.name = 'GAMMA.DIST';
|
||
cGAMMA_DIST.prototype.argumentsMin = 4;
|
||
cGAMMA_DIST.prototype.argumentsMax = 4;
|
||
cGAMMA_DIST.prototype.isXLFN = true;
|
||
cGAMMA_DIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
cGAMMA_DIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
argClone[3] = argClone[3].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcGamma = function (argArray) {
|
||
var fX = argArray[0];
|
||
var fAlpha = argArray[1];
|
||
var fBeta = argArray[2];
|
||
var bCumulative = argArray[3];
|
||
|
||
var res = null;
|
||
if ((fX < 0) || fAlpha <= 0 || fBeta <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
if (bCumulative) {
|
||
res = getGammaDist(fX, fAlpha, fBeta);
|
||
} else {
|
||
res = getGammaDistPDF(fX, fAlpha, fBeta);
|
||
}
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcGamma);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cGAMMA_DIST}
|
||
*/
|
||
function cGAMMADIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGAMMADIST.prototype = Object.create(cGAMMA_DIST.prototype);
|
||
cGAMMADIST.prototype.constructor = cGAMMADIST;
|
||
cGAMMADIST.prototype.name = 'GAMMADIST';
|
||
cGAMMADIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cGAMMA_INV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGAMMA_INV.prototype = Object.create(cBaseFunction.prototype);
|
||
cGAMMA_INV.prototype.constructor = cGAMMA_INV;
|
||
cGAMMA_INV.prototype.name = 'GAMMA.INV';
|
||
cGAMMA_INV.prototype.argumentsMin = 3;
|
||
cGAMMA_INV.prototype.argumentsMax = 3;
|
||
cGAMMA_INV.prototype.isXLFN = true;
|
||
cGAMMA_INV.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cGAMMA_INV.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcGamma = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fAlpha = argArray[1];
|
||
var fBeta = argArray[2];
|
||
|
||
if (fAlpha <= 0 || fBeta <= 0 || fP < 0 || fP >= 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = null;
|
||
if (fP === 0) {
|
||
res = 0;
|
||
} else {
|
||
var aFunc = new GAMMADISTFUNCTION(fP, fAlpha, fBeta);
|
||
var fStart = fAlpha * fBeta;
|
||
var oVal = iterateInverse(aFunc, fStart * 0.5, fStart);
|
||
var bConvError = oVal.bError;
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
//SetError(FormulaError::NoConvergence);
|
||
}
|
||
res = oVal.val;
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcGamma);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cGAMMA_INV}
|
||
*/
|
||
function cGAMMAINV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGAMMAINV.prototype = Object.create(cGAMMA_INV.prototype);
|
||
cGAMMAINV.prototype.constructor = cGAMMAINV;
|
||
cGAMMAINV.prototype.name = 'GAMMAINV';
|
||
cGAMMAINV.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cGAMMALN() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGAMMALN.prototype = Object.create(cBaseFunction.prototype);
|
||
cGAMMALN.prototype.constructor = cGAMMALN;
|
||
cGAMMALN.prototype.name = 'GAMMALN';
|
||
cGAMMALN.prototype.argumentsMin = 1;
|
||
cGAMMALN.prototype.argumentsMax = 1;
|
||
cGAMMALN.prototype.argumentsType = [argType.number];
|
||
cGAMMALN.prototype.Calculate = function (arg) {
|
||
|
||
|
||
/*
|
||
from OpenOffice Source.
|
||
end
|
||
*/
|
||
|
||
var arg0 = arg[0];
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
}
|
||
arg0 = arg0.tocNumber();
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem, r, c) {
|
||
if (elem instanceof cNumber) {
|
||
var a = getLogGamma(elem.getValue());
|
||
this.array[r][c] = isNaN(a) ? new cError(cErrorType.not_numeric) : new cNumber(a);
|
||
} else {
|
||
this.array[r][c] = new cError(cErrorType.wrong_value_type);
|
||
}
|
||
})
|
||
} else {
|
||
var a = getLogGamma(arg0.getValue());
|
||
return isNaN(a) ? new cError(cErrorType.not_numeric) : new cNumber(a);
|
||
}
|
||
return arg0;
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cGAMMALN_PRECISE() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGAMMALN_PRECISE.prototype = Object.create(cBaseFunction.prototype);
|
||
cGAMMALN_PRECISE.prototype.constructor = cGAMMALN_PRECISE;
|
||
cGAMMALN_PRECISE.prototype.name = 'GAMMALN.PRECISE';
|
||
cGAMMALN_PRECISE.prototype.argumentsMin = 1;
|
||
cGAMMALN_PRECISE.prototype.argumentsMax = 1;
|
||
cGAMMALN_PRECISE.prototype.isXLFN = true;
|
||
cGAMMALN_PRECISE.prototype.argumentsType = [argType.number];
|
||
cGAMMALN_PRECISE.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcGamma = function (argArray) {
|
||
var a = getLogGamma(argArray[0]);
|
||
return isNaN(a) ? new cError(cErrorType.not_numeric) : new cNumber(a);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcGamma);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cGAUSS() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGAUSS.prototype = Object.create(cBaseFunction.prototype);
|
||
cGAUSS.prototype.constructor = cGAUSS;
|
||
cGAUSS.prototype.name = 'GAUSS';
|
||
cGAUSS.prototype.argumentsMin = 1;
|
||
cGAUSS.prototype.argumentsMax = 1;
|
||
cGAUSS.prototype.isXLFN = true;
|
||
cGAUSS.prototype.argumentsType = [argType.number];
|
||
cGAUSS.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcGauss = function (argArray) {
|
||
var res = gauss(argArray[0]);
|
||
return isNaN(res) ? new cError(cErrorType.not_numeric) : new cNumber(res);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcGauss);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cGEOMEAN() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGEOMEAN.prototype = Object.create(cBaseFunction.prototype);
|
||
cGEOMEAN.prototype.constructor = cGEOMEAN;
|
||
cGEOMEAN.prototype.name = 'GEOMEAN';
|
||
cGEOMEAN.prototype.argumentsMin = 1;
|
||
cGEOMEAN.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cGEOMEAN.prototype.argumentsType = [[argType.number]];
|
||
cGEOMEAN.prototype.Calculate = function (arg) {
|
||
|
||
function geommean(x) {
|
||
|
||
var _x = 1, xLength = 0, _tx;
|
||
for (var i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
_x *= x[i].getValue();
|
||
xLength++;
|
||
} else if ((x[i] instanceof cString || x[i] instanceof cBool) &&
|
||
(_tx = x[i].tocNumber()) instanceof cNumber) {
|
||
_x *= _tx.getValue();
|
||
xLength++;
|
||
}
|
||
|
||
}
|
||
|
||
if (_x <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
return new cNumber(Math.pow(_x, 1 / xLength));
|
||
}
|
||
}
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber) {
|
||
arr0.push(a);
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString && arg[j].tocNumber() instanceof cNumber) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return geommean(arr0);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cGROWTH() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cGROWTH.prototype = Object.create(cBaseFunction.prototype);
|
||
cGROWTH.prototype.constructor = cGROWTH;
|
||
cGROWTH.prototype.name = 'GROWTH';
|
||
cGROWTH.prototype.argumentsMin = 1;
|
||
cGROWTH.prototype.argumentsMax = 4;
|
||
cGROWTH.prototype.arrayIndexes = {0: 1, 1: 1, 2: 1};
|
||
cGROWTH.prototype.argumentsType = [argType.reference, argType.reference, argType.reference, argType.logical];
|
||
cGROWTH.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cGROWTH.prototype.Calculate = function (arg) {
|
||
let prepeareArgs = prepeareGrowthTrendCalculation(this, arg);
|
||
if (cElementType.error === prepeareArgs.type) {
|
||
return prepeareArgs;
|
||
}
|
||
|
||
let pMatY = prepeareArgs.pMatY,
|
||
pMatX = prepeareArgs.pMatX,
|
||
pMatNewX = prepeareArgs.pMatNewX,
|
||
bConstant = prepeareArgs.bConstant;
|
||
|
||
let mat = CalculateTrendGrowth(pMatY, pMatX, pMatNewX, bConstant, true);
|
||
|
||
if (mat && mat[0] && mat[0][0] !== undefined) {
|
||
let tMatrix = [], res = new cArray();
|
||
|
||
for (let i = 0; i < mat.length; i++) {
|
||
for (let j = 0; j < mat[i].length; j++) {
|
||
if (!tMatrix[j]) {
|
||
tMatrix[j] = [];
|
||
}
|
||
tMatrix[j][i] = new cNumber(mat[i][j]);
|
||
}
|
||
}
|
||
|
||
res.fillFromArray(tMatrix);
|
||
return res;
|
||
} else if (mat && mat.type && mat.type === cElementType.error) {
|
||
return mat;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cHARMEAN() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cHARMEAN.prototype = Object.create(cBaseFunction.prototype);
|
||
cHARMEAN.prototype.constructor = cHARMEAN;
|
||
cHARMEAN.prototype.name = 'HARMEAN';
|
||
cHARMEAN.prototype.argumentsMin = 1;
|
||
cHARMEAN.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cHARMEAN.prototype.argumentsType = [[argType.number]];
|
||
cHARMEAN.prototype.Calculate = function (arg) {
|
||
|
||
function harmmean(x) {
|
||
|
||
var _x = 0, xLength = 0, _tx;
|
||
for (var i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
if (x[i].getValue() == 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
_x += 1 / x[i].getValue();
|
||
xLength++;
|
||
} else if ((x[i] instanceof cString || x[i] instanceof cBool) &&
|
||
(_tx = x[i].tocNumber()) instanceof cNumber) {
|
||
if (_tx.getValue() == 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
_x += 1 / _tx.getValue();
|
||
xLength++;
|
||
}
|
||
|
||
}
|
||
|
||
if (_x <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
return new cNumber(xLength / _x);
|
||
}
|
||
}
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber) {
|
||
arr0.push(a);
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString && arg[j].tocNumber() instanceof cNumber) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return harmmean(arr0);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cHYPGEOMDIST() {
|
||
}
|
||
|
||
cHYPGEOMDIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cHYPGEOMDIST.prototype.constructor = cHYPGEOMDIST;
|
||
cHYPGEOMDIST.prototype.name = 'HYPGEOMDIST';
|
||
cHYPGEOMDIST.prototype.argumentsMin = 4;
|
||
cHYPGEOMDIST.prototype.argumentsMax = 4;
|
||
cHYPGEOMDIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number];
|
||
cHYPGEOMDIST.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0], arg1 = arg[1], arg2 = arg[2], arg3 = arg[3];
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0 = arg0.getElement(0);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1 = arg1.getElement(0);
|
||
}
|
||
|
||
if (arg2 instanceof cArea || arg2 instanceof cArea3D) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (arg2 instanceof cArray) {
|
||
arg2 = arg2.getElement(0);
|
||
}
|
||
|
||
if (arg3 instanceof cArea || arg3 instanceof cArea3D) {
|
||
arg3 = arg3.cross(arguments[1]);
|
||
} else if (arg3 instanceof cArray) {
|
||
arg3 = arg3.getElement(0);
|
||
}
|
||
|
||
arg0 = arg0.tocNumber();
|
||
arg1 = arg1.tocNumber();
|
||
arg2 = arg2.tocNumber();
|
||
arg3 = arg3.tocNumber();
|
||
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
}
|
||
if (arg1 instanceof cError) {
|
||
return arg1;
|
||
}
|
||
if (arg2 instanceof cError) {
|
||
return arg2;
|
||
}
|
||
if (arg3 instanceof cError) {
|
||
return arg3;
|
||
}
|
||
|
||
|
||
if (arg0.getValue() < 0 || arg0.getValue() > Math.min(arg1.getValue(), arg2.getValue()) ||
|
||
arg0.getValue() < Math.max(0, arg1.getValue() - arg3.getValue() + arg2.getValue()) ||
|
||
arg1.getValue() <= 0 || arg1.getValue() > arg3.getValue() || arg2.getValue() <= 0 ||
|
||
arg2.getValue() > arg3.getValue() || arg3.getValue() <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return new cNumber(Math.binomCoeff(arg2.getValue(), arg0.getValue()) *
|
||
Math.binomCoeff(arg3.getValue() - arg2.getValue(), arg1.getValue() - arg0.getValue()) /
|
||
Math.binomCoeff(arg3.getValue(), arg1.getValue()));
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cHYPGEOM_DIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cHYPGEOM_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cHYPGEOM_DIST.prototype.constructor = cHYPGEOM_DIST;
|
||
cHYPGEOM_DIST.prototype.name = 'HYPGEOM.DIST';
|
||
cHYPGEOM_DIST.prototype.argumentsMin = 5;
|
||
cHYPGEOM_DIST.prototype.argumentsMax = 5;
|
||
cHYPGEOM_DIST.prototype.isXLFN = true;
|
||
cHYPGEOM_DIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.number, argType.logical];
|
||
cHYPGEOM_DIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
argClone[3] = argClone[3].tocNumber();
|
||
argClone[4] = argClone[4].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function hypgeomdist(argArray) {
|
||
var arg0 = Math.floor(argArray[0]);
|
||
var arg1 = Math.floor(argArray[1]);
|
||
var arg2 = Math.floor(argArray[2]);
|
||
var arg3 = Math.floor(argArray[3]);
|
||
var bCumulative = argArray[4];
|
||
|
||
if (arg0 < 0 || arg0 > Math.min(arg1, arg2) || arg0 < Math.max(0, arg1 - arg3 + arg2) || arg1 <= 0 ||
|
||
arg1 > arg3 || arg2 <= 0 || arg2 > arg3 || arg3 <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res;
|
||
if (bCumulative) {
|
||
var fVal = 0.0;
|
||
|
||
//TODO значения неверные для этой ветки! пересчитать
|
||
for (var i = 0; i <= arg0; i++) {
|
||
var temp = Math.binomCoeff(arg2, i) * Math.binomCoeff(arg3 - arg2, arg1 - i) /
|
||
Math.binomCoeff(arg3, arg1);
|
||
if (!isNaN(temp)) {
|
||
fVal += temp;
|
||
}
|
||
}
|
||
|
||
res = fVal;
|
||
} else {
|
||
res = Math.binomCoeff(arg2, arg0) * Math.binomCoeff(arg3 - arg2, arg1 - arg0) /
|
||
Math.binomCoeff(arg3, arg1);
|
||
}
|
||
|
||
return isNaN(res) ? new cError(cErrorType.not_numeric) : new cNumber(res);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, hypgeomdist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cINTERCEPT() {
|
||
}
|
||
|
||
cINTERCEPT.prototype = Object.create(cBaseFunction.prototype);
|
||
cINTERCEPT.prototype.constructor = cINTERCEPT;
|
||
cINTERCEPT.prototype.name = 'INTERCEPT';
|
||
cINTERCEPT.prototype.argumentsMin = 2;
|
||
cINTERCEPT.prototype.argumentsMax = 2;
|
||
cINTERCEPT.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cINTERCEPT.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cINTERCEPT.prototype.argumentsType = [argType.array, argType.array];
|
||
cINTERCEPT.prototype.Calculate = function (arg) {
|
||
function intercept(y, x) {
|
||
|
||
var fSumDeltaXDeltaY = 0, fSumSqrDeltaX = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
var fValX = x[i].getValue();
|
||
var fValY = y[i].getValue();
|
||
|
||
fSumDeltaXDeltaY += (fValX - _x) * (fValY - _y);
|
||
fSumSqrDeltaX += (fValX - _x) * (fValX - _x);
|
||
|
||
}
|
||
|
||
if (fSumDeltaXDeltaY == 0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
return new cNumber(_y - fSumDeltaXDeltaY / fSumSqrDeltaX * _x);
|
||
}
|
||
|
||
}
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arr0 = [], arr1 = [];
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arr0 = arg0.getValue();
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem) {
|
||
arr0.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arr1 = arg1.getValue();
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1.foreach(function (elem) {
|
||
arr1.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
return intercept(arr0, arr1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cKURT() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cKURT.prototype = Object.create(cBaseFunction.prototype);
|
||
cKURT.prototype.constructor = cKURT;
|
||
cKURT.prototype.name = 'KURT';
|
||
cKURT.prototype.argumentsMin = 1;
|
||
cKURT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cKURT.prototype.argumentsType = [[argType.number]];
|
||
cKURT.prototype.Calculate = function (arg) {
|
||
|
||
function kurt(x) {
|
||
|
||
var sumSQRDeltaX = 0, _x = 0, xLength = 0, sumSQRDeltaXDivstandDev = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
_x += x[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
sumSQRDeltaX += Math.pow(x[i].getValue() - _x, 2);
|
||
}
|
||
|
||
}
|
||
|
||
var standDev = Math.sqrt(sumSQRDeltaX / (xLength - 1));
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
sumSQRDeltaXDivstandDev += Math.pow((x[i].getValue() - _x) / standDev, 4);
|
||
}
|
||
|
||
}
|
||
|
||
return new cNumber(xLength * (xLength + 1) / (xLength - 1) / (xLength - 2) / (xLength - 3) *
|
||
sumSQRDeltaXDivstandDev - 3 * (xLength - 1) * (xLength - 1) / (xLength - 2) / (xLength - 3))
|
||
|
||
}
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber) {
|
||
arr0.push(a);
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString) {
|
||
continue;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return kurt(arr0);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cLARGE() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cLARGE.prototype = Object.create(cBaseFunction.prototype);
|
||
cLARGE.prototype.constructor = cLARGE;
|
||
cLARGE.prototype.name = 'LARGE';
|
||
cLARGE.prototype.argumentsMin = 2;
|
||
cLARGE.prototype.argumentsMax = 2;
|
||
cLARGE.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cLARGE.prototype.arrayIndexes = {0: 1};
|
||
cLARGE.prototype.argumentsType = [argType.number, argType.number];
|
||
cLARGE.prototype._getValue = function (arg0, arg1) {
|
||
if (cElementType.error === arg1.type) {
|
||
return arg1;
|
||
}
|
||
|
||
arg1 = arg1.getValue();
|
||
if (arg1 <= 0) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
var v, tA = [];
|
||
for (var i = 0; i < arg0.length; i++) {
|
||
for (var j = 0; j < arg0[i].length; j++) {
|
||
v = arg0[i][j];
|
||
if (cElementType.error === v.type) {
|
||
return v;
|
||
} else if (cElementType.number === v.type) {
|
||
tA.push(v.getValue());
|
||
} else if (cElementType.bool === v.type) {
|
||
tA.push(v.tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
tA.sort(AscCommon.fSortDescending);
|
||
|
||
if (arg1 > tA.length) {
|
||
return new cError(cErrorType.not_available);
|
||
} else {
|
||
return new cNumber(tA[arg1 - 1]);
|
||
}
|
||
};
|
||
cLARGE.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0], arg1 = arg[1];
|
||
if (cElementType.cellsRange === arg0.type) {
|
||
arg0 = arg0.getValuesNoEmpty(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal,
|
||
this.excludeNestedStAg);
|
||
} else if (cElementType.array === arg0.type) {
|
||
arg0 = arg0.getMatrix();
|
||
} else if (cElementType.cellsRange3D === arg0.type) {
|
||
arg0 = arg0.getMatrix()[0];
|
||
} else {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
|
||
if (cElementType.cellsRange === arg1.type || cElementType.cellsRange3D === arg1.type) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (cElementType.array === arg1.type) {
|
||
arg1 = arg1.getElement(0);
|
||
}
|
||
|
||
arg1 = arg1.tocNumber();
|
||
return this._getValue(arg0, arg1);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cLINEST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cLINEST.prototype = Object.create(cBaseFunction.prototype);
|
||
cLINEST.prototype.constructor = cLINEST;
|
||
cLINEST.prototype.name = 'LINEST';
|
||
cLINEST.prototype.argumentsMin = 1;
|
||
cLINEST.prototype.argumentsMax = 4;
|
||
cLINEST.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cLINEST.prototype.argumentsType = [argType.reference, argType.reference, argType.logical, argType.logical];
|
||
cLINEST.prototype.Calculate = function (arg) {
|
||
arg[0] = tryNumberToArray(arg[0]);
|
||
if (arg[1]) {
|
||
arg[1] = tryNumberToArray(arg[1]);
|
||
}
|
||
|
||
let oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, cElementType.array]);
|
||
let argClone = oArguments.args;
|
||
|
||
let argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
let pMatY = argClone[0];
|
||
let pMatX = argClone[1];
|
||
let bConstant = getBoolValue(argClone[2], true);
|
||
let bStats = getBoolValue(argClone[3], false);
|
||
|
||
//return matrix [col][row]
|
||
let mat = CalculateRGPRKP(pMatY, pMatX, bConstant, bStats);
|
||
|
||
//TODO далее функцию необходимо отптимизировать и сразу формировать итоговую матрицу без промежуточного транспонирования
|
||
if (mat && mat[0] && mat[0][0] !== undefined) {
|
||
let tMatrix = [], res = new cArray();
|
||
|
||
for (let i = 0; i < mat.length; i++) {
|
||
for (let j = 0; j < mat[i].length; j++) {
|
||
if (!tMatrix[j]) {
|
||
tMatrix[j] = [];
|
||
}
|
||
if (null === mat[i][j]) {
|
||
tMatrix[j][i] = new cError(cErrorType.not_available);
|
||
} else {
|
||
tMatrix[j][i] = new cNumber(mat[i][j]);
|
||
}
|
||
}
|
||
}
|
||
|
||
res.fillFromArray(tMatrix);
|
||
return res;
|
||
} else if (mat && mat.type && mat.type === cElementType.error) {
|
||
return mat;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cLOGEST() {
|
||
}
|
||
|
||
cLOGEST.prototype = Object.create(cBaseFunction.prototype);
|
||
cLOGEST.prototype.constructor = cLOGEST;
|
||
cLOGEST.prototype.name = 'LOGEST';
|
||
cLOGEST.prototype.argumentsMin = 1;
|
||
cLOGEST.prototype.argumentsMax = 4;
|
||
cLOGEST.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cLOGEST.prototype.argumentsType = [argType.reference, argType.reference, argType.logical, argType.logical];
|
||
cLOGEST.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cLOGEST.prototype.Calculate = function (arg) {
|
||
|
||
arg[0] = tryNumberToArray(arg[0]);
|
||
if (arg[1]) {
|
||
arg[1] = tryNumberToArray(arg[1]);
|
||
}
|
||
|
||
const oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, cElementType.array]);
|
||
let argClone = oArguments.args;
|
||
|
||
let argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
let pMatY = argClone[0],
|
||
pMatX = argClone[1],
|
||
bConstant = getBoolValue(argClone[2], true),
|
||
bStats = getBoolValue(argClone[3], false),
|
||
res = new cArray(),
|
||
tMatrix = [];
|
||
|
||
|
||
//return matrix [col][row]
|
||
let mat = CalculateRGPRKP(pMatY, pMatX, bConstant, bStats, true);
|
||
|
||
//TODO далее функцию необходимо отптимизировать и сразу формировать итоговую матрицу без промежуточного транспонирования
|
||
if (mat && mat[0] && mat[0][0] !== undefined) {
|
||
for (let i = 0; i < mat.length; i++) {
|
||
for (let j = 0; j < mat[i].length; j++) {
|
||
if (!tMatrix[j]) {
|
||
tMatrix[j] = [];
|
||
}
|
||
if (null === mat[i][j]) {
|
||
tMatrix[j][i] = new cError(cErrorType.not_available);
|
||
} else {
|
||
tMatrix[j][i] = new cNumber(mat[i][j]);
|
||
}
|
||
}
|
||
}
|
||
|
||
res.fillFromArray(tMatrix);
|
||
return res;
|
||
} else if (mat && mat.type && mat.type === cElementType.error) {
|
||
return mat;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cLOGINV() {
|
||
}
|
||
|
||
cLOGINV.prototype = Object.create(cBaseFunction.prototype);
|
||
cLOGINV.prototype.constructor = cLOGINV;
|
||
cLOGINV.prototype.name = 'LOGINV';
|
||
cLOGINV.prototype.argumentsMin = 3;
|
||
cLOGINV.prototype.argumentsMax = 3;
|
||
cLOGINV.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cLOGINV.prototype.Calculate = function (arg) {
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arg2 = arg[2];
|
||
|
||
function loginv(x, mue, sigma) {
|
||
if (sigma <= 0 || x <= 0 || x >= 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
return new cNumber(Math.exp(mue + sigma * (gaussinv(x))));
|
||
}
|
||
}
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0 = arg0.getElement(0);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1 = arg1.getElement(0);
|
||
}
|
||
|
||
if (arg2 instanceof cArea || arg2 instanceof cArea3D) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (arg2 instanceof cArray) {
|
||
arg2 = arg2.getElement(0);
|
||
}
|
||
|
||
arg0 = arg0.tocNumber();
|
||
arg1 = arg1.tocNumber();
|
||
arg2 = arg2.tocNumber();
|
||
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
}
|
||
if (arg1 instanceof cError) {
|
||
return arg1;
|
||
}
|
||
if (arg2 instanceof cError) {
|
||
return arg2;
|
||
}
|
||
|
||
return loginv(arg0.getValue(), arg1.getValue(), arg2.getValue());
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cLOGNORM_DIST() {
|
||
}
|
||
|
||
cLOGNORM_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cLOGNORM_DIST.prototype.constructor = cLOGNORM_DIST;
|
||
cLOGNORM_DIST.prototype.name = 'LOGNORM.DIST';
|
||
cLOGNORM_DIST.prototype.argumentsMin = 4;
|
||
cLOGNORM_DIST.prototype.argumentsMax = 4;
|
||
cLOGNORM_DIST.prototype.isXLFN = true;
|
||
cLOGNORM_DIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
cLOGNORM_DIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
argClone[3] = argClone[3].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var normdist = function (argArray) {
|
||
var x = argArray[0];
|
||
var mue = argArray[1];
|
||
var sigma = argArray[2];
|
||
var bCumulative = argArray[3];
|
||
|
||
var res = null;
|
||
if (sigma <= 0.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
if (bCumulative) {
|
||
if (x <= 0) {
|
||
res = 0;
|
||
} else {
|
||
res = 0.5 + gauss((Math.ln(x) - mue) / sigma);
|
||
}
|
||
} else {
|
||
if (x <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
res = phi((Math.log(x) - mue) / sigma) / sigma / x;
|
||
}
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, normdist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cLOGNORM_INV() {
|
||
}
|
||
|
||
cLOGNORM_INV.prototype = Object.create(cBaseFunction.prototype);
|
||
cLOGNORM_INV.prototype.constructor = cLOGNORM_INV;
|
||
cLOGNORM_INV.prototype.name = 'LOGNORM.INV';
|
||
cLOGNORM_INV.prototype.argumentsMin = 3;
|
||
cLOGNORM_INV.prototype.argumentsMax = 3;
|
||
cLOGNORM_INV.prototype.isXLFN = true;
|
||
cLOGNORM_INV.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cLOGNORM_INV.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var normdist = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fMue = argArray[1];
|
||
var fSigma = argArray[2];
|
||
|
||
var res = null;
|
||
if (fSigma <= 0.0 || fP <= 0.0 || fP >= 1.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
res = Math.exp(fMue + fSigma * gaussinv(fP));
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, normdist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cLOGNORMDIST() {
|
||
}
|
||
|
||
cLOGNORMDIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cLOGNORMDIST.prototype.constructor = cLOGNORMDIST;
|
||
cLOGNORMDIST.prototype.name = 'LOGNORMDIST';
|
||
cLOGNORMDIST.prototype.argumentsMin = 3;
|
||
cLOGNORMDIST.prototype.argumentsMax = 3;
|
||
cLOGNORMDIST.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cLOGNORMDIST.prototype.Calculate = function (arg) {
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arg2 = arg[2];
|
||
|
||
function normdist(x, mue, sigma) {
|
||
if (sigma <= 0 || x <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
return new cNumber(0.5 + gauss((Math.ln(x) - mue) / sigma));
|
||
}
|
||
}
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0 = arg0.getElement(0);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1 = arg1.getElement(0);
|
||
}
|
||
|
||
if (arg2 instanceof cArea || arg2 instanceof cArea3D) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (arg2 instanceof cArray) {
|
||
arg2 = arg2.getElement(0);
|
||
}
|
||
|
||
arg0 = arg0.tocNumber();
|
||
arg1 = arg1.tocNumber();
|
||
arg2 = arg2.tocNumber();
|
||
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
}
|
||
if (arg1 instanceof cError) {
|
||
return arg1;
|
||
}
|
||
if (arg2 instanceof cError) {
|
||
return arg2;
|
||
}
|
||
|
||
return normdist(arg0.getValue(), arg1.getValue(), arg2.getValue());
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cMAX() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cMAX.prototype = Object.create(cBaseFunction.prototype);
|
||
cMAX.prototype.constructor = cMAX;
|
||
cMAX.prototype.name = 'MAX';
|
||
cMAX.prototype.argumentsMin = 1;
|
||
cMAX.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cMAX.prototype.inheritFormat = true;
|
||
cMAX.prototype.argumentsType = [[argType.number]];
|
||
cMAX.prototype.Calculate = function (arg) {
|
||
var v, element, argIVal, max = Number.NEGATIVE_INFINITY;
|
||
for (var i = 0; i < arg.length; i++) {
|
||
element = arg[i];
|
||
argIVal = element.getValue();
|
||
if (cElementType.cell === element.type || cElementType.cell3D === element.type) {
|
||
if (!this.checkExclude || !element.isHidden(this.excludeHiddenRows)) {
|
||
if (cElementType.error === argIVal.type) {
|
||
return argIVal;
|
||
}
|
||
if (cElementType.number === argIVal.type) {
|
||
v = argIVal.tocNumber();
|
||
if (v.getValue() > max) {
|
||
max = v.getValue();
|
||
}
|
||
}
|
||
}
|
||
} else if (cElementType.cellsRange === element.type || cElementType.cellsRange3D === element.type) {
|
||
var argArr = element.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal,
|
||
this.excludeNestedStAg);
|
||
for (var j = 0; j < argArr.length; j++) {
|
||
if (cElementType.number === argArr[j].type) {
|
||
v = argArr[j].tocNumber();
|
||
if (v.getValue() > max) {
|
||
max = v.getValue();
|
||
}
|
||
} else if (cElementType.error === argArr[j].type) {
|
||
return argArr[j];
|
||
}
|
||
}
|
||
} else if (cElementType.error === element.type) {
|
||
return element;
|
||
} else if (cElementType.string === element.type) {
|
||
v = element.tocNumber();
|
||
if (cElementType.number === v.type) {
|
||
if (v.getValue() > max) {
|
||
max = v.getValue();
|
||
}
|
||
}
|
||
} else if (cElementType.bool === element.type || cElementType.empty === element.type) {
|
||
v = element.tocNumber();
|
||
if (v.getValue() > max) {
|
||
max = v.getValue();
|
||
}
|
||
} else if (cElementType.array === element.type) {
|
||
element.foreach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
if (elem.getValue() > max) {
|
||
max = elem.getValue();
|
||
}
|
||
} else if (cElementType.error === elem.type) {
|
||
max = elem;
|
||
return true;
|
||
}
|
||
});
|
||
if (cElementType.error === max.type) {
|
||
return max;
|
||
}
|
||
} else {
|
||
if (element.getValue() > max) {
|
||
max = element.getValue();
|
||
}
|
||
}
|
||
}
|
||
return (max === Number.NEGATIVE_INFINITY ? new cNumber(0) : new cNumber(max));
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cMAXA() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cMAXA.prototype = Object.create(cBaseFunction.prototype);
|
||
cMAXA.prototype.constructor = cMAXA;
|
||
cMAXA.prototype.name = 'MAXA';
|
||
cMAXA.prototype.argumentsMin = 1;
|
||
cMAXA.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cMAXA.prototype.argumentsType = [[argType.number]];
|
||
cMAXA.prototype.Calculate = function (arg) {
|
||
var argI, argIVal, max = Number.NEGATIVE_INFINITY, v;
|
||
for (var i = 0; i < arg.length; i++) {
|
||
argI = arg[i];
|
||
argIVal = argI.getValue();
|
||
if (argI instanceof cRef || argI instanceof cRef3D) {
|
||
|
||
if (argIVal instanceof cError) {
|
||
return argIVal;
|
||
}
|
||
|
||
v = argIVal.tocNumber();
|
||
|
||
if (v instanceof cNumber && v.getValue() > max) {
|
||
max = v.getValue();
|
||
}
|
||
} else if (argI instanceof cArea || argI instanceof cArea3D) {
|
||
var argArr = argI.getValue();
|
||
for (var j = 0; j < argArr.length; j++) {
|
||
|
||
if (argArr[j] instanceof cError) {
|
||
return argArr[j];
|
||
}
|
||
|
||
v = argArr[j].tocNumber();
|
||
|
||
if (v instanceof cNumber && v.getValue() > max) {
|
||
max = v.getValue();
|
||
}
|
||
}
|
||
} else if (argI instanceof cError) {
|
||
return argI;
|
||
} else if (argI instanceof cString) {
|
||
v = argI.tocNumber();
|
||
if (v instanceof cNumber) {
|
||
if (v.getValue() > max) {
|
||
max = v.getValue();
|
||
}
|
||
}
|
||
} else if (argI instanceof cBool || argI instanceof cEmpty) {
|
||
v = argI.tocNumber();
|
||
if (v.getValue() > max) {
|
||
max = v.getValue();
|
||
}
|
||
} else if (argI instanceof cArray) {
|
||
argI.foreach(function (elem) {
|
||
if (elem instanceof cError) {
|
||
max = elem;
|
||
return true;
|
||
}
|
||
elem = elem.tocNumber();
|
||
|
||
if (elem instanceof cNumber && elem.getValue() > max) {
|
||
max = elem.getValue();
|
||
}
|
||
});
|
||
if (max instanceof cError) {
|
||
return max;
|
||
}
|
||
} else {
|
||
if (argI.getValue() > max) {
|
||
max = argI.getValue();
|
||
}
|
||
}
|
||
}
|
||
return (max === Number.NEGATIVE_INFINITY ? new cNumber(0) : new cNumber(max))
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cMAXIFS() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cMAXIFS.prototype = Object.create(cBaseFunction.prototype);
|
||
cMAXIFS.prototype.constructor = cMAXIFS;
|
||
cMAXIFS.prototype.name = 'MAXIFS';
|
||
cMAXIFS.prototype.argumentsMin = 3;
|
||
cMAXIFS.prototype.isXLFN = true;
|
||
cMAXIFS.prototype.arrayIndexes = {0: 1, 1: 1, 3: 1, 5: 1, 7: 1, 9: 1};
|
||
cMAXIFS.prototype.getArrayIndex = function (index) {
|
||
if (index === 0) {
|
||
return 1;
|
||
}
|
||
return index % 2 !== 0 ? 1 : undefined;
|
||
};
|
||
cMAXIFS.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0];
|
||
if (cElementType.cell !== arg0.type && cElementType.cell3D !== arg0.type &&
|
||
cElementType.cellsRange !== arg0.type) {
|
||
if (cElementType.cellsRange3D === arg0.type) {
|
||
arg0 = arg0.tocArea();
|
||
if (!arg0) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
}
|
||
|
||
var arg0Matrix = arg0.getMatrix();
|
||
var i, j, arg1, arg2, matchingInfo;
|
||
for (var k = 1; k < arg.length; k += 2) {
|
||
arg1 = arg[k];
|
||
arg2 = arg[k + 1];
|
||
|
||
if (cElementType.cell !== arg1.type && cElementType.cell3D !== arg1.type &&
|
||
cElementType.cellsRange !== arg1.type) {
|
||
if (cElementType.cellsRange3D === arg1.type) {
|
||
arg1 = arg1.tocArea();
|
||
if (!arg1) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
}
|
||
|
||
if (cElementType.cellsRange === arg2.type || cElementType.cellsRange3D === arg2.type) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (cElementType.array === arg2.type) {
|
||
arg2 = arg2.getElementRowCol(0, 0);
|
||
}
|
||
|
||
arg2 = arg2.tocString();
|
||
|
||
if (cElementType.string !== arg2.type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
matchingInfo = AscCommonExcel.matchingValue(arg2);
|
||
|
||
var arg1Matrix = arg1.getMatrix();
|
||
if (arg0Matrix.length !== arg1Matrix.length) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
//compare
|
||
for (i = 0; i < arg1Matrix.length; ++i) {
|
||
if (arg0Matrix[i].length !== arg1Matrix[i].length) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
for (j = 0; j < arg1Matrix[i].length; ++j) {
|
||
if (arg0Matrix[i][j] && !AscCommonExcel.matching(arg1Matrix[i][j], matchingInfo)) {
|
||
//MS считает в данном случае, что значение 0 (из диапазона условий) соответсвует условию = ""
|
||
if (!(null === matchingInfo.op && "" === matchingInfo.val.value && 0 ===
|
||
arg1Matrix[i][j].value)) {
|
||
arg0Matrix[i][j] = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
var resArr = [];
|
||
var valMatrix0;
|
||
for (i = 0; i < arg0Matrix.length; ++i) {
|
||
for (j = 0; j < arg0Matrix[i].length; ++j) {
|
||
if ((valMatrix0 = arg0Matrix[i][j]) && cElementType.number === valMatrix0.type) {
|
||
resArr.push(valMatrix0.getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
if (0 === resArr.length) {
|
||
return new cNumber(0);
|
||
}
|
||
|
||
resArr.sort(function (a, b) {
|
||
return b - a;
|
||
});
|
||
|
||
return new cNumber(resArr[0]);
|
||
};
|
||
cMAXIFS.prototype.checkArguments = function (countArguments) {
|
||
return 1 === countArguments % 2 && cBaseFunction.prototype.checkArguments.apply(this, arguments);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cMINIFS() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cMINIFS.prototype = Object.create(cBaseFunction.prototype);
|
||
cMINIFS.prototype.constructor = cMINIFS;
|
||
cMINIFS.prototype.name = 'MINIFS';
|
||
cMINIFS.prototype.argumentsMin = 3;
|
||
cMINIFS.prototype.isXLFN = true;
|
||
cMINIFS.prototype.arrayIndexes = {0: 1, 1: 1, 3: 1, 5: 1, 7: 1, 9: 1};
|
||
cMINIFS.prototype.getArrayIndex = function (index) {
|
||
if (index === 0) {
|
||
return 1;
|
||
}
|
||
return index % 2 !== 0 ? 1 : undefined;
|
||
};
|
||
cMINIFS.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0];
|
||
if (cElementType.cell !== arg0.type && cElementType.cell3D !== arg0.type &&
|
||
cElementType.cellsRange !== arg0.type) {
|
||
if (cElementType.cellsRange3D === arg0.type) {
|
||
arg0 = arg0.tocArea();
|
||
if (!arg0) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
}
|
||
|
||
var arg0Matrix = arg0.getMatrix();
|
||
var i, j, arg1, arg2, matchingInfo;
|
||
for (var k = 1; k < arg.length; k += 2) {
|
||
arg1 = arg[k];
|
||
arg2 = arg[k + 1];
|
||
|
||
if (cElementType.cell !== arg1.type && cElementType.cell3D !== arg1.type &&
|
||
cElementType.cellsRange !== arg1.type) {
|
||
if (cElementType.cellsRange3D === arg1.type) {
|
||
arg1 = arg1.tocArea();
|
||
if (!arg1) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
}
|
||
|
||
if (cElementType.cellsRange === arg2.type || cElementType.cellsRange3D === arg2.type) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (cElementType.array === arg2.type) {
|
||
arg2 = arg2.getElementRowCol(0, 0);
|
||
}
|
||
|
||
arg2 = arg2.tocString();
|
||
|
||
if (cElementType.string !== arg2.type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
matchingInfo = AscCommonExcel.matchingValue(arg2);
|
||
|
||
var arg1Matrix = arg1.getMatrix();
|
||
if (arg0Matrix.length !== arg1Matrix.length) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
//compare
|
||
for (i = 0; i < arg1Matrix.length; ++i) {
|
||
if (arg0Matrix[i].length !== arg1Matrix[i].length) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
for (j = 0; j < arg1Matrix[i].length; ++j) {
|
||
if (arg0Matrix[i][j] && !AscCommonExcel.matching(arg1Matrix[i][j], matchingInfo)) {
|
||
//MS считает в данном случае, что значение 0 (из диапазона условий) соответсвует условию = ""
|
||
if (!(null === matchingInfo.op && "" === matchingInfo.val.value && 0 ===
|
||
arg1Matrix[i][j].value)) {
|
||
arg0Matrix[i][j] = null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
var resArr = [];
|
||
var valMatrix0;
|
||
for (i = 0; i < arg0Matrix.length; ++i) {
|
||
for (j = 0; j < arg0Matrix[i].length; ++j) {
|
||
if ((valMatrix0 = arg0Matrix[i][j]) && cElementType.number === valMatrix0.type) {
|
||
resArr.push(valMatrix0.getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
if (0 === resArr.length) {
|
||
return new cNumber(0);
|
||
}
|
||
|
||
resArr.sort(function (a, b) {
|
||
return a - b;
|
||
});
|
||
|
||
return new cNumber(resArr[0]);
|
||
};
|
||
cMINIFS.prototype.checkArguments = function (countArguments) {
|
||
return 1 === countArguments % 2 && cBaseFunction.prototype.checkArguments.apply(this, arguments);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cMEDIAN() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cMEDIAN.prototype = Object.create(cBaseFunction.prototype);
|
||
cMEDIAN.prototype.constructor = cMEDIAN;
|
||
cMEDIAN.prototype.name = 'MEDIAN';
|
||
cMEDIAN.prototype.argumentsMin = 1;
|
||
cMEDIAN.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cMEDIAN.prototype.inheritFormat = true;
|
||
cMEDIAN.prototype.argumentsType = [[argType.number]];
|
||
cMEDIAN.prototype.Calculate = function (arg) {
|
||
|
||
function median(x) {
|
||
|
||
var medArr = [], t;
|
||
|
||
for (var i = 0; i < x.length; i++) {
|
||
t = x[i].tocNumber();
|
||
if (t instanceof cNumber) {
|
||
medArr.push(t.getValue())
|
||
}
|
||
}
|
||
|
||
medArr.sort(fSortAscending);
|
||
|
||
if (medArr.length < 1) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
} else {
|
||
if (medArr.length % 2) {
|
||
return new cNumber(medArr[(medArr.length - 1) / 2]);
|
||
} else {
|
||
return new cNumber((medArr[medArr.length / 2 - 1] + medArr[medArr.length / 2]) / 2);
|
||
}
|
||
}
|
||
}
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber) {
|
||
arr0.push(a);
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString) {
|
||
continue;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return median(arr0);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cMIN() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cMIN.prototype = Object.create(cBaseFunction.prototype);
|
||
cMIN.prototype.constructor = cMIN;
|
||
cMIN.prototype.name = 'MIN';
|
||
cMIN.prototype.argumentsMin = 1;
|
||
cMIN.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cMIN.prototype.inheritFormat = true;
|
||
cMIN.prototype.argumentsType = [[argType.number]];
|
||
cMIN.prototype.Calculate = function (arg) {
|
||
var v, element, argIVal, min = Number.POSITIVE_INFINITY;
|
||
for (var i = 0; i < arg.length; i++) {
|
||
element = arg[i];
|
||
argIVal = element.getValue();
|
||
if (cElementType.cell === element.type || cElementType.cell3D === element.type) {
|
||
if (!this.checkExclude || !element.isHidden(this.excludeHiddenRows)) {
|
||
if (cElementType.error === argIVal.type) {
|
||
return argIVal;
|
||
}
|
||
if (cElementType.number === argIVal.type) {
|
||
v = argIVal.tocNumber();
|
||
if (v.getValue() < min) {
|
||
min = v.getValue();
|
||
}
|
||
}
|
||
}
|
||
} else if (cElementType.cellsRange === element.type || cElementType.cellsRange3D === element.type) {
|
||
var argArr = element.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal,
|
||
this.excludeNestedStAg);
|
||
for (var j = 0; j < argArr.length; j++) {
|
||
if (cElementType.number === argArr[j].type) {
|
||
v = argArr[j].tocNumber();
|
||
if (v.getValue() < min) {
|
||
min = v.getValue();
|
||
}
|
||
continue;
|
||
} else if (cElementType.error === argArr[j].type) {
|
||
return argArr[j];
|
||
}
|
||
}
|
||
} else if (cElementType.error === element.type) {
|
||
return element;
|
||
} else if (cElementType.string === element.type) {
|
||
v = element.tocNumber();
|
||
if (cElementType.number === v.type) {
|
||
if (v.getValue() < min) {
|
||
min = v.getValue();
|
||
}
|
||
}
|
||
} else if (cElementType.bool === element.type || cElementType.empty === element.type) {
|
||
v = element.tocNumber();
|
||
if (v.getValue() < min) {
|
||
min = v.getValue();
|
||
}
|
||
} else if (cElementType.array === element.type) {
|
||
element.foreach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
if (elem.getValue() < min) {
|
||
min = elem.getValue();
|
||
}
|
||
} else if (cElementType.error === elem.type) {
|
||
min = elem;
|
||
return true;
|
||
}
|
||
});
|
||
if (cElementType.error === min.type) {
|
||
return min;
|
||
}
|
||
} else {
|
||
if (element.getValue() < min) {
|
||
min = element.getValue();
|
||
}
|
||
}
|
||
}
|
||
return (min === Number.POSITIVE_INFINITY ? new cNumber(0) : new cNumber(min));
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cMINA() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cMINA.prototype = Object.create(cBaseFunction.prototype);
|
||
cMINA.prototype.constructor = cMINA;
|
||
cMINA.prototype.name = 'MINA';
|
||
cMINA.prototype.argumentsMin = 1;
|
||
cMINA.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cMINA.prototype.argumentsType = [[argType.number]];
|
||
cMINA.prototype.Calculate = function (arg) {
|
||
var argI, argIVal, min = Number.POSITIVE_INFINITY, v;
|
||
for (var i = 0; i < arg.length; i++) {
|
||
argI = arg[i];
|
||
argIVal = argI.getValue();
|
||
if (argI instanceof cRef || argI instanceof cRef3D) {
|
||
|
||
if (argIVal instanceof cError) {
|
||
return argIVal;
|
||
}
|
||
|
||
v = argIVal.tocNumber();
|
||
|
||
if (v instanceof cNumber && v.getValue() < min) {
|
||
min = v.getValue();
|
||
}
|
||
} else if (argI instanceof cArea || argI instanceof cArea3D) {
|
||
var argArr = argI.getValue();
|
||
for (var j = 0; j < argArr.length; j++) {
|
||
|
||
if (argArr[j] instanceof cError) {
|
||
return argArr[j];
|
||
}
|
||
|
||
v = argArr[j].tocNumber();
|
||
|
||
if (v instanceof cNumber && v.getValue() < min) {
|
||
min = v.getValue();
|
||
}
|
||
}
|
||
} else if (argI instanceof cError) {
|
||
return argI;
|
||
} else if (argI instanceof cString) {
|
||
v = argI.tocNumber();
|
||
if (v instanceof cNumber) {
|
||
if (v.getValue() < min) {
|
||
min = v.getValue();
|
||
}
|
||
}
|
||
} else if (argI instanceof cBool || argI instanceof cEmpty) {
|
||
v = argI.tocNumber();
|
||
if (v.getValue() < min) {
|
||
min = v.getValue();
|
||
}
|
||
} else if (argI instanceof cArray) {
|
||
argI.foreach(function (elem) {
|
||
if (elem instanceof cError) {
|
||
min = elem;
|
||
return true;
|
||
}
|
||
|
||
elem = elem.tocNumber();
|
||
|
||
if (elem instanceof cNumber && elem.getValue() < min) {
|
||
min = elem.getValue();
|
||
}
|
||
});
|
||
if (min instanceof cError) {
|
||
return min;
|
||
}
|
||
} else {
|
||
if (argI.getValue() < min) {
|
||
min = argI.getValue();
|
||
}
|
||
}
|
||
}
|
||
return (min === Number.POSITIVE_INFINITY ? new cNumber(0) : new cNumber(min));
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cMODE() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cMODE.prototype = Object.create(cBaseFunction.prototype);
|
||
cMODE.prototype.constructor = cMODE;
|
||
cMODE.prototype.name = 'MODE';
|
||
cMODE.prototype.argumentsMin = 1;
|
||
cMODE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cMODE.prototype.inheritFormat = true;
|
||
cMODE.prototype.argumentsType = [[argType.array]];
|
||
cMODE.prototype.Calculate = function (arg) {
|
||
function mode(x) {
|
||
|
||
var medArr = [], t, i;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
t = x[i].tocNumber();
|
||
if (t instanceof cNumber) {
|
||
medArr.push(t.getValue())
|
||
}
|
||
}
|
||
|
||
medArr.sort(fSortAscending);
|
||
|
||
if (medArr.length < 1) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
} else {
|
||
var nMaxIndex = 0, nMax = 1, nCount = 1, nOldVal = medArr[0];
|
||
|
||
for (i = 1; i < medArr.length; i++) {
|
||
if (medArr[i] == nOldVal) {
|
||
nCount++;
|
||
} else {
|
||
nOldVal = medArr[i];
|
||
if (nCount > nMax) {
|
||
nMax = nCount;
|
||
nMaxIndex = i - 1;
|
||
}
|
||
nCount = 1;
|
||
}
|
||
}
|
||
if (nCount > nMax) {
|
||
nMax = nCount;
|
||
nMaxIndex = i - 1;
|
||
}
|
||
if (nMax == 1 && nCount == 1) {
|
||
return new cError(cErrorType.not_available);
|
||
} else if (nMax == 1) {
|
||
return new cNumber(nOldVal);
|
||
} else {
|
||
return new cNumber(medArr[nMaxIndex]);
|
||
}
|
||
}
|
||
}
|
||
|
||
let arr0 = [];
|
||
|
||
for (let j = 0; j < arg.length; j++) {
|
||
|
||
if (cElementType.cellsRange === arg[j].type || cElementType.cellsRange3D === arg[j].type) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (cElementType.cell === arg[j].type || cElementType.cell3D === arg[j].type) {
|
||
let a = arg[j].getValue();
|
||
if (cElementType.number === a.type) {
|
||
arr0.push(a);
|
||
}
|
||
} else if (cElementType.array === arg[j].type) {
|
||
arg[j].foreach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (cElementType.number === arg[j].type) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (cElementType.string === arg[j].type) {
|
||
continue;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
|
||
return mode(arr0);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cPERCENTILE}
|
||
*/
|
||
function cMODE_MULT() {
|
||
}
|
||
|
||
//***array-formula***
|
||
//TODO другое поведение для формул массива!!!
|
||
cMODE_MULT.prototype = Object.create(cBaseFunction.prototype);
|
||
cMODE_MULT.prototype.constructor = cMODE_MULT;
|
||
cMODE_MULT.prototype.name = 'MODE.MULT';
|
||
cMODE_MULT.prototype.isXLFN = true;
|
||
cMODE_MULT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cMODE_MULT.prototype.argumentsType = [[argType.array]];
|
||
cMODE_MULT.prototype.Calculate = function (arg) {
|
||
function modeMult(numArray) {
|
||
if (numArray.length < 1) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
} else {
|
||
let res = new cArray(), i, maxEntry = 0;
|
||
let elemMap = new Map();
|
||
for (i = 0; i < numArray.length; i++) {
|
||
let key = numArray[i];
|
||
let _elemIndex = elemMap.get(key);
|
||
let index = !_elemIndex ? 1 : _elemIndex + 1;
|
||
elemMap.set(key, index);
|
||
maxEntry = Math.max(maxEntry, index);
|
||
}
|
||
|
||
if (maxEntry === 1) {
|
||
return new cError(cErrorType.not_available);
|
||
} else {
|
||
elemMap.forEach(function (_val, _key) {
|
||
if (!(_val < maxEntry)) {
|
||
res.addRow();
|
||
res.addElement(new cNumber(_key));
|
||
}
|
||
});
|
||
return res;
|
||
}
|
||
}
|
||
}
|
||
|
||
let arr0 = [];
|
||
for (let j = 0; j < arg.length; j++) {
|
||
if (cElementType.cellsRange === arg[j].type || cElementType.cellsRange3D === arg[j].type) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem.toNumber());
|
||
}
|
||
});
|
||
} else if (cElementType.cell === arg[j].type || cElementType.cell3D === arg[j].type) {
|
||
let a = arg[j].getValue();
|
||
if (cElementType.number === a.type) {
|
||
arr0.push(a.toNumber());
|
||
}
|
||
} else if (cElementType.array === arg[j].type) {
|
||
arg[j].foreach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem.toNumber());
|
||
}
|
||
});
|
||
} else if (cElementType.number === arg[j].type) {
|
||
arr0.push(arg[j].toNumber());
|
||
} else if (cElementType.string === arg[j].type) {
|
||
continue;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
}
|
||
|
||
return modeMult(arr0);
|
||
}
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cPERCENTILE}
|
||
*/
|
||
function cMODE_SNGL() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cMODE_SNGL.prototype = Object.create(cMODE.prototype);
|
||
cMODE_SNGL.prototype.constructor = cMODE_SNGL;
|
||
cMODE_SNGL.prototype.name = 'MODE.SNGL';
|
||
cMODE_SNGL.prototype.isXLFN = true;
|
||
cMODE_SNGL.prototype.argumentsType = [[argType.array]];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cNEGBINOMDIST() {
|
||
}
|
||
|
||
cNEGBINOMDIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cNEGBINOMDIST.prototype.constructor = cNEGBINOMDIST;
|
||
cNEGBINOMDIST.prototype.name = 'NEGBINOMDIST';
|
||
cNEGBINOMDIST.prototype.argumentsMin = 3;
|
||
cNEGBINOMDIST.prototype.argumentsMax = 3;
|
||
cNEGBINOMDIST.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cNEGBINOMDIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function negbinomdist(argArray) {
|
||
var x = argArray[0];
|
||
var r = argArray[1];
|
||
var p = argArray[2];
|
||
if (x < 0 || r < 1 || p < 0 || p > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
return new cNumber(Math.binomCoeff(x + r - 1, r - 1) * Math.pow(p, r) * Math.pow(1 - p, x));
|
||
}
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, negbinomdist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cNEGBINOM_DIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cNEGBINOM_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cNEGBINOM_DIST.prototype.constructor = cNEGBINOM_DIST;
|
||
cNEGBINOM_DIST.prototype.name = 'NEGBINOM.DIST';
|
||
cNEGBINOM_DIST.prototype.argumentsMin = 4;
|
||
cNEGBINOM_DIST.prototype.argumentsMax = 4;
|
||
cNEGBINOM_DIST.prototype.isXLFN = true;
|
||
cNEGBINOM_DIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
cNEGBINOM_DIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
argClone[3] = argClone[3].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function negbinomdist(argArray) {
|
||
var x = parseInt(argArray[0]);
|
||
var r = parseInt(argArray[1]);
|
||
var p = argArray[2];
|
||
var bCumulative = argArray[3];
|
||
|
||
if (x < 0 || r < 1 || p < 0 || p > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res;
|
||
if (bCumulative) {
|
||
res = 1 - getBetaDist(1 - p, x + 1, r);
|
||
} else {
|
||
res = Math.binomCoeff(x + r - 1, r - 1) * Math.pow(p, r) * Math.pow(1 - p, x);
|
||
}
|
||
|
||
return isNaN(res) ? new cError(cErrorType.not_numeric) : new cNumber(res);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, negbinomdist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cNORMDIST() {
|
||
}
|
||
|
||
cNORMDIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cNORMDIST.prototype.constructor = cNORMDIST;
|
||
cNORMDIST.prototype.name = 'NORMDIST';
|
||
cNORMDIST.prototype.argumentsMin = 4;
|
||
cNORMDIST.prototype.argumentsMax = 4;
|
||
cNORMDIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
cNORMDIST.prototype.Calculate = function (arg) {
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arg2 = arg[2], arg3 = arg[3];
|
||
|
||
function normdist(x, mue, sigma, kum) {
|
||
if (sigma <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
if (kum) {
|
||
return new cNumber(integralPhi((x - mue) / sigma));
|
||
} else {
|
||
return new cNumber(phi((x - mue) / sigma) / sigma);
|
||
}
|
||
|
||
}
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0 = arg0.getElement(0);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1 = arg1.getElement(0);
|
||
}
|
||
|
||
if (arg2 instanceof cArea || arg2 instanceof cArea3D) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (arg2 instanceof cArray) {
|
||
arg2 = arg2.getElement(0);
|
||
}
|
||
|
||
if (arg3 instanceof cArea || arg3 instanceof cArea3D) {
|
||
arg3 = arg3.cross(arguments[1]);
|
||
} else if (arg3 instanceof cArray) {
|
||
arg3 = arg3.getElement(0);
|
||
}
|
||
|
||
arg0 = arg0.tocNumber();
|
||
arg1 = arg1.tocNumber();
|
||
arg2 = arg2.tocNumber();
|
||
arg3 = arg3.tocBool();
|
||
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
}
|
||
if (arg1 instanceof cError) {
|
||
return arg1;
|
||
}
|
||
if (arg2 instanceof cError) {
|
||
return arg2;
|
||
}
|
||
if (arg3 instanceof cError) {
|
||
return arg3;
|
||
}
|
||
|
||
|
||
return normdist(arg0.getValue(), arg1.getValue(), arg2.getValue(), arg3.toBool());
|
||
};
|
||
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cPERCENTILE}
|
||
*/
|
||
function cNORM_DIST() {
|
||
}
|
||
|
||
cNORM_DIST.prototype = Object.create(cNORMDIST.prototype);
|
||
cNORM_DIST.prototype.constructor = cNORM_DIST;
|
||
cNORM_DIST.prototype.name = 'NORM.DIST';
|
||
cNORM_DIST.prototype.isXLFN = true;
|
||
cNORM_DIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cNORMINV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cNORMINV.prototype = Object.create(cBaseFunction.prototype);
|
||
cNORMINV.prototype.constructor = cNORMINV;
|
||
cNORMINV.prototype.name = 'NORMINV';
|
||
cNORMINV.prototype.argumentsMin = 3;
|
||
cNORMINV.prototype.argumentsMax = 3;
|
||
cNORMINV.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cNORMINV.prototype.Calculate = function (arg) {
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arg2 = arg[2];
|
||
|
||
function norminv(x, mue, sigma) {
|
||
if (sigma <= 0.0 || x <= 0.0 || x >= 1.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
return new cNumber(gaussinv(x) * sigma + mue);
|
||
}
|
||
}
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0 = arg0.getElement(0);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1 = arg1.getElement(0);
|
||
}
|
||
|
||
if (arg2 instanceof cArea || arg2 instanceof cArea3D) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (arg2 instanceof cArray) {
|
||
arg2 = arg2.getElement(0);
|
||
}
|
||
|
||
arg0 = arg0.tocNumber();
|
||
arg1 = arg1.tocNumber();
|
||
arg2 = arg2.tocNumber();
|
||
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
}
|
||
if (arg1 instanceof cError) {
|
||
return arg1;
|
||
}
|
||
if (arg2 instanceof cError) {
|
||
return arg2;
|
||
}
|
||
|
||
return norminv(arg0.getValue(), arg1.getValue(), arg2.getValue());
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cNORMINV}
|
||
*/
|
||
function cNORM_INV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cNORM_INV.prototype = Object.create(cNORMINV.prototype);
|
||
cNORM_INV.prototype.constructor = cNORM_INV;
|
||
cNORM_INV.prototype.name = 'NORM.INV';
|
||
cNORM_INV.prototype.isXLFN = true;
|
||
cNORM_INV.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cNORMSDIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cNORMSDIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cNORMSDIST.prototype.constructor = cNORMSDIST;
|
||
cNORMSDIST.prototype.name = 'NORMSDIST';
|
||
cNORMSDIST.prototype.argumentsMin = 1;
|
||
cNORMSDIST.prototype.argumentsMax = 1;
|
||
cNORMSDIST.prototype.argumentsType = [argType.number];
|
||
cNORMSDIST.prototype.Calculate = function (arg) {
|
||
var arg0 = arg[0];
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
}
|
||
arg0 = arg0.tocNumber();
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem, r, c) {
|
||
if (elem instanceof cNumber) {
|
||
var a = 0.5 + gauss(elem.getValue());
|
||
this.array[r][c] = isNaN(a) ? new cError(cErrorType.not_numeric) : new cNumber(a);
|
||
} else {
|
||
this.array[r][c] = new cError(cErrorType.wrong_value_type);
|
||
}
|
||
})
|
||
} else {
|
||
var a = 0.5 + gauss(arg0.getValue());
|
||
return isNaN(a) ? new cError(cErrorType.not_numeric) : new cNumber(a);
|
||
}
|
||
return arg0;
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cNORM_S_DIST() {
|
||
}
|
||
|
||
cNORM_S_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cNORM_S_DIST.prototype.constructor = cNORM_S_DIST;
|
||
cNORM_S_DIST.prototype.name = 'NORM.S.DIST';
|
||
cNORM_S_DIST.prototype.argumentsMin = 2;
|
||
cNORM_S_DIST.prototype.argumentsMax = 2;
|
||
cNORM_S_DIST.prototype.isXLFN = true;
|
||
cNORM_S_DIST.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cNORM_S_DIST.prototype.argumentsType = [argType.number, argType.logical];
|
||
cNORM_S_DIST.prototype.Calculate = function (arg) {
|
||
function normDistCalc(argArray) {
|
||
|
||
var arg0 = argArray[0], arg1 = argArray[1];
|
||
var res;
|
||
if (arg1) {
|
||
res = 0.5 + gauss(arg0);
|
||
} else {
|
||
res = Math.exp(-Math.pow(arg0, 2) / 2) / Math.sqrt(2 * Math.PI);
|
||
}
|
||
|
||
return isNaN(res) ? new cError(cErrorType.not_numeric) : new cNumber(res);
|
||
}
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, normDistCalc);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cNORMSINV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cNORMSINV.prototype = Object.create(cBaseFunction.prototype);
|
||
cNORMSINV.prototype.constructor = cNORMSINV;
|
||
cNORMSINV.prototype.name = 'NORMSINV';
|
||
cNORMSINV.prototype.argumentsMin = 1;
|
||
cNORMSINV.prototype.argumentsMax = 1;
|
||
cNORMSINV.prototype.argumentsType = [argType.number];
|
||
cNORMSINV.prototype.Calculate = function (arg) {
|
||
|
||
function normsinv(x) {
|
||
if (x <= 0.0 || x >= 1.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
return new cNumber(gaussinv(x));
|
||
}
|
||
}
|
||
|
||
var arg0 = arg[0];
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
}
|
||
arg0 = arg0.tocNumber();
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem, r, c) {
|
||
if (elem instanceof cNumber) {
|
||
var a = normsinv(elem.getValue());
|
||
this.array[r][c] = isNaN(a) ? new cError(cErrorType.not_available) : new cNumber(a);
|
||
} else {
|
||
this.array[r][c] = new cError(cErrorType.wrong_value_type);
|
||
}
|
||
})
|
||
} else {
|
||
var a = normsinv(arg0.getValue());
|
||
return isNaN(a) ? new cError(cErrorType.not_available) : new cNumber(a);
|
||
}
|
||
return arg0;
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cNORMSINV}
|
||
*/
|
||
function cNORM_S_INV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cNORM_S_INV.prototype = Object.create(cNORMSINV.prototype);
|
||
cNORM_S_INV.prototype.constructor = cNORM_S_INV;
|
||
cNORM_S_INV.prototype.name = 'NORM.S.INV';
|
||
cNORM_S_INV.prototype.isXLFN = true;
|
||
cNORM_S_INV.prototype.argumentsType = [argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPEARSON() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPEARSON.prototype = Object.create(cBaseFunction.prototype);
|
||
cPEARSON.prototype.constructor = cPEARSON;
|
||
cPEARSON.prototype.name = 'PEARSON';
|
||
cPEARSON.prototype.argumentsMin = 2;
|
||
cPEARSON.prototype.argumentsMax = 2;
|
||
cPEARSON.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cPEARSON.prototype.argumentsType = [argType.array, argType.array];
|
||
cPEARSON.prototype.Calculate = function (arg) {
|
||
|
||
function pearson(x, y) {
|
||
|
||
var sumXDeltaYDelta = 0, sqrXDelta = 0, sqrYDelta = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
|
||
if (x.length != y.length) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
sumXDeltaYDelta += (x[i].getValue() - _x) * (y[i].getValue() - _y);
|
||
sqrXDelta += (x[i].getValue() - _x) * (x[i].getValue() - _x);
|
||
sqrYDelta += (y[i].getValue() - _y) * (y[i].getValue() - _y);
|
||
|
||
}
|
||
|
||
if (sqrXDelta == 0 || sqrYDelta == 0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
return new cNumber(sumXDeltaYDelta / Math.sqrt(sqrXDelta * sqrYDelta));
|
||
}
|
||
}
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arr0 = [], arr1 = [];
|
||
|
||
if (arg0 instanceof cArea) {
|
||
arr0 = arg0.getValue();
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem) {
|
||
arr0.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (arg1 instanceof cArea) {
|
||
arr1 = arg1.getValue();
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1.foreach(function (elem) {
|
||
arr1.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
return pearson(arr0, arr1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPERCENTILE() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPERCENTILE.prototype = Object.create(cBaseFunction.prototype);
|
||
cPERCENTILE.prototype.constructor = cPERCENTILE;
|
||
cPERCENTILE.prototype.name = 'PERCENTILE';
|
||
cPERCENTILE.prototype.argumentsMin = 2;
|
||
cPERCENTILE.prototype.argumentsMax = 2;
|
||
cPERCENTILE.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cPERCENTILE.prototype.arrayIndexes = {0: 1};
|
||
cPERCENTILE.prototype.argumentsType = [argType.number, argType.number];
|
||
cPERCENTILE.prototype.Calculate = function (arg) {
|
||
function percentile(argArray) {
|
||
|
||
var tA = [], A = argArray[0], alpha = argArray[1];
|
||
|
||
for (var i = 0; i < A.length; i++) {
|
||
for (var j = 0; j < A[i].length; j++) {
|
||
if (A[i][j] instanceof cError) {
|
||
return A[i][j];
|
||
} else if (A[i][j] instanceof cNumber) {
|
||
tA.push(A[i][j].getValue());
|
||
} else if (A[i][j] instanceof cBool) {
|
||
tA.push(A[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
return getPercentile(tA, alpha);
|
||
}
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, percentile);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPERCENTILE_EXC() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPERCENTILE_EXC.prototype = Object.create(cBaseFunction.prototype);
|
||
cPERCENTILE_EXC.prototype.constructor = cPERCENTILE_EXC;
|
||
cPERCENTILE_EXC.prototype.name = 'PERCENTILE.EXC';
|
||
cPERCENTILE_EXC.prototype.argumentsMin = 2;
|
||
cPERCENTILE_EXC.prototype.argumentsMax = 2;
|
||
cPERCENTILE_EXC.prototype.isXLFN = true;
|
||
cPERCENTILE_EXC.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cPERCENTILE_EXC.prototype.arrayIndexes = {0: 1};
|
||
cPERCENTILE_EXC.prototype.argumentsType = [argType.number, argType.number];
|
||
cPERCENTILE_EXC.prototype.Calculate = function (arg) {
|
||
function percentile(argArray) {
|
||
|
||
var tA = [], A = argArray[0], alpha = argArray[1];
|
||
|
||
for (var i = 0; i < A.length; i++) {
|
||
for (var j = 0; j < A[i].length; j++) {
|
||
if (A[i][j] instanceof cError) {
|
||
return A[i][j];
|
||
} else if (A[i][j] instanceof cNumber) {
|
||
tA.push(A[i][j].getValue());
|
||
} else if (A[i][j] instanceof cBool) {
|
||
tA.push(A[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
return getPercentileExclusive(tA, alpha);
|
||
}
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, percentile);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cPERCENTILE}
|
||
*/
|
||
function cPERCENTILE_INC() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPERCENTILE_INC.prototype = Object.create(cPERCENTILE.prototype);
|
||
cPERCENTILE_INC.prototype.constructor = cPERCENTILE_INC;
|
||
cPERCENTILE_INC.prototype.name = 'PERCENTILE.INC';
|
||
cPERCENTILE_INC.prototype.isXLFN = true;
|
||
cPERCENTILE_INC.prototype.argumentsType = [argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPERCENTRANK() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPERCENTRANK.prototype = Object.create(cBaseFunction.prototype);
|
||
cPERCENTRANK.prototype.constructor = cPERCENTRANK;
|
||
cPERCENTRANK.prototype.name = 'PERCENTRANK';
|
||
cPERCENTRANK.prototype.argumentsMin = 2;
|
||
cPERCENTRANK.prototype.argumentsMax = 3;
|
||
cPERCENTRANK.prototype.arrayIndexes = {0: 1};
|
||
cPERCENTRANK.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cPERCENTRANK.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2] ? argClone[2].tocNumber() : new cNumber(3);
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function calcPercenTrank(argArray) {
|
||
|
||
var tA = [], A = argArray[0], fNum = argArray[1], k = argArray[2];
|
||
|
||
for (var i = 0; i < A.length; i++) {
|
||
for (var j = 0; j < A[i].length; j++) {
|
||
if (A[i][j] instanceof cError) {
|
||
return A[i][j];
|
||
} else if (A[i][j] instanceof cNumber) {
|
||
tA.push(A[i][j].getValue());
|
||
} else if (A[i][j] instanceof cBool) {
|
||
tA.push(A[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
return percentrank(tA, fNum, k, true);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcPercenTrank);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPERCENTRANK_EXC() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPERCENTRANK_EXC.prototype = Object.create(cBaseFunction.prototype);
|
||
cPERCENTRANK_EXC.prototype.constructor = cPERCENTRANK_EXC;
|
||
cPERCENTRANK_EXC.prototype.name = 'PERCENTRANK.EXC';
|
||
cPERCENTRANK_EXC.prototype.argumentsMin = 2;
|
||
cPERCENTRANK_EXC.prototype.argumentsMax = 3;
|
||
cPERCENTRANK_EXC.prototype.isXLFN = true;
|
||
cPERCENTRANK_EXC.prototype.arrayIndexes = {0: 1};
|
||
cPERCENTRANK_EXC.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cPERCENTRANK_EXC.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2] ? argClone[2].tocNumber() : new cNumber(3);
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function calcPercenTrank(argArray) {
|
||
|
||
var tA = [], A = argArray[0], fNum = argArray[1], k = argArray[2];
|
||
|
||
for (var i = 0; i < A.length; i++) {
|
||
for (var j = 0; j < A[i].length; j++) {
|
||
if (A[i][j] instanceof cError) {
|
||
return A[i][j];
|
||
} else if (A[i][j] instanceof cNumber) {
|
||
tA.push(A[i][j].getValue());
|
||
} else if (A[i][j] instanceof cBool) {
|
||
tA.push(A[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
return percentrank(tA, fNum, k);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcPercenTrank);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cPERCENTRANK}
|
||
*/
|
||
function cPERCENTRANK_INC() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPERCENTRANK_INC.prototype = Object.create(cPERCENTRANK.prototype);
|
||
cPERCENTRANK_INC.prototype.constructor = cPERCENTRANK_INC;
|
||
cPERCENTRANK_INC.prototype.name = 'PERCENTRANK.INC';
|
||
cPERCENTRANK_INC.prototype.isXLFN = true;
|
||
cPERCENTRANK_INC.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPERMUT() {
|
||
}
|
||
|
||
cPERMUT.prototype = Object.create(cBaseFunction.prototype);
|
||
cPERMUT.prototype.constructor = cPERMUT;
|
||
cPERMUT.prototype.name = 'PERMUT';
|
||
cPERMUT.prototype.argumentsMin = 2;
|
||
cPERMUT.prototype.argumentsMax = 2;
|
||
cPERMUT.prototype.argumentsType = [argType.number, argType.number];
|
||
cPERMUT.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function permut(argArray) {
|
||
var n = Math.floor(argArray[0]);
|
||
var k = Math.floor(argArray[1]);
|
||
if (n <= 0 || k <= 0 || n < k) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return new cNumber(Math.permut(n, k));
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, permut);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPERMUTATIONA() {
|
||
}
|
||
|
||
cPERMUTATIONA.prototype = Object.create(cBaseFunction.prototype);
|
||
cPERMUTATIONA.prototype.constructor = cPERMUTATIONA;
|
||
cPERMUTATIONA.prototype.name = 'PERMUTATIONA';
|
||
cPERMUTATIONA.prototype.argumentsMin = 2;
|
||
cPERMUTATIONA.prototype.argumentsMax = 2;
|
||
cPERMUTATIONA.prototype.isXLFN = true;
|
||
cPERMUTATIONA.prototype.argumentsType = [argType.number, argType.number];
|
||
cPERMUTATIONA.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function permutationa(argArray) {
|
||
var n = Math.floor(argArray[0]);
|
||
var k = Math.floor(argArray[1]);
|
||
if (n < 0.0 || k < 0.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return new cNumber(Math.pow(n, k));
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, permutationa);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPHI() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPHI.prototype = Object.create(cBaseFunction.prototype);
|
||
cPHI.prototype.constructor = cPHI;
|
||
cPHI.prototype.name = 'PHI';
|
||
cPHI.prototype.argumentsMin = 1;
|
||
cPHI.prototype.argumentsMax = 1;
|
||
cPHI.prototype.isXLFN = true;
|
||
cPHI.prototype.argumentsType = [argType.number];
|
||
cPHI.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function calcPhi(argArray) {
|
||
var res = phi(argArray[0]);
|
||
|
||
return isNaN(res) ? new cError(cErrorType.not_available) : new cNumber(res);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcPhi);
|
||
};
|
||
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPOISSON() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPOISSON.prototype = Object.create(cBaseFunction.prototype);
|
||
cPOISSON.prototype.constructor = cPOISSON;
|
||
cPOISSON.prototype.name = 'POISSON';
|
||
cPOISSON.prototype.argumentsMin = 3;
|
||
cPOISSON.prototype.argumentsMax = 3;
|
||
cPOISSON.prototype.argumentsType = [argType.number, argType.number, argType.logical];
|
||
cPOISSON.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function poisson(argArray) {
|
||
var _x = parseInt(argArray[0]);
|
||
var _l = argArray[1];
|
||
var f = argArray[2];
|
||
|
||
if (_x < 0 || _l < 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
if (f) {
|
||
var sum = 0;
|
||
for (var k = 0; k <= _x; k++) {
|
||
sum += Math.pow(_l, k) / Math.fact(k);
|
||
}
|
||
sum *= Math.exp(-_l);
|
||
return new cNumber(sum);
|
||
} else {
|
||
return new cNumber(Math.exp(-_l) * Math.pow(_l, _x) / Math.fact(_x));
|
||
}
|
||
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, poisson);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cPERCENTRANK}
|
||
*/
|
||
function cPOISSON_DIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPOISSON_DIST.prototype = Object.create(cPOISSON.prototype);
|
||
cPOISSON_DIST.prototype.constructor = cPOISSON_DIST;
|
||
cPOISSON_DIST.prototype.name = 'POISSON.DIST';
|
||
cPOISSON_DIST.prototype.isXLFN = true;
|
||
cPOISSON_DIST.prototype.argumentsType = [argType.number, argType.number, argType.logical];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cPROB() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cPROB.prototype = Object.create(cBaseFunction.prototype);
|
||
cPROB.prototype.constructor = cPROB;
|
||
cPROB.prototype.name = 'PROB';
|
||
cPROB.prototype.argumentsMin = 3;
|
||
cPROB.prototype.argumentsMax = 4;
|
||
cPROB.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cPROB.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cPROB.prototype.argumentsType = [argType.array, argType.array, argType.number, argType.number];
|
||
cPROB.prototype.Calculate = function (arg) {
|
||
|
||
function prob(x, p, l, u) {
|
||
var fUp, fLo;
|
||
fLo = l.getValue();
|
||
if (u instanceof cEmpty) {
|
||
fUp = fLo;
|
||
} else {
|
||
fUp = u.getValue();
|
||
}
|
||
|
||
if (fLo > fUp) {
|
||
var fTemp = fLo;
|
||
fLo = fUp;
|
||
fUp = fTemp;
|
||
}
|
||
var nC1 = x[0].length, nC2 = p[0].length, nR1 = x.length, nR2 = p.length;
|
||
|
||
if (nC1 != nC2 || nR1 != nR2 || nC1 == 0 || nR1 == 0 || nC2 == 0 || nR2 == 0) {
|
||
return new cError(cErrorType.not_available);
|
||
} else {
|
||
var fSum = 0, fRes = 0, bStop = false, fP, fW;
|
||
for (var i = 0; i < nR1 && !bStop; i++) {
|
||
for (var j = 0; j < nC1 && !bStop; j++) {
|
||
if (x[i][j] instanceof cNumber && p[i][j] instanceof cNumber) {
|
||
fP = p[i][j].getValue();
|
||
fW = x[i][j].getValue();
|
||
if (fP < 0.0 || fP > 1.0) {
|
||
bStop = true;
|
||
} else {
|
||
fSum += fP;
|
||
if (fW >= fLo && fW <= fUp) {
|
||
fRes += fP;
|
||
}
|
||
}
|
||
} else {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
}
|
||
|
||
}
|
||
if (bStop || Math.abs(fSum - 1.0) > 1.0E-7) {
|
||
return new cError(cErrorType.not_available);
|
||
} else {
|
||
return new cNumber(fRes);
|
||
}
|
||
}
|
||
}
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arg2 = arg[2], arg3 = arg[3] ? arg[3] : new cEmpty();
|
||
if (arg0 instanceof cArea || arg0 instanceof cArray) {
|
||
arg0 = arg0.getMatrix();
|
||
} else if (arg0 instanceof cArea3D) {
|
||
arg0 = arg0.getMatrix()[0];
|
||
} else {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArray) {
|
||
arg1 = arg1.getMatrix();
|
||
} else if (arg1 instanceof cArea3D) {
|
||
arg1 = arg1.getMatrix()[0];
|
||
} else {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
|
||
|
||
if (arg2 instanceof cArea || arg2 instanceof cArea3D) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (arg2 instanceof cArray) {
|
||
arg2 = arg2.getElement(0);
|
||
}
|
||
|
||
if (arg3 instanceof cArea || arg3 instanceof cArea3D) {
|
||
arg3 = arg3.cross(arguments[1]);
|
||
} else if (arg3 instanceof cArray) {
|
||
arg3 = arg3.getElement(0);
|
||
}
|
||
|
||
arg2 = arg2.tocNumber();
|
||
if (!arg3 instanceof cEmpty) {
|
||
arg3 = arg3.tocNumber();
|
||
}
|
||
|
||
if (arg2 instanceof cError) {
|
||
return arg2;
|
||
}
|
||
if (arg3 instanceof cError) {
|
||
return arg3;
|
||
}
|
||
|
||
return prob(arg0, arg1, arg2, arg3);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cQUARTILE() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cQUARTILE.prototype = Object.create(cBaseFunction.prototype);
|
||
cQUARTILE.prototype.constructor = cQUARTILE;
|
||
cQUARTILE.prototype.name = 'QUARTILE';
|
||
cQUARTILE.prototype.argumentsMin = 2;
|
||
cQUARTILE.prototype.argumentsMax = 2;
|
||
cQUARTILE.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cQUARTILE.prototype.arrayIndexes = {0: 1};
|
||
cQUARTILE.prototype.argumentsType = [argType.number, argType.number];
|
||
cQUARTILE.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function quartile(argArray) {
|
||
|
||
var A = argArray[0];
|
||
var fFlag = Math.floor(argArray[1]);
|
||
var tA = [];
|
||
|
||
for (var i = 0; i < A.length; i++) {
|
||
for (var j = 0; j < A[i].length; j++) {
|
||
if (A[i][j] instanceof cError) {
|
||
return A[i][j];
|
||
} else if (A[i][j] instanceof cNumber || A[i][j] instanceof cEmpty) {
|
||
tA.push(A[i][j].getValue());
|
||
} else if (A[i][j] instanceof cBool) {
|
||
tA.push(A[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
var nSize = tA.length;
|
||
if (tA.length < 1 || nSize === 0) {
|
||
return new cError(cErrorType.not_available);
|
||
} else if (fFlag < 0.0 || fFlag > 4.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else if (nSize === 1) {
|
||
return new cNumber(tA[0]);
|
||
}
|
||
|
||
return fFlag === 2 ? getMedian(tA) : getPercentile(tA, 0.25 * fFlag);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, quartile);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cQUARTILE_EXC() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cQUARTILE_EXC.prototype = Object.create(cBaseFunction.prototype);
|
||
cQUARTILE_EXC.prototype.constructor = cQUARTILE_EXC;
|
||
cQUARTILE_EXC.prototype.name = 'QUARTILE.EXC';
|
||
cQUARTILE_EXC.prototype.argumentsMin = 2;
|
||
cQUARTILE_EXC.prototype.argumentsMax = 2;
|
||
cQUARTILE_EXC.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cQUARTILE_EXC.prototype.isXLFN = true;
|
||
cQUARTILE_EXC.prototype.arrayIndexes = {0: 1};
|
||
cQUARTILE_EXC.prototype.argumentsType = [argType.number, argType.number];
|
||
cQUARTILE_EXC.prototype.Calculate = function (arg) {
|
||
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function quartile(argArray) {
|
||
|
||
var A = argArray[0];
|
||
var fFlag = Math.floor(argArray[1]);
|
||
var tA = [];
|
||
|
||
for (var i = 0; i < A.length; i++) {
|
||
for (var j = 0; j < A[i].length; j++) {
|
||
if (A[i][j] instanceof cError) {
|
||
return A[i][j];
|
||
} else if (A[i][j] instanceof cNumber) {
|
||
tA.push(A[i][j].getValue());
|
||
} else if (A[i][j] instanceof cBool) {
|
||
tA.push(A[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
var nSize = tA.length;
|
||
if (tA.length < 1 || nSize === 0) {
|
||
return new cError(cErrorType.not_available);
|
||
} else if (fFlag <= 0.0 || fFlag >= 4.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else if (nSize === 1) {
|
||
return new cNumber(tA[0]);
|
||
}
|
||
|
||
return fFlag === 2 ? getMedian(tA) : getPercentileExclusive(tA, 0.25 * fFlag);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, quartile);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cQUARTILE}
|
||
*/
|
||
function cQUARTILE_INC() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cQUARTILE_INC.prototype = Object.create(cQUARTILE.prototype);
|
||
cQUARTILE_INC.prototype.constructor = cQUARTILE_INC;
|
||
cQUARTILE_INC.prototype.name = 'QUARTILE.INC';
|
||
cQUARTILE_INC.prototype.isXLFN = true;
|
||
cQUARTILE_INC.prototype.argumentsType = [argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cRANK() {
|
||
}
|
||
|
||
cRANK.prototype = Object.create(cBaseFunction.prototype);
|
||
cRANK.prototype.constructor = cRANK;
|
||
cRANK.prototype.name = "RANK";
|
||
cRANK.prototype.argumentsMin = 2;
|
||
cRANK.prototype.argumentsMax = 3;
|
||
cRANK.prototype.arrayIndexes = {1: 1};
|
||
cRANK.prototype.argumentsType = [argType.number, argType.reference, argType.logical];
|
||
cRANK.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [null, cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
//1 argument - array
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[2] = undefined !== argClone[2] ? argClone[2].tocNumber() : new cNumber(0);
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcRank = function (argArray) {
|
||
var number = argArray[0];
|
||
var ref = argArray[1];
|
||
var order = argArray[2];
|
||
|
||
var changedRef = [];
|
||
for (var i = 0; i < ref.length; i++) {
|
||
for (var j = 0; j < ref[i].length; j++) {
|
||
if (ref[i][j] instanceof cError) {
|
||
return ref[i][j];
|
||
} else if (ref[i][j] instanceof cNumber) {
|
||
changedRef.push(ref[i][j].getValue());
|
||
} else if (ref[i][j] instanceof cBool) {
|
||
changedRef.push(ref[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!changedRef.length) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
var res = rank(number, changedRef, order);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcRank);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cRANK_AVG() {
|
||
}
|
||
|
||
cRANK_AVG.prototype = Object.create(cBaseFunction.prototype);
|
||
cRANK_AVG.prototype.constructor = cRANK_AVG;
|
||
cRANK_AVG.prototype.name = 'RANK.AVG';
|
||
cRANK_AVG.prototype.argumentsMin = 2;
|
||
cRANK_AVG.prototype.argumentsMax = 3;
|
||
cRANK_AVG.prototype.isXLFN = true;
|
||
cRANK_AVG.prototype.arrayIndexes = {1: 1};
|
||
cRANK_AVG.prototype.argumentsType = [argType.number, argType.reference, argType.logical];
|
||
cRANK_AVG.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true, [null, cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
//1 argument - array
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[2] = undefined !== argClone[2] ? argClone[2].tocNumber() : new cNumber(0);
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcRank = function (argArray) {
|
||
var number = argArray[0];
|
||
var ref = argArray[1];
|
||
var order = argArray[2];
|
||
|
||
var changedRef = [];
|
||
for (var i = 0; i < ref.length; i++) {
|
||
for (var j = 0; j < ref[i].length; j++) {
|
||
if (ref[i][j] instanceof cError) {
|
||
return ref[i][j];
|
||
} else if (ref[i][j] instanceof cNumber) {
|
||
changedRef.push(ref[i][j].getValue());
|
||
} else if (ref[i][j] instanceof cBool) {
|
||
changedRef.push(ref[i][j].tocNumber().getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!changedRef.length) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
var res = rank(number, changedRef, order, true);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcRank);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cRANK}
|
||
*/
|
||
function cRANK_EQ() {
|
||
}
|
||
|
||
cRANK_EQ.prototype = Object.create(cRANK.prototype);
|
||
cRANK_EQ.prototype.constructor = cRANK_EQ;
|
||
cRANK_EQ.prototype.name = 'RANK.EQ';
|
||
cRANK_EQ.prototype.isXLFN = true;
|
||
cRANK_EQ.prototype.argumentsType = [argType.number, argType.reference, argType.logical];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cRSQ() {
|
||
}
|
||
|
||
cRSQ.prototype = Object.create(cBaseFunction.prototype);
|
||
cRSQ.prototype.constructor = cRSQ;
|
||
cRSQ.prototype.name = 'RSQ';
|
||
cRSQ.prototype.argumentsMin = 2;
|
||
cRSQ.prototype.argumentsMax = 2;
|
||
cRSQ.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cRSQ.prototype.argumentsType = [argType.array, argType.array];
|
||
cRSQ.prototype.Calculate = function (arg) {
|
||
|
||
function rsq(x, y) {
|
||
|
||
var sumXDeltaYDelta = 0, sqrXDelta = 0, sqrYDelta = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
|
||
if (x.length != y.length) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
sumXDeltaYDelta += (x[i].getValue() - _x) * (y[i].getValue() - _y);
|
||
sqrXDelta += (x[i].getValue() - _x) * (x[i].getValue() - _x);
|
||
sqrYDelta += (y[i].getValue() - _y) * (y[i].getValue() - _y);
|
||
|
||
}
|
||
|
||
if (sqrXDelta == 0 || sqrYDelta == 0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
return new cNumber(Math.pow(sumXDeltaYDelta / Math.sqrt(sqrXDelta * sqrYDelta), 2));
|
||
}
|
||
}
|
||
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arr0 = [], arr1 = [];
|
||
|
||
if (arg0 instanceof cArea) {
|
||
arr0 = arg0.getValue();
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem) {
|
||
arr0.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (arg1 instanceof cArea) {
|
||
arr1 = arg1.getValue();
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1.foreach(function (elem) {
|
||
arr1.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
return rsq(arr0, arr1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSKEW() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cSKEW.prototype = Object.create(cBaseFunction.prototype);
|
||
cSKEW.prototype.constructor = cSKEW;
|
||
cSKEW.prototype.name = 'SKEW';
|
||
cSKEW.prototype.argumentsMin = 1;
|
||
cSKEW.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cSKEW.prototype.argumentsType = [[argType.number]];
|
||
cSKEW.prototype.isXLFN = true;
|
||
cSKEW.prototype.Calculate = function (arg) {
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber) {
|
||
arr0.push(a);
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString) {
|
||
continue;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return skew(arr0);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSKEW_P() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cSKEW_P.prototype = Object.create(cBaseFunction.prototype);
|
||
cSKEW_P.prototype.constructor = cSKEW_P;
|
||
cSKEW_P.prototype.name = 'SKEW.P';
|
||
cSKEW_P.prototype.argumentsMin = 1;
|
||
cSKEW_P.prototype.isXLFN = true;
|
||
cSKEW_P.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cSKEW_P.prototype.argumentsType = [[argType.number]];
|
||
cSKEW_P.prototype.Calculate = function (arg) {
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber) {
|
||
arr0.push(a);
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber) {
|
||
arr0.push(elem);
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString) {
|
||
continue;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return skew(arr0, true);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSLOPE() {
|
||
}
|
||
|
||
cSLOPE.prototype = Object.create(cBaseFunction.prototype);
|
||
cSLOPE.prototype.constructor = cSLOPE;
|
||
cSLOPE.prototype.name = 'SLOPE';
|
||
cSLOPE.prototype.argumentsMin = 2;
|
||
cSLOPE.prototype.argumentsMax = 2;
|
||
cSLOPE.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cSLOPE.prototype.argumentsType = [argType.array, argType.array];
|
||
cSLOPE.prototype.Calculate = function (arg) {
|
||
|
||
function slope(y, x) {
|
||
|
||
var sumXDeltaYDelta = 0, sqrXDelta = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
|
||
if (x.length != y.length) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
sumXDeltaYDelta += (x[i].getValue() - _x) * (y[i].getValue() - _y);
|
||
sqrXDelta += (x[i].getValue() - _x) * (x[i].getValue() - _x);
|
||
|
||
}
|
||
|
||
if (sqrXDelta == 0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
return new cNumber(sumXDeltaYDelta / sqrXDelta);
|
||
}
|
||
}
|
||
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arr0 = [], arr1 = [];
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arr0 = arg0.getValue();
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem) {
|
||
arr0.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arr1 = arg1.getValue();
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1.foreach(function (elem) {
|
||
arr1.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
return slope(arr0, arr1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSMALL() {
|
||
}
|
||
|
||
cSMALL.prototype = Object.create(cBaseFunction.prototype);
|
||
cSMALL.prototype.constructor = cSMALL;
|
||
cSMALL.prototype.name = 'SMALL';
|
||
cSMALL.prototype.argumentsMin = 2;
|
||
cSMALL.prototype.argumentsMax = 2;
|
||
cSMALL.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cSMALL.prototype.arrayIndexes = {0: 1};
|
||
cSMALL.prototype.argumentsType = [argType.number, argType.number];
|
||
cSMALL.prototype.Calculate = function (arg) {
|
||
|
||
function frequency(A, k) {
|
||
|
||
var tA = [];
|
||
|
||
for (var i = 0; i < A.length; i++) {
|
||
for (var j = 0; j < A[i].length; j++) {
|
||
if (A[i][j] instanceof cError) {
|
||
return A[i][j];
|
||
} else if (A[i][j] instanceof cNumber) {
|
||
tA.push(A[i][j].getValue());
|
||
} /*else if (A[i][j] instanceof cBool) {
|
||
tA.push(A[i][j].tocNumber().getValue());
|
||
}*/
|
||
}
|
||
}
|
||
|
||
tA.sort(fSortAscending);
|
||
|
||
if (k.getValue() > tA.length || k.getValue() <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
return new cNumber(tA[k.getValue() - 1]);
|
||
}
|
||
}
|
||
|
||
function actionArray(elem, r, c) {
|
||
var e = elem.tocNumber();
|
||
|
||
if (e instanceof cError) {
|
||
retArr.addElement(e);
|
||
}
|
||
|
||
retArr.addElement(frequency(arg0, e));
|
||
}
|
||
|
||
let arg0 = arg[0], arg1 = arg[1], retArr = new cArray();
|
||
if ((arg0.type !== cElementType.array && arg0.type !== cElementType.cellsRange && arg0.type !== cElementType.cellsRange3D) &&
|
||
(arg1.type !== cElementType.array && arg1.type !== cElementType.cellsRange && arg1.type !== cElementType.cellsRange3D)) {
|
||
/* value to value */
|
||
arg0 = arg0.tocNumber();
|
||
arg1 = arg1.tocNumber();
|
||
|
||
if (arg0.type === cElementType.error) {
|
||
return arg0;
|
||
}
|
||
if (arg1.type === cElementType.error) {
|
||
return arg1;
|
||
}
|
||
if (arg1.getValue() !== 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return arg0;
|
||
}
|
||
|
||
if (cElementType.cellsRange === arg0.type || cElementType.array === arg0.type) {
|
||
arg0 = arg0.getMatrix(this.excludeHiddenRows, this.excludeErrorsVal, this.excludeNestedStAg);
|
||
} else if (cElementType.cellsRange3D === arg0.type) {
|
||
arg0 = arg0.getMatrix(this.excludeHiddenRows, this.excludeErrorsVal, this.excludeNestedStAg)[0];
|
||
} else {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
if (cElementType.cellsRange === arg0.type || cElementType.cellsRange3D === arg0.type) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (cElementType.array === arg0.type) {
|
||
arg1.foreach(actionArray);
|
||
return retArr;
|
||
}
|
||
|
||
return frequency(arg0, arg1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSTANDARDIZE() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cSTANDARDIZE.prototype = Object.create(cBaseFunction.prototype);
|
||
cSTANDARDIZE.prototype.constructor = cSTANDARDIZE;
|
||
cSTANDARDIZE.prototype.name = 'STANDARDIZE';
|
||
cSTANDARDIZE.prototype.argumentsMin = 3;
|
||
cSTANDARDIZE.prototype.argumentsMax = 3;
|
||
cSTANDARDIZE.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cSTANDARDIZE.prototype.Calculate = function (arg) {
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arg2 = arg[2];
|
||
|
||
function standardize(x, mue, sigma) {
|
||
if (sigma <= 0.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
return new cNumber((x - mue) / sigma);
|
||
}
|
||
}
|
||
|
||
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
||
arg0 = arg0.cross(arguments[1]);
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0 = arg0.getElement(0);
|
||
}
|
||
|
||
if (arg1 instanceof cArea || arg1 instanceof cArea3D) {
|
||
arg1 = arg1.cross(arguments[1]);
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1 = arg1.getElement(0);
|
||
}
|
||
|
||
if (arg2 instanceof cArea || arg2 instanceof cArea3D) {
|
||
arg2 = arg2.cross(arguments[1]);
|
||
} else if (arg2 instanceof cArray) {
|
||
arg2 = arg2.getElement(0);
|
||
}
|
||
|
||
arg0 = arg0.tocNumber();
|
||
arg1 = arg1.tocNumber();
|
||
arg2 = arg2.tocNumber();
|
||
|
||
if (arg0 instanceof cError) {
|
||
return arg0;
|
||
}
|
||
if (arg1 instanceof cError) {
|
||
return arg1;
|
||
}
|
||
if (arg2 instanceof cError) {
|
||
return arg2;
|
||
}
|
||
|
||
return standardize(arg0.getValue(), arg1.getValue(), arg2.getValue());
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSTDEV() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cSTDEV.prototype = Object.create(cBaseFunction.prototype);
|
||
cSTDEV.prototype.constructor = cSTDEV;
|
||
cSTDEV.prototype.name = 'STDEV';
|
||
cSTDEV.prototype.argumentsMin = 1;
|
||
cSTDEV.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cSTDEV.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cSTDEV.prototype.argumentsType = [[argType.number]];
|
||
cSTDEV.prototype.Calculate = function (arg) {
|
||
var i, element, count = 0, sum = new cNumber(0), member = [];
|
||
for (i = 0; i < arg.length; i++) {
|
||
element = arg[i];
|
||
if (cElementType.cell === element.type || cElementType.cell3D === element.type) {
|
||
if (!this.checkExclude || !element.isHidden(this.excludeHiddenRows)) {
|
||
var _argV = element.getValue();
|
||
if (cElementType.number === _argV.type) {
|
||
member.push(_argV);
|
||
sum = _func[sum.type][_argV.type](sum, _argV, "+");
|
||
count++;
|
||
}
|
||
}
|
||
} else if (cElementType.cellsRange === element.type || cElementType.cellsRange3D === element.type) {
|
||
var _argAreaValue = element.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal,
|
||
this.excludeNestedStAg);
|
||
for (var j = 0; j < _argAreaValue.length; j++) {
|
||
var __arg = _argAreaValue[j];
|
||
if (cElementType.number === __arg.type) {
|
||
member.push(__arg);
|
||
sum = _func[sum.type][__arg.type](sum, __arg, "+");
|
||
count++;
|
||
}
|
||
}
|
||
} else if (cElementType.array === element.type) {
|
||
element.foreach(function (elem) {
|
||
var e = elem.tocNumber();
|
||
if (cElementType.number === e.type) {
|
||
member.push(e);
|
||
sum = _func[sum.type][e.type](sum, e, "+");
|
||
count++;
|
||
}
|
||
})
|
||
} else {
|
||
element = element.tocNumber();
|
||
if (cElementType.number === element.type) {
|
||
member.push(element);
|
||
sum = _func[sum.type][element.type](sum, element, "+");
|
||
count++;
|
||
}
|
||
}
|
||
}
|
||
var average = sum.getValue() / count, res = 0, av;
|
||
for (i = 0; i < member.length; i++) {
|
||
av = member[i] - average;
|
||
res += av * av;
|
||
}
|
||
|
||
if (1 === count) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
return new cNumber(Math.sqrt(res / (count - 1)));
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cSTDEV}
|
||
*/
|
||
function cSTDEV_S() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cSTDEV_S.prototype = Object.create(cSTDEV.prototype);
|
||
cSTDEV_S.prototype.constructor = cSTDEV_S;
|
||
cSTDEV_S.prototype.name = 'STDEV.S';
|
||
cSTDEV_S.prototype.isXLFN = true;
|
||
cSTDEV_S.prototype.argumentsType = [[argType.number]];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSTDEVA() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cSTDEVA.prototype = Object.create(cBaseFunction.prototype);
|
||
cSTDEVA.prototype.constructor = cSTDEVA;
|
||
cSTDEVA.prototype.name = 'STDEVA';
|
||
cSTDEVA.prototype.argumentsMin = 1;
|
||
cSTDEVA.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cSTDEVA.prototype.argumentsType = [[argType.number]];
|
||
cSTDEVA.prototype.Calculate = function (arg) {
|
||
var count = 0, sum = new cNumber(0), member = [], i;
|
||
for (i = 0; i < arg.length; i++) {
|
||
var _arg = arg[i];
|
||
if (_arg instanceof cRef || _arg instanceof cRef3D) {
|
||
var _argV = _arg.getValue().tocNumber();
|
||
if (_argV instanceof cNumber) {
|
||
member.push(_argV);
|
||
sum = _func[sum.type][_argV.type](sum, _argV, "+");
|
||
count++;
|
||
}
|
||
} else if (_arg instanceof cArea || _arg instanceof cArea3D) {
|
||
var _argAreaValue = _arg.getValue();
|
||
for (var j = 0; j < _argAreaValue.length; j++) {
|
||
var __arg = _argAreaValue[j].tocNumber();
|
||
if (__arg instanceof cNumber) {
|
||
member.push(__arg);
|
||
sum = _func[sum.type][__arg.type](sum, __arg, "+");
|
||
count++;
|
||
}
|
||
}
|
||
} else if (_arg instanceof cArray) {
|
||
_arg.foreach(function (elem) {
|
||
var e = elem.tocNumber();
|
||
if (e instanceof cNumber) {
|
||
member.push(e);
|
||
sum = _func[sum.type][e.type](sum, e, "+");
|
||
count++;
|
||
}
|
||
})
|
||
} else {
|
||
_arg = _arg.tocNumber();
|
||
if (_arg instanceof cNumber) {
|
||
member.push(_arg);
|
||
sum = _func[sum.type][_arg.type](sum, _arg, "+");
|
||
count++;
|
||
}
|
||
}
|
||
}
|
||
var average = sum.getValue() / count, res = 0, av;
|
||
for (i = 0; i < member.length; i++) {
|
||
av = member[i] - average;
|
||
res += av * av;
|
||
}
|
||
return new cNumber(Math.sqrt(res / (count - 1)));
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSTDEVP() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cSTDEVP.prototype = Object.create(cBaseFunction.prototype);
|
||
cSTDEVP.prototype.constructor = cSTDEVP;
|
||
cSTDEVP.prototype.name = 'STDEVP';
|
||
cSTDEVP.prototype.argumentsMin = 1;
|
||
cSTDEVP.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cSTDEVP.prototype.argumentsType = [[argType.number]];
|
||
cSTDEVP.prototype.Calculate = function (arg) {
|
||
function _var(x) {
|
||
var i, tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (cElementType.number === x[i].type) {
|
||
_x += x[i].getValue();
|
||
tA.push(x[i].getValue());
|
||
xLength++;
|
||
} else if (cElementType.error === x[i].type) {
|
||
return x[i];
|
||
}
|
||
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x)
|
||
}
|
||
|
||
return new cNumber(isNaN(_x) ? new cError(cErrorType.division_by_zero) : Math.sqrt(sumSQRDeltaX / xLength));
|
||
}
|
||
|
||
var element, arr0 = [];
|
||
var error;
|
||
for (var j = 0; j < arg.length; j++) {
|
||
element = arg[j];
|
||
if (cElementType.cellsRange === element.type || cElementType.cellsRange3D === element.type) {
|
||
var _arrVal = element.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal, this.excludeNestedStAg);
|
||
_arrVal.forEach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
} else if (cElementType.error === elem.type && !error) {
|
||
error = elem;
|
||
}
|
||
});
|
||
if (error) {
|
||
return error;
|
||
}
|
||
} else if (cElementType.cell === element.type || cElementType.cell3D === element.type) {
|
||
if (!this.checkExclude || !element.isHidden(this.excludeHiddenRows)) {
|
||
var a = element.getValue();
|
||
if (cElementType.number === a.type) {
|
||
arr0.push(a);
|
||
} else if (cElementType.error === a.type) {
|
||
return a;
|
||
}
|
||
}
|
||
} else if (cElementType.array === element.type) {
|
||
element.foreach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
} else if (cElementType.error === elem.type && !error) {
|
||
error = elem;
|
||
}
|
||
});
|
||
if (error) {
|
||
return error;
|
||
}
|
||
} else if (cElementType.number === element.type || cElementType.bool === element.type) {
|
||
arr0.push(element.tocNumber());
|
||
} else if (cElementType.string === element.type || cElementType.empty === element.type) {
|
||
arr0.push(new cNumber(0));
|
||
} else if (cElementType.error === element.type) {
|
||
return element;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return _var(arr0);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cSTDEVP}
|
||
*/
|
||
function cSTDEV_P() {
|
||
}
|
||
|
||
cSTDEV_P.prototype = Object.create(cSTDEVP.prototype);
|
||
cSTDEV_P.prototype.constructor = cSTDEV_P;
|
||
cSTDEV_P.prototype.name = 'STDEV.P';
|
||
cSTDEV_P.prototype.isXLFN = true;
|
||
cSTDEV_P.prototype.argumentsType = [[argType.number]];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSTDEVPA() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cSTDEVPA.prototype = Object.create(cBaseFunction.prototype);
|
||
cSTDEVPA.prototype.constructor = cSTDEVPA;
|
||
cSTDEVPA.prototype.name = 'STDEVPA';
|
||
cSTDEVPA.prototype.argumentsMin = 1;
|
||
cSTDEVPA.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cSTDEVPA.prototype.argumentsType = [[argType.number]];
|
||
cSTDEVPA.prototype.Calculate = function (arg) {
|
||
|
||
function _var(x) {
|
||
|
||
var tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
_x += x[i].getValue();
|
||
tA.push(x[i].getValue());
|
||
xLength++;
|
||
} else if (x[i] instanceof cError) {
|
||
return x[i];
|
||
}
|
||
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x)
|
||
|
||
}
|
||
|
||
return new cNumber(Math.sqrt(sumSQRDeltaX / xLength));
|
||
|
||
}
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber || elem instanceof cError) {
|
||
arr0.push(elem);
|
||
} else if (elem instanceof cBool) {
|
||
arr0.push(elem.tocNumber());
|
||
} else if (elem instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber || a instanceof cError) {
|
||
arr0.push(a);
|
||
} else if (a instanceof cBool) {
|
||
arr0.push(a.tocNumber());
|
||
} else if (a instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber || elem instanceof cError) {
|
||
arr0.push(elem);
|
||
} else if (elem instanceof cBool) {
|
||
arr0.push(elem.tocNumber());
|
||
} else if (elem instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return _var(arr0);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cSTEYX() {
|
||
}
|
||
|
||
cSTEYX.prototype = Object.create(cBaseFunction.prototype);
|
||
cSTEYX.prototype.constructor = cSTEYX;
|
||
cSTEYX.prototype.name = 'STEYX';
|
||
cSTEYX.prototype.argumentsMin = 2;
|
||
cSTEYX.prototype.argumentsMax = 2;
|
||
cSTEYX.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cSTEYX.prototype.argumentsType = [argType.array, argType.array];
|
||
cSTEYX.prototype.Calculate = function (arg) {
|
||
|
||
function steyx(y, x) {
|
||
|
||
var sumXDeltaYDelta = 0, sqrXDelta = 0, sqrYDelta = 0, _x = 0, _y = 0, xLength = 0, i;
|
||
|
||
if (x.length != y.length) {
|
||
return new cError(cErrorType.not_available);
|
||
}
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
_x += x[i].getValue();
|
||
_y += y[i].getValue();
|
||
xLength++;
|
||
}
|
||
|
||
_x /= xLength;
|
||
_y /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (!(x[i] instanceof cNumber && y[i] instanceof cNumber)) {
|
||
continue;
|
||
}
|
||
|
||
sumXDeltaYDelta += (x[i].getValue() - _x) * (y[i].getValue() - _y);
|
||
sqrXDelta += (x[i].getValue() - _x) * (x[i].getValue() - _x);
|
||
sqrYDelta += (y[i].getValue() - _y) * (y[i].getValue() - _y);
|
||
|
||
}
|
||
|
||
|
||
if (sqrXDelta == 0 || sqrYDelta == 0 || xLength < 3) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
return new cNumber(
|
||
Math.sqrt((1 / (xLength - 2)) * (sqrYDelta - sumXDeltaYDelta * sumXDeltaYDelta / sqrXDelta)));
|
||
}
|
||
}
|
||
|
||
|
||
var arg0 = arg[0], arg1 = arg[1], arr0 = [], arr1 = [];
|
||
|
||
if (arg0 instanceof cArea) {
|
||
arr0 = arg0.getValue();
|
||
} else if (arg0 instanceof cArray) {
|
||
arg0.foreach(function (elem) {
|
||
arr0.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
if (arg1 instanceof cArea) {
|
||
arr1 = arg1.getValue();
|
||
} else if (arg1 instanceof cArray) {
|
||
arg1.foreach(function (elem) {
|
||
arr1.push(elem);
|
||
});
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
return steyx(arr0, arr1);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cTDIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cTDIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cTDIST.prototype.constructor = cTDIST;
|
||
cTDIST.prototype.name = 'TDIST';
|
||
cTDIST.prototype.argumentsMin = 3;
|
||
cTDIST.prototype.argumentsMax = 3;
|
||
cTDIST.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cTDIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var T = argArray[0];
|
||
var fDF = argArray[1];
|
||
var nType = argArray[2];
|
||
|
||
var res = getTDist(T, fDF, nType);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
if (argClone[1].getValue() < 1 || argClone[0].getValue() < 0 ||
|
||
(argClone[2].getValue() !== 1 && argClone[2].getValue() !== 2)) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cT_DIST() {
|
||
}
|
||
|
||
cT_DIST.prototype = Object.create(cBaseFunction.prototype);
|
||
cT_DIST.prototype.constructor = cT_DIST;
|
||
cT_DIST.prototype.name = 'T.DIST';
|
||
cT_DIST.prototype.argumentsMin = 3;
|
||
cT_DIST.prototype.argumentsMax = 3;
|
||
cT_DIST.prototype.isXLFN = true;
|
||
cT_DIST.prototype.argumentsType = [argType.number, argType.number, argType.logical];
|
||
cT_DIST.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var T = argArray[0];
|
||
var fDF = argArray[1];
|
||
var bCumulative = argArray[2];
|
||
|
||
var res = getTDist(T, fDF, bCumulative ? 4 : 3);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
if (argClone[1].getValue() < 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cT_DIST_2T() {
|
||
}
|
||
|
||
cT_DIST_2T.prototype = Object.create(cBaseFunction.prototype);
|
||
cT_DIST_2T.prototype.constructor = cT_DIST_2T;
|
||
cT_DIST_2T.prototype.name = 'T.DIST.2T';
|
||
cT_DIST_2T.prototype.argumentsMin = 2;
|
||
cT_DIST_2T.prototype.argumentsMax = 2;
|
||
cT_DIST_2T.prototype.isXLFN = true;
|
||
cT_DIST_2T.prototype.argumentsType = [argType.number, argType.number];
|
||
cT_DIST_2T.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var T = argArray[0];
|
||
var fDF = argArray[1];
|
||
|
||
if (fDF < 1 || T < 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = getTDist(T, fDF, 2);
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cT_DIST_RT() {
|
||
}
|
||
|
||
cT_DIST_RT.prototype = Object.create(cBaseFunction.prototype);
|
||
cT_DIST_RT.prototype.constructor = cT_DIST_RT;
|
||
cT_DIST_RT.prototype.name = 'T.DIST.RT';
|
||
cT_DIST_RT.prototype.argumentsMin = 2;
|
||
cT_DIST_RT.prototype.argumentsMax = 2;
|
||
cT_DIST_RT.prototype.isXLFN = true;
|
||
cT_DIST_RT.prototype.argumentsType = [argType.number, argType.number];
|
||
cT_DIST_RT.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var T = argArray[0];
|
||
var fDF = argArray[1];
|
||
|
||
if (fDF < 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var res = getTDist(T, fDF, 1);
|
||
if (T < 0) {
|
||
res = 1 - res;
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cT_INV() {
|
||
}
|
||
|
||
cT_INV.prototype = Object.create(cBaseFunction.prototype);
|
||
cT_INV.prototype.constructor = cT_INV;
|
||
cT_INV.prototype.name = 'T.INV';
|
||
cT_INV.prototype.argumentsMin = 2;
|
||
cT_INV.prototype.argumentsMax = 2;
|
||
cT_INV.prototype.isXLFN = true;
|
||
cT_INV.prototype.argumentsType = [argType.number, argType.number];
|
||
cT_INV.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fDF = parseInt(argArray[1]);
|
||
|
||
if (fDF < 1.0 || fP <= 0.0 || fP > 1.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aFunc, oVal, bConvError, res = null;
|
||
if (fP === 1.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else if (fP < 0.5) {
|
||
aFunc = new TDISTFUNCTION(1 - fP, fDF, 4);
|
||
oVal = iterateInverse(aFunc, fDF * 0.5, fDF);
|
||
bConvError = oVal.bError;
|
||
res = -oVal.val;
|
||
} else {
|
||
aFunc = new TDISTFUNCTION(fP, fDF, 4);
|
||
oVal = iterateInverse(aFunc, fDF * 0.5, fDF);
|
||
bConvError = oVal.bError;
|
||
res = oVal.val;
|
||
}
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cT_INV_2T() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cT_INV_2T.prototype = Object.create(cBaseFunction.prototype);
|
||
cT_INV_2T.prototype.constructor = cT_INV_2T;
|
||
cT_INV_2T.prototype.name = 'T.INV.2T';
|
||
cT_INV_2T.prototype.argumentsMin = 2;
|
||
cT_INV_2T.prototype.argumentsMax = 2;
|
||
cT_INV_2T.prototype.isXLFN = true;
|
||
cT_INV_2T.prototype.argumentsType = [argType.number, argType.number];
|
||
cT_INV_2T.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTDist = function (argArray) {
|
||
var fP = argArray[0];
|
||
var fDF = parseInt(argArray[1]);
|
||
|
||
//ms игнорирует услвие fP > 1. сделал как в документации
|
||
if (fDF < 1.0 || fP <= 0 || fP > 1) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var aFunc = new TDISTFUNCTION(fP, fDF, 2);
|
||
var oVal = iterateInverse(aFunc, fDF * 0.5, fDF);
|
||
var bConvError = oVal.bError;
|
||
var res = oVal.val;
|
||
|
||
if (bConvError) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return null !== res && !isNaN(res) ? new cNumber(res) : new cError(cErrorType.wrong_value_type);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTDist);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cT_INV_2T}
|
||
*/
|
||
//***array-formula***
|
||
function cTINV() {
|
||
}
|
||
|
||
cTINV.prototype = Object.create(cT_INV_2T.prototype);
|
||
cTINV.prototype.constructor = cTINV;
|
||
cTINV.prototype.name = 'TINV';
|
||
cTINV.prototype.argumentsType = [argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cTREND() {
|
||
}
|
||
|
||
cTREND.prototype = Object.create(cBaseFunction.prototype);
|
||
cTREND.prototype.constructor = cTREND;
|
||
cTREND.prototype.name = 'TREND';
|
||
cTREND.prototype.argumentsMin = 1;
|
||
cTREND.prototype.argumentsMax = 4;
|
||
cTREND.prototype.arrayIndexes = {0: 1, 1: 1, 2: 1};
|
||
cTREND.prototype.argumentsType = [argType.reference, argType.reference, argType.reference, argType.logical];
|
||
cTREND.prototype.numFormat = AscCommonExcel.cNumFormatNone;
|
||
cTREND.prototype.Calculate = function (arg) {
|
||
let prepeareArgs = prepeareGrowthTrendCalculation(this, arg);
|
||
if (cElementType.error === prepeareArgs.type) {
|
||
return prepeareArgs;
|
||
}
|
||
let pMatY = prepeareArgs.pMatY,
|
||
pMatX = prepeareArgs.pMatX,
|
||
pMatNewX = prepeareArgs.pMatNewX,
|
||
bConstant = prepeareArgs.bConstant;
|
||
|
||
let mat = CalculateTrendGrowth(pMatY, pMatX, pMatNewX, bConstant);
|
||
|
||
if (mat && mat[0] && mat[0][0] !== undefined) {
|
||
let tMatrix = [], res = new cArray();
|
||
|
||
for (let i = 0; i < mat.length; i++) {
|
||
for (let j = 0; j < mat[i].length; j++) {
|
||
if (!tMatrix[j]) {
|
||
tMatrix[j] = [];
|
||
}
|
||
tMatrix[j][i] = new cNumber(mat[i][j]);
|
||
}
|
||
}
|
||
|
||
res.fillFromArray(tMatrix);
|
||
return res;
|
||
} else if (mat && mat.type && mat.type === cElementType.error) {
|
||
return mat;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cTRIMMEAN() {
|
||
}
|
||
|
||
cTRIMMEAN.prototype = Object.create(cBaseFunction.prototype);
|
||
cTRIMMEAN.prototype.constructor = cTRIMMEAN;
|
||
cTRIMMEAN.prototype.name = 'TRIMMEAN';
|
||
cTRIMMEAN.prototype.argumentsMin = 2;
|
||
cTRIMMEAN.prototype.argumentsMax = 2;
|
||
cTRIMMEAN.prototype.arrayIndexes = {0: 1};
|
||
cTRIMMEAN.prototype.argumentsType = [argType.number, argType.number];
|
||
cTRIMMEAN.prototype.Calculate = function (arg) {
|
||
|
||
var arg2 = [arg[0], arg[1]];
|
||
//если первое значение строка
|
||
if (cElementType.string === arg[0].type || cElementType.bool === arg[0].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
//если первое значение число
|
||
if (cElementType.number === arg[0].type) {
|
||
arg2[0] = new cArray();
|
||
arg2[0].addElement(arg[0]);
|
||
}
|
||
|
||
var oArguments = this._prepareArguments(arg2, arguments[1], true, [cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[1] = argClone[1].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTrimMean = function (argArray) {
|
||
var arg0 = argArray[0];
|
||
var arg1 = argArray[1];
|
||
|
||
if (arg1 < 0.0 || arg1 >= 1.0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var arr = [];
|
||
for (var i = 0; i < arg0.length; i++) {
|
||
for (var j = 0; j < arg0[i].length; j++) {
|
||
if (cElementType.number === arg0[i][j].type) {
|
||
arr.push(arg0[i][j].getValue());
|
||
}
|
||
}
|
||
}
|
||
|
||
var aSortArray = arr.sort(fSortAscending);
|
||
var nSize = aSortArray.length;
|
||
if (nSize == 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else {
|
||
|
||
var nIndex = Math.floor(arg1 * nSize);
|
||
if (nIndex % 2 !== 0) {
|
||
nIndex--;
|
||
}
|
||
nIndex /= 2;
|
||
|
||
var fSum = 0.0;
|
||
for (var i = nIndex; i < nSize - nIndex; i++) {
|
||
fSum += aSortArray[i];
|
||
}
|
||
|
||
return new cNumber(fSum / (nSize - 2 * nIndex));
|
||
}
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTrimMean);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cTTEST() {
|
||
}
|
||
|
||
cTTEST.prototype = Object.create(cBaseFunction.prototype);
|
||
cTTEST.prototype.constructor = cTTEST;
|
||
cTTEST.prototype.name = 'TTEST';
|
||
cTTEST.prototype.argumentsMin = 4;
|
||
cTTEST.prototype.argumentsMax = 4;
|
||
cTTEST.prototype.arrayIndexes = {0: 1, 1: 1};
|
||
cTTEST.prototype.argumentsType = [argType.array, argType.array, argType.number, argType.number];
|
||
cTTEST.prototype.Calculate = function (arg) {
|
||
|
||
var arg2 = [arg[0], arg[1], arg[2], arg[3]];
|
||
//если первое или второе значение строка
|
||
if (cElementType.string === arg[0].type || cElementType.bool === arg[0].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
if (cElementType.string === arg[1].type || cElementType.bool === arg[1].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
//если первое или второе значение число
|
||
if (cElementType.number === arg[0].type) {
|
||
arg2[0] = new cArray();
|
||
arg2[0].addElement(arg[0]);
|
||
}
|
||
if (cElementType.number === arg[1].type) {
|
||
arg2[1] = new cArray();
|
||
arg2[1].addElement(arg[1]);
|
||
}
|
||
|
||
var oArguments = this._prepareArguments(arg2, arguments[1], true, [cElementType.array, cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[2] = argClone[2].tocNumber();
|
||
argClone[3] = argClone[3].tocNumber();//bool
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcTTest = function (argArray) {
|
||
var arg0 = argArray[0];
|
||
var arg1 = argArray[1];
|
||
var arg2 = parseInt(argArray[2]);
|
||
var arg3 = parseInt(argArray[3]);
|
||
|
||
if (!(arg2 === 1 || arg2 === 2)) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
return tTest(arg0, arg1, arg2, arg3);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcTTest);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cTTEST}
|
||
*/
|
||
function cT_TEST() {
|
||
}
|
||
|
||
cT_TEST.prototype = Object.create(cTTEST.prototype);
|
||
cT_TEST.prototype.constructor = cT_TEST;
|
||
cT_TEST.prototype.name = 'T.TEST';
|
||
cT_TEST.prototype.isXLFN = true;
|
||
cT_TEST.prototype.argumentsType = [argType.array, argType.array, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cVAR() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cVAR.prototype = Object.create(cBaseFunction.prototype);
|
||
cVAR.prototype.constructor = cVAR;
|
||
cVAR.prototype.name = 'VAR';
|
||
cVAR.prototype.argumentsMin = 1;
|
||
cVAR.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cVAR.prototype.argumentsType = [[argType.number]];
|
||
cVAR.prototype.Calculate = function (arg) {
|
||
function _var(x) {
|
||
if (x.length <= 1) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
var i, tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (cElementType.number === x[i].type) {
|
||
_x += x[i].getValue();
|
||
tA.push(x[i].getValue());
|
||
xLength++;
|
||
} else if (cElementType.error === x[i].type) {
|
||
return x[i];
|
||
}
|
||
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x)
|
||
}
|
||
|
||
return new cNumber(sumSQRDeltaX / (xLength - 1))
|
||
|
||
}
|
||
|
||
var element, arr0 = [];
|
||
|
||
var error;
|
||
for (var j = 0; j < arg.length; j++) {
|
||
element = arg[j];
|
||
if (cElementType.cellsRange === element.type || cElementType.cellsRange3D === element.type) {
|
||
var _arrVal = element.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal, this.excludeNestedStAg);
|
||
_arrVal.forEach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
} else if (cElementType.error === elem.type && !error) {
|
||
error = elem;
|
||
}
|
||
});
|
||
if (error) {
|
||
return error;
|
||
}
|
||
} else if (cElementType.cell === element.type || cElementType.cell3D === element.type) {
|
||
if (!this.checkExclude || !element.isHidden(this.excludeHiddenRows)) {
|
||
var a = element.getValue();
|
||
if (cElementType.number === a.type) {
|
||
arr0.push(a);
|
||
} else if (cElementType.error === a.type) {
|
||
return a;
|
||
}
|
||
}
|
||
} else if (cElementType.array === element.type) {
|
||
element.foreach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
} else if (cElementType.error === elem.type && !error) {
|
||
error = elem;
|
||
}
|
||
});
|
||
if (error) {
|
||
return error;
|
||
}
|
||
} else if (cElementType.number === element.type || cElementType.bool === element.type) {
|
||
arr0.push(element.tocNumber());
|
||
} else if (cElementType.string === element.type || cElementType.empty === element.type) {
|
||
continue;
|
||
} else if (cElementType.error === element.type) {
|
||
return element;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return _var(arr0);
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cVARA() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cVARA.prototype = Object.create(cBaseFunction.prototype);
|
||
cVARA.prototype.constructor = cVARA;
|
||
cVARA.prototype.name = 'VARA';
|
||
cVARA.prototype.argumentsMin = 1;
|
||
cVARA.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cVARA.prototype.argumentsType = [[argType.number]];
|
||
cVARA.prototype.Calculate = function (arg) {
|
||
|
||
function _var(x) {
|
||
|
||
if (x.length < 1) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
var tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
_x += x[i].getValue();
|
||
tA.push(x[i].getValue());
|
||
xLength++;
|
||
} else if (x[i] instanceof cError) {
|
||
return x[i];
|
||
}
|
||
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x)
|
||
|
||
}
|
||
|
||
return new cNumber(sumSQRDeltaX / (xLength - 1))
|
||
|
||
}
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber || elem instanceof cError) {
|
||
arr0.push(elem);
|
||
} else if (elem instanceof cBool) {
|
||
arr0.push(elem.tocNumber());
|
||
} else if (elem instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber || a instanceof cError) {
|
||
arr0.push(a);
|
||
} else if (a instanceof cBool) {
|
||
arr0.push(a.tocNumber());
|
||
} else if (a instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber || elem instanceof cError) {
|
||
arr0.push(elem);
|
||
} else if (elem instanceof cBool) {
|
||
arr0.push(elem.tocNumber());
|
||
} else if (a instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
} else if (arg[j] instanceof cError) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return _var(arr0);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cVARP() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cVARP.prototype = Object.create(cBaseFunction.prototype);
|
||
cVARP.prototype.constructor = cVARP;
|
||
cVARP.prototype.name = 'VARP';
|
||
cVARP.prototype.argumentsMin = 1;
|
||
cVARP.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cVARP.prototype.argumentsType = [[argType.number]];
|
||
cVARP.prototype.Calculate = function (arg) {
|
||
function _var(x) {
|
||
if (x.length < 1) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
var tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (cElementType.number === x[i].type) {
|
||
_x += x[i].getValue();
|
||
tA.push(x[i].getValue());
|
||
xLength++;
|
||
} else if (cElementType.error === x[i].type) {
|
||
return x[i];
|
||
}
|
||
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x);
|
||
}
|
||
|
||
return new cNumber(sumSQRDeltaX / xLength);
|
||
|
||
}
|
||
|
||
var element, arr0 = [];
|
||
var error;
|
||
for (var j = 0; j < arg.length; j++) {
|
||
element = arg[j];
|
||
if (cElementType.cellsRange === element.type || cElementType.cellsRange3D === element.type) {
|
||
var _arrVal = element.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal, this.excludeNestedStAg);
|
||
_arrVal.forEach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
} else if (cElementType.error === elem.type && !error) {
|
||
error = elem;
|
||
}
|
||
});
|
||
if (error) {
|
||
return error;
|
||
}
|
||
} else if (cElementType.cell === element.type || cElementType.cell3D === element.type) {
|
||
if (!this.checkExclude || !element.isHidden(this.excludeHiddenRows)) {
|
||
var a = element.getValue();
|
||
if (cElementType.number === a.type) {
|
||
arr0.push(a);
|
||
} else if (cElementType.error === a.type) {
|
||
return a;
|
||
}
|
||
}
|
||
} else if (cElementType.array === element.type) {
|
||
element.foreach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
} else if (cElementType.error === elem.type && !error) {
|
||
error = elem;
|
||
}
|
||
});
|
||
if (error) {
|
||
return error;
|
||
}
|
||
} else if (cElementType.number === element.type || cElementType.bool === element.type) {
|
||
arr0.push(element.tocNumber());
|
||
} else if (cElementType.string === element.type || cElementType.empty === element.type) {
|
||
arr0.push(new cNumber(0));
|
||
} else if (cElementType.error === element.type) {
|
||
return element;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return _var(arr0);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cVARP}
|
||
*/
|
||
function cVAR_P() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cVAR_P.prototype = Object.create(cVARP.prototype);
|
||
cVAR_P.prototype.constructor = cVAR_P;
|
||
cVAR_P.prototype.name = 'VAR.P';
|
||
cVAR_P.prototype.isXLFN = true;
|
||
cVAR_P.prototype.argumentsType = [[argType.number]];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cVAR_S() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cVAR_S.prototype = Object.create(cBaseFunction.prototype);
|
||
cVAR_S.prototype.constructor = cVAR_S;
|
||
cVAR_S.prototype.name = 'VAR.S';
|
||
cVAR_S.prototype.argumentsMin = 1;
|
||
cVAR_S.prototype.isXLFN = true;
|
||
cVAR_S.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cVAR_S.prototype.argumentsType = [[argType.number]];
|
||
cVAR_S.prototype.Calculate = function (arg) {
|
||
function _var(x) {
|
||
if (x.length <= 1) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
var tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (cElementType.number === x[i].type) {
|
||
_x += x[i].getValue();
|
||
tA.push(x[i].getValue());
|
||
xLength++;
|
||
} else if (cElementType.error === x[i].type) {
|
||
return x[i];
|
||
}
|
||
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x);
|
||
}
|
||
|
||
return new cNumber(sumSQRDeltaX / (xLength - 1));
|
||
}
|
||
|
||
var element, arr0 = [];
|
||
var error;
|
||
for (var j = 0; j < arg.length; j++) {
|
||
element = arg[j];
|
||
if (cElementType.cellsRange === element.type || cElementType.cellsRange3D === element.type) {
|
||
var _arrVal = element.getValue(this.checkExclude, this.excludeHiddenRows, this.excludeErrorsVal, this.excludeNestedStAg);
|
||
_arrVal.forEach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
} else if (cElementType.error === elem.type && !error) {
|
||
error = elem;
|
||
}
|
||
});
|
||
if (error) {
|
||
return error;
|
||
}
|
||
} else if (cElementType.cell === element.type || cElementType.cell3D === element.type) {
|
||
if (!this.checkExclude || !element.isHidden(this.excludeHiddenRows)) {
|
||
var a = element.getValue();
|
||
if (cElementType.number === a.type) {
|
||
arr0.push(a);
|
||
} else if (cElementType.error === a.type) {
|
||
return a;
|
||
}
|
||
}
|
||
} else if (cElementType.array === element.type) {
|
||
element.foreach(function (elem) {
|
||
if (cElementType.number === elem.type) {
|
||
arr0.push(elem);
|
||
} else if (cElementType.error === elem.type && !error) {
|
||
error = elem;
|
||
}
|
||
});
|
||
if (error) {
|
||
return error;
|
||
}
|
||
} else if (cElementType.number === element.type || cElementType.bool === element.type) {
|
||
arr0.push(element.tocNumber());
|
||
} else if (cElementType.string === element.type || cElementType.empty === element.type) {
|
||
arr0.push(new cNumber(0));
|
||
} else if (cElementType.error === element.type) {
|
||
return element;
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
|
||
}
|
||
return _var(arr0);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cVARdotP() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cVARdotP.prototype = Object.create(cBaseFunction.prototype);
|
||
cVARdotP.prototype.constructor = cVARdotP;
|
||
cVARdotP.prototype.name = 'VAR.P';
|
||
cVARdotP.prototype.argumentsMin = 1;
|
||
cVARdotP.prototype.Calculate = cVARP.prototype.Calculate;
|
||
cVARdotP.prototype.argumentsType = [[argType.number]];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cVARPA() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cVARPA.prototype = Object.create(cBaseFunction.prototype);
|
||
cVARPA.prototype.constructor = cVARPA;
|
||
cVARPA.prototype.name = 'VARPA';
|
||
cVARPA.prototype.argumentsMin = 1;
|
||
cVARPA.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.array;
|
||
cVARPA.prototype.argumentsType = [[argType.number]];
|
||
cVARPA.prototype.Calculate = function (arg) {
|
||
|
||
function _var(x) {
|
||
|
||
if (x.length < 1) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
}
|
||
|
||
var tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0, i;
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
if (x[i] instanceof cNumber) {
|
||
_x += x[i].getValue();
|
||
tA.push(x[i].getValue());
|
||
xLength++;
|
||
} else if (x[i] instanceof cError) {
|
||
return x[i];
|
||
}
|
||
|
||
}
|
||
|
||
_x /= xLength;
|
||
|
||
for (i = 0; i < x.length; i++) {
|
||
|
||
sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x)
|
||
|
||
}
|
||
|
||
return new cNumber(sumSQRDeltaX / xLength);
|
||
|
||
}
|
||
|
||
var arr0 = [];
|
||
|
||
for (var j = 0; j < arg.length; j++) {
|
||
|
||
if (arg[j] instanceof cArea || arg[j] instanceof cArea3D) {
|
||
arg[j].foreach2(function (elem) {
|
||
if (elem instanceof cNumber || elem instanceof cError) {
|
||
arr0.push(elem);
|
||
} else if (elem instanceof cBool) {
|
||
arr0.push(elem.tocNumber());
|
||
} else if (elem instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cRef || arg[j] instanceof cRef3D) {
|
||
var a = arg[j].getValue();
|
||
if (a instanceof cNumber || a instanceof cError) {
|
||
arr0.push(a);
|
||
} else if (a instanceof cBool) {
|
||
arr0.push(a.tocNumber());
|
||
} else if (a instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
}
|
||
} else if (arg[j] instanceof cArray) {
|
||
arg[j].foreach(function (elem) {
|
||
if (elem instanceof cNumber || elem instanceof cError) {
|
||
arr0.push(elem);
|
||
} else if (elem instanceof cBool) {
|
||
arr0.push(elem.tocNumber());
|
||
} else if (elem instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
}
|
||
});
|
||
} else if (arg[j] instanceof cNumber || arg[j] instanceof cBool) {
|
||
arr0.push(arg[j].tocNumber());
|
||
} else if (arg[j] instanceof cString) {
|
||
arr0.push(new cNumber(0));
|
||
} else if (arg[j] instanceof cError) {
|
||
return arg[j];
|
||
}
|
||
|
||
}
|
||
return _var(arr0);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cWEIBULL() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cWEIBULL.prototype = Object.create(cBaseFunction.prototype);
|
||
cWEIBULL.prototype.constructor = cWEIBULL;
|
||
cWEIBULL.prototype.name = 'WEIBULL';
|
||
cWEIBULL.prototype.argumentsMin = 4;
|
||
cWEIBULL.prototype.argumentsMax = 4;
|
||
cWEIBULL.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
cWEIBULL.prototype.Calculate = function (arg) {
|
||
var oArguments = this._prepareArguments(arg, arguments[1], true);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[0] = argClone[0].tocNumber();
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2].tocNumber();
|
||
argClone[3] = argClone[3].tocNumber();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
var calcWeibull = function (argArray) {
|
||
var x = argArray[0];
|
||
var alpha = argArray[1];
|
||
var beta = argArray[2];
|
||
var kum = argArray[3];
|
||
|
||
var res;
|
||
if (alpha <= 0 || beta <= 0 || x < 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
} else if (kum === 0) {
|
||
res = alpha / Math.pow(beta, alpha) * Math.pow(x, alpha - 1.0) * Math.exp(-Math.pow(x / beta, alpha));
|
||
} else {
|
||
res = 1.0 - Math.exp(-Math.pow(x / beta, alpha));
|
||
}
|
||
|
||
return new cNumber(res);
|
||
};
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcWeibull);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cRANK}
|
||
*/
|
||
function cWEIBULL_DIST() {
|
||
}
|
||
|
||
//***array-formula***
|
||
cWEIBULL_DIST.prototype = Object.create(cWEIBULL.prototype);
|
||
cWEIBULL_DIST.prototype.constructor = cWEIBULL_DIST;
|
||
cWEIBULL_DIST.prototype.name = 'WEIBULL.DIST';
|
||
cWEIBULL_DIST.prototype.isXLFN = true;
|
||
cWEIBULL_DIST.prototype.argumentsType = [argType.number, argType.number, argType.number, argType.logical];
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {AscCommonExcel.cBaseFunction}
|
||
*/
|
||
function cZTEST() {
|
||
}
|
||
|
||
cZTEST.prototype = Object.create(cBaseFunction.prototype);
|
||
cZTEST.prototype.constructor = cZTEST;
|
||
cZTEST.prototype.name = 'ZTEST';
|
||
cZTEST.prototype.argumentsMin = 2;
|
||
cZTEST.prototype.argumentsMax = 3;
|
||
cZTEST.prototype.arrayIndexes = {0: 1};
|
||
cZTEST.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
cZTEST.prototype.Calculate = function (arg) {
|
||
|
||
var arg2 = arg[2] ? [arg[0], arg[1], arg[2]] : [arg[0], arg[1]];
|
||
//если первое или второе значение строка
|
||
if (cElementType.string === arg[0].type || cElementType.bool === arg[0].type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
//если первое или второе значение число
|
||
if (cElementType.number === arg[0].type) {
|
||
arg2[0] = new cArray();
|
||
arg2[0].addElement(arg[0]);
|
||
}
|
||
|
||
var oArguments = this._prepareArguments(arg2, arguments[1], true, [cElementType.array]);
|
||
var argClone = oArguments.args;
|
||
|
||
argClone[1] = argClone[1].tocNumber();
|
||
argClone[2] = argClone[2] ? argClone[2].tocNumber() : new AscCommonExcel.cUndefined();
|
||
|
||
var argError;
|
||
if (argError = this._checkErrorArg(argClone)) {
|
||
return argError;
|
||
}
|
||
|
||
function calcZTest(argArray) {
|
||
|
||
var arg0 = argArray[0];
|
||
var x = argArray[1];
|
||
var sigma = argArray[2];
|
||
|
||
if (sigma !== undefined && sigma <= 0) {
|
||
return new cError(cErrorType.not_numeric);
|
||
}
|
||
|
||
var nC1 = arg0.length;
|
||
var nR1 = arg0[0].length;
|
||
|
||
var fSum = 0.0;
|
||
var fSumSqr = 0.0;
|
||
var fVal;
|
||
var rValCount = 0.0;
|
||
for (var i = 0; i < nC1; i++) {
|
||
for (var j = 0; j < nR1; j++) {
|
||
if (cElementType.number !== arg0[i][j].type || cElementType.number !== arg0[i][j].type) {
|
||
continue;
|
||
}
|
||
|
||
fVal = arg0[i][j].getValue();
|
||
fSum += fVal;
|
||
fSumSqr += fVal * fVal;
|
||
rValCount++;
|
||
}
|
||
}
|
||
|
||
var res;
|
||
if (rValCount <= 1.0) {
|
||
return new cError(cErrorType.division_by_zero);
|
||
} else {
|
||
var mue = fSum / rValCount;
|
||
|
||
if (undefined === sigma) {
|
||
sigma = (fSumSqr - fSum * fSum / rValCount) / (rValCount - 1.0);
|
||
res = 0.5 - gauss((mue - x) / Math.sqrt(sigma / rValCount));
|
||
} else {
|
||
res = 0.5 - gauss((mue - x) * Math.sqrt(rValCount) / sigma);
|
||
}
|
||
}
|
||
|
||
return new cNumber(res);
|
||
}
|
||
|
||
return this._findArrayInNumberArguments(oArguments, calcZTest);
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
* @extends {cZTEST}
|
||
*/
|
||
function cZ_TEST() {
|
||
}
|
||
|
||
cZ_TEST.prototype = Object.create(cZTEST.prototype);
|
||
cZ_TEST.prototype.constructor = cZ_TEST;
|
||
cZ_TEST.prototype.name = 'Z.TEST';
|
||
cZ_TEST.prototype.isXLFN = true;
|
||
cZ_TEST.prototype.argumentsType = [argType.number, argType.number, argType.number];
|
||
|
||
/**
|
||
* @constructor
|
||
*/
|
||
function FormulaRangesCache() {
|
||
this.cacheRanges = {};
|
||
this.cacheId = {};
|
||
}
|
||
|
||
FormulaRangesCache.prototype.get = function (area) {
|
||
let range = area.getRange();
|
||
let wsId = range.getWorksheet().getId();
|
||
|
||
let sRangeName;
|
||
AscCommonExcel.executeInR1C1Mode(false, function () {
|
||
sRangeName = wsId + g_cCharDelimiter + range.getName();
|
||
});
|
||
|
||
let cacheElem = this.cacheId[sRangeName];
|
||
if (!cacheElem) {
|
||
cacheElem = area.getMatrixNoEmpty ? area.getMatrixNoEmpty() : area.getMatrix();
|
||
this.cacheId[sRangeName] = cacheElem;
|
||
let cacheRange = this.cacheRanges[wsId];
|
||
if (!cacheRange) {
|
||
cacheRange = new AscCommonExcel.RangeDataManager(null);
|
||
this.cacheRanges[wsId] = cacheRange;
|
||
}
|
||
cacheRange.add(range.getBBox0(), cacheElem);
|
||
}
|
||
|
||
return cacheElem;
|
||
};
|
||
FormulaRangesCache.prototype.clean = function () {
|
||
this.cacheRanges = {};
|
||
};
|
||
|
||
FormulaRangesCache.prototype.remove = function () {
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
*/
|
||
function CountIfCache() {
|
||
this.cacheId = {};
|
||
this.cacheRanges = {};
|
||
}
|
||
CountIfCache.prototype.constructor = CountIfCache;
|
||
/**
|
||
* Extracts and categorizes all values from a range into a universal array structure
|
||
* @private
|
||
* @param {cArea} range - The range object to extract values from
|
||
* @returns {Object.<cElementType, Array|number>} Object where keys are cElementType constants and values are arrays of cell values or count for empty cells
|
||
*/
|
||
CountIfCache.prototype._getUniversalArrayFromRange = function(range) {
|
||
const res = {};
|
||
const bbox = range.getBBox0();
|
||
let emptyCount = (bbox.c2 - bbox.c1 + 1) * (bbox.r2 - bbox.r1 + 1);
|
||
range.foreach2(function(cell) {
|
||
const type = cell.type;
|
||
if (type !== cElementType.empty) {
|
||
if (!res[type]) {
|
||
res[type] = [];
|
||
}
|
||
let value = cell;
|
||
if (type === cElementType.error) {
|
||
value = cell.errorType;
|
||
} else if (type === cElementType.string) {
|
||
value = value.value.toLowerCase();
|
||
} else {
|
||
value = value.value;
|
||
}
|
||
res[type].push(value);
|
||
}
|
||
});
|
||
for (let i in res) {
|
||
emptyCount -= res[i].length;
|
||
}
|
||
res[cElementType.empty] = emptyCount;
|
||
return res;
|
||
};
|
||
CountIfCache.prototype.calculate = function (arg, _arg1) {
|
||
let arg0 = arg[0], arg1 = arg[1];
|
||
|
||
if (cElementType.error === arg0.type) {
|
||
return arg0;
|
||
}
|
||
if (cElementType.cell !== arg0.type && cElementType.cell3D !== arg0.type &&
|
||
cElementType.cellsRange !== arg0.type && cElementType.cellsRange3D !== arg0.type) {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
const t = this;
|
||
function calculateOne(rangeOrCell, condition) {
|
||
if (cElementType.cell === rangeOrCell.type || cElementType.cell3D === rangeOrCell.type) {
|
||
const arr = {};
|
||
const value = arg0.getValue();
|
||
if (value.type === cElementType.empty) {
|
||
arr[value.type] = 1;
|
||
} else if (value.type === cElementType.error) {
|
||
arr[value.type] = [value.errorType];
|
||
} else {
|
||
arr[value.type] = [value.value];
|
||
}
|
||
return t._calculate(arr, condition);
|
||
}
|
||
else if (cElementType.cellsRange === rangeOrCell.type || cElementType.cellsRange3D === rangeOrCell.type) {
|
||
return t._get(rangeOrCell, condition);
|
||
} else {
|
||
return new cError(cErrorType.wrong_value_type);
|
||
}
|
||
}
|
||
|
||
if (cElementType.cellsRange === arg1.type || cElementType.cellsRange3D === arg1.type) {
|
||
const matrix = arg1.getMatrix();
|
||
const result = new cArray();
|
||
for (let row = 0; row < matrix.length; row += 1) {
|
||
result.addRow();
|
||
for (let col = 0; col < matrix[row].length; col += 1) {
|
||
const condition = matrix[row][col];
|
||
const calculateResult = calculateOne(arg0, condition);
|
||
result.addElementInRow(calculateResult, row);
|
||
}
|
||
}
|
||
return result;
|
||
} else if (cElementType.array === arg1.type) {
|
||
const dimensions = arg1.getDimensions();
|
||
const colCount = dimensions.col;
|
||
const rowCount = dimensions.row;
|
||
const result = new cArray();
|
||
for (let row = 0; row < rowCount; row += 1) {
|
||
result.addRow();
|
||
for (let col = 0; col < colCount; col += 1) {
|
||
const condition = arg1.getElementRowCol(row, col);
|
||
const calculateResult = calculateOne(arg0, condition);
|
||
result.addElementInRow(calculateResult, row);
|
||
}
|
||
}
|
||
return result;
|
||
} else if (cElementType.cell === arg1.type || cElementType.cell3D === arg1.type) {
|
||
arg1 = arg1.getValue();
|
||
}
|
||
return calculateOne(arg0, arg1);
|
||
};
|
||
CountIfCache.prototype._get = function (range, arg1) {
|
||
let res, wsId = range.getWS().getId(),
|
||
sRangeName = wsId + g_cCharDelimiter + range.getBBox0().getName(), cacheElem = this.cacheId[sRangeName],
|
||
valueForSearching = arg1.getValue();
|
||
|
||
if (!cacheElem) {
|
||
cacheElem = {elements: this._getUniversalArrayFromRange(range), results: {}};
|
||
this.cacheId[sRangeName] = cacheElem;
|
||
let cacheRange = this.cacheRanges[wsId];
|
||
if (!cacheRange) {
|
||
cacheRange = new AscCommonExcel.RangeDataManager(null);
|
||
this.cacheRanges[wsId] = cacheRange;
|
||
}
|
||
cacheRange.add(range.getBBox0(), cacheElem);
|
||
}
|
||
let sInputKey = valueForSearching;
|
||
res = cacheElem.results[sInputKey];
|
||
|
||
if (!res) {
|
||
cacheElem.results[sInputKey] = res = this._calculate(cacheElem.elements, arg1);
|
||
}
|
||
return res;
|
||
};
|
||
CountIfCache.prototype._calculate = function (arr, arg1) {
|
||
let _count = 0;
|
||
let matchingInfo = AscCommonExcel.matchingValue(arg1);
|
||
let type = matchingInfo.val.type;
|
||
let searchValue = matchingInfo.val;
|
||
if (type === cElementType.string) {
|
||
searchValue = searchValue.toString().toLowerCase();
|
||
} else {
|
||
searchValue = searchValue.value;
|
||
}
|
||
if (type === cElementType.string) {
|
||
const checkErr = new cError(matchingInfo.val.value.toUpperCase());
|
||
if (checkErr.errorType !== -1) {
|
||
type = cElementType.error;
|
||
searchValue = checkErr.errorType;
|
||
}
|
||
}
|
||
if (matchingInfo.op === "<>") {
|
||
for (let i in arr) {
|
||
if (i !== String(type)) {
|
||
_count += arr[i].length ? arr[i].length : arr[i];
|
||
}
|
||
}
|
||
}
|
||
const typedArr = arr[type];
|
||
if (searchValue === "" && matchingInfo.op !== "<>") {
|
||
if (arr[cElementType.empty]) {
|
||
return new cNumber(arr[cElementType.empty]);
|
||
}
|
||
return new cNumber(0);
|
||
}
|
||
const isWildcard = type === cElementType.string && (searchValue.indexOf('*') !== -1 || searchValue.indexOf('?') !== -1);
|
||
const matchingFunction = getMatchingFunction(type, matchingInfo.op, isWildcard);
|
||
if (typedArr) {
|
||
for (let i = 0; i < typedArr.length; i += 1) {
|
||
_count += matchingFunction(typedArr[i], searchValue);
|
||
}
|
||
}
|
||
return new cNumber(_count);
|
||
};
|
||
CountIfCache.prototype.remove = function (cell) {
|
||
var wsId = cell.ws.getId();
|
||
var cacheRange = this.cacheRanges[wsId];
|
||
if (cacheRange) {
|
||
var oGetRes = cacheRange.get(new Asc.Range(cell.nCol, cell.nRow, cell.nCol, cell.nRow));
|
||
for (var i = 0, length = oGetRes.all.length; i < length; ++i) {
|
||
var elem = oGetRes.all[i];
|
||
elem.data.results = {};
|
||
}
|
||
}
|
||
};
|
||
CountIfCache.prototype.clean = function () {
|
||
this.cacheId = {};
|
||
this.cacheRanges = {};
|
||
};
|
||
|
||
|
||
let g_oFormulaRangesCache = new FormulaRangesCache();
|
||
let g_oCountIfCache = new CountIfCache();
|
||
|
||
|
||
//----------------------------------------------------------export----------------------------------------------------
|
||
window['AscCommonExcel'] = window['AscCommonExcel'] || {};
|
||
window['AscCommonExcel'].phi = phi;
|
||
window['AscCommonExcel'].gauss = gauss;
|
||
window['AscCommonExcel'].gaussinv = gaussinv;
|
||
window['AscCommonExcel'].getPercentile = getPercentile;
|
||
window['AscCommonExcel'].getMedian = getMedian;
|
||
window['AscCommonExcel'].getPercentileExclusive = getPercentileExclusive;
|
||
|
||
window['AscCommonExcel'].cAVERAGE = cAVERAGE;
|
||
window['AscCommonExcel'].cCOUNT = cCOUNT;
|
||
window['AscCommonExcel'].cCOUNTA = cCOUNTA;
|
||
window['AscCommonExcel'].cMAX = cMAX;
|
||
window['AscCommonExcel'].cMIN = cMIN;
|
||
window['AscCommonExcel'].cSTDEV = cSTDEV;
|
||
window['AscCommonExcel'].cSTDEVP = cSTDEVP;
|
||
window['AscCommonExcel'].cVAR = cVAR;
|
||
window['AscCommonExcel'].cVARP = cVARP;
|
||
window['AscCommonExcel'].cLARGE = cLARGE;
|
||
window['AscCommonExcel'].cSMALL = cSMALL;
|
||
window['AscCommonExcel'].cMEDIAN = cMEDIAN;
|
||
window['AscCommonExcel'].cSTDEV_S = cSTDEV_S;
|
||
window['AscCommonExcel'].cSTDEV_P = cSTDEV_P;
|
||
window['AscCommonExcel'].cVAR_S = cVAR_S;
|
||
window['AscCommonExcel'].cVAR_P = cVAR_P;
|
||
window['AscCommonExcel'].cMODE_SNGL = cMODE_SNGL;
|
||
window['AscCommonExcel'].cPERCENTILE_INC = cPERCENTILE_INC;
|
||
window['AscCommonExcel'].cQUARTILE_INC = cQUARTILE_INC;
|
||
window['AscCommonExcel'].cPERCENTILE_EXC = cPERCENTILE_EXC;
|
||
window['AscCommonExcel'].cQUARTILE_EXC = cQUARTILE_EXC;
|
||
|
||
window['AscCommonExcel'].g_oFormulaRangesCache = g_oFormulaRangesCache;
|
||
window['AscCommonExcel'].g_oCountIfCache = g_oCountIfCache;
|
||
|
||
})(window);
|