/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_apache_sysds_utils_NativeHelper */

#ifndef _Included_org_apache_sysds_utils_NativeHelper
#define _Included_org_apache_sysds_utils_NativeHelper
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    dmmdd
 * Signature: ([D[D[DIIII)Z
 */
JNIEXPORT jboolean JNICALL Java_org_apache_sysds_utils_NativeHelper_dmmdd
  (JNIEnv *, jclass, jdoubleArray, jdoubleArray, jdoubleArray, jint, jint, jint, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    smmdd
 * Signature: (Ljava/nio/FloatBuffer;Ljava/nio/FloatBuffer;Ljava/nio/FloatBuffer;IIII)Z
 */
JNIEXPORT jboolean JNICALL Java_org_apache_sysds_utils_NativeHelper_smmdd
  (JNIEnv *, jclass, jobject, jobject, jobject, jint, jint, jint, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    tsmm
 * Signature: ([D[DIIZI)Z
 */
JNIEXPORT jboolean JNICALL Java_org_apache_sysds_utils_NativeHelper_tsmm
  (JNIEnv *, jclass, jdoubleArray, jdoubleArray, jint, jint, jboolean, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    conv2dDense
 * Signature: ([D[D[DIIIIIIIIIIIIII)I
 */
JNIEXPORT jint JNICALL Java_org_apache_sysds_utils_NativeHelper_conv2dDense
  (JNIEnv *, jclass, jdoubleArray, jdoubleArray, jdoubleArray, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    dconv2dBiasAddDense
 * Signature: ([D[D[D[DIIIIIIIIIIIIII)I
 */
JNIEXPORT jint JNICALL Java_org_apache_sysds_utils_NativeHelper_dconv2dBiasAddDense
  (JNIEnv *, jclass, jdoubleArray, jdoubleArray, jdoubleArray, jdoubleArray, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    sconv2dBiasAddDense
 * Signature: (Ljava/nio/FloatBuffer;Ljava/nio/FloatBuffer;Ljava/nio/FloatBuffer;Ljava/nio/FloatBuffer;IIIIIIIIIIIIII)I
 */
JNIEXPORT jint JNICALL Java_org_apache_sysds_utils_NativeHelper_sconv2dBiasAddDense
  (JNIEnv *, jclass, jobject, jobject, jobject, jobject, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    conv2dBackwardFilterDense
 * Signature: ([D[D[DIIIIIIIIIIIIII)I
 */
JNIEXPORT jint JNICALL Java_org_apache_sysds_utils_NativeHelper_conv2dBackwardFilterDense
  (JNIEnv *, jclass, jdoubleArray, jdoubleArray, jdoubleArray, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    conv2dBackwardDataDense
 * Signature: ([D[D[DIIIIIIIIIIIIII)I
 */
JNIEXPORT jint JNICALL Java_org_apache_sysds_utils_NativeHelper_conv2dBackwardDataDense
  (JNIEnv *, jclass, jdoubleArray, jdoubleArray, jdoubleArray, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    conv2dBackwardFilterSparseDense
 * Signature: (II[I[D[D[DIIIIIIIIIIIIII)Z
 */
JNIEXPORT jboolean JNICALL Java_org_apache_sysds_utils_NativeHelper_conv2dBackwardFilterSparseDense
  (JNIEnv *, jclass, jint, jint, jintArray, jdoubleArray, jdoubleArray, jdoubleArray, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    conv2dSparse
 * Signature: (II[I[D[D[DIIIIIIIIIIIIII)Z
 */
JNIEXPORT jboolean JNICALL Java_org_apache_sysds_utils_NativeHelper_conv2dSparse
  (JNIEnv *, jclass, jint, jint, jintArray, jdoubleArray, jdoubleArray, jdoubleArray, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint, jint);

/*
 * Class:     org_apache_sysds_utils_NativeHelper
 * Method:    setMaxNumThreads
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_org_apache_sysds_utils_NativeHelper_setMaxNumThreads
  (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif
