Skip to content

Commit

Permalink
Adding the join method to the array namespace (#100)
Browse files Browse the repository at this point in the history
  • Loading branch information
Oscar Torreno authored Apr 3, 2019
1 parent dfd12e4 commit 7153347
Show file tree
Hide file tree
Showing 9 changed files with 584 additions and 67 deletions.
10 changes: 4 additions & 6 deletions .vscode/c_cpp_properties.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"includePath": [
"/Library/Developer/CommandLineTools/usr/include/c++/v1",
"/usr/local/include",
"/Library/Developer/CommandLineTools/usr/lib/clang/9.1.0/include",
"/Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/include",
"/Library/Developer/CommandLineTools/usr/include",
"/usr/include",
"${workspaceRoot}/include",
Expand All @@ -14,16 +14,15 @@
"~/.conan/data/google-benchmark/1.3.0/mpusz/stable/package/b08ddb4c31e42478ed3036f88d8a2f266668e243/include",
"~/.conan/data/gtest/1.8.0/bincrafters/stable/package/79bf458d3de8bb5575d85a5ab9191928a608b0ae/include",
"~/.conan/data/boost/1.66.0/conan/stable/package/4954664e4425a1c3c36181fae1dcf688eaf7a7fd/include/",
"~/.conan/data/eigen/3.3.4/conan/stable/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/",
"/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers"
"~/.conan/data/eigen/3.3.4/conan/stable/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"/Library/Developer/CommandLineTools/usr/include/c++/v1",
"/usr/local/include",
"/Library/Developer/CommandLineTools/usr/lib/clang/9.1.0/include",
"/Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/include",
"/Library/Developer/CommandLineTools/usr/include",
"/usr/include",
"${workspaceRoot}/include",
Expand All @@ -32,8 +31,7 @@
"~/.conan/data/google-benchmark/1.3.0/mpusz/stable/package/b08ddb4c31e42478ed3036f88d8a2f266668e243/include",
"~/.conan/data/gtest/1.8.0/bincrafters/stable/package/79bf458d3de8bb5575d85a5ab9191928a608b0ae/include",
"~/.conan/data/boost/1.66.0/conan/stable/package/4954664e4425a1c3c36181fae1dcf688eaf7a7fd/include/",
"~/.conan/data/eigen/3.3.4/conan/stable/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/",
"/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers"
"~/.conan/data/eigen/3.3.4/conan/stable/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
Expand Down
4 changes: 2 additions & 2 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
"twxs.cmake",
"xaver.clang-format",
"eamodio.gitlens",
"robertohuertasm.vscode-icons",
"vscode-icons.vscode-icons",
"streetsidesoftware.code-spell-checker",
"ymotongpoo.licenser"
]
}
}
38 changes: 24 additions & 14 deletions bindings/c/include/khiva_c/array.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,34 +25,34 @@ extern "C" {
KHIVAAPI void create_array(void *data, unsigned *ndims, long long *dims, khiva_array *result, int *type);

/**
* @brief Retrieves the data from the device to the host.
* @brief Decreases the references count of the given array.
*
* @param array The Array that contains the data to be retrieved.
* @param data Pointer to previously allocated memory in the host.
* @param array The Array to release.
*/
KHIVAAPI void get_data(khiva_array *array, void *data);
KHIVAAPI void delete_array(khiva_array *array);

/**
* @brief Gets the Array dimensions.
* @brief Displays an Array.
*
* @param array Array from which to get the dimensions.
* @param dims The dimensions.
* @param array The array to display.
*/
KHIVAAPI void get_dims(khiva_array *array, long long *dims);
KHIVAAPI void display(khiva_array *array);

/**
* @brief Displays an Array.
* @brief Retrieves the data from the device to the host.
*
* @param array The array to display.
* @param array The Array that contains the data to be retrieved.
* @param data Pointer to previously allocated memory in the host.
*/
KHIVAAPI void display(khiva_array *array);
KHIVAAPI void get_data(khiva_array *array, void *data);

/**
* @brief Decreases the references count of the given array.
* @brief Gets the Array dimensions.
*
* @param array The Array to release.
* @param array Array from which to get the dimensions.
* @param dims The dimensions.
*/
KHIVAAPI void delete_array(khiva_array *array);
KHIVAAPI void get_dims(khiva_array *array, long long *dims);

/**
* @brief Gets the type of the array.
Expand All @@ -62,6 +62,16 @@ KHIVAAPI void delete_array(khiva_array *array);
*/
KHIVAAPI void get_type(khiva_array *array, int *t);

/**
* @brief Joins the first and second arrays along the specified dimension.
*
* @param dim The dimension along which the join occurs.
* @param first The first input array.
* @param second The second input array.
* @param result KHIVA Array with the result of this operation.
*/
KHIVAAPI void join(int *dim, khiva_array *first, khiva_array *second, khiva_array *result);

/**
* @brief Adds two arrays.
*
Expand Down
24 changes: 16 additions & 8 deletions bindings/c/src/array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ void create_array(void *data, unsigned *ndims, long long *dims, khiva_array *res
af_retain_array(result, khiva::array::createArray(data, *ndims, dims, *type).get());
}

void delete_array(khiva_array *array) { khiva::array::deleteArray(*array); }

void display(khiva_array *array) {
af::array var = af::array(*array);
khiva::array::print(var);
af_retain_array(array, var.get());
}

void get_data(khiva_array *array, void *data) {
af::array var = af::array(*array);
khiva::array::getData(var, data);
Expand All @@ -27,20 +35,20 @@ void get_dims(khiva_array *array, long long *dimens) {
af_retain_array(array, var.get());
}

void display(khiva_array *array) {
af::array var = af::array(*array);
khiva::array::print(var);
af_retain_array(array, var.get());
}

void delete_array(khiva_array *array) { khiva::array::deleteArray(*array); }

void get_type(khiva_array *array, int *t) {
af::array var = af::array(*array);
*t = khiva::array::getType(var);
af_retain_array(array, var.get());
}

void join(int *dim, khiva_array *first, khiva_array *second, khiva_array *result) {
af::array var1;
af::array var2;
check_and_retain_arrays(first, second, var1, var2);
af::array r = khiva::array::join(*dim, var1, var2);
af_retain_array(result, r.get());
}

void khiva_add(khiva_array *lhs, khiva_array *rhs, khiva_array *result) {
af::array var1;
af::array var2;
Expand Down
26 changes: 18 additions & 8 deletions bindings/jni/include/khiva_jni/array.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromFloatComple
JNIEXPORT jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromDoubleComplex(JNIEnv *env, jclass,
jobjectArray objs, jlongArray dims);

/**
* @brief Releases the array.
*/
JNIEXPORT void JNICALL Java_io_shapelets_khiva_Array_deleteArray(JNIEnv *env, jobject thisObj);

/**
* @brief Retrieves data from the device to host (Float, Double, Int, Boolean, Long, Short or Byte).
*
Expand Down Expand Up @@ -88,28 +93,33 @@ JNIEXPORT jobjectArray JNICALL Java_io_shapelets_khiva_Array_getDoubleComplexFro
JNIEXPORT jobjectArray JNICALL Java_io_shapelets_khiva_Array_getFloatComplexFromArray(JNIEnv *env, jobject thisObj);

/**
* @brief Gets the Array type.
* @brief Gets the Array dimensions.
*
* @return Integer representing the Array type.
* @return The dimensions.
*/
JNIEXPORT jint JNICALL Java_io_shapelets_khiva_Array_nativeGetType(JNIEnv *env, jobject thisObj);
JNIEXPORT jlongArray JNICALL Java_io_shapelets_khiva_Array_nativeGetDims(JNIEnv *env, jobject thisObj);

/**
* @brief Gets the Array dimensions.
* @brief Gets the Array type.
*
* @return The dimensions.
* @return Integer representing the Array type.
*/
JNIEXPORT jlongArray JNICALL Java_io_shapelets_khiva_Array_nativeGetDims(JNIEnv *env, jobject thisObj);
JNIEXPORT jint JNICALL Java_io_shapelets_khiva_Array_nativeGetType(JNIEnv *env, jobject thisObj);

/**
* @brief Prints the Array.
*/
JNIEXPORT void JNICALL Java_io_shapelets_khiva_Array_nativePrint(JNIEnv *env, jobject thisObj);

/**
* @brief Releases the array.
* @brief Joins this array with the one specified as parameter along the specified dimension.
*
* @param dim The dimension along which the join occurs.
* @param ref_rhs Reference to the right-hand side array for the operation.
*
* @return The updated reference of the right-hand side array and the reference of the resulting array.
*/
JNIEXPORT void JNICALL Java_io_shapelets_khiva_Array_deleteArray(JNIEnv *env, jobject thisObj);
JNIEXPORT jlongArray JNICALL Java_io_shapelets_khiva_Array_join(JNIEnv *env, jobject thisObj, jint dim, jlong ref_rhs);

/**
* @brief Adds this array with the one specified as parameter.
Expand Down
56 changes: 41 additions & 15 deletions bindings/jni/src/array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,14 @@ jlong JNICALL Java_io_shapelets_khiva_Array_createArrayFromDoubleComplex(JNIEnv
return jlong(ret);
}

void JNICALL Java_io_shapelets_khiva_Array_deleteArray(JNIEnv *env, jobject thisObj) {
jclass clazz = env->GetObjectClass(thisObj);
jfieldID fidf = env->GetFieldID(clazz, "reference", "J");
jlong ref = env->GetLongField(thisObj, fidf);

khiva::array::deleteArray((void *)ref);
}

#define GET_T_FROM_ARRAY(Ty, ty) \
j##ty##Array JNICALL Java_io_shapelets_khiva_Array_get##Ty##FromArray(JNIEnv *env, jobject thisObj) { \
jclass clazz = env->GetObjectClass(thisObj); \
Expand Down Expand Up @@ -196,19 +204,6 @@ jobjectArray JNICALL Java_io_shapelets_khiva_Array_getFloatComplexFromArray(JNIE
return result;
}

jint JNICALL Java_io_shapelets_khiva_Array_nativeGetType(JNIEnv *env, jobject thisObj) {
jclass clazz = env->GetObjectClass(thisObj);
jfieldID fidf = env->GetFieldID(clazz, "reference", "J");
jlong ref = env->GetLongField(thisObj, fidf);

af_array a = (af_array)ref;
af::array var = af::array(a);
jint t = khiva::array::getType(var);
af_retain_array(&a, var.get());
env->SetLongField(thisObj, fidf, jlong(a));
return t;
}

jlongArray JNICALL Java_io_shapelets_khiva_Array_nativeGetDims(JNIEnv *env, jobject thisObj) {
jclass clazz = env->GetObjectClass(thisObj);
jfieldID fidf = env->GetFieldID(clazz, "reference", "J");
Expand All @@ -229,6 +224,19 @@ jlongArray JNICALL Java_io_shapelets_khiva_Array_nativeGetDims(JNIEnv *env, jobj
return p;
}

jint JNICALL Java_io_shapelets_khiva_Array_nativeGetType(JNIEnv *env, jobject thisObj) {
jclass clazz = env->GetObjectClass(thisObj);
jfieldID fidf = env->GetFieldID(clazz, "reference", "J");
jlong ref = env->GetLongField(thisObj, fidf);

af_array a = (af_array)ref;
af::array var = af::array(a);
jint t = khiva::array::getType(var);
af_retain_array(&a, var.get());
env->SetLongField(thisObj, fidf, jlong(a));
return t;
}

void JNICALL Java_io_shapelets_khiva_Array_nativePrint(JNIEnv *env, jobject thisObj) {
jclass clazz = env->GetObjectClass(thisObj);
jfieldID fidf = env->GetFieldID(clazz, "reference", "J");
Expand All @@ -241,12 +249,30 @@ void JNICALL Java_io_shapelets_khiva_Array_nativePrint(JNIEnv *env, jobject this
env->SetLongField(thisObj, fidf, jlong(a));
}

void JNICALL Java_io_shapelets_khiva_Array_deleteArray(JNIEnv *env, jobject thisObj) {
jlongArray JNICALL Java_io_shapelets_khiva_Array_join(JNIEnv *env, jobject thisObj, jint dim, jlong ref_rhs) {
jclass clazz = env->GetObjectClass(thisObj);
jfieldID fidf = env->GetFieldID(clazz, "reference", "J");
jlong ref = env->GetLongField(thisObj, fidf);

khiva::array::deleteArray((void *)ref);
af_array lhs = (af_array)ref;
af::array a;
af_array rhs = (af_array)ref_rhs;
af::array b;

check_and_retain_arrays(lhs, rhs, a, b);
af::array c = khiva::array::join(dim, a, b);
jlong raw_pointer = 0;
af_array af_p = (af_array)raw_pointer;

af_retain_array(&af_p, c.get());

env->SetLongField(thisObj, fidf, jlong(lhs));

jlong result[] = {(jlong)rhs, (jlong)af_p};
jlongArray p = env->NewLongArray(2);
env->SetLongArrayRegion(p, 0, 2, &result[0]);

return p;
}

jlongArray JNICALL Java_io_shapelets_khiva_Array_add(JNIEnv *env, jobject thisObj, jlong ref_rhs) {
Expand Down
33 changes: 22 additions & 11 deletions include/khiva/array.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@ namespace array {
*/
af::array createArray(void *data, unsigned ndims, dim_t *dims, const int type);

/**
* @brief Decreases the references count for the given array.
*
* @param array The Array to be deleted.
*/
void deleteArray(af_array array);

/**
* @brief Retrieves the data from the device to the host.
*
Expand All @@ -44,27 +51,31 @@ void getData(af::array array, void *data);
af::dim4 getDims(af::array array);

/**
* @brief Prints the content of an array.
* @brief Gets the type of the array.
*
* @param array The array to be printed.
* @param array The array to obtain the type from.
*
* @return int Value of the Dtype enumeration.
*/
void print(af::array array);
int getType(af::array array);

/**
* @brief Decreases the references count for the given array.
* @brief Joins the first and second arrays along the specified dimension.
*
* @param array The Array to be deleted.
* @param dim The dimension along which the join occurs.
* @param first The first input array.
* @param second The second input array.
*
* @return af::array The result of joining first and second along the specified dimension.
*/
void deleteArray(af_array array);
af::array join(int dim, af::array first, af::array second);

/**
* @brief Gets the type of the array.
*
* @param array The array to obtain the type from.
* @brief Prints the content of an array.
*
* @return int Value of the Dtype enumeration.
* @param array The array to be printed.
*/
int getType(af::array array);
void print(af::array array);

/**
* @brief Array class, This class provides functionality manage Arrays on the host side.
Expand Down
8 changes: 5 additions & 3 deletions src/khiva/array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,14 @@ af::array khiva::array::createArray(void *data, unsigned ndims, dim_t *dims, con
}
}

void khiva::array::deleteArray(af_array array) { af_release_array(array); }

void khiva::array::getData(af::array array, void *data) { array.host(data); }

af::dim4 khiva::array::getDims(af::array array) { return array.dims(); }

void khiva::array::print(af::array array) { af_print(array); }
int khiva::array::getType(af::array array) { return array.type(); }

void khiva::array::deleteArray(af_array array) { af_release_array(array); }
void khiva::array::print(af::array array) { af_print(array); }

int khiva::array::getType(af::array array) { return array.type(); }
af::array khiva::array::join(int dim, af::array first, af::array second) { return af::join(dim, first, second); }
Loading

0 comments on commit 7153347

Please sign in to comment.