StochasticLinearRanker.java revision 6b4eebc73439cbc3ddfb547444a341d1f9be7996
16b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua/* 26b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Copyright (C) 2011 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 Hua 186b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huapackage android.bordeaux.learning; 196b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport android.util.Log; 206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.List; 216b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.Arrays; 226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huaimport java.util.ArrayList; 236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua/** 256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Stochastic Linear Ranker, learns how to rank a sample. The learned rank score 266b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * can be used to compare samples. 276b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * This java class wraps the native StochasticLinearRanker class. 286b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * To update the ranker, call updateClassifier with two samples, with the first 296b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * one having higher rank than the second one. 306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * To get the rank score of the sample call scoreSample. 316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * TODO: adding more interfaces for changing the learning parameters 326b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua */ 336b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huapublic class StochasticLinearRanker { 346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String TAG = "StochasticLinearRanker"; 356b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua static int VAR_NUM = 15; 366b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public StochasticLinearRanker() { 376b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mNativeClassifier = initNativeClassifier(); 386b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 396b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 406b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua /** 416b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Train the ranker with a pair of samples. A sample, a pair of arrays of 426b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * keys and values. The first sample should have higher rank than the second 436b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * one. 446b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua */ 456b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public boolean updateClassifier(String[] keys_positive, 466b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values_positive, 476b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys_negative, 486b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values_negative) { 496b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return nativeUpdateClassifier(keys_positive, values_positive, 506b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua keys_negative, values_negative, 516b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua mNativeClassifier); 526b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 536b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 546b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua /** 556b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Get the rank score of the sample, a sample is a list of key, value pairs.. 566b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua */ 576b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public float scoreSample(String[] keys, float[] values) { 586b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return nativeScoreSample(keys, values, mNativeClassifier); 596b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 606b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 616b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua /** 626b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * Get the current model and parameters of ranker 636b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua */ 646b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public void getModel(ArrayList keys_list, ArrayList values_list, ArrayList param_list){ 656b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua int len = nativeGetLengthClassifier(mNativeClassifier); 666b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys = new String[len]; 676b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values = new float[len]; 686b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] param = new float[VAR_NUM]; 696b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua nativeGetClassifier(keys, values, param, mNativeClassifier); 706b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua boolean add_flag; 716b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i=0; i< keys.length ; i++){ 726b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua add_flag = keys_list.add(keys[i]); 736b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua add_flag = values_list.add(values[i]); 746b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 756b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i=0; i< param.length ; i++) 766b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua add_flag = param_list.add(param[i]); 776b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 786b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 796b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua /** 806b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * use the given model and parameters for ranker 816b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua */ 826b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua public boolean loadModel(String [] keys, float[] values, float[] param){ 836b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return nativeLoadClassifier(keys, values, param, mNativeClassifier); 846b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 856b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 866b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua @Override 876b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua protected void finalize() throws Throwable { 886b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua deleteNativeClassifier(mNativeClassifier); 896b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 906b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 916b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua static { 926b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua System.loadLibrary("bordeaux"); 936b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 946b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 956b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private int mNativeClassifier; 966b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 976b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua /* 986b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua * The following methods are the java stubs for the jni implementations. 996b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua */ 1006b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private native int initNativeClassifier(); 1016b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 1026b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private native void deleteNativeClassifier(int classifierPtr); 1036b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 1046b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private native boolean nativeUpdateClassifier( 1056b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys_positive, 1066b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values_positive, 1076b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua String[] keys_negative, 1086b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values_negative, 1096b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua int classifierPtr); 1106b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 1116b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private native float nativeScoreSample(String[] keys, 1126b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] values, 1136b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua int classifierPtr); 1146b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private native void nativeGetClassifier(String [] keys, float[] values, float[] param, 1156b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua int classifierPtr); 1166b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private native boolean nativeLoadClassifier(String [] keys, float[] values, 1176b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua float[] param, int classifierPtr); 1186b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua private native int nativeGetLengthClassifier(int classifierPtr); 1196b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua} 120