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