You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2017/12/07 12:45:10 UTC
[16/50] [abbrv] lucene-solr:jira/solr-11285-sim: SOLR-11485: Add
olsRegress, spline and derivative Stream Evaluators
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8750e5f2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/VectorFunction.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/VectorFunction.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/VectorFunction.java
new file mode 100644
index 0000000..1a21b1d
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/VectorFunction.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.client.solrj.io.eval;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+
+public class VectorFunction extends ArrayList {
+
+ protected static final long serialVersionUID = 1L;
+
+ private Object function;
+ private Map context = new HashMap();
+
+ public VectorFunction(Object function, double[] results) {
+ this.function = function;
+ for(double d : results) {
+ add(d);
+ }
+ }
+
+ public VectorFunction(Object function, List<Number> values) {
+ this.function = function;
+ addAll(values);
+ }
+
+ public Object getFunction() {
+ return this.function;
+ }
+
+ public void addToContext(Object key, Object value) {
+ this.context.put(key, value);
+ }
+
+ public Object getFromContext(Object key) {
+ return this.context.get(key);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8750e5f2/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
index c9fa396..4b368c1 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
@@ -6791,7 +6791,7 @@ public class StreamExpressionTest extends SolrCloudTestCase {
List<Map> listg = (List<Map>)tuples.get(0).get("g");
Map mapg = listg.get(0);
double pctg = (double) mapg.get("pct");
- assertEquals(pctg, .2, .02 );
+ assertEquals(pctg, .2, .02);
List<Map> listh = (List<Map>)tuples.get(0).get("h");
Map maph = listh.get(0);
@@ -7115,33 +7115,10 @@ public class StreamExpressionTest extends SolrCloudTestCase {
}
@Test
- public void testResiduals() throws Exception {
- String cexpr = "let(a=array(1,2,3,4,5,6), b=array(2,4,6,8,10,12), c=regress(a,b), tuple(res=residuals(c,a,a)))";
- ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
- paramsLoc.set("expr", cexpr);
- paramsLoc.set("qt", "/stream");
- String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
- TupleStream solrStream = new SolrStream(url, paramsLoc);
- StreamContext context = new StreamContext();
- solrStream.setStreamContext(context);
- List<Tuple> tuples = getTuples(solrStream);
- assertTrue(tuples.size() == 1);
- List<Number> out = (List<Number>)tuples.get(0).get("res");
- assertTrue(out.size() == 6);
- assertTrue(out.get(0).intValue() == -1);
- assertTrue(out.get(1).intValue() == -2);
- assertTrue(out.get(2).intValue() == -3);
- assertTrue(out.get(3).intValue() == -4);
- assertTrue(out.get(4).intValue() == -5);
- assertTrue(out.get(5).intValue() == -6);
- }
-
- @Test
public void testPolyfit() throws Exception {
String cexpr = "let(echo=true," +
" a=array(0,1,2,3,4,5,6,7)," +
- " fit=polyfit(a, 1)," +
- " deriv=polyfitDerivative(a, 1))";
+ " fit=polyfit(a, 1))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
@@ -7161,17 +7138,6 @@ public class StreamExpressionTest extends SolrCloudTestCase {
assertTrue(out.get(5).intValue() == 5);
assertTrue(out.get(6).intValue() == 6);
assertTrue(out.get(7).intValue() == 7);
-
- out = (List<Number>)tuples.get(0).get("deriv");
- assertTrue(out.size() == 8);
- assertTrue(out.get(0).intValue() == 1);
- assertTrue(out.get(1).intValue() == 1);
- assertTrue(out.get(2).intValue() == 1);
- assertTrue(out.get(3).intValue() == 1);
- assertTrue(out.get(4).intValue() == 1);
- assertTrue(out.get(5).intValue() == 1);
- assertTrue(out.get(6).intValue() == 1);
- assertTrue(out.get(7).intValue() == 1);
}
@@ -7179,7 +7145,8 @@ public class StreamExpressionTest extends SolrCloudTestCase {
public void testLoess() throws Exception {
String cexpr = "let(echo=true," +
" a=array(0,1,2,3,4,5,6,7)," +
- " fit=loess(a))";
+ " fit=loess(a), " +
+ " der=derivative(fit))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
@@ -7192,14 +7159,66 @@ public class StreamExpressionTest extends SolrCloudTestCase {
assertTrue(tuples.size() == 1);
List<Number> out = (List<Number>)tuples.get(0).get("fit");
assertTrue(out.size() == 8);
- assertTrue(out.get(0).intValue() == 0);
- assertTrue(out.get(1).intValue() == 1);
- assertTrue(out.get(2).intValue() == 2);
- assertTrue(out.get(3).intValue() == 3);
- assertTrue(out.get(4).intValue() == 4);
- assertTrue(out.get(5).intValue() == 5);
- assertTrue(out.get(6).intValue() == 6);
- assertTrue(out.get(7).intValue() == 7);
+ assertEquals(out.get(0).doubleValue(), 0.0, 0.0);
+ assertEquals(out.get(1).doubleValue(), 1.0, 0.0);
+ assertEquals(out.get(2).doubleValue(), 2.0, 0.0);
+ assertEquals(out.get(3).doubleValue(), 3.0, 0.0);
+ assertEquals(out.get(4).doubleValue(), 4.0, 0.0);
+ assertEquals(out.get(5).doubleValue(), 5.0, 0.0);
+ assertEquals(out.get(6).doubleValue(), 6.0, 0.0);
+ assertEquals(out.get(7).doubleValue(), 7.0, 0.0);
+
+ List<Number> out1 = (List<Number>)tuples.get(0).get("der");
+ assertTrue(out1.size() == 8);
+ assertEquals(out1.get(0).doubleValue(), 1.0, 0.0);
+ assertEquals(out1.get(1).doubleValue(), 1.0, 0.0);
+ assertEquals(out1.get(2).doubleValue(), 1.0, 0.0);
+ assertEquals(out1.get(3).doubleValue(), 1.0, 0.0);
+ assertEquals(out1.get(4).doubleValue(), 1.0, 0.0);
+ assertEquals(out1.get(5).doubleValue(), 1.0, 0.0);
+ assertEquals(out1.get(6).doubleValue(), 1.0, 0.0);
+ assertEquals(out1.get(7).doubleValue(), 1.0, 0.0);
+
+ }
+
+ @Test
+ public void testSpline() throws Exception {
+ String cexpr = "let(echo=true," +
+ " a=array(0,1,2,3,4,5,6,7), b=array(1,70,90,10,78, 100, 1, 9)," +
+ " fit=spline(a, b), " +
+ " der=derivative(fit))";
+
+ ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
+ paramsLoc.set("expr", cexpr);
+ paramsLoc.set("qt", "/stream");
+ String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
+ TupleStream solrStream = new SolrStream(url, paramsLoc);
+ StreamContext context = new StreamContext();
+ solrStream.setStreamContext(context);
+ List<Tuple> tuples = getTuples(solrStream);
+ assertTrue(tuples.size() == 1);
+ List<Number> out = (List<Number>)tuples.get(0).get("fit");
+ assertTrue(out.size() == 8);
+ assertEquals(out.get(0).doubleValue(), 1.0, 0.0001);
+ assertEquals(out.get(1).doubleValue(), 70.0, 0.0001);
+ assertEquals(out.get(2).doubleValue(), 90.0, 0.0001);
+ assertEquals(out.get(3).doubleValue(), 10.0, 0.0001);
+ assertEquals(out.get(4).doubleValue(), 78.0, 0.0001);
+ assertEquals(out.get(5).doubleValue(), 100.0, 0.0001);
+ assertEquals(out.get(6).doubleValue(), 1.0, 0.0001);
+ assertEquals(out.get(7).doubleValue(), 9.0, 0.0001);
+
+ List<Number> out1 = (List<Number>)tuples.get(0).get("der");
+
+ assertTrue(out1.size() == 8);
+ assertEquals(out1.get(0).doubleValue(), 72.06870491240123, 0.0001);
+ assertEquals(out1.get(1).doubleValue(), 62.86259017519753, 0.0001);
+ assertEquals(out1.get(2).doubleValue(),-56.519065613191344, 0.0001);
+ assertEquals(out1.get(3).doubleValue(), -16.786327722432148, 0.0001);
+ assertEquals(out1.get(4).doubleValue(), 87.66437650291996, 0.0001);
+ assertEquals(out1.get(5).doubleValue(), -63.87117828924769, 0.0001);
+ assertEquals(out1.get(6).doubleValue(), -63.17966334592923, 0.0001);
+ assertEquals(out1.get(7).doubleValue(), 43.58983167296462, 0.0001);
}
@@ -7241,6 +7260,50 @@ public class StreamExpressionTest extends SolrCloudTestCase {
assertEquals((double) out.get("f-ratio"), 0.24169D, .0001);
}
+ @Test
+ public void testOlsRegress() throws Exception {
+ String cexpr = "let(echo=true, a=array(8.5, 12.89999962, 5.199999809, 10.69999981, 3.099999905, 3.5, 9.199999809, 9, 15.10000038, 10.19999981), " +
+ "b=array(5.099999905, 5.800000191, 2.099999905, 8.399998665, 2.900000095, 1.200000048, 3.700000048, 7.599999905, 7.699999809, 4.5)," +
+ "c=array(4.699999809, 8.800000191, 15.10000038, 12.19999981, 10.60000038, 3.5, 9.699999809, 5.900000095, 20.79999924, 7.900000095)," +
+ "d=array(85.09999847, 106.3000031, 50.20000076, 130.6000061, 54.79999924, 30.29999924, 79.40000153, 91, 135.3999939, 89.30000305)," +
+ "e=transpose(matrix(a, b, c))," +
+ "f=olsRegress(e, d)," +
+ "g=predict(f, e))";
+ ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
+ paramsLoc.set("expr", cexpr);
+ paramsLoc.set("qt", "/stream");
+ String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
+ TupleStream solrStream = new SolrStream(url, paramsLoc);
+ StreamContext context = new StreamContext();
+ solrStream.setStreamContext(context);
+ List<Tuple> tuples = getTuples(solrStream);
+ assertTrue(tuples.size() == 1);
+ Map regression = (Map)tuples.get(0).get("f");
+
+ Number rsquared = (Number)regression.get("RSquared");
+
+ assertEquals(rsquared.doubleValue(), 0.9667887860584002, .000001);
+
+ List<Number> regressionParameters = (List<Number>)regression.get("regressionParameters");
+
+ assertEquals(regressionParameters.get(0).doubleValue(), 7.676028542255028, .0001);
+ assertEquals(regressionParameters.get(1).doubleValue(), 3.661604009261836, .0001);
+ assertEquals(regressionParameters.get(2).doubleValue(), 7.621051256504592, .0001);
+ assertEquals(regressionParameters.get(3).doubleValue(), 0.8284680662898674, .0001);
+
+ List<Number> predictions = (List<Number>)tuples.get(0).get("g");
+
+ assertEquals(predictions.get(0).doubleValue(), 81.56082305847914, .0001);
+ assertEquals(predictions.get(1).doubleValue(), 106.40333675525883, .0001);
+ assertEquals(predictions.get(2).doubleValue(), 55.23044372150484, .0001);
+ assertEquals(predictions.get(3).doubleValue(), 120.97932137751451, .0001);
+ assertEquals(predictions.get(4).doubleValue(), 49.90981180846799, .0001);
+ assertEquals(predictions.get(5).doubleValue(), 32.53654268030196, .0001);
+ assertEquals(predictions.get(6).doubleValue(), 77.59681482774931, .0001);
+ assertEquals(predictions.get(7).doubleValue(), 103.43841512086125, .0001);
+ assertEquals(predictions.get(8).doubleValue(), 138.88047884217636, .0001);
+ assertEquals(predictions.get(9).doubleValue(), 85.86401719768607, .0001);
+ }
@Test
public void testPlot() throws Exception {
@@ -7269,8 +7332,6 @@ public class StreamExpressionTest extends SolrCloudTestCase {
assertTrue(pair3.get(1).intValue() == 3);
}
-
-
@Test
public void testMovingAverage() throws Exception {
String cexpr = "movingAvg(array(1,2,3,4,5,6,7), 4)";
@@ -7893,7 +7954,7 @@ public class StreamExpressionTest extends SolrCloudTestCase {
Map regression = (Map)tuple.get("regress");
double slope = (double)regression.get("slope");
double intercept= (double) regression.get("intercept");
- double rSquare= (double) regression.get("RSquare");
+ double rSquare= (double) regression.get("RSquared");
assertTrue(slope == 2.0D);
assertTrue(intercept == 0.0D);
assertTrue(rSquare == 1.0D);