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_multiclass_pa.h" 186b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua#include "native/multiclass_pa.h" 196b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 206b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua#include <vector> 216b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 226b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huausing learningfw::MulticlassPA; 236b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huausing std::vector; 246b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huausing std::pair; 256b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 266b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huavoid CreateIndexValuePairs(const int* indices, const float* values, 276b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua const int length, vector<pair<int, float> >* pairs) { 286b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua pairs->clear(); 296b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 306b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua for (int i = 0; i < length; ++i) { 316b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua pair<int, float> new_pair(indices[i], values[i]); 326b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua pairs->push_back(new_pair); 336b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 346b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua} 356b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 3672dfa8f7d69de01c8443252d37dac9a78ce55ff3Aurimas Liutikasjlong Java_android_bordeaux_learning_MulticlassPA_initNativeClassifier(JNIEnv* /* env */, 3772dfa8f7d69de01c8443252d37dac9a78ce55ff3Aurimas Liutikas jobject /* thiz */, 386b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jint num_classes, 396b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jint num_dims, 406b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jfloat aggressiveness) { 416b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua MulticlassPA* classifier = new MulticlassPA(num_classes, 426b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua num_dims, 436b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua aggressiveness); 4455f6e8b32805d662fe05e2e3a8ea6dd9d303a324Marcus Oakland return ((jlong) classifier); 456b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua} 466b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 476b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 4872dfa8f7d69de01c8443252d37dac9a78ce55ff3Aurimas Liutikasjboolean Java_android_bordeaux_learning_MulticlassPA_deleteNativeClassifier(JNIEnv* /* env */, 4972dfa8f7d69de01c8443252d37dac9a78ce55ff3Aurimas Liutikas jobject /* thiz */, 5055f6e8b32805d662fe05e2e3a8ea6dd9d303a324Marcus Oakland jlong paPtr) { 516b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua MulticlassPA* classifier = (MulticlassPA*) paPtr; 526b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua delete classifier; 536b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return JNI_TRUE; 546b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua} 556b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 566b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huajboolean Java_android_bordeaux_learning_MulticlassPA_nativeSparseTrainOneExample(JNIEnv* env, 5772dfa8f7d69de01c8443252d37dac9a78ce55ff3Aurimas Liutikas jobject /* thiz */, 586b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jintArray index_array, 596b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jfloatArray value_array, 606b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jint target, 6155f6e8b32805d662fe05e2e3a8ea6dd9d303a324Marcus Oakland jlong paPtr) { 626b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua MulticlassPA* classifier = (MulticlassPA*) paPtr; 636b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 646b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (classifier && index_array && value_array) { 656b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 666b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jfloat* values = env->GetFloatArrayElements(value_array, NULL); 676b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jint* indices = env->GetIntArrayElements(index_array, NULL); 686b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua const int value_len = env->GetArrayLength(value_array); 696b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua const int index_len = env->GetArrayLength(index_array); 706b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 716b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (values && indices && value_len == index_len) { 726b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua vector<pair<int, float> > inputs; 736b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 746b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua CreateIndexValuePairs(indices, values, value_len, &inputs); 756b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua classifier->SparseTrainOneExample(inputs, target); 766b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua env->ReleaseIntArrayElements(index_array, indices, JNI_ABORT); 776b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua env->ReleaseFloatArrayElements(value_array, values, JNI_ABORT); 786b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 796b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return JNI_TRUE; 806b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 816b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua env->ReleaseIntArrayElements(index_array, indices, JNI_ABORT); 826b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua env->ReleaseFloatArrayElements(value_array, values, JNI_ABORT); 836b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 846b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 856b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return JNI_FALSE; 866b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua} 876b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 886b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 896b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Huajint Java_android_bordeaux_learning_MulticlassPA_nativeSparseGetClass(JNIEnv* env, 9072dfa8f7d69de01c8443252d37dac9a78ce55ff3Aurimas Liutikas jobject /* thiz */, 916b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jintArray index_array, 926b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jfloatArray value_array, 9355f6e8b32805d662fe05e2e3a8ea6dd9d303a324Marcus Oakland jlong paPtr) { 946b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 956b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua MulticlassPA* classifier = (MulticlassPA*) paPtr; 966b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 976b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (classifier && index_array && value_array) { 986b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 996b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jfloat* values = env->GetFloatArrayElements(value_array, NULL); 1006b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua jint* indices = env->GetIntArrayElements(index_array, NULL); 1016b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua const int value_len = env->GetArrayLength(value_array); 1026b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua const int index_len = env->GetArrayLength(index_array); 1036b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 1046b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua if (values && indices && value_len == index_len) { 1056b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua vector<pair<int, float> > inputs; 1066b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua CreateIndexValuePairs(indices, values, value_len, &inputs); 1076b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua env->ReleaseIntArrayElements(index_array, indices, JNI_ABORT); 1086b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua env->ReleaseFloatArrayElements(value_array, values, JNI_ABORT); 1096b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return classifier->SparseGetClass(inputs); 1106b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1116b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua env->ReleaseIntArrayElements(index_array, indices, JNI_ABORT); 1126b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua env->ReleaseFloatArrayElements(value_array, values, JNI_ABORT); 1136b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua } 1146b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua 1156b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua return -1; 1166b4eebc73439cbc3ddfb547444a341d1f9be7996Wei Hua} 117