Skip to main content

ganit_core/eval/functions/math/
mod.rs

1use super::super::{FunctionMeta, Registry};
2
3pub mod abs;
4pub mod average;
5pub mod special_fn;
6pub mod averageif;
7pub mod base;
8pub mod ceiling_floor;
9pub mod ceiling_floor_math;
10pub mod combin;
11pub mod combina;
12pub mod countif;
13pub mod countifs;
14pub mod countunique;
15pub mod criterion;
16pub mod decimal;
17pub mod exp;
18pub mod fact;
19pub mod factdouble;
20pub mod gcd;
21pub mod int_fn;
22pub mod iseven_isodd;
23pub mod subtotal;
24pub mod sequence;
25pub mod randarray;
26pub mod munit;
27pub mod array_fns;
28pub mod lcm;
29pub mod log;
30pub mod mod_fn;
31pub mod multinomial;
32pub mod power;
33pub mod product;
34pub mod quotient;
35pub mod rand;
36pub mod round;
37pub mod seriessum;
38pub mod sign;
39pub mod sqrt;
40pub mod sqrtpi;
41pub mod sum;
42pub mod sumif;
43pub mod sumifs;
44pub mod sumsq;
45pub mod trig;
46
47pub fn register_math(registry: &mut Registry) {
48    registry.register_eager("SUM",        sum::sum_fn,                  FunctionMeta { category: "math",        signature: "SUM(value1,...)",                       description: "Sum of arguments" });
49    registry.register_eager("AVERAGE",    average::average_fn,          FunctionMeta { category: "statistical", signature: "AVERAGE(value1,...)",                   description: "Arithmetic mean of arguments" });
50    registry.register_eager("PRODUCT",    product::product_fn,          FunctionMeta { category: "math",        signature: "PRODUCT(value1,...)",                   description: "Product of arguments" });
51    registry.register_eager("ROUND",      round::round_fn,              FunctionMeta { category: "math",        signature: "ROUND(number, digits)",                 description: "Round to specified decimal places" });
52    registry.register_eager("ROUNDUP",    round::roundup_fn,            FunctionMeta { category: "math",        signature: "ROUNDUP(number, digits)",               description: "Round away from zero" });
53    registry.register_eager("ROUNDDOWN",  round::rounddown_fn,          FunctionMeta { category: "math",        signature: "ROUNDDOWN(number, digits)",             description: "Round toward zero" });
54    registry.register_eager("INT",        int_fn::int_fn,               FunctionMeta { category: "math",        signature: "INT(number)",                           description: "Round down to nearest integer" });
55    registry.register_eager("ABS",        abs::abs_fn,                  FunctionMeta { category: "math",        signature: "ABS(number)",                           description: "Absolute value of a number" });
56    registry.register_eager("SIGN",       sign::sign_fn,                FunctionMeta { category: "math",        signature: "SIGN(number)",                          description: "Sign of a number: -1, 0, or 1" });
57    registry.register_eager("MOD",        mod_fn::mod_fn,               FunctionMeta { category: "math",        signature: "MOD(number, divisor)",                  description: "Remainder after division" });
58    registry.register_eager("POWER",      power::power_fn,              FunctionMeta { category: "math",        signature: "POWER(number, power)",                  description: "Number raised to a power" });
59    registry.register_eager("SQRT",       sqrt::sqrt_fn,                FunctionMeta { category: "math",        signature: "SQRT(number)",                          description: "Square root" });
60    registry.register_eager("LOG",        log::log_fn,                  FunctionMeta { category: "math",        signature: "LOG(number, base)",                     description: "Logarithm to specified base" });
61    registry.register_eager("LOG10",      log::log10_fn,                FunctionMeta { category: "math",        signature: "LOG10(number)",                         description: "Base-10 logarithm" });
62    registry.register_eager("LN",         log::ln_fn,                   FunctionMeta { category: "math",        signature: "LN(number)",                            description: "Natural logarithm" });
63    registry.register_eager("EXP",        exp::exp_fn,                  FunctionMeta { category: "math",        signature: "EXP(number)",                           description: "e raised to a power" });
64    registry.register_eager("CEILING",         ceiling_floor::ceiling_fn,                    FunctionMeta { category: "math", signature: "CEILING(number, significance)",                description: "Round up to nearest multiple of significance" });
65    registry.register_eager("FLOOR",           ceiling_floor::floor_fn,                      FunctionMeta { category: "math", signature: "FLOOR(number, significance)",                  description: "Round down to nearest multiple of significance" });
66    registry.register_eager("CEILING.MATH",    ceiling_floor_math::ceiling_math_fn,          FunctionMeta { category: "math", signature: "CEILING.MATH(number, [significance], [mode])", description: "Round up to nearest multiple; handles negative numbers via mode" });
67    registry.register_eager("CEILING.PRECISE", ceiling_floor_math::ceiling_precise_fn,       FunctionMeta { category: "math", signature: "CEILING.PRECISE(number, [significance])",      description: "Round up to nearest multiple; sign of significance ignored" });
68    registry.register_eager("FLOOR.MATH",      ceiling_floor_math::floor_math_fn,            FunctionMeta { category: "math", signature: "FLOOR.MATH(number, [significance], [mode])",   description: "Round down to nearest multiple; handles negative numbers via mode" });
69    registry.register_eager("FLOOR.PRECISE",   ceiling_floor_math::floor_precise_fn,         FunctionMeta { category: "math", signature: "FLOOR.PRECISE(number, [significance])",        description: "Round down to nearest multiple; sign of significance ignored" });
70    registry.register_eager("ISO.CEILING",     ceiling_floor_math::iso_ceiling_fn,           FunctionMeta { category: "math", signature: "ISO.CEILING(number, [significance])",          description: "ISO standard ceiling; identical to CEILING.PRECISE" });
71    registry.register_eager("RAND",       rand::rand_fn,                FunctionMeta { category: "math",        signature: "RAND()",                                description: "Random number between 0 and 1" });
72    registry.register_eager("RANDBETWEEN",rand::randbetween_fn,         FunctionMeta { category: "math",        signature: "RANDBETWEEN(low, high)",                description: "Random integer between two values" });
73    registry.register_eager("PI",         trig::pi_fn,                  FunctionMeta { category: "math",        signature: "PI()",                                  description: "The value of pi (3.14159...)" });
74    registry.register_eager("SIN",        trig::sin_fn,                 FunctionMeta { category: "math",        signature: "SIN(angle)",                            description: "Sine of an angle in radians" });
75    registry.register_eager("COS",        trig::cos_fn,                 FunctionMeta { category: "math",        signature: "COS(angle)",                            description: "Cosine of an angle in radians" });
76    registry.register_eager("TAN",        trig::tan_fn,                 FunctionMeta { category: "math",        signature: "TAN(angle)",                            description: "Tangent of an angle in radians" });
77    registry.register_eager("ACOS",       trig::acos_fn,                FunctionMeta { category: "math",        signature: "ACOS(number)",                          description: "Arccosine in radians" });
78    registry.register_eager("ASIN",       trig::asin_fn,                FunctionMeta { category: "math",        signature: "ASIN(number)",                          description: "Arcsine in radians" });
79    registry.register_eager("ATAN",       trig::atan_fn,                FunctionMeta { category: "math",        signature: "ATAN(number)",                          description: "Arctangent in radians" });
80    registry.register_eager("ATAN2",      trig::atan2_fn,               FunctionMeta { category: "math",        signature: "ATAN2(x, y)",                           description: "Arctangent of y/x in radians" });
81    registry.register_eager("DEGREES",    trig::degrees_fn,             FunctionMeta { category: "math",        signature: "DEGREES(angle)",                        description: "Convert radians to degrees" });
82    registry.register_eager("RADIANS",    trig::radians_fn,             FunctionMeta { category: "math",        signature: "RADIANS(angle)",                        description: "Convert degrees to radians" });
83    registry.register_eager("SINH",       trig::sinh_fn,                FunctionMeta { category: "math",        signature: "SINH(number)",                          description: "Hyperbolic sine" });
84    registry.register_eager("COSH",       trig::cosh_fn,                FunctionMeta { category: "math",        signature: "COSH(number)",                          description: "Hyperbolic cosine" });
85    registry.register_eager("TANH",       trig::tanh_fn,                FunctionMeta { category: "math",        signature: "TANH(number)",                          description: "Hyperbolic tangent" });
86    registry.register_eager("ACOSH",      trig::acosh_fn,               FunctionMeta { category: "math",        signature: "ACOSH(number)",                         description: "Inverse hyperbolic cosine" });
87    registry.register_eager("ASINH",      trig::asinh_fn,               FunctionMeta { category: "math",        signature: "ASINH(number)",                         description: "Inverse hyperbolic sine" });
88    registry.register_eager("ATANH",      trig::atanh_fn,               FunctionMeta { category: "math",        signature: "ATANH(number)",                         description: "Inverse hyperbolic tangent" });
89    registry.register_eager("COT",        trig::cot_fn,                 FunctionMeta { category: "math",        signature: "COT(angle)",                            description: "Cotangent of an angle in radians" });
90    registry.register_eager("COTH",       trig::coth_fn,                FunctionMeta { category: "math",        signature: "COTH(number)",                          description: "Hyperbolic cotangent" });
91    registry.register_eager("CSC",        trig::csc_fn,                 FunctionMeta { category: "math",        signature: "CSC(angle)",                            description: "Cosecant of an angle in radians" });
92    registry.register_eager("CSCH",       trig::csch_fn,                FunctionMeta { category: "math",        signature: "CSCH(number)",                          description: "Hyperbolic cosecant" });
93    registry.register_eager("SEC",        trig::sec_fn,                 FunctionMeta { category: "math",        signature: "SEC(angle)",                            description: "Secant of an angle in radians" });
94    registry.register_eager("SECH",       trig::sech_fn,                FunctionMeta { category: "math",        signature: "SECH(number)",                          description: "Hyperbolic secant" });
95    registry.register_eager("ACOT",       trig::acot_fn,                FunctionMeta { category: "math",        signature: "ACOT(number)",                          description: "Inverse cotangent in radians" });
96    registry.register_eager("ACOTH",      trig::acoth_fn,               FunctionMeta { category: "math",        signature: "ACOTH(number)",                         description: "Inverse hyperbolic cotangent" });
97    registry.register_eager("QUOTIENT",   quotient::quotient_fn,        FunctionMeta { category: "math",        signature: "QUOTIENT(numerator, denominator)",       description: "Integer portion of division" });
98    registry.register_eager("EVEN",       round::even_fn,               FunctionMeta { category: "math",        signature: "EVEN(number)",                          description: "Round up to nearest even integer" });
99    registry.register_eager("ODD",        round::odd_fn,                FunctionMeta { category: "math",        signature: "ODD(number)",                           description: "Round up to nearest odd integer" });
100    registry.register_eager("FACT",       fact::fact_fn,                FunctionMeta { category: "math",        signature: "FACT(number)",                          description: "Factorial of a number" });
101    registry.register_eager("BASE",       base::base_fn,                FunctionMeta { category: "math",        signature: "BASE(value, base, [min_length])",        description: "Convert number to string in given base" });
102    registry.register_eager("DECIMAL",    decimal::decimal_fn,          FunctionMeta { category: "math",        signature: "DECIMAL(text, base)",                   description: "Convert string in given base to decimal" });
103    registry.register_eager("MROUND",     round::mround_fn,             FunctionMeta { category: "math",        signature: "MROUND(number, multiple)",               description: "Round to nearest multiple" });
104    registry.register_eager("TRUNC",      round::trunc_fn,              FunctionMeta { category: "math",        signature: "TRUNC(number, digits)",                 description: "Truncate to integer or decimal places" });
105    registry.register_eager("COUNTIF",    countif::countif_fn,          FunctionMeta { category: "math",        signature: "COUNTIF(range, criterion)",              description: "Count cells matching criterion" });
106    registry.register_eager("COUNTIFS",   countifs::countifs_fn,        FunctionMeta { category: "math",        signature: "COUNTIFS(range1, criterion1, ...)",                     description: "Count rows where all criteria match" });
107    registry.register_eager("COUNTUNIQUE",countunique::countunique_fn,  FunctionMeta { category: "math",        signature: "COUNTUNIQUE(value1, ...)",                              description: "Count unique distinct values" });
108    registry.register_lazy("SUMIF",       sumif::sumif_fn,              FunctionMeta { category: "math",        signature: "SUMIF(range, criterion, [sum_range])",   description: "Sum cells where range matches criterion" });
109    registry.register_lazy("SUMIFS",      sumifs::sumifs_fn,            FunctionMeta { category: "math",        signature: "SUMIFS(sum_range, range1, criterion1, ...)",            description: "Sum cells where all criteria match" });
110    registry.register_eager("AVERAGEIF",  averageif::averageif_fn,      FunctionMeta { category: "statistical", signature: "AVERAGEIF(range, criterion, [avg_range])", description: "Average cells where range matches criterion" });
111    registry.register_eager("SQRTPI",     sqrtpi::sqrtpi_fn,            FunctionMeta { category: "math",        signature: "SQRTPI(n)",                                 description: "Square root of n times pi" });
112    registry.register_eager("SUMSQ",      sumsq::sumsq_fn,              FunctionMeta { category: "math",        signature: "SUMSQ(value1,...)",                          description: "Sum of squares of arguments" });
113    registry.register_eager("FACTDOUBLE", factdouble::factdouble_fn,    FunctionMeta { category: "math",        signature: "FACTDOUBLE(n)",                              description: "Double factorial of a number" });
114    registry.register_eager("SERIESSUM",  seriessum::seriessum_fn,      FunctionMeta { category: "math",        signature: "SERIESSUM(x, n, m, coefficients)",           description: "Sum of a power series" });
115
116    registry.register_eager("COMBIN",      combin::combin_fn,            FunctionMeta { category: "math",        signature: "COMBIN(n, k)",                               description: "Number of combinations without repetition" });
117    registry.register_eager("COMBINA",     combina::combina_fn,          FunctionMeta { category: "math",        signature: "COMBINA(n, k)",                              description: "Number of combinations with repetition" });
118    registry.register_eager("MULTINOMIAL", multinomial::multinomial_fn,  FunctionMeta { category: "math",        signature: "MULTINOMIAL(value1,...)",                    description: "Multinomial coefficient of given arguments" });
119    registry.register_eager("GCD",         gcd::gcd_fn,                  FunctionMeta { category: "math",        signature: "GCD(value1,...)",                            description: "Greatest common divisor" });
120    registry.register_eager("LCM",         lcm::lcm_fn,                  FunctionMeta { category: "math",        signature: "LCM(value1,...)",                            description: "Least common multiple" });
121    registry.register_eager("ISEVEN", iseven_isodd::iseven_fn, FunctionMeta { category: "math", signature: "ISEVEN(number)",                           description: "Returns TRUE if number is even" });
122    registry.register_eager("ISODD",  iseven_isodd::isodd_fn,  FunctionMeta { category: "math", signature: "ISODD(number)",                            description: "Returns TRUE if number is odd" });
123    registry.register_eager("MUNIT",     munit::munit_fn,       FunctionMeta { category: "math", signature: "MUNIT(dimension)",                           description: "Returns identity matrix of given dimension" });
124    registry.register_eager("SEQUENCE",  sequence::sequence_fn, FunctionMeta { category: "math", signature: "SEQUENCE(rows, [cols], [start], [step])",    description: "Generate a sequence of numbers" });
125    registry.register_eager("RANDARRAY", randarray::randarray_fn, FunctionMeta { category: "math", signature: "RANDARRAY([rows], [cols])",                description: "Array of random numbers" });
126    registry.register_eager("SUBTOTAL",  subtotal::subtotal_fn, FunctionMeta { category: "math", signature: "SUBTOTAL(function_code, ref1, ...)",         description: "Apply function to a list (not supported with arrays)" });
127
128    // Special functions
129    registry.register_eager("ERF",              special_fn::erf_fn,              FunctionMeta { category: "math", signature: "ERF(lower_limit, [upper_limit])", description: "Error function" });
130    registry.register_eager("ERF.PRECISE",      special_fn::erf_precise_fn,      FunctionMeta { category: "math", signature: "ERF.PRECISE(x)",                 description: "Error function (precise)" });
131    registry.register_eager("ERFC",             special_fn::erfc_fn,             FunctionMeta { category: "math", signature: "ERFC(x)",                        description: "Complementary error function" });
132    registry.register_eager("ERFC.PRECISE",     special_fn::erfc_precise_fn,     FunctionMeta { category: "math", signature: "ERFC.PRECISE(x)",               description: "Complementary error function (precise)" });
133    registry.register_eager("GAMMALN",          special_fn::gammaln_fn,          FunctionMeta { category: "math", signature: "GAMMALN(x)",                     description: "Natural logarithm of the gamma function" });
134    registry.register_eager("GAMMALN.PRECISE",  special_fn::gammaln_precise_fn,  FunctionMeta { category: "math", signature: "GAMMALN.PRECISE(x)",            description: "Natural logarithm of the gamma function (precise)" });
135}