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