BordeauxRanker.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.bordeaux.services.ILearning_StochasticLinearRanker; 206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport android.bordeaux.services.StringFloat; 216b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport android.content.Context; 226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport android.os.RemoteException; 236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport android.util.Log; 246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.ArrayList; 266b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.List; 276b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.HashMap; 286b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.Map; 296b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua/** Ranker for the Learning framework. 316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * For training: call updateClassifier with a pair of samples. 326b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * For ranking: call scoreSample to the score of the rank 336b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Data is represented as sparse key, value pair. And key is a String, value 346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * is a float. 356b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Note: since the actual ranker is running in a remote the service. 366b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Sometimes the connection may be lost or not established. 376b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * 386b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua */ 396b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huapublic class BordeauxRanker { 406b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua static final String TAG = "BordeauxRanker"; 416b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua static final String RANKER_NOTAVAILABLE = "Ranker not Available"; 426b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private Context mContext; 436b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private String mName; 446b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private ILearning_StochasticLinearRanker mRanker; 456b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private ArrayList<StringFloat> getArrayList(final HashMap<String, Float> sample) { 466b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua ArrayList<StringFloat> stringfloat_sample = new ArrayList<StringFloat>(); 476b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (Map.Entry<String, Float> x : sample.entrySet()) { 486b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua StringFloat v = new StringFloat(); 496b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua v.key = x.getKey(); 506b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua v.value = x.getValue(); 516b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua stringfloat_sample.add(v); 526b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 536b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return stringfloat_sample; 546b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 556b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 566b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private boolean retrieveRanker() { 576b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (mRanker == null) 586b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mRanker = BordeauxManagerService.getRanker(mContext, mName); 596b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua // if classifier is not available, return false 606b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (mRanker == null) { 616b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua Log.e(TAG,"Ranker not available."); 626b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return false; 636b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 646b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return true; 656b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 666b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 676b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public BordeauxRanker(Context context) { 686b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mContext = context; 696b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mName = "defaultRanker"; 706b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mRanker = BordeauxManagerService.getRanker(context, mName); 716b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 726b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 736b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public BordeauxRanker(Context context, String name) { 746b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mContext = context; 756b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mName = name; 766b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mRanker = BordeauxManagerService.getRanker(context, mName); 776b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 786b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 796b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua // Update the ranker with two samples, sample1 has higher rank than 806b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua // sample2. 816b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public boolean update(final HashMap<String, Float> sample1, 826b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua final HashMap<String, Float> sample2) { 836b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (!retrieveRanker()) 846b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return false; 856b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua try { 866b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mRanker.UpdateClassifier(getArrayList(sample1), getArrayList(sample2)); 876b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } catch (RemoteException e) { 886b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua Log.e(TAG,"Exception: updateClassifier."); 896b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return false; 906b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 916b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return true; 926b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 936b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 946b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public float scoreSample(final HashMap<String, Float> sample) { 956b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (!retrieveRanker()) 966b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua throw new RuntimeException(RANKER_NOTAVAILABLE); 976b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua try { 986b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return mRanker.ScoreSample(getArrayList(sample)); 996b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } catch (RemoteException e) { 1006b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua Log.e(TAG,"Exception: scoring the sample."); 1016b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua throw new RuntimeException(RANKER_NOTAVAILABLE); 1026b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1036b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1046b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 1056b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public void loadModel(String filename) { 1066b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (!retrieveRanker()) 1076b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua throw new RuntimeException(RANKER_NOTAVAILABLE); 1086b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua try { 1096b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mRanker.LoadModel(filename); 1106b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } catch (RemoteException e) { 1116b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua Log.e(TAG,"Exception: loading model."); 1126b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua throw new RuntimeException(RANKER_NOTAVAILABLE); 1136b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1146b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1156b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 1166b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public String saveModel(String filename) { 1176b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (!retrieveRanker()) 1186b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua throw new RuntimeException(RANKER_NOTAVAILABLE); 1196b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua try { 1206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return mRanker.SaveModel(filename); 1216b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } catch (RemoteException e) { 1226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua Log.e(TAG,"Exception: saving model."); 1236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua throw new RuntimeException(RANKER_NOTAVAILABLE); 1246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1266b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua} 127