[ 
https://issues.apache.org/jira/browse/METRON-1038?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16100496#comment-16100496
 ] 

ASF GitHub Bot commented on METRON-1038:
----------------------------------------

Github user mattf-horton commented on a diff in the pull request:

    https://github.com/apache/metron/pull/650#discussion_r129384644
  
    --- Diff: 
metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/MathFunctionsTest.java
 ---
    @@ -38,10 +46,156 @@ public static Object run(String rule, Map<String, 
Object> variables) {
     
       @Test
       public void testAbs() {
    -    Assert.assertEquals((Double)run("ABS(value)", ImmutableMap.of("value", 
0)), 0, 1e-7);
    -    Assert.assertTrue(Double.isNaN((Double)run("ABS(value)", 
ImmutableMap.of("value", Double.NaN))));
    -    Assert.assertEquals((Double)run("ABS(value)", ImmutableMap.of("value", 
10.5)), 10.5, 1e-7);
    -    Assert.assertEquals((Double)run("ABS(value)", ImmutableMap.of("value", 
-10.5)), 10.5, 1e-7);
    +    assertValues("ABS",
    +           new HashMap<Double, Double>(baseExpectations) {{
    +             put(0d, 0d);
    +             put(10.5d, 10.5d);
    +             put(-10.5d, 10.5d);
    +           }}
    +    );
    +  }
    +
    +  @Test
    +  public void testSqrt() {
    +    assertValues("SQRT",
    +           new HashMap<Double, Double>(baseExpectations) {{
    +             put(0d, 0d);
    +             put(25d, 5d);
    +             put(-10.5d, Double.NaN);
    +           }}
    +    );
    +  }
    +
    +  @Test
    +  public void testCeil() {
    +    assertValues("CEIL",
    +           new HashMap<Double, Double>(baseExpectations) {{
    +             put(0d, 0d);
    +             put(10.5d, 11d);
    +             put(-10.5d, -10d);
    +           }}
    +    );
    +  }
    +
    +  @Test
    +  public void testFloor() {
    +    assertValues("FLOOR",
    +           new HashMap<Double, Double>(baseExpectations) {{
    +             put(0d, 0d);
    +             put(10.5d, 10d);
    +             put(-10.5d, -11d);
    +           }}
    +    );
    +  }
    +
    +  @Test
    +  public void testSin() {
    +    assertValues("SIN",
    +           new HashMap<Double, Double>(baseExpectations) {{
    +             put(0d, 0d);
    +             put(Math.PI/6, 0.5);
    +             put(Math.PI/4, Math.sqrt(2)/2.0);
    +             put(Math.PI/3, Math.sqrt(3)/2.0);
    +             put(Math.PI/2, 1d);
    +           }}
    +    );
    +  }
    +
    +  @Test
    +  public void testCos() {
    +    assertValues("COS",
    +           new HashMap<Double, Double>(baseExpectations) {{
    +             put(0d, 1d);
    +             put(Math.PI/6, Math.sqrt(3)/2.0);
    +             put(Math.PI/4, Math.sqrt(2)/2.0);
    +             put(Math.PI/3, 0.5d);
    +             put(Math.PI/2, 0d);
    +           }}
    +    );
    +  }
    +
    +  @Test
    +  public void testTan() {
    +    assertValues("TAN",
    +           new HashMap<Double, Double>(baseExpectations) {{
    +             put(0d, 0d);
    +             put(Math.PI/6, Math.sqrt(3)/3.0);
    +             put(Math.PI/4, 1d);
    +             put(Math.PI/3, Math.sqrt(3));
    +             put(Math.PI/2, Math.sin(Math.PI/2)/Math.cos(Math.PI/2));
    +           }}
    +    );
    +  }
    +
    +  @Test
    +  public void testExp() {
    +    assertValues("EXP",
    +           new HashMap<Double, Double>(baseExpectations) {{
    +             put(0d, 1d);
    +             put(0.5d, Math.sqrt(Math.E));
    +             put(-0.5d, 1/Math.sqrt(Math.E));
    +             put(1d, Math.E);
    +             put(2d, Math.E*Math.E);
    +           }}
    +    );
    +  }
    +
    +  @Test
    +  public void testRound() {
    +    assertValues("ROUND",
    +           new HashMap<Double, Double>(baseExpectations) {{
    +             put(0d, 0d);
    +             put(0.5d, 1d);
    +             put(0.4d, 0d);
    +             put(-0.5d, 0d);
    +           }}
    +    );
    +  }
    +
    +  @Test
    +  public void testNaturalLog() {
    +    testLog("LN", Math.E);
    +  }
    +
    +  @Test
    +  public void testLog2() {
    +    testLog("LOG2", 2);
    +  }
    +
    +  @Test
    +  public void testLog10() {
    +    testLog("LOG10", 10);
    +  }
    +
    +  public void assertValues(String func, Map<Double, Double> expected) {
    +    for(Map.Entry<Double, Double> test : expected.entrySet()) {
    +      for(String expr : ImmutableList.of(func + "(value)"
    +                                        ,func + "(" + test.getKey() + ")"
    +                                        )
    +         )
    +      {
    +        if (Double.isNaN(test.getValue())) {
    +          Assert.assertTrue(expr + " != NaN, where value == " + 
test.getKey(), Double.isNaN(toDouble(run(expr, ImmutableMap.of("value", 
test.getKey())))));
    +        } else {
    +          Assert.assertEquals(expr + " != " + test.getValue() + " (where 
value == " + test.getKey() + ")", test.getValue(), toDouble(run(expr, 
ImmutableMap.of("value", test.getKey()))), EPSILON);
    +        }
    +      }
    +    }
    +  }
    +
    +  public Double toDouble(Object n) {
    +    return ((Number)n).doubleValue();
    +  }
    +
    +  public void testLog(String logExpr, double base) {
    +    Map<Double, Double> expectedValues = new HashMap<Double, 
Double>(baseExpectations) {{
    +      put(base, 1d);
    +      put(0d, Double.NEGATIVE_INFINITY);
    +    }};
    +    for(int i = 1;i <= 10;++i) {
    +      expectedValues.put(Math.pow(base, i), (double)i);
    +    }
    +    assertValues(logExpr, expectedValues);
    --- End diff --
    
    These test look pretty good.


> Stellar should have a better collection of basic math operations
> ----------------------------------------------------------------
>
>                 Key: METRON-1038
>                 URL: https://issues.apache.org/jira/browse/METRON-1038
>             Project: Metron
>          Issue Type: Improvement
>            Reporter: Casey Stella
>
> At the moment the math functions are woefully incomplete.  
> We should add at least the ones difficult or impossible to reconstruct using 
> existing stellar primitives/math functions:
> * log10
> * log2
> * ln
> * sqrt
> * ceil
> * floor
> * sin
> * cos
> * tan



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to