1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.bordeaux.services; 18 19import android.bordeaux.learning.StochasticLinearRanker; 20import android.bordeaux.services.IBordeauxLearner.ModelChangeCallback; 21import android.os.IBinder; 22import android.util.Log; 23import java.util.List; 24import java.util.ArrayList; 25import java.io.*; 26import java.lang.ClassNotFoundException; 27import java.util.Arrays; 28import java.util.ArrayList; 29import java.util.List; 30import java.util.Scanner; 31import java.io.ByteArrayOutputStream; 32import java.util.HashMap; 33import java.util.Map; 34 35public class Learning_StochasticLinearRanker extends ILearning_StochasticLinearRanker.Stub 36 implements IBordeauxLearner { 37 38 private final String TAG = "ILearning_StochasticLinearRanker"; 39 private StochasticLinearRankerWithPrior mLearningSlRanker = null; 40 private ModelChangeCallback modelChangeCallback = null; 41 42 public Learning_StochasticLinearRanker(){ 43 } 44 45 public void ResetRanker(){ 46 if (mLearningSlRanker == null) 47 mLearningSlRanker = new StochasticLinearRankerWithPrior(); 48 mLearningSlRanker.resetRanker(); 49 } 50 51 public boolean UpdateClassifier(List<StringFloat> sample_1, List<StringFloat> sample_2){ 52 ArrayList<StringFloat> temp_1 = (ArrayList<StringFloat>)sample_1; 53 String[] keys_1 = new String[temp_1.size()]; 54 float[] values_1 = new float[temp_1.size()]; 55 for (int i = 0; i < temp_1.size(); i++){ 56 keys_1[i] = temp_1.get(i).key; 57 values_1[i] = temp_1.get(i).value; 58 } 59 ArrayList<StringFloat> temp_2 = (ArrayList<StringFloat>)sample_2; 60 String[] keys_2 = new String[temp_2.size()]; 61 float[] values_2 = new float[temp_2.size()]; 62 for (int i = 0; i < temp_2.size(); i++){ 63 keys_2[i] = temp_2.get(i).key; 64 values_2[i] = temp_2.get(i).value; 65 } 66 if (mLearningSlRanker == null) 67 mLearningSlRanker = new StochasticLinearRankerWithPrior(); 68 boolean res = mLearningSlRanker.updateClassifier(keys_1,values_1,keys_2,values_2); 69 if (res && modelChangeCallback != null) { 70 modelChangeCallback.modelChanged(this); 71 } 72 return res; 73 } 74 75 public float ScoreSample(List<StringFloat> sample) { 76 ArrayList<StringFloat> temp = (ArrayList<StringFloat>)sample; 77 String[] keys = new String[temp.size()]; 78 float[] values = new float[temp.size()]; 79 for (int i = 0; i < temp.size(); i++){ 80 keys[i] = temp.get(i).key; 81 values[i] = temp.get(i).value; 82 } 83 if (mLearningSlRanker == null) 84 mLearningSlRanker = new StochasticLinearRankerWithPrior(); 85 return mLearningSlRanker.scoreSample(keys,values); 86 } 87 88 public boolean SetModelPriorWeight(List<StringFloat> sample) { 89 ArrayList<StringFloat> temp = (ArrayList<StringFloat>)sample; 90 HashMap<String, Float> weights = new HashMap<String, Float>(); 91 for (int i = 0; i < temp.size(); i++) 92 weights.put(temp.get(i).key, temp.get(i).value); 93 if (mLearningSlRanker == null) 94 mLearningSlRanker = new StochasticLinearRankerWithPrior(); 95 return mLearningSlRanker.setModelPriorWeights(weights); 96 } 97 98 public boolean SetModelParameter(String key, String value) { 99 if (mLearningSlRanker == null) 100 mLearningSlRanker = new StochasticLinearRankerWithPrior(); 101 return mLearningSlRanker.setModelParameter(key,value); 102 } 103 104 // Beginning of the IBordeauxLearner Interface implementation 105 public byte [] getModel() { 106 if (mLearningSlRanker == null) 107 mLearningSlRanker = new StochasticLinearRankerWithPrior(); 108 StochasticLinearRankerWithPrior.Model model = mLearningSlRanker.getModel(); 109 try { 110 ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 111 ObjectOutputStream objStream = new ObjectOutputStream(byteStream); 112 objStream.writeObject(model); 113 //return byteStream.toByteArray(); 114 byte[] bytes = byteStream.toByteArray(); 115 return bytes; 116 } catch (IOException e) { 117 throw new RuntimeException("Can't get model"); 118 } 119 } 120 121 public boolean setModel(final byte [] modelData) { 122 try { 123 ByteArrayInputStream input = new ByteArrayInputStream(modelData); 124 ObjectInputStream objStream = new ObjectInputStream(input); 125 StochasticLinearRankerWithPrior.Model model = 126 (StochasticLinearRankerWithPrior.Model) objStream.readObject(); 127 if (mLearningSlRanker == null) 128 mLearningSlRanker = new StochasticLinearRankerWithPrior(); 129 boolean res = mLearningSlRanker.loadModel(model); 130 return res; 131 } catch (IOException e) { 132 throw new RuntimeException("Can't load model"); 133 } catch (ClassNotFoundException e) { 134 throw new RuntimeException("Learning class not found"); 135 } 136 } 137 138 public IBinder getBinder() { 139 return this; 140 } 141 142 public void setModelChangeCallback(ModelChangeCallback callback) { 143 modelChangeCallback = callback; 144 } 145 // End of IBordeauxLearner Interface implemenation 146} 147