Free cookie consent management tool by TermsFeed Policy Generator

Changeset 8123


Ignore:
Timestamp:
06/26/12 14:17:10 (12 years ago)
Author:
gkronber
Message:

#1810 added a unit test to check the evaluation of newly added special functions and fixed a bugs in the interpreters.

Location:
trunk/sources
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeILEmittingInterpreter.cs

    r7708 r8123  
    837837    public static double Psi(double x) {
    838838      if (double.IsNaN(x)) return double.NaN;
    839       else if (x.IsAlmost(0.0)) return double.NaN;
    840       else if ((Math.Floor(x) - x).IsAlmost(0.0)) return double.NaN;
     839      else if (x <= 0 && (Math.Floor(x) - x).IsAlmost(0)) return double.NaN;
    841840      return alglib.psi(x);
    842841    }
     
    865864      double shi, chi;
    866865      alglib.hyperbolicsinecosineintegrals(x, out shi, out chi);
    867       return chi;
     866      return shi;
    868867    }
    869868
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeInterpreter.cs

    r7708 r8123  
    198198      { typeof(Norm), OpCodes.Norm},
    199199      { typeof(Erf), OpCodes.Erf},
    200       { typeof(Bessel), OpCodes.Bessel}     
     200      { typeof(Bessel), OpCodes.Bessel}
    201201    };
    202202
     
    370370            var x = Evaluate(dataset, ref row, state);
    371371            if (double.IsNaN(x)) return double.NaN;
    372             else if (x.IsAlmost(0.0)) return double.NaN;
    373             else if ((Math.Floor(x) - x).IsAlmost(0)) return double.NaN;
     372            else if (x <= 0 && (Math.Floor(x) - x).IsAlmost(0)) return double.NaN;
    374373            return alglib.psi(x);
    375374          }
  • trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicDataAnalysisExpressionTreeInterpreterTest.cs

    r7926 r8123  
    365365      Evaluate(interpreter, ds, "(lag -1.0 (* (lagVariable 1.0 a 1) (lagVariable 1.0 b 2)))", 1, ds.GetDoubleValue("A", 1) * ds.GetDoubleValue("B", 2));
    366366      Evaluate(interpreter, ds, "(lag -2.0 3.0)", 1, 3.0);
     367
     368      {
     369        // special functions
     370        Action<double> checkAiry = (x) => {
     371          double ai, aip, bi, bip;
     372          alglib.airy(x, out ai, out aip, out bi, out bip);
     373          Evaluate(interpreter, ds, "(airya " + x + ")", 0, ai);
     374          Evaluate(interpreter, ds, "(airyb " + x + ")", 0, bi);
     375        };
     376
     377        Action<double> checkBessel = (x) => {
     378          Evaluate(interpreter, ds, "(bessel " + x + ")", 0, alglib.besseli0(x));
     379        };
     380
     381        Action<double> checkSinCosIntegrals = (x) => {
     382          double si, ci;
     383          alglib.sinecosineintegrals(x, out si, out ci);
     384          Evaluate(interpreter, ds, "(cosint " + x + ")", 0, ci);
     385          Evaluate(interpreter, ds, "(sinint " + x + ")", 0, si);
     386        };
     387        Action<double> checkHypSinCosIntegrals = (x) => {
     388          double shi, chi;
     389          alglib.hyperbolicsinecosineintegrals(x, out shi, out chi);
     390          Evaluate(interpreter, ds, "(hypcosint " + x + ")", 0, chi);
     391          Evaluate(interpreter, ds, "(hypsinint " + x + ")", 0, shi);
     392        };
     393        Action<double> checkFresnelSinCosIntegrals = (x) => {
     394          double c = 0, s = 0;
     395          alglib.fresnelintegral(x, ref c, ref s);
     396          Evaluate(interpreter, ds, "(fresnelcosint " + x + ")", 0, c);
     397          Evaluate(interpreter, ds, "(fresnelsinint " + x + ")", 0, s);
     398        };
     399        Action<double> checkNormErf = (x) => {
     400          Evaluate(interpreter, ds, "(norm " + x + ")", 0, alglib.normaldistribution(x));
     401          Evaluate(interpreter, ds, "(erf " + x + ")", 0, alglib.errorfunction(x));
     402        };
     403
     404        Action<double> checkGamma = (x) => {
     405          Evaluate(interpreter, ds, "(gamma " + x + ")", 0, alglib.gammafunction(x));
     406        };
     407        Action<double> checkPsi = (x) => {
     408          try {
     409            Evaluate(interpreter, ds, "(psi " + x + ")", 0, alglib.psi(x));
     410          }
     411          catch (alglib.alglibexception) { // ignore cases where alglib throws an exception
     412          }
     413        };
     414        Action<double> checkDawson = (x) => {
     415          Evaluate(interpreter, ds, "(dawson " + x + ")", 0, alglib.dawsonintegral(x));
     416        };
     417        Action<double> checkExpInt = (x) => {
     418          Evaluate(interpreter, ds, "(expint " + x + ")", 0, alglib.exponentialintegralei(x));
     419        };
     420
     421
     422
     423        foreach (var e in new[] { -2.0, -1.0, 0.0, 1.0, 2.0 }) {
     424          checkAiry(e);
     425          checkBessel(e);
     426          checkSinCosIntegrals(e);
     427          checkGamma(e);
     428          checkExpInt(e);
     429          checkDawson(e);
     430          checkPsi(e);
     431          checkNormErf(e);
     432          checkFresnelSinCosIntegrals(e);
     433          checkHypSinCosIntegrals(e);
     434        }
     435      }
    367436    }
    368437
  • trunk/sources/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicExpressionImporter.cs

    r7915 r8123  
    4949        {"COS", new Cosine()},
    5050        {"TAN", new Tangent()},
     51        {"AIRYA", new AiryA()},
     52        {"AIRYB", new AiryB()},
     53        {"BESSEL", new Bessel()},
     54        {"COSINT", new CosineIntegral()},
     55        {"SININT", new SineIntegral()},
     56        {"HYPCOSINT", new HyperbolicCosineIntegral()},
     57        {"HYPSININT", new HyperbolicSineIntegral()},
     58        {"FRESNELSININT", new FresnelSineIntegral()},
     59        {"FRESNELCOSINT", new FresnelCosineIntegral()},
     60        {"NORM", new Norm()},
     61        {"ERF", new Erf()},
     62        {"GAMMA", new Gamma()},
     63        {"PSI", new Psi()},
     64        {"DAWSON", new Dawson()},
     65        {"EXPINT", new ExponentialIntegralEi()},
    5166        {"MEAN", new Average()},
    5267        {"IF", new IfThenElse()},
Note: See TracChangeset for help on using the changeset viewer.