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.MulticlassPA;
201dd8ef56681617db46caec7776c9bf416f01d8ddWei Huaimport android.os.IBinder;
211dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua
226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.List;
236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.ArrayList;
246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
251dd8ef56681617db46caec7776c9bf416f01d8ddWei Huapublic class Learning_MulticlassPA extends ILearning_MulticlassPA.Stub
261dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua        implements IBordeauxLearner {
276b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    private MulticlassPA mMulticlassPA_learner;
281dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    private ModelChangeCallback modelChangeCallback = null;
296b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    class IntFloatArray {
316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        int[] indexArray;
326b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        float[] floatArray;
336b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    };
346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
356b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    private IntFloatArray splitIntFloatArray(List<IntFloat> sample) {
366b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        IntFloatArray splited = new IntFloatArray();
376b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        ArrayList<IntFloat> s = (ArrayList<IntFloat>)sample;
386b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        splited.indexArray = new int[s.size()];
396b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        splited.floatArray = new float[s.size()];
406b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        for (int i = 0; i < s.size(); i++) {
416b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua            splited.indexArray[i] = s.get(i).index;
426b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua            splited.floatArray[i] = s.get(i).value;
436b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        }
446b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        return splited;
456b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    }
466b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
476b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    public Learning_MulticlassPA() {
486b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        mMulticlassPA_learner = new MulticlassPA(2, 2, 0.001f);
496b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    }
506b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
511dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    // Beginning of the IBordeauxLearner Interface implementation
521dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    public byte [] getModel() {
531dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua        return null;
541dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    }
551dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua
561dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    public boolean setModel(final byte [] modelData) {
571dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua        return false;
581dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    }
591dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua
601dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    public IBinder getBinder() {
611dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua        return this;
621dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    }
631dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua
641dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    public void setModelChangeCallback(ModelChangeCallback callback) {
651dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua        modelChangeCallback = callback;
661dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    }
671dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua    // End of IBordeauxLearner Interface implemenation
681dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua
696b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    // This implementation, combines training and prediction in one step.
706b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    // The return value is the prediction value for the supplied sample. It
716b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    // also update the model with the current sample.
726b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    public void TrainOneSample(List<IntFloat> sample, int target) {
736b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        IntFloatArray splited = splitIntFloatArray(sample);
746b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        mMulticlassPA_learner.sparseTrainOneExample(splited.indexArray,
756b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                                                    splited.floatArray,
766b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                                                    target);
771dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua        if (modelChangeCallback != null) {
781dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua            modelChangeCallback.modelChanged(this);
791dd8ef56681617db46caec7776c9bf416f01d8ddWei Hua        }
806b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    }
816b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
826b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    public int Classify(List<IntFloat> sample) {
836b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        IntFloatArray splited = splitIntFloatArray(sample);
846b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        int prediction = mMulticlassPA_learner.sparseGetClass(splited.indexArray,
856b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                                                              splited.floatArray);
866b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        return prediction;
876b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    }
886b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
896b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
90