From 66557de0f63290da68dcd8af35770a2ea6cf2e9e Mon Sep 17 00:00:00 2001 From: Rajat Krishna Date: Wed, 13 Mar 2024 11:37:48 -0400 Subject: [PATCH] [JAVA_API] Wrapper for ov::PartialShape (#883) * Get partial shape from output * Update PartialShape getDimension to align with C++ API * Use pointer arithmetic to access Partial Shape dimension Co-authored-by: Nesterov Alexander * Remove redundant delete method * Revert "Use pointer arithmetic to access Partial Shape dimension" --------- Co-authored-by: Nesterov Alexander Co-authored-by: Anna Likholat --- modules/java_api/src/main/cpp/dimension.cpp | 6 -- .../java_api/src/main/cpp/openvino_java.hpp | 7 ++- modules/java_api/src/main/cpp/output.cpp | 10 ++++ .../java_api/src/main/cpp/partial_shape.cpp | 56 +++++++++++++++++++ .../java/org/intel/openvino/Dimension.java | 3 - .../main/java/org/intel/openvino/Output.java | 7 +++ .../java/org/intel/openvino/PartialShape.java | 39 +++++++++++++ .../java/org/intel/openvino/ModelTests.java | 14 +++++ 8 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 modules/java_api/src/main/cpp/partial_shape.cpp create mode 100644 modules/java_api/src/main/java/org/intel/openvino/PartialShape.java diff --git a/modules/java_api/src/main/cpp/dimension.cpp b/modules/java_api/src/main/cpp/dimension.cpp index ff40c3463..87717348a 100644 --- a/modules/java_api/src/main/cpp/dimension.cpp +++ b/modules/java_api/src/main/cpp/dimension.cpp @@ -17,9 +17,3 @@ JNIEXPORT jint JNICALL Java_org_intel_openvino_Dimension_getLength(JNIEnv *env, ) return 0; } - -JNIEXPORT void JNICALL Java_org_intel_openvino_Dimension_delete(JNIEnv *, jobject, jlong addr) -{ - Dimension *dim = (Dimension *)addr; - delete dim; -} diff --git a/modules/java_api/src/main/cpp/openvino_java.hpp b/modules/java_api/src/main/cpp/openvino_java.hpp index f78bad6f3..664ffa7bb 100644 --- a/modules/java_api/src/main/cpp/openvino_java.hpp +++ b/modules/java_api/src/main/cpp/openvino_java.hpp @@ -107,14 +107,19 @@ extern "C" // ov::Dimension JNIEXPORT jint JNICALL Java_org_intel_openvino_Dimension_getLength(JNIEnv *, jobject, jlong); - JNIEXPORT void JNICALL Java_org_intel_openvino_Dimension_delete(JNIEnv *, jobject, jlong); // ov::Output JNIEXPORT jstring JNICALL Java_org_intel_openvino_Output_GetAnyName(JNIEnv *, jobject, jlong); JNIEXPORT jintArray JNICALL Java_org_intel_openvino_Output_GetShape(JNIEnv *, jobject, jlong); + JNIEXPORT jlong JNICALL Java_org_intel_openvino_Output_GetPartialShape(JNIEnv *, jobject, jlong); JNIEXPORT int JNICALL Java_org_intel_openvino_Output_GetElementType(JNIEnv *, jobject, jlong); JNIEXPORT void JNICALL Java_org_intel_openvino_Output_delete(JNIEnv *, jobject, jlong); + // ov::PartialShape + JNIEXPORT jlong JNICALL Java_org_intel_openvino_PartialShape_GetDimension(JNIEnv *, jobject, jlong, jint); + JNIEXPORT jintArray JNICALL Java_org_intel_openvino_PartialShape_GetMaxShape(JNIEnv *, jobject, jlong); + JNIEXPORT jintArray JNICALL Java_org_intel_openvino_PartialShape_GetMinShape(JNIEnv *, jobject, jlong); + #ifdef __cplusplus } #endif diff --git a/modules/java_api/src/main/cpp/output.cpp b/modules/java_api/src/main/cpp/output.cpp index 02f32cd4d..4ed73251f 100644 --- a/modules/java_api/src/main/cpp/output.cpp +++ b/modules/java_api/src/main/cpp/output.cpp @@ -47,6 +47,16 @@ JNIEXPORT int JNICALL Java_org_intel_openvino_Output_GetElementType(JNIEnv *env, return 0; } +JNIEXPORT jlong JNICALL Java_org_intel_openvino_Output_GetPartialShape(JNIEnv *env, jobject obj, jlong addr) { + JNI_METHOD("GetPartialShape", + Output *output = (Output *)addr; + const PartialShape& partialShape = output->get_partial_shape(); + + return (jlong) &partialShape; + ) + return 0; +} + JNIEXPORT void JNICALL Java_org_intel_openvino_Output_delete(JNIEnv *, jobject, jlong addr) { Output *obj = (Output *)addr; diff --git a/modules/java_api/src/main/cpp/partial_shape.cpp b/modules/java_api/src/main/cpp/partial_shape.cpp new file mode 100644 index 000000000..37fa5e555 --- /dev/null +++ b/modules/java_api/src/main/cpp/partial_shape.cpp @@ -0,0 +1,56 @@ +// Copyright (C) 2020-2023 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include // JNI header provided by JDK +#include "openvino/openvino.hpp" + +#include "openvino_java.hpp" +#include "jni_common.hpp" + +using namespace ov; + +JNIEXPORT jlong JNICALL Java_org_intel_openvino_PartialShape_GetDimension(JNIEnv *env, jobject obj, jlong addr, jint index) { + JNI_METHOD("GetDimension", + PartialShape* partial_shape = (PartialShape *)addr; + return (jlong) &(*partial_shape)[index]; + ) + return 0; +} + +JNIEXPORT jintArray JNICALL Java_org_intel_openvino_PartialShape_GetMaxShape(JNIEnv *env, jobject obj, jlong addr) { + JNI_METHOD("GetMaxShape", + PartialShape* partial_shape = (PartialShape *)addr; + Shape max_shape = partial_shape->get_max_shape(); + + jintArray result = env->NewIntArray(max_shape.size()); + if (!result) { + throw std::runtime_error("Out of memory!"); + } jint *arr = env->GetIntArrayElements(result, nullptr); + + for (int i = 0; i < max_shape.size(); ++i) + arr[i] = max_shape[i]; + + env->ReleaseIntArrayElements(result, arr, 0); + return result; + ) + return 0; +} + +JNIEXPORT jintArray JNICALL Java_org_intel_openvino_PartialShape_GetMinShape(JNIEnv *env, jobject obj, jlong addr) { + JNI_METHOD("GetMinShape", + PartialShape* partial_shape = (PartialShape *)addr; + Shape min_shape = partial_shape->get_min_shape(); + + jintArray result = env->NewIntArray(min_shape.size()); + if (!result) { + throw std::runtime_error("Out of memory!"); + } jint *arr = env->GetIntArrayElements(result, nullptr); + + for (int i = 0; i < min_shape.size(); ++i) + arr[i] = min_shape[i]; + + env->ReleaseIntArrayElements(result, arr, 0); + return result; + ) + return 0; +} diff --git a/modules/java_api/src/main/java/org/intel/openvino/Dimension.java b/modules/java_api/src/main/java/org/intel/openvino/Dimension.java index 789dd7025..b418f683e 100644 --- a/modules/java_api/src/main/java/org/intel/openvino/Dimension.java +++ b/modules/java_api/src/main/java/org/intel/openvino/Dimension.java @@ -23,7 +23,4 @@ public int get_length() { /*----------------------------------- native methods -----------------------------------*/ private static native int getLength(long addr); - - @Override - protected native void delete(long nativeObj); } diff --git a/modules/java_api/src/main/java/org/intel/openvino/Output.java b/modules/java_api/src/main/java/org/intel/openvino/Output.java index 8b77f3a80..ae1dab50d 100644 --- a/modules/java_api/src/main/java/org/intel/openvino/Output.java +++ b/modules/java_api/src/main/java/org/intel/openvino/Output.java @@ -20,6 +20,11 @@ public int[] get_shape() { return GetShape(nativeObj); } + /** Returns the partial shape of the output referred to by this output handle. */ + public PartialShape get_partial_shape() { + return new PartialShape(GetPartialShape(nativeObj)); + } + /** Returns the element type of the output referred to by this output handle. */ public ElementType get_element_type() { return ElementType.valueOf(GetElementType(nativeObj)); @@ -30,6 +35,8 @@ public ElementType get_element_type() { private static native int[] GetShape(long addr); + private static native long GetPartialShape(long addr); + private static native int GetElementType(long addr); @Override diff --git a/modules/java_api/src/main/java/org/intel/openvino/PartialShape.java b/modules/java_api/src/main/java/org/intel/openvino/PartialShape.java new file mode 100644 index 000000000..6a84a9c3a --- /dev/null +++ b/modules/java_api/src/main/java/org/intel/openvino/PartialShape.java @@ -0,0 +1,39 @@ +// Copyright (C) 2020-2023 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +package org.intel.openvino; + +/** This class represents the definitions and operations about partial shape. */ +public class PartialShape extends Wrapper { + + public PartialShape(long addr) { + super(addr); + } + + /** + * Get the dimension at specified index of a partial shape. + * + * @param index The index of dimension. + * @return The particular dimension of partial shape. + */ + public Dimension get_dimension(int index) { + return new Dimension(GetDimension(nativeObj, index)); + } + + /** Returns the max bounding shape. */ + public int[] get_max_shape() { + return GetMaxShape(nativeObj); + } + + /** Returns the min bounding shape. */ + public int[] get_min_shape() { + return GetMinShape(nativeObj); + } + + /*----------------------------------- native methods -----------------------------------*/ + private static native long GetDimension(long addr, int index); + + private static native int[] GetMaxShape(long addr); + + private static native int[] GetMinShape(long addr); +} diff --git a/modules/java_api/src/test/java/org/intel/openvino/ModelTests.java b/modules/java_api/src/test/java/org/intel/openvino/ModelTests.java index 2debe3e32..bb0ce5be7 100644 --- a/modules/java_api/src/test/java/org/intel/openvino/ModelTests.java +++ b/modules/java_api/src/test/java/org/intel/openvino/ModelTests.java @@ -44,6 +44,20 @@ public void testGetShape() { assertArrayEquals("Shape", ref, outputs.get(0).get_shape()); } + @Test + public void testGetPartialShape() { + ArrayList outputs = net.outputs(); + int[] ref = new int[] {1, 10}; + + PartialShape partialShape = outputs.get(0).get_partial_shape(); + for (int i = 0; i < ref.length; i++) { + Dimension dim = partialShape.get_dimension(i); + assertEquals(ref[i], dim.get_length()); + } + assertArrayEquals("MaxShape", ref, partialShape.get_max_shape()); + assertArrayEquals("MinShape", ref, partialShape.get_min_shape()); + } + @Test public void testReshape() { int[] inpDims = net.input().get_shape();