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