/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef LEARNING_JNI_STOCHASTIC_LINEAR_RANKER_H
#define LEAENING_JNI_STOCHASTIC_LINEAR_RANKER_H

#include <jni.h>

#ifdef __cplusplus
extern "C" {
#endif

/*  Counts the number of learning iterations. */
const char * ITR_NUM = "IterationNumber";

/*  The maximum norm of the weight vector. If norm of weights are larger than NormConstraint
    they will be reprojected using RegularizationType to satisfy this constraint. */
const char * NORM_CONSTRAINT = "NormConstraint";

/*  Ddetermines type of the regularization used in learning.
    This regularization can be based on different norms.
    Options: "L0", "L1", "L2", "L1L2", "L1LInf".
    Default : LINEAR */
const char * REG_TYPE = "RegularizationType";

/*  Lambda is a factor that is multiplied with the step size in learning. This can be used
    to change the step size.
    Default : 1.0 */
const char * LAMBDA = "Lambda";

/*  This parameter determines the update type in learning process.
    Options: "FULL_CS" , "CLIP_CS", "REG_CS", "SL", "ADAPTIVE_REG"
    Default : "SL" */
const char * UPDATE_TYPE = "UpdateType";

/*  Options: "CONST", "INV_LINEAR", "INV_QUADRATIC", "INV_SQRT"
    Default: "INV_LINEAR". */
const char * ADAPT_MODE = "AdaptationMode";

/*  Three differnt kernels are supported: Linear "LINEAR", Polynomial "POLY", and RBF "RBF"
    Default : "LINEAR" */
const char * KERNEL_TYPE = "KernelType";

/*  Kernel param is kernel-specific. In case of polynomial kernel, it is the degree of the
    polynomial. In case of RBF kernel, it implies the sigma parameter. In case of linear
    kernel, it is not used. */
const char * KERNEL_PARAM = "KernelParameter";

/*  Kernel gain is typically a multiplicative factor to the dot product while calculating
    the kernel function. In most use cases, gain should be set to 1.0. */
const char * KERNEL_GAIN = "KernelGain";

/*  Kernel bias is typically an additive factors to the dot product while calculating
    the kernel function. In most use cases, bias should be set to 0.0. */
const char * KERNEL_BIAS = "KernelBias";

/*  This parameter determines the type of loss function to minimize.
    Options : "PAIRWISE", "RECIPROCAL_RANK"
    Default : "PAIRWISE" */
const char * LOSS_TYPE = "LossType";

/*  The minimum percent of training pairs that are used in training.
    Default : "0.1" */
const char * ACC_PROB = "AcceptaceProbability";

/*  The code averages out gradient updates for MinimumBatchSize samples
    before performing an iteration of the algorithm. */
const char * MIN_BATCH_SIZE = "MinimumBatchSize";

/*  Specifies the number of non-zero entries allowed in a gradient.
    Default is -1 which means we take the gradient as given by data without
    adding any new constraints. positive number is treated as an L0 constraint */
const char * GRAD_L0_NORM = "GradientL0Nrom";

const char * REG_TYPE_L0 = "L0";
const char * REG_TYPE_L1 = "L1";
const char * REG_TYPE_L2 = "L2";
const char * REG_TYPE_L1L2 = "L1L2";
const char * REG_TYPE_L1LInf = "L1LInf";
const char * UPDATE_TYPE_FULL_CS = "FULL_CS";
const char * UPDATE_TYPE_CLIP_CS = "CLIP_CS";
const char * UPDATE_TYPE_REG_CS = "REG_CS";
const char * UPDATE_TYPE_SL = "SL";
const char * UPDATE_TYPE_ADAPTIVE_REG = "ADAPTIVE_REG";
const char * ADAPT_MODE_CONST = "CONST";
const char * ADAPT_MODE_INV_LINEAR = "INV_LINEAR";
const char * ADAPT_MODE_INV_QUADRATIC = "INV_QUADRATIC";
const char * ADAPT_MODE_INV_SQRT = "INV_SQRT";
const char * KERNEL_TYPE_LINEAR = "LINEAR";
const char * KERNEL_TYPE_POLY = "POLY";
const char * KERNEL_TYPE_RBF = "RBF";
const char * LOSS_TYPE_PAIRWISE = "PAIRWISE";
const char * LOSS_TYPE_RECIPROCAL_RANK = "RECIPROCAL_RANK";

JNIEXPORT jlong JNICALL
Java_android_bordeaux_learning_StochasticLinearRanker_initNativeClassifier(
    JNIEnv* env,
    jobject thiz);


JNIEXPORT jboolean JNICALL
Java_android_bordeaux_learning_StochasticLinearRanker_deleteNativeClassifier(
    JNIEnv* env,
    jobject thiz,
    jlong paPtr);

JNIEXPORT jboolean JNICALL
Java_android_bordeaux_learning_StochasticLinearRanker_nativeUpdateClassifier(
    JNIEnv* env,
    jobject thiz,
    jobjectArray key_array_positive,
    jfloatArray value_array_positive,
    jobjectArray key_array_negative,
    jfloatArray value_array_negative,
    jlong paPtr);

JNIEXPORT jfloat JNICALL
Java_android_bordeaux_learning_StochasticLinearRanker_nativeScoreSample(
    JNIEnv* env,
    jobject thiz,
    jobjectArray key_array,
    jfloatArray value_array,
    jlong paPtr);

JNIEXPORT void JNICALL
Java_android_bordeaux_learning_StochasticLinearRanker_nativeGetWeightClassifier(
    JNIEnv* env,
    jobject thiz,
    jobjectArray key_array_weight,
    jfloatArray value_array_weight,
    jfloat normalizer,
    jlong paPtr);

JNIEXPORT void JNICALL
Java_android_bordeaux_learning_StochasticLinearRanker_nativeGetParameterClassifier(
    JNIEnv* env,
    jobject thiz,
    jobjectArray key_array_param,
    jobjectArray value_array_param,
    jlong paPtr);

JNIEXPORT jint JNICALL
Java_android_bordeaux_learning_StochasticLinearRanker_nativeGetLengthClassifier(
    JNIEnv* env,
    jobject thiz,
    jlong paPtr);

JNIEXPORT jboolean JNICALL
Java_android_bordeaux_learning_StochasticLinearRanker_nativeSetWeightClassifier(
    JNIEnv* env,
    jobject thiz,
    jobjectArray key_array_model,
    jfloatArray value_array_model,
    jfloat normalizer_model,
    jlong paPtr);

JNIEXPORT jboolean JNICALL
Java_android_bordeaux_learning_StochasticLinearRanker_nativeSetParameterClassifier(
    JNIEnv* env,
    jobject thiz,
    jstring key,
    jstring value,
    jlong paPtr);

#ifdef __cplusplus
}
#endif

#endif /* ANDROID_LERNING_JNI_STOCHASTIC_LINEAR_RANKER_H */
