jni_stochastic_linear_ranker.cpp 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#include "jni/jni_stochastic_linear_ranker.h"
186b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua#include "native/common_defs.h"
196b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua#include "native/sparse_weight_vector.h"
206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua#include "native/stochastic_linear_ranker.h"
216b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua#include <vector>
236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua#include <string>
246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huausing std::string;
256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huausing std::vector;
266b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huausing std::hash_map;
276b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huausing learning_stochastic_linear::StochasticLinearRanker;
286b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huausing learning_stochastic_linear::SparseWeightVector;
296b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huavoid CreateSparseWeightVector(JNIEnv* env, const jobjectArray keys, const float* values,
316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int length, SparseWeightVector<string> * sample) {
326b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  for (int i = 0; i < length; ++i) {
336b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jboolean iscopy;
346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jstring s = (jstring) env->GetObjectArrayElement(keys, i);
356b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const char *key = env->GetStringUTFChars(s, &iscopy);
366b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    sample->SetElement(key, static_cast<double>(values[i]));
376b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    env->ReleaseStringUTFChars(s,key);
386b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  }
396b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
406b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
416b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huavoid DecomposeSparseWeightVector(JNIEnv* env, jobjectArray *keys, jfloatArray *values,
426b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int length, SparseWeightVector<string> *sample) {
436b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
446b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  SparseWeightVector<string>::Wmap w_ = sample->GetMap();
456b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int i=0;
466b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  for ( SparseWeightVector<string>::Witer_const iter = w_.begin();
476b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    iter != w_.end(); ++iter) {
486b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    std::string key = iter->first;
496b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jstring jstr = env->NewStringUTF(key.c_str());
506b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    env->SetObjectArrayElement(*keys, i, jstr);
516b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    double value = iter->second;
526b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jfloat s[1];
536b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    s[0] = value;
546b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    env->SetFloatArrayRegion(*values, i, 1, s);
556b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    i++;
566b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  }
576b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
586b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
596b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huajboolean Java_android_bordeaux_learning_StochasticLinearRanker_nativeLoadClassifier(
606b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    JNIEnv* env,
616b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jobject thiz,
626b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jobjectArray key_array_model,
636b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jfloatArray value_array_model,
646b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jfloatArray value_array_param,
656b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jint paPtr) {
666b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
676b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  StochasticLinearRanker<string>* classifier = (StochasticLinearRanker<string>*) paPtr;
686b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  if (classifier && key_array_model && value_array_model && value_array_param) {
696b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int keys_m_len = env->GetArrayLength(key_array_model);
706b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jfloat* values_m = env->GetFloatArrayElements(value_array_model, NULL);
716b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int values_m_len = env->GetArrayLength(value_array_model);
726b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jfloat* param_m = env->GetFloatArrayElements(value_array_param, NULL);
736b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
746b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    if (values_m && key_array_model && values_m_len == keys_m_len) {
756b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      SparseWeightVector<string> model;
766b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      CreateSparseWeightVector(env, key_array_model, values_m, values_m_len, &model);
776b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      model.SetNormalizer((double) param_m[0]);
786b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      classifier->LoadWeights(model);
796b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      classifier->SetIterationNumber((uint64) param_m[1]);
806b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      classifier->SetNormConstraint((double) param_m[2]);
816b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
826b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      switch ((int) param_m[3]){
836b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 0 :
846b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetRegularizationType(learning_stochastic_linear::L0);
856b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
866b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 1 :
876b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetRegularizationType(learning_stochastic_linear::L1);
886b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
896b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 2 :
906b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetRegularizationType(learning_stochastic_linear::L2);
916b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
926b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 3 :
936b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetRegularizationType(learning_stochastic_linear::L1L2);
946b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
956b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 4 :
966b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetRegularizationType(learning_stochastic_linear::L1LInf);
976b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
986b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      }
996b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1006b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      classifier->SetLambda((double) param_m[4]);
1016b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1026b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      switch ((int) param_m[5]){
1036b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 0 :
1046b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetUpdateType(learning_stochastic_linear::FULL_CS);
1056b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1066b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 1 :
1076b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetUpdateType(learning_stochastic_linear::CLIP_CS);
1086b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1096b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 2 :
1106b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetUpdateType(learning_stochastic_linear::REG_CS);
1116b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1126b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 3 :
1136b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetUpdateType(learning_stochastic_linear::SL);
1146b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1156b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 4 :
1166b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetUpdateType(learning_stochastic_linear::ADAPTIVE_REG);
1176b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1186b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      }
1196b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      switch ((int) param_m[6]){
1216b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 0 :
1226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetAdaptationMode(learning_stochastic_linear::CONST);
1236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 1 :
1256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetAdaptationMode(learning_stochastic_linear::INV_LINEAR);
1266b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1276b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 2 :
1286b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetAdaptationMode(learning_stochastic_linear::INV_QUADRATIC);
1296b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 3 :
1316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetAdaptationMode(learning_stochastic_linear::INV_SQRT);
1326b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1336b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      }
1346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1356b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      switch ((int) param_m[7]){
1366b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 0 :
1376b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetKernelType(learning_stochastic_linear::LINEAR, (double) param_m[8],
1386b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                                  (double) param_m[9],(double) param_m[10]);
1396b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1406b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 1 : classifier->SetKernelType(learning_stochastic_linear::POLY, (double) param_m[8],
1416b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                                         (double) param_m[9],(double) param_m[10]);
1426b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1436b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 2 : classifier->SetKernelType(learning_stochastic_linear::RBF, (double) param_m[8],
1446b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                                          (double) param_m[9],(double) param_m[10]);
1456b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1466b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      }
1476b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1486b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      switch ((int) param_m[11]){
1496b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 0 :
1506b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetRankLossType(learning_stochastic_linear::PAIRWISE);
1516b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1526b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      case 1 :
1536b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        classifier->SetRankLossType(learning_stochastic_linear::RECIPROCAL_RANK);
1546b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua        break;
1556b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      }
1566b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1576b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      classifier->SetAcceptanceProbability((double) param_m[12]);
1586b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      classifier->SetMiniBatchSize((uint64)param_m[13]);
1596b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      classifier->SetGradientL0Norm((int32)param_m[14]);
1606b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      env->ReleaseFloatArrayElements(value_array_model, values_m, JNI_ABORT);
1616b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      env->ReleaseFloatArrayElements(value_array_param, param_m, JNI_ABORT);
1626b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      return JNI_TRUE;
1636b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    }
1646b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  }
1656b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  return JNI_FALSE;
1666b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
1676b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1686b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huajint Java_android_bordeaux_learning_StochasticLinearRanker_nativeGetLengthClassifier(
1696b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  JNIEnv* env,
1706b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jobject thiz,
1716b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jint paPtr) {
1726b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1736b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  StochasticLinearRanker<string>* classifier = (StochasticLinearRanker<string>*) paPtr;
1746b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  SparseWeightVector<string> M_weights;
1756b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  classifier->SaveWeights(&M_weights);
1766b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1776b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  SparseWeightVector<string>::Wmap w_map = M_weights.GetMap();
1786b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int len = w_map.size();
1796b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  return len;
1806b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
1816b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1826b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huavoid Java_android_bordeaux_learning_StochasticLinearRanker_nativeGetClassifier(
1836b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  JNIEnv* env,
1846b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jobject thiz,
1856b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jobjectArray key_array_model,
1866b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jfloatArray value_array_model,
1876b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jfloatArray value_array_param,
1886b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jint paPtr) {
1896b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1906b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  StochasticLinearRanker<string>* classifier = (StochasticLinearRanker<string>*) paPtr;
1916b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
1926b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  SparseWeightVector<string> M_weights;
1936b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  classifier->SaveWeights(&M_weights);
1946b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  double Jni_weight_normalizer = M_weights.GetNormalizer();
1956b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int Jni_itr_num = classifier->GetIterationNumber();
1966b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  double Jni_norm_cont = classifier->GetNormContraint();
1976b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int Jni_reg_type = classifier->GetRegularizationType();
1986b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  double Jni_lambda = classifier->GetLambda();
1996b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int Jni_update_type = classifier->GetUpdateType();
2006b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int Jni_AdaptationMode = classifier->GetAdaptationMode();
2016b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  double Jni_kernel_param, Jni_kernel_gain, Jni_kernel_bias;
2026b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int Jni_kernel_type = classifier->GetKernelType(&Jni_kernel_param, &Jni_kernel_gain, &Jni_kernel_bias);
2036b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int Jni_rank_loss_type = classifier->GetRankLossType();
2046b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  double Jni_accp_prob = classifier->GetAcceptanceProbability();
2056b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  uint64 Jni_min_batch_size = classifier->GetMiniBatchSize();
2066b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int32 Jni_GradL0Norm = classifier->GetGradientL0Norm();
2076b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  const int Var_num = 15;
2086b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jfloat s[Var_num]= {  (float) Jni_weight_normalizer,
2096b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_itr_num,
2106b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_norm_cont,
2116b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_reg_type,
2126b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_lambda,
2136b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_update_type,
2146b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_AdaptationMode,
2156b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_kernel_type,
2166b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_kernel_param,
2176b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_kernel_gain,
2186b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_kernel_bias,
2196b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_rank_loss_type,
2206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_accp_prob,
2216b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_min_batch_size,
2226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                        (float) Jni_GradL0Norm};
2236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  env->SetFloatArrayRegion(value_array_param, 0, Var_num, s);
2256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2266b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  SparseWeightVector<string>::Wmap w_map = M_weights.GetMap();
2276b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  int array_len = w_map.size();
2286b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2296b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  DecomposeSparseWeightVector(env, &key_array_model, &value_array_model, array_len, &M_weights);
2306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
2316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2326b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huajint Java_android_bordeaux_learning_StochasticLinearRanker_initNativeClassifier(JNIEnv* env,
2336b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                             jobject thiz) {
2346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  StochasticLinearRanker<string>* classifier = new StochasticLinearRanker<string>();
2356b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  classifier->SetUpdateType(learning_stochastic_linear::REG_CS);
2366b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  classifier->SetRegularizationType(learning_stochastic_linear::L2);
2376b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  return ((jint) classifier);
2386b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
2396b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2406b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2416b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huajboolean Java_android_bordeaux_learning_StochasticLinearRanker_deleteNativeClassifier(JNIEnv* env,
2426b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                               jobject thiz,
2436b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua                               jint paPtr) {
2446b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  StochasticLinearRanker<string>* classifier = (StochasticLinearRanker<string>*) paPtr;
2456b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  delete classifier;
2466b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  return JNI_TRUE;
2476b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
2486b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2496b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huajboolean Java_android_bordeaux_learning_StochasticLinearRanker_nativeUpdateClassifier(
2506b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  JNIEnv* env,
2516b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jobject thiz,
2526b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jobjectArray key_array_positive,
2536b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jfloatArray value_array_positive,
2546b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jobjectArray key_array_negative,
2556b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jfloatArray value_array_negative,
2566b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jint paPtr) {
2576b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  StochasticLinearRanker<string>* classifier = (StochasticLinearRanker<string>*) paPtr;
2586b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2596b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  if (classifier && key_array_positive && value_array_positive &&
2606b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      key_array_negative && value_array_negative) {
2616b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2626b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int keys_p_len = env->GetArrayLength(key_array_positive);
2636b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jfloat* values_p = env->GetFloatArrayElements(value_array_positive, NULL);
2646b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int values_p_len = env->GetArrayLength(value_array_positive);
2656b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jfloat* values_n = env->GetFloatArrayElements(value_array_negative, NULL);
2666b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int values_n_len = env->GetArrayLength(value_array_negative);
2676b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int keys_n_len = env->GetArrayLength(key_array_negative);
2686b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2696b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    if (values_p && key_array_positive && values_p_len == keys_p_len &&
2706b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      values_n && key_array_negative && values_n_len == keys_n_len) {
2716b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2726b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      SparseWeightVector<string> sample_pos;
2736b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      SparseWeightVector<string> sample_neg;
2746b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      CreateSparseWeightVector(env, key_array_positive, values_p, values_p_len, &sample_pos);
2756b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      CreateSparseWeightVector(env, key_array_negative, values_n, values_n_len, &sample_neg);
2766b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      classifier->UpdateClassifier(sample_pos, sample_neg);
2776b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      env->ReleaseFloatArrayElements(value_array_negative, values_n, JNI_ABORT);
2786b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      env->ReleaseFloatArrayElements(value_array_positive, values_p, JNI_ABORT);
2796b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2806b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      return JNI_TRUE;
2816b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    }
2826b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    env->ReleaseFloatArrayElements(value_array_negative, values_n, JNI_ABORT);
2836b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    env->ReleaseFloatArrayElements(value_array_positive, values_p, JNI_ABORT);
2846b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  }
2856b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  return JNI_FALSE;
2866b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
2876b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2886b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2896b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huajfloat Java_android_bordeaux_learning_StochasticLinearRanker_nativeScoreSample(
2906b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  JNIEnv* env,
2916b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jobject thiz,
2926b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jobjectArray key_array,
2936b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jfloatArray value_array,
2946b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  jint paPtr) {
2956b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2966b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  StochasticLinearRanker<string>* classifier = (StochasticLinearRanker<string>*) paPtr;
2976b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
2986b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  if (classifier && key_array && value_array) {
2996b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
3006b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    jfloat* values = env->GetFloatArrayElements(value_array, NULL);
3016b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int values_len = env->GetArrayLength(value_array);
3026b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    const int keys_len = env->GetArrayLength(key_array);
3036b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua
3046b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    if (values && key_array && values_len == keys_len) {
3056b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      SparseWeightVector<string> sample;
3066b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      CreateSparseWeightVector(env, key_array, values, values_len, &sample);
3076b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      env->ReleaseFloatArrayElements(value_array, values, JNI_ABORT);
3086b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua      return classifier->ScoreSample(sample);
3096b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua    }
3106b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  }
3116b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua  return -1;
3126b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua}
313