Learning_StochasticLinearRanker.java revision 1dd8ef56681617db46caec7776c9bf416f01d8dd
16b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua/* 26b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Copyright (C) 2012 The Android Open Source Project 36b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * 46b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Licensed under the Apache License, Version 2.0 (the "License"); 56b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * you may not use this file except in compliance with the License. 66b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * You may obtain a copy of the License at 76b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * 86b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * http://www.apache.org/licenses/LICENSE-2.0 96b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * 106b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Unless required by applicable law or agreed to in writing, software 116b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * distributed under the License is distributed on an "AS IS" BASIS, 126b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * See the License for the specific language governing permissions and 146b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * limitations under the License. 156b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua */ 166b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 176b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huapackage android.bordeaux.services; 186b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 196b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport android.bordeaux.learning.StochasticLinearRanker; 201dd8ef56681617db46caec7776c9bf416f01d8ddWei Huaimport android.bordeaux.learning.StochasticLinearRanker.Model; 211dd8ef56681617db46caec7776c9bf416f01d8ddWei Huaimport android.bordeaux.services.IBordeauxLearner.ModelChangeCallback; 221dd8ef56681617db46caec7776c9bf416f01d8ddWei Huaimport android.os.IBinder; 236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport android.util.Log; 241dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua 256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.io.*; 261dd8ef56681617db46caec7776c9bf416f01d8ddWei Huaimport java.lang.ClassNotFoundException; 271dd8ef56681617db46caec7776c9bf416f01d8ddWei Huaimport java.util.Arrays; 281dd8ef56681617db46caec7776c9bf416f01d8ddWei Huaimport java.util.ArrayList; 291dd8ef56681617db46caec7776c9bf416f01d8ddWei Huaimport java.util.List; 306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.Scanner; 316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 321dd8ef56681617db46caec7776c9bf416f01d8ddWei Huapublic class Learning_StochasticLinearRanker extends ILearning_StochasticLinearRanker.Stub 331dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua implements IBordeauxLearner { 346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 356b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String TAG = "ILearning_StochasticLinearRanker"; 366b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private StochasticLinearRanker mLearningSlRanker = null; 371dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua private ModelChangeCallback modelChangeCallback = null; 386b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 391dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua public Learning_StochasticLinearRanker(){ 406b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 416b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 426b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public boolean UpdateClassifier(List<StringFloat> sample_1, List<StringFloat> sample_2){ 436b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<StringFloat> temp_1 = (ArrayList<StringFloat>)sample_1; 446b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys_1 = new String[temp_1.size()]; 456b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values_1 = new float[temp_1.size()]; 466b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i = 0; i < temp_1.size(); i++){ 476b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua keys_1[i] = temp_1.get(i).key; 486b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua values_1[i] = temp_1.get(i).value; 496b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 506b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<StringFloat> temp_2 = (ArrayList<StringFloat>)sample_2; 516b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys_2 = new String[temp_2.size()]; 526b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values_2 = new float[temp_2.size()]; 536b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i = 0; i < temp_2.size(); i++){ 546b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua keys_2[i] = temp_2.get(i).key; 556b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua values_2[i] = temp_2.get(i).value; 566b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 576b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (mLearningSlRanker == null) mLearningSlRanker = new StochasticLinearRanker(); 586b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua boolean res = mLearningSlRanker.updateClassifier(keys_1,values_1,keys_2,values_2); 591dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua if (res && modelChangeCallback != null) { 601dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua modelChangeCallback.modelChanged(this); 611dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua } 626b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return res; 636b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 646b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 656b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public float ScoreSample(List<StringFloat> sample) { 666b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<StringFloat> temp = (ArrayList<StringFloat>)sample; 676b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys = new String[temp.size()]; 686b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values = new float[temp.size()]; 696b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i = 0; i < temp.size(); i++){ 706b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua keys[i] = temp.get(i).key; 716b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua values[i] = temp.get(i).value; 726b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 736b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (mLearningSlRanker == null) mLearningSlRanker = new StochasticLinearRanker(); 746b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float res=mLearningSlRanker .scoreSample(keys,values); 756b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua res = (float) (Math.exp(res)/(Math.exp(res)+Math.exp(-res))); 766b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return res; 776b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 786b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 791dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua // Beginning of the IBordeauxLearner Interface implementation 801dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua public byte [] getModel() { 811dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua if (mLearningSlRanker == null) mLearningSlRanker = new StochasticLinearRanker(); 821dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua Model model = mLearningSlRanker.getModel(); 831dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua try { 841dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 851dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua ObjectOutputStream objStream = new ObjectOutputStream(byteStream); 861dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua objStream.writeObject(model); 871dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua //return byteStream.toByteArray(); 881dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua byte[] bytes = byteStream.toByteArray(); 891dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua Log.i(TAG, "getModel: " + bytes); 901dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua return bytes; 911dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua } catch (IOException e) { 921dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua throw new RuntimeException("Can't get model"); 936b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 946b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 956b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 961dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua public boolean setModel(final byte [] modelData) { 971dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua try { 981dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua ByteArrayInputStream input = new ByteArrayInputStream(modelData); 991dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua ObjectInputStream objStream = new ObjectInputStream(input); 1001dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua Model model = (Model) objStream.readObject(); 1011dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua if (mLearningSlRanker == null) mLearningSlRanker = new StochasticLinearRanker(); 1021dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua boolean res = mLearningSlRanker.loadModel(model); 1031dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua Log.i(TAG, "LoadModel: " + modelData); 1041dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua return res; 1051dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua } catch (IOException e) { 1061dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua throw new RuntimeException("Can't load model"); 1071dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua } catch (ClassNotFoundException e) { 1081dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua throw new RuntimeException("Learning class not found"); 1096b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1106b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1111dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua 1121dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua public IBinder getBinder() { 1131dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua return this; 1141dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua } 1151dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua 1161dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua public void setModelChangeCallback(ModelChangeCallback callback) { 1171dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua modelChangeCallback = callback; 1181dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua } 1191dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua // End of IBordeauxLearner Interface implemenation 1206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua} 121