You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by cp...@apache.org on 2018/11/05 19:32:55 UTC
lucene-solr:master: SOLR-12699: Make contrib/ltr LTRScoringModel
immutable and cache its hashCode. (Stanislav Livotov, Edward Ribeiro,
Christine Poerschke)
Repository: lucene-solr
Updated Branches:
refs/heads/master 01808eee9 -> be65b95e8
SOLR-12699: Make contrib/ltr LTRScoringModel immutable and cache its hashCode.
(Stanislav Livotov, Edward Ribeiro, Christine Poerschke)
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/be65b95e
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/be65b95e
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/be65b95e
Branch: refs/heads/master
Commit: be65b95e80fdddea109a9d850506d6c524911ecb
Parents: 01808ee
Author: Christine Poerschke <cp...@apache.org>
Authored: Mon Nov 5 18:56:40 2018 +0000
Committer: Christine Poerschke <cp...@apache.org>
Committed: Mon Nov 5 18:56:40 2018 +0000
----------------------------------------------------------------------
solr/CHANGES.txt | 3 ++
.../solr/ltr/model/DefaultWrapperModel.java | 5 +++
.../apache/solr/ltr/model/LTRScoringModel.java | 33 +++++++++++++-------
.../org/apache/solr/ltr/model/LinearModel.java | 5 +++
.../ltr/model/MultipleAdditiveTreesModel.java | 11 +++++++
.../solr/ltr/model/NeuralNetworkModel.java | 5 +++
.../apache/solr/ltr/model/TestAdapterModel.java | 10 ++++++
7 files changed, 61 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/be65b95e/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 198ccf6..8e25a4d 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -178,6 +178,9 @@ Improvements
* SOLR-12892: MapWriter to use CharSequence instead of String (noble)
+* SOLR-12699: Make contrib/ltr LTRScoringModel immutable and cache its hashCode.
+ (Stanislav Livotov, Edward Ribeiro, Christine Poerschke)
+
================== 7.5.0 ==================
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/be65b95e/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/DefaultWrapperModel.java
----------------------------------------------------------------------
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/DefaultWrapperModel.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/DefaultWrapperModel.java
index b21b6c3..bdb62d9 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/DefaultWrapperModel.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/DefaultWrapperModel.java
@@ -52,6 +52,11 @@ import org.noggit.ObjectBuilder;
*/
public class DefaultWrapperModel extends WrapperModel {
+ /**
+ * resource is part of the LTRScoringModel params map
+ * and therefore here it does not individually
+ * influence the class hashCode, equals, etc.
+ */
private String resource;
public DefaultWrapperModel(String name, List<Feature> features, List<Normalizer> norms, String featureStoreName,
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/be65b95e/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LTRScoringModel.java
----------------------------------------------------------------------
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LTRScoringModel.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LTRScoringModel.java
index 7eb3436..cf20d7e 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LTRScoringModel.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LTRScoringModel.java
@@ -16,11 +16,14 @@
*/
package org.apache.solr.ltr.model;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.Explanation;
@@ -81,6 +84,7 @@ public abstract class LTRScoringModel {
private final List<Feature> allFeatures;
private final Map<String,Object> params;
protected final List<Normalizer> norms;
+ private Integer hashCode; // cached since it shouldn't actually change after construction
public static LTRScoringModel getInstance(SolrResourceLoader solrResourceLoader,
String className, String name, List<Feature> features,
@@ -111,11 +115,11 @@ public abstract class LTRScoringModel {
String featureStoreName, List<Feature> allFeatures,
Map<String,Object> params) {
this.name = name;
- this.features = features;
+ this.features = features != null ? Collections.unmodifiableList(new ArrayList<>(features)) : null;
this.featureStoreName = featureStoreName;
- this.allFeatures = allFeatures;
- this.params = params;
- this.norms = norms;
+ this.allFeatures = allFeatures != null ? Collections.unmodifiableList(new ArrayList<>(allFeatures)) : null;
+ this.params = params != null ? Collections.unmodifiableMap(new LinkedHashMap<>(params)) : null;
+ this.norms = norms != null ? Collections.unmodifiableList(new ArrayList<>(norms)) : null;
}
/**
@@ -144,7 +148,7 @@ public abstract class LTRScoringModel {
* @return the norms
*/
public List<Normalizer> getNorms() {
- return Collections.unmodifiableList(norms);
+ return norms;
}
/**
@@ -158,7 +162,7 @@ public abstract class LTRScoringModel {
* @return the features
*/
public List<Feature> getFeatures() {
- return Collections.unmodifiableList(features);
+ return features;
}
public Map<String,Object> getParams() {
@@ -167,13 +171,20 @@ public abstract class LTRScoringModel {
@Override
public int hashCode() {
+ if(hashCode == null) {
+ hashCode = calculateHashCode();
+ }
+ return hashCode;
+ }
+
+ final private int calculateHashCode() {
final int prime = 31;
int result = 1;
- result = (prime * result) + ((features == null) ? 0 : features.hashCode());
- result = (prime * result) + ((name == null) ? 0 : name.hashCode());
- result = (prime * result) + ((params == null) ? 0 : params.hashCode());
- result = (prime * result) + ((norms == null) ? 0 : norms.hashCode());
- result = (prime * result) + ((featureStoreName == null) ? 0 : featureStoreName.hashCode());
+ result = (prime * result) + Objects.hashCode(features);
+ result = (prime * result) + Objects.hashCode(name);
+ result = (prime * result) + Objects.hashCode(params);
+ result = (prime * result) + Objects.hashCode(norms);
+ result = (prime * result) + Objects.hashCode(featureStoreName);
return result;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/be65b95e/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LinearModel.java
----------------------------------------------------------------------
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LinearModel.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LinearModel.java
index 94eacab..908b073 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LinearModel.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LinearModel.java
@@ -71,6 +71,11 @@ import org.apache.solr.ltr.norm.Normalizer;
*/
public class LinearModel extends LTRScoringModel {
+ /**
+ * featureToWeight is part of the LTRScoringModel params map
+ * and therefore here it does not individually
+ * influence the class hashCode, equals, etc.
+ */
protected Float[] featureToWeight;
public void setWeights(Object weights) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/be65b95e/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/MultipleAdditiveTreesModel.java
----------------------------------------------------------------------
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/MultipleAdditiveTreesModel.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/MultipleAdditiveTreesModel.java
index a626189..c3e434b 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/MultipleAdditiveTreesModel.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/MultipleAdditiveTreesModel.java
@@ -90,7 +90,18 @@ import org.apache.solr.util.SolrPluginUtils;
*/
public class MultipleAdditiveTreesModel extends LTRScoringModel {
+ /**
+ * fname2index is filled from constructor arguments
+ * (that are already part of the base class hashCode)
+ * and therefore here it does not individually
+ * influence the class hashCode, equals, etc.
+ */
private final HashMap<String,Integer> fname2index;
+ /**
+ * trees is part of the LTRScoringModel params map
+ * and therefore here it does not individually
+ * influence the class hashCode, equals, etc.
+ */
private List<RegressionTree> trees;
private RegressionTree createRegressionTree(Map<String,Object> map) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/be65b95e/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/NeuralNetworkModel.java
----------------------------------------------------------------------
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/NeuralNetworkModel.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/NeuralNetworkModel.java
index fa92374..8c43296 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/NeuralNetworkModel.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/NeuralNetworkModel.java
@@ -95,6 +95,11 @@ import org.apache.solr.util.SolrPluginUtils;
*/
public class NeuralNetworkModel extends LTRScoringModel {
+ /**
+ * layers is part of the LTRScoringModel params map
+ * and therefore here it does not individually
+ * influence the class hashCode, equals, etc.
+ */
private List<Layer> layers;
protected interface Activation {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/be65b95e/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestAdapterModel.java
----------------------------------------------------------------------
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestAdapterModel.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestAdapterModel.java
index d60d46e..0981401 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestAdapterModel.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestAdapterModel.java
@@ -93,7 +93,17 @@ public class TestAdapterModel extends TestRerankBase {
public static class CustomModel extends AdapterModel {
+ /**
+ * answerFileName is part of the LTRScoringModel params map
+ * and therefore here it does not individually
+ * influence the class hashCode, equals, etc.
+ */
private String answerFileName;
+ /**
+ * answerValue is obtained from answerFileName
+ * and therefore here it does not individually
+ * influence the class hashCode, equals, etc.
+ */
private float answerValue;
public CustomModel(String name, List<Feature> features, List<Normalizer> norms, String featureStoreName,