blob: 0f484a5df76126035851b97a4d2fca790b1a7e3c [file] [log] [blame]
/*
* 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.ltr.interleaving.algorithms;
import java.util.ArrayList;
import java.util.Random;
import java.util.Set;
import org.apache.lucene.search.ScoreDoc;
import org.apache.solr.ltr.interleaving.InterleavingResult;
import org.junit.Before;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertTrue;
public class TeamDraftInterleavingTest {
private TeamDraftInterleaving toTest;
private ScoreDoc[] rerankedA,rerankedB;
private ScoreDoc a1,a2,a3,a4,a5;
private ScoreDoc b1,b2,b3,b4,b5;
@Before
public void setup() {
toTest = new TeamDraftInterleaving();
TeamDraftInterleaving.setRANDOM(new Random(10101010));//Random Boolean Choices Generation from Seed: [0,1,1]
}
protected void initDifferentOrderRerankLists() {
a1 = new ScoreDoc(1,10,1);
a2 = new ScoreDoc(5,7,1);
a3 = new ScoreDoc(4,6,1);
a4 = new ScoreDoc(2,5,1);
a5 = new ScoreDoc(3,4,1);
rerankedA = new ScoreDoc[]{a1,a2,a3,a4,a5};
b1 = new ScoreDoc(1,10,1);
b2 = new ScoreDoc(4,7,1);
b3 = new ScoreDoc(5,6,1);
b4 = new ScoreDoc(3,5,1);
b5 = new ScoreDoc(2,4,1);
rerankedB = new ScoreDoc[]{b1,b2,b3,b4,b5};
}
/**
* Random Boolean Choices Generation from Seed: [0,1,1]
*/
@Test
public void interleaving_twoDifferentLists_shouldInterleaveTeamDraft() {
initDifferentOrderRerankLists();
InterleavingResult interleaved = toTest.interleave(rerankedA, rerankedB);
ScoreDoc[] interleavedResults = interleaved.getInterleavedResults();
assertThat(interleavedResults.length,is(5));
assertThat(interleavedResults[0],is(a1));
assertThat(interleavedResults[1],is(b2));
assertThat(interleavedResults[2],is(b3));
assertThat(interleavedResults[3],is(a4));
assertThat(interleavedResults[4],is(b4));
}
/**
* Random Boolean Choices Generation from Seed: [0,1,1]
*/
@Test
public void interleaving_twoDifferentLists_shouldBuildCorrectInterleavingPicks() {
initDifferentOrderRerankLists();
InterleavingResult interleaved = toTest.interleave(rerankedA, rerankedB);
ArrayList<Set<Integer>> interleavingPicks = interleaved.getInterleavingPicks();
Set<Integer> modelAPicks = interleavingPicks.get(0);
Set<Integer> modelBPicks = interleavingPicks.get(1);
assertThat(modelAPicks.size(),is(2));
assertThat(modelBPicks.size(),is(3));
assertTrue(modelAPicks.contains(a1.doc));
assertTrue(modelAPicks.contains(a4.doc));
assertTrue(modelBPicks.contains(b2.doc));
assertTrue(modelBPicks.contains(b3.doc));
assertTrue(modelBPicks.contains(b4.doc));
}
protected void initIdenticalOrderRerankLists() {
a1 = new ScoreDoc(1,10,1);
a2 = new ScoreDoc(5,7,1);
a3 = new ScoreDoc(4,6,1);
a4 = new ScoreDoc(2,5,1);
a5 = new ScoreDoc(3,4,1);
rerankedA = new ScoreDoc[]{a1,a2,a3,a4,a5};
b1 = new ScoreDoc(1,10,1);
b2 = new ScoreDoc(5,7,1);
b3 = new ScoreDoc(4,6,1);
b4 = new ScoreDoc(2,5,1);
b5 = new ScoreDoc(3,4,1);
rerankedB = new ScoreDoc[]{b1,b2,b3,b4,b5};
}
/**
* Random Boolean Choices Generation from Seed: [0,1,1]
*/
@Test
public void interleaving_identicalRerankLists_shouldInterleaveTeamDraft() {
initIdenticalOrderRerankLists();
InterleavingResult interleaved = toTest.interleave(rerankedA, rerankedB);
ScoreDoc[] interleavedResults = interleaved.getInterleavedResults();
assertThat(interleavedResults.length,is(5));
assertThat(interleavedResults[0],is(a1));
assertThat(interleavedResults[1],is(b2));
assertThat(interleavedResults[2],is(b3));
assertThat(interleavedResults[3],is(a4));
assertThat(interleavedResults[4],is(b5));
}
/**
* Random Boolean Choices Generation from Seed: [0,1,1]
*/
@Test
public void interleaving_identicalRerankLists_shouldBuildCorrectInterleavingPicks() {
initIdenticalOrderRerankLists();
InterleavingResult interleaved = toTest.interleave(rerankedA, rerankedB);
ArrayList<Set<Integer>> interleavingPicks = interleaved.getInterleavingPicks();
Set<Integer> modelAPicks = interleavingPicks.get(0);
Set<Integer> modelBPicks = interleavingPicks.get(1);
assertThat(modelAPicks.size(),is(2));
assertThat(modelBPicks.size(),is(3));
assertTrue(modelAPicks.contains(a1.doc));
assertTrue(modelAPicks.contains(a4.doc));
assertTrue(modelBPicks.contains(b2.doc));
assertTrue(modelBPicks.contains(b3.doc));
assertTrue(modelBPicks.contains(b5.doc));
}
}