Learning_StochasticLinearRanker.java revision 6b4eebc73439cbc3ddfb547444a341d1f9be7996
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.content.Context; 206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport android.bordeaux.learning.StochasticLinearRanker; 216b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport android.util.Log; 226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.List; 236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.ArrayList; 246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.io.*; 256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.Scanner; 266b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 276b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huapublic class Learning_StochasticLinearRanker extends ILearning_StochasticLinearRanker.Stub { 286b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 296b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String TAG = "ILearning_StochasticLinearRanker"; 306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua Context mContext; 316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private StochasticLinearRanker mLearningSlRanker = null; 326b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 336b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public Learning_StochasticLinearRanker(Context context){ 346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mContext = context; 356b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 366b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 376b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public boolean UpdateClassifier(List<StringFloat> sample_1, List<StringFloat> sample_2){ 386b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<StringFloat> temp_1 = (ArrayList<StringFloat>)sample_1; 396b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys_1 = new String[temp_1.size()]; 406b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values_1 = new float[temp_1.size()]; 416b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i = 0; i < temp_1.size(); i++){ 426b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua keys_1[i] = temp_1.get(i).key; 436b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua values_1[i] = temp_1.get(i).value; 446b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 456b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<StringFloat> temp_2 = (ArrayList<StringFloat>)sample_2; 466b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys_2 = new String[temp_2.size()]; 476b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values_2 = new float[temp_2.size()]; 486b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i = 0; i < temp_2.size(); i++){ 496b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua keys_2[i] = temp_2.get(i).key; 506b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua values_2[i] = temp_2.get(i).value; 516b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 526b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (mLearningSlRanker == null) mLearningSlRanker = new StochasticLinearRanker(); 536b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua boolean res = mLearningSlRanker.updateClassifier(keys_1,values_1,keys_2,values_2); 546b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return res; 556b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 566b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 576b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public float ScoreSample(List<StringFloat> sample) { 586b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<StringFloat> temp = (ArrayList<StringFloat>)sample; 596b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys = new String[temp.size()]; 606b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values = new float[temp.size()]; 616b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i = 0; i < temp.size(); i++){ 626b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua keys[i] = temp.get(i).key; 636b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua values[i] = temp.get(i).value; 646b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 656b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (mLearningSlRanker == null) mLearningSlRanker = new StochasticLinearRanker(); 666b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float res=mLearningSlRanker .scoreSample(keys,values); 676b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua res = (float) (Math.exp(res)/(Math.exp(res)+Math.exp(-res))); 686b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return res; 696b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 706b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 716b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public void LoadModel(String FileName){ 726b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua try{ 736b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String str = ""; 746b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua StringBuffer buf = new StringBuffer(); 756b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua FileInputStream fis = mContext.openFileInput(FileName); 766b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); 776b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (fis!=null) { 786b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua while ((str = reader.readLine()) != null) { 796b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua buf.append(str + "\n" ); 806b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 816b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 826b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua fis.close(); 836b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String Temps = buf.toString(); 846b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] TempS_Array; 856b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua TempS_Array = Temps.split("<>"); 866b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String KeyValueString = TempS_Array[0]; 876b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String ParamString = TempS_Array[1]; 886b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] TempS1_Array; 896b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua TempS1_Array = KeyValueString.split("\\|"); 906b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua int len = TempS1_Array.length; 916b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys = new String[len]; 926b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values = new float[len]; 936b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i =0; i< len; i++ ){ 946b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] TempSd_Array; 956b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua TempSd_Array = TempS1_Array[i].split(","); 966b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua keys[i] = TempSd_Array[0]; 976b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua values[i] = Float.valueOf(TempSd_Array[1].trim()).floatValue(); 986b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 996b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] TempS2_Array; 1006b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua TempS2_Array = ParamString.split("\\|"); 1016b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua int lenParam = TempS2_Array.length - 1; 1026b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] parameters = new float[lenParam]; 1036b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i =0; i< lenParam; i++ ){ 1046b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua parameters[i] = Float.valueOf(TempS2_Array[i].trim()).floatValue(); 1056b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1066b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (mLearningSlRanker == null) mLearningSlRanker = new StochasticLinearRanker(); 1076b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua boolean res = mLearningSlRanker.loadModel(keys,values, parameters); 1086b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 1096b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } catch (IOException e){ 1106b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1116b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1126b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 1136b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public String SaveModel(String FileName){ 1146b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<String> keys_list = new ArrayList<String>(); 1156b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<Float> values_list = new ArrayList<Float>(); 1166b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<Float> parameters_list = new ArrayList<Float>(); 1176b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (mLearningSlRanker == null) mLearningSlRanker = new StochasticLinearRanker(); 1186b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mLearningSlRanker.getModel(keys_list,values_list, parameters_list); 1196b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String S_model = ""; 1206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i = 0; i < keys_list.size(); i++) 1216b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua S_model = S_model + keys_list.get(i) + "," + values_list.get(i) + "|"; 1226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String S_param =""; 1236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i=0; i< parameters_list.size(); i++) 1246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua S_param = S_param + parameters_list.get(i) + "|"; 1256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String Final_Str = S_model + "<> " + S_param; 1266b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua try{ 1276b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua FileOutputStream fos = mContext.openFileOutput(FileName, Context.MODE_PRIVATE); 1286b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua fos.write(Final_Str.getBytes()); 1296b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua fos.close(); 1306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } catch (IOException e){ 1316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1326b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return S_model; 1336b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua} 135