From 9196fa7b9e1c92f2b45c14b80140332090a459bb Mon Sep 17 00:00:00 2001 From: Rajat Date: Thu, 29 Feb 2024 14:54:21 -0500 Subject: [PATCH 1/5] Get partial shape from output --- .../java_api/src/main/cpp/openvino_java.hpp | 6 ++ modules/java_api/src/main/cpp/output.cpp | 10 ++++ .../java_api/src/main/cpp/partial_shape.cpp | 58 +++++++++++++++++++ .../main/java/org/intel/openvino/Output.java | 7 +++ .../java/org/intel/openvino/PartialShape.java | 39 +++++++++++++ .../java/org/intel/openvino/ModelTests.java | 13 +++++ 6 files changed, 133 insertions(+) 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/openvino_java.hpp b/modules/java_api/src/main/cpp/openvino_java.hpp index f78bad6f3..68273c5e4 100644 --- a/modules/java_api/src/main/cpp/openvino_java.hpp +++ b/modules/java_api/src/main/cpp/openvino_java.hpp @@ -112,9 +112,15 @@ extern "C" // 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..68105e1f6 --- /dev/null +++ b/modules/java_api/src/main/cpp/partial_shape.cpp @@ -0,0 +1,58 @@ +// 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; + Dimension dimension = (*partial_shape)[index]; + + return (jlong) dimension.get_length(); + ) + 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/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..4449c6f1d --- /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 long get_dimension(int index) { + return 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..2d1289362 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,19 @@ 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++) { + assertEquals(ref[i], partialShape.get_dimension(i)); + } + assertArrayEquals("MaxShape", ref, partialShape.get_max_shape()); + assertArrayEquals("MinShape", ref, partialShape.get_min_shape()); + } + @Test public void testReshape() { int[] inpDims = net.input().get_shape(); From 764ca2d430bd7678c74759b39e5cc11d69d632a8 Mon Sep 17 00:00:00 2001 From: Rajat Date: Mon, 11 Mar 2024 11:16:16 -0400 Subject: [PATCH 2/5] Update PartialShape getDimension to align with C++ API --- modules/java_api/src/main/cpp/partial_shape.cpp | 4 +--- .../src/main/java/org/intel/openvino/PartialShape.java | 4 ++-- .../java_api/src/test/java/org/intel/openvino/ModelTests.java | 3 ++- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/java_api/src/main/cpp/partial_shape.cpp b/modules/java_api/src/main/cpp/partial_shape.cpp index 68105e1f6..37fa5e555 100644 --- a/modules/java_api/src/main/cpp/partial_shape.cpp +++ b/modules/java_api/src/main/cpp/partial_shape.cpp @@ -12,9 +12,7 @@ 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; - Dimension dimension = (*partial_shape)[index]; - - return (jlong) dimension.get_length(); + return (jlong) &(*partial_shape)[index]; ) return 0; } 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 index 4449c6f1d..6a84a9c3a 100644 --- a/modules/java_api/src/main/java/org/intel/openvino/PartialShape.java +++ b/modules/java_api/src/main/java/org/intel/openvino/PartialShape.java @@ -16,8 +16,8 @@ public PartialShape(long addr) { * @param index The index of dimension. * @return The particular dimension of partial shape. */ - public long get_dimension(int index) { - return GetDimension(nativeObj, index); + public Dimension get_dimension(int index) { + return new Dimension(GetDimension(nativeObj, index)); } /** Returns the max bounding shape. */ 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 2d1289362..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 @@ -51,7 +51,8 @@ public void testGetPartialShape() { PartialShape partialShape = outputs.get(0).get_partial_shape(); for (int i = 0; i < ref.length; i++) { - assertEquals(ref[i], partialShape.get_dimension(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()); From 93c5f4c1be1864f281a69acbba84be54d7f8059c Mon Sep 17 00:00:00 2001 From: Rajat Krishna Date: Mon, 11 Mar 2024 14:17:34 -0400 Subject: [PATCH 3/5] Use pointer arithmetic to access Partial Shape dimension Co-authored-by: Nesterov Alexander --- modules/java_api/src/main/cpp/partial_shape.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/java_api/src/main/cpp/partial_shape.cpp b/modules/java_api/src/main/cpp/partial_shape.cpp index 37fa5e555..327dda7e2 100644 --- a/modules/java_api/src/main/cpp/partial_shape.cpp +++ b/modules/java_api/src/main/cpp/partial_shape.cpp @@ -12,7 +12,7 @@ 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 (jlong) (partial_shape + index); ) return 0; } From c51d7ab91b3c6bd2332041074ae7f304ab068209 Mon Sep 17 00:00:00 2001 From: Rajat Date: Mon, 11 Mar 2024 16:03:40 -0400 Subject: [PATCH 4/5] Remove redundant delete method --- modules/java_api/src/main/cpp/dimension.cpp | 6 ------ modules/java_api/src/main/cpp/openvino_java.hpp | 1 - .../src/main/java/org/intel/openvino/Dimension.java | 3 --- 3 files changed, 10 deletions(-) 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 68273c5e4..664ffa7bb 100644 --- a/modules/java_api/src/main/cpp/openvino_java.hpp +++ b/modules/java_api/src/main/cpp/openvino_java.hpp @@ -107,7 +107,6 @@ 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); 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); } From 49ef785129d6b93e0fd65589b315bc92b5a4d0f9 Mon Sep 17 00:00:00 2001 From: Rajat Date: Mon, 11 Mar 2024 19:14:08 -0400 Subject: [PATCH 5/5] Revert "Use pointer arithmetic to access Partial Shape dimension" --- modules/java_api/src/main/cpp/partial_shape.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/java_api/src/main/cpp/partial_shape.cpp b/modules/java_api/src/main/cpp/partial_shape.cpp index 327dda7e2..37fa5e555 100644 --- a/modules/java_api/src/main/cpp/partial_shape.cpp +++ b/modules/java_api/src/main/cpp/partial_shape.cpp @@ -12,7 +12,7 @@ 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 (jlong) &(*partial_shape)[index]; ) return 0; }