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