aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/org
diff options
context:
space:
mode:
authorCamil Staps2015-05-19 16:41:11 +0200
committerCamil Staps2015-05-19 16:41:11 +0200
commit5d008662343266b1a15a68f968474a13fb948a05 (patch)
treeb15a916a0a367c4d25a8f947c9cadf15f70491bc /app/src/main/java/org
parentFilterSettingsActivity (diff)
parentNN JUnit tests + fix (diff)
Merge branch 'master' into app
Diffstat (limited to 'app/src/main/java/org')
-rwxr-xr-xapp/src/main/java/org/rssin/neurons/FeedSorter.java147
-rwxr-xr-xapp/src/main/java/org/rssin/neurons/Feedback.java9
-rwxr-xr-xapp/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java2
-rwxr-xr-xapp/src/main/java/org/rssin/neurons/MultiNeuralNetworkPrediction.java2
-rwxr-xr-xapp/src/main/java/org/rssin/neurons/NeuralNetwork.java6
-rwxr-xr-xapp/src/main/java/org/rssin/neurons/NeuralNetworkPrediction.java2
-rwxr-xr-xapp/src/main/java/org/rssin/neurons/PredictionInterface.java2
-rw-r--r--app/src/main/java/org/rssin/rss/Feed.java3
-rw-r--r--app/src/main/java/org/rssin/rss/FeedLoader.java21
9 files changed, 148 insertions, 46 deletions
diff --git a/app/src/main/java/org/rssin/neurons/FeedSorter.java b/app/src/main/java/org/rssin/neurons/FeedSorter.java
index 43e26c0..550d9e5 100755
--- a/app/src/main/java/org/rssin/neurons/FeedSorter.java
+++ b/app/src/main/java/org/rssin/neurons/FeedSorter.java
@@ -1,19 +1,31 @@
package org.rssin.neurons;
+import android.gesture.Prediction;
+
+import org.rssin.rss.FeedItem;
+
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
import java.util.Hashtable;
+import java.util.List;
import java.util.TimeZone;
/**
* Created by Jos on 14-5-2015.
*/
public class FeedSorter {
+ private final int SECONDS_IN_DAY = 24 * 60 * 60;
+
private MultiNeuralNetwork nn = new MultiNeuralNetwork(25, 50);
private int[] isNthMonthInput = new int[12];
private int[] isNthWeekDayInput = new int[7];
- private int isMorning, isAfternoon, isEvening, isNight;
+ private int isMorning, isAfternoon, isEvening, isNight, biasInput;
private Hashtable<String, Integer> categoryInputs = new Hashtable<String, Integer>();
private Hashtable<String, Integer> wordInputs = new Hashtable<String, Integer>();
private Hashtable<String, Integer> feedSourceInputs = new Hashtable<String, Integer>();
@@ -24,32 +36,45 @@ public class FeedSorter {
}
private void createNewNetwork() {
- for(int i = 0; i < 12; i++)
+ biasInput = nn.addInput();
+// for(int i = 0; i < 12; i++)
+// {
+// isNthMonthInput[i] = nn.addInput();
+// }
+//
+// for(int i = 0; i < 7; i++)
+// {
+// isNthWeekDayInput[i] = nn.addInput();
+// }
+//
+// isMorning = nn.addInput();
+// isAfternoon = nn.addInput();
+// isEvening = nn.addInput();
+// isNight = nn.addInput();
+ }
+
+ private PredictionInterface getPrediction(FeedItem item) {
+ //Add new inputs for categories.
+ for(String category : item.getCategory())
{
- isNthMonthInput[i] = nn.addInput();
+ category = category.toLowerCase();
+ if(!categoryInputs.containsKey(category))
+ {
+ categoryInputs.put(category, nn.addInput());
+ }
}
- for(int i = 0; i < 7; i++)
+ double[] inputs = new double[nn.getInputCount()];
+
+ inputs[biasInput] = 1;
+
+ //Initialize all inputs to -1 / false
+ for(int i = 0; i < inputs.length; i++)
{
- isNthWeekDayInput[i] = nn.addInput();
+ inputs[i] = -1;
}
- isMorning = nn.addInput();
- isAfternoon = nn.addInput();
- isEvening = nn.addInput();
- isNight = nn.addInput();
- }
-
-// private PredictionInterface getPrediction(FeedItem item) {
-// double[] inputs = new double[nn.getInputCount()];
-//
-// //Initialize all inputs to -1 / false
-// for(int i = 0; i < inputs.length; i++)
-// {
-// inputs[i] = -1;
-// }
-//
-// //Set month
+ //Set month
// Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
// for(int i = 0; i < isNthMonthInput.length; i++)
// {
@@ -58,8 +83,8 @@ public class FeedSorter {
// inputs[isNthMonthInput[i]] = 1;
// }
// }
-//
-// //Set weekday
+
+ //Set weekday
// for(int i = 0; i < isNthWeekDayInput.length; i++)
// {
// if(cal.get(Calendar.DAY_OF_WEEK) - cal.getMinimum(Calendar.DAY_OF_WEEK) == i)
@@ -67,8 +92,8 @@ public class FeedSorter {
// inputs[isNthMonthInput[i]] = 1;
// }
// }
-//
-// //Set day
+
+ //Set day
// int hourOfDay = cal.get(Calendar.HOUR_OF_DAY);
// if(hourOfDay > 6 && hourOfDay < 12)
// {
@@ -83,15 +108,65 @@ public class FeedSorter {
// {
// inputs[isNight] = 1;
// }
-//
-// //TODO: source, category, title, text, etc of FeedItems
-//
-// return nn.computeOutput(inputs);
-// }
-
-// public List<FeedItem> sortItems(List<FeedItem> items) {
-// // Sort list based on something like date + nn.computeOutput() * DAY.
-// throw new NotImplementedException();
-// return items;
-// }
+
+ for(String category : item.getCategory())
+ {
+ inputs[categoryInputs.get(category.toLowerCase())] = 1;
+ }
+
+ return nn.computeOutput(inputs);
+ }
+
+ /**
+ * Provides feedback to the neural network.
+ * @param item The feeditem.
+ * @param feedback The feedback. Like will move these types of items up in the list,
+ * dislike will move them down.
+ */
+ public void feedback(FeedItem item, Feedback feedback)
+ {
+ PredictionInterface prediction = getPrediction(item);
+ switch(feedback)
+ {
+ case Like:
+ prediction.learn(1);
+ break;
+ case Dislike:
+ prediction.learn(-1);
+ break;
+ default:
+ throw new IllegalArgumentException("feedback");
+ }
+ }
+
+ /**
+ * Returns a sorted list of all the items in the List, according to the neural network.
+ * @param items The list of items.
+ * @return A new, sorted, list of items. The parameter items is not modified.
+ */
+ public List<FeedItem> sortItems(List<FeedItem> items) {
+ // Sort list based on something like date + nn.computeOutput() * DAY.
+ List<FeedItem> newItems = new ArrayList<FeedItem>(items);
+ final Hashtable<FeedItem, PredictionInterface> predictions = new Hashtable<>();
+
+ for(FeedItem feed : newItems)
+ {
+ predictions.put(feed, getPrediction(feed));
+ }
+
+ Collections.sort(newItems, new Comparator<FeedItem>() {
+ @Override
+ public int compare(FeedItem lhs, FeedItem rhs) {
+ PredictionInterface lPrediction = predictions.get(lhs),
+ rPrediction = predictions.get(rhs);
+
+ long lhsSeconds = (long)(lhs.getPubDate().getTime() / 1000 + lPrediction.getOutput() * SECONDS_IN_DAY);
+ long rhsSeconds = (long)(rhs.getPubDate().getTime() / 1000 + rPrediction.getOutput() * SECONDS_IN_DAY);
+
+ return (int)Math.signum(rhsSeconds - lhsSeconds);
+ }
+ });
+
+ return newItems;
+ }
}
diff --git a/app/src/main/java/org/rssin/neurons/Feedback.java b/app/src/main/java/org/rssin/neurons/Feedback.java
new file mode 100755
index 0000000..af5f1b3
--- /dev/null
+++ b/app/src/main/java/org/rssin/neurons/Feedback.java
@@ -0,0 +1,9 @@
+package org.rssin.neurons;
+
+/**
+ * Created by Jos on 19-5-2015.
+ */
+public enum Feedback {
+ Like,
+ Dislike
+}
diff --git a/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java b/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java
index 492f67c..50fa707 100755
--- a/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java
+++ b/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java
@@ -3,7 +3,7 @@ package org.rssin.neurons;
/**
* Created by Jos on 14-5-2015.
*/
-public class MultiNeuralNetwork {
+class MultiNeuralNetwork {
private NeuralNetwork[] networks;
public MultiNeuralNetwork(int numNetworks, int numHiddenNodes) {
diff --git a/app/src/main/java/org/rssin/neurons/MultiNeuralNetworkPrediction.java b/app/src/main/java/org/rssin/neurons/MultiNeuralNetworkPrediction.java
index 06164d0..8df99e5 100755
--- a/app/src/main/java/org/rssin/neurons/MultiNeuralNetworkPrediction.java
+++ b/app/src/main/java/org/rssin/neurons/MultiNeuralNetworkPrediction.java
@@ -3,7 +3,7 @@ package org.rssin.neurons;
/**
* Created by Jos on 14-5-2015.
*/
-public class MultiNeuralNetworkPrediction implements PredictionInterface {
+class MultiNeuralNetworkPrediction implements PredictionInterface {
private PredictionInterface[] predictions;
MultiNeuralNetworkPrediction(PredictionInterface[] predictions)
{
diff --git a/app/src/main/java/org/rssin/neurons/NeuralNetwork.java b/app/src/main/java/org/rssin/neurons/NeuralNetwork.java
index 365991f..f5ee569 100755
--- a/app/src/main/java/org/rssin/neurons/NeuralNetwork.java
+++ b/app/src/main/java/org/rssin/neurons/NeuralNetwork.java
@@ -3,7 +3,7 @@ package org.rssin.neurons;
/**
* Created by Jos on 14-5-2015.
*/
-public class NeuralNetwork {
+class NeuralNetwork {
private Neuron[] hiddenNodes;
private Neuron outputNode;
@@ -25,7 +25,11 @@ public class NeuralNetwork {
public int addInput() {
int result = 0;
for (int i = 0; i < hiddenNodes.length; i++) {
+<<<<<<< HEAD
+ result = hiddenNodes[i].addWeight();
+=======
//result = hiddenNodes[i].AddWeight();
+>>>>>>> 7336ef600f6bd472b9aa1d59ad6418ff5c543044
}
return result;
diff --git a/app/src/main/java/org/rssin/neurons/NeuralNetworkPrediction.java b/app/src/main/java/org/rssin/neurons/NeuralNetworkPrediction.java
index cd34c8e..162ba21 100755
--- a/app/src/main/java/org/rssin/neurons/NeuralNetworkPrediction.java
+++ b/app/src/main/java/org/rssin/neurons/NeuralNetworkPrediction.java
@@ -3,7 +3,7 @@ package org.rssin.neurons;
/**
* Created by Jos on 14-5-2015.
*/
-public class NeuralNetworkPrediction implements PredictionInterface {
+class NeuralNetworkPrediction implements PredictionInterface {
private double[] inputs;
private double[] intermediateValues;
private double output;
diff --git a/app/src/main/java/org/rssin/neurons/PredictionInterface.java b/app/src/main/java/org/rssin/neurons/PredictionInterface.java
index d2c04b9..e130f4d 100755
--- a/app/src/main/java/org/rssin/neurons/PredictionInterface.java
+++ b/app/src/main/java/org/rssin/neurons/PredictionInterface.java
@@ -3,7 +3,7 @@ package org.rssin.neurons;
/**
* Created by Jos on 14-5-2015.
*/
-public interface PredictionInterface {
+interface PredictionInterface {
public double getOutput();
public void learn(double expectedOutput);
}
diff --git a/app/src/main/java/org/rssin/rss/Feed.java b/app/src/main/java/org/rssin/rss/Feed.java
index 20c0782..b48f036 100644
--- a/app/src/main/java/org/rssin/rss/Feed.java
+++ b/app/src/main/java/org/rssin/rss/Feed.java
@@ -41,6 +41,9 @@ public class Feed implements Serializable {
this.source = source;
}
+ public void addPost(FeedItem post) {
+ posts.add(post);
+ }
public List<FeedItem> getPosts() {
return posts;
diff --git a/app/src/main/java/org/rssin/rss/FeedLoader.java b/app/src/main/java/org/rssin/rss/FeedLoader.java
index f1ab72e..db0f1db 100644
--- a/app/src/main/java/org/rssin/rss/FeedLoader.java
+++ b/app/src/main/java/org/rssin/rss/FeedLoader.java
@@ -9,19 +9,20 @@ import java.util.LinkedList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
-import android.util.Log;
-
/**
* Created by Randy on 19-5-2015.
*/
public class FeedLoader {
+ private Feed feed;
+
private String urlString = null;
private XmlPullParserFactory xmlFactoryObject;
public volatile boolean parsingComplete = true;
- public FeedLoader(String url){
+ public FeedLoader(Feed feed, String url){
+ this.setFeed(feed);
this.urlString = url;
}
@@ -35,8 +36,11 @@ public class FeedLoader {
String name=myParser.getName();
switch (event) {
case XmlPullParser.START_TAG:
- post = new FeedItem(null, null, null, null, null,
- null, new LinkedList<String>(), null, null, null);
+ if(name.equals("item"))
+ {
+ post = new FeedItem(null, null, null, null, null,
+ null, new LinkedList<String>(), null, null, null);
+ }
break;
case XmlPullParser.TEXT:
text = myParser.getText();
@@ -74,6 +78,9 @@ public class FeedLoader {
else if(name.equals("source")) {
post.setSource(text);
}
+ else if(name.equals("item")) {
+ feed.addPost(post);
+ }
break;
}
event = myParser.next();
@@ -109,4 +116,8 @@ public class FeedLoader {
});
thread.start();
}
+
+ public void setFeed(Feed feed) {
+ this.feed = feed;
+ }
}