Skip to content

Commit

Permalink
RankSys PreferenceData as DataModel for issue #83
Browse files Browse the repository at this point in the history
  • Loading branch information
abellogin committed Sep 6, 2016
1 parent 84a2579 commit 6866aaf
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 6 deletions.
20 changes: 14 additions & 6 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,16 @@
<repository.domain>github.com</repository.domain>
-->
<mahout.version>0.8</mahout.version>
<ranksys.version>0.4.3</ranksys.version>
</properties>

<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>

<issueManagement>
<system>GitHub</system>
<url>https://github.com/recommenders/rival/issues</url>
Expand Down Expand Up @@ -117,8 +125,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:unchecked</compilerArgument>
</configuration>
</plugin>
Expand Down Expand Up @@ -271,8 +279,8 @@
<configuration>
<rules>
<requireJavaVersion>
<version>[1.6.0,)</version>
<message>Java 6 required to build RiVal.</message>
<version>[1.8.0,)</version>
<message>Java 8 required to build RiVal.</message>
</requireJavaVersion>
<requireMavenVersion>
<version>[3.0.0,)</version>
Expand Down Expand Up @@ -362,8 +370,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
Expand Down
11 changes: 11 additions & 0 deletions rival-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,16 @@
<artifactId>mahout-core</artifactId>
<version>${mahout.version}</version>
</dependency>

<dependency>
<groupId>org.ranksys.RankSys</groupId>
<artifactId>RankSys-core</artifactId>
<version>${ranksys.version}</version>
</dependency>
<dependency>
<groupId>org.ranksys.RankSys</groupId>
<artifactId>RankSys-fast</artifactId>
<version>${ranksys.version}</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package net.recommenders.rival.core;

import net.recommenders.rival.core.ext.MahoutDataModel;
import net.recommenders.rival.core.ext.RankSysDataModel;

/**
*
Expand All @@ -38,4 +39,8 @@ public static <U, I> TemporalDataModelIF<U, I> getSimpleTemporalModel() {
public static TemporalDataModelIF<Long, Long> getMahoutTemporalModel() {
return new MahoutDataModel();
}

public static <U, I> DataModelIF<U, I> getRankSysModel() {
return new RankSysDataModel<>();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*
* Copyright 2016 recommenders.net.
*
* Licensed 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 net.recommenders.rival.core.ext;

import es.uam.eps.ir.ranksys.fast.index.FastItemIndex;
import es.uam.eps.ir.ranksys.fast.index.FastUserIndex;
import es.uam.eps.ir.ranksys.fast.index.SimpleFastItemIndex;
import es.uam.eps.ir.ranksys.fast.index.SimpleFastUserIndex;
import es.uam.eps.ir.ranksys.fast.preference.SimpleFastPreferenceData;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
import net.recommenders.rival.core.DataModelIF;
import org.jooq.lambda.tuple.Tuple;
import org.jooq.lambda.tuple.Tuple3;

/**
*
* @author <a href="http://github.com/abellogin">Alejandro</a>
*/
public class RankSysDataModel<U, I> implements DataModelIF<U, I> {

private SimpleFastPreferenceData<U, I> model;
private List<Tuple3<U, I, Double>> tuples;
private Set<U> users;
private Set<I> items;

public RankSysDataModel() {
clear();
}

private void generateDatamodel() {
FastUserIndex<U> uIndex = SimpleFastUserIndex.load(users.stream());
FastItemIndex<I> iIndex = SimpleFastItemIndex.load(items.stream());
model = SimpleFastPreferenceData.load(tuples.stream(), uIndex, iIndex);
}

@Override
public void addPreference(U u, I i, Double d) {
if (model != null) {
throw new IllegalArgumentException("DataModel already generated. It is not possible to add more information.");
}
users.add(u);
items.add(i);
tuples.add(Tuple.tuple(u, i, d));
}

@Override
public Double getUserItemPreference(U u, I i) {
if (model == null) {
generateDatamodel();
}
return model.getPreference(u, i).get().v2;
}

@Override
public Iterable<I> getUserItems(U u) {
if (model == null) {
generateDatamodel();
}
Stream<I> s = model.getUserPreferences(u).map(p -> p.v1());
return new Iterable<I>() {
@Override
public Iterator<I> iterator() {
return s.iterator();
}
};
}

@Override
public Iterable<I> getItems() {
if (model == null) {
generateDatamodel();
}
Stream<I> s = model.getItemsWithPreferences();
return new Iterable<I>() {
@Override
public Iterator<I> iterator() {
return s.iterator();
}
};
}

@Override
public Iterable<U> getUsers() {
if (model == null) {
generateDatamodel();
}
Stream<U> s = model.getUsersWithPreferences();
return new Iterable<U>() {
@Override
public Iterator<U> iterator() {
return s.iterator();
}
};
}

@Override
public int getNumItems() {
if (model == null) {
generateDatamodel();
}
return model.numItems();
}

@Override
public int getNumUsers() {
if (model == null) {
generateDatamodel();
}
return model.numUsers();
}

@Override
public void clear() {
model = null;
tuples = new ArrayList<>();
users = new HashSet<>();
items = new HashSet<>();
}
}

0 comments on commit 6866aaf

Please sign in to comment.