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