From 724d99bef8f01516ac531b6230962e210e1b3db6 Mon Sep 17 00:00:00 2001 From: Jared Duke Date: Mon, 18 Mar 2019 12:00:33 -0700 Subject: [PATCH] Add TensorFlow Lite runtime version This version is shared with the TensorFlow runtime version. PiperOrigin-RevId: 239032347 --- tensorflow/lite/BUILD | 12 ++++++++++-- tensorflow/lite/examples/label_image/BUILD | 1 - .../examples/label_image/bitmap_helpers_impl.h | 1 - tensorflow/lite/experimental/c/BUILD | 1 + tensorflow/lite/experimental/c/c_api.cc | 3 +++ tensorflow/lite/experimental/c/c_api.h | 5 +++++ tensorflow/lite/experimental/c/c_api_test.cc | 2 ++ .../main/java/org/tensorflow/lite/DataType.java | 2 +- .../java/org/tensorflow/lite/TensorFlowLite.java | 15 ++++++++++++++- .../java/src/main/native/tensorflow_lite_jni.cc | 9 ++++++++- .../java/src/main/native/tensorflow_lite_jni.h | 12 ++++++++++-- .../org/tensorflow/lite/TensorFlowLiteTest.java | 11 +++++++++++ tensorflow/lite/version.h | 6 ++++++ 13 files changed, 71 insertions(+), 9 deletions(-) diff --git a/tensorflow/lite/BUILD b/tensorflow/lite/BUILD index e9eb7af8ea4..8fea881f719 100644 --- a/tensorflow/lite/BUILD +++ b/tensorflow/lite/BUILD @@ -45,9 +45,17 @@ TFLITE_DEFAULT_COPTS = if_not_windows([ ]) cc_library( - name = "schema_fbs_version", + name = "version", hdrs = ["version.h"], copts = TFLITE_DEFAULT_COPTS, + # Note that we only use the header defines from :version_lib. + deps = ["//tensorflow/core:version_lib"], +) + +# TODO(b/128420794): Migrate clients to use :version directly. +alias( + name = "schema_fbs_version", + actual = ":version", ) cc_library( @@ -181,10 +189,10 @@ cc_library( ":graph_info", ":memory_planner", ":minimal_logging", - ":schema_fbs_version", ":simple_memory_arena", ":string", ":util", + ":version", "//tensorflow/lite/c:c_api_internal", "//tensorflow/lite/core/api", "//tensorflow/lite/nnapi:nnapi_implementation", diff --git a/tensorflow/lite/examples/label_image/BUILD b/tensorflow/lite/examples/label_image/BUILD index 75e1add6019..088cd2f78ac 100644 --- a/tensorflow/lite/examples/label_image/BUILD +++ b/tensorflow/lite/examples/label_image/BUILD @@ -44,7 +44,6 @@ cc_library( deps = [ "//tensorflow/lite:builtin_op_data", "//tensorflow/lite:framework", - "//tensorflow/lite:schema_fbs_version", "//tensorflow/lite:string", "//tensorflow/lite:string_util", "//tensorflow/lite/kernels:builtin_ops", diff --git a/tensorflow/lite/examples/label_image/bitmap_helpers_impl.h b/tensorflow/lite/examples/label_image/bitmap_helpers_impl.h index b581d807734..9015b93cc1e 100644 --- a/tensorflow/lite/examples/label_image/bitmap_helpers_impl.h +++ b/tensorflow/lite/examples/label_image/bitmap_helpers_impl.h @@ -22,7 +22,6 @@ limitations under the License. #include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/string_util.h" -#include "tensorflow/lite/version.h" namespace tflite { namespace label_image { diff --git a/tensorflow/lite/experimental/c/BUILD b/tensorflow/lite/experimental/c/BUILD index aef39db0214..f9608034f7b 100644 --- a/tensorflow/lite/experimental/c/BUILD +++ b/tensorflow/lite/experimental/c/BUILD @@ -64,6 +64,7 @@ cc_library( ":c_api_internal", "//tensorflow/lite:context", "//tensorflow/lite:framework", + "//tensorflow/lite:version", "//tensorflow/lite/kernels:builtin_ops", ], ) diff --git a/tensorflow/lite/experimental/c/c_api.cc b/tensorflow/lite/experimental/c/c_api.cc index 9caacfeb361..f5d89b7308f 100644 --- a/tensorflow/lite/experimental/c/c_api.cc +++ b/tensorflow/lite/experimental/c/c_api.cc @@ -22,6 +22,7 @@ limitations under the License. #include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/model.h" +#include "tensorflow/lite/version.h" #ifdef __cplusplus extern "C" { @@ -49,6 +50,8 @@ class CallbackErrorReporter : public tflite::ErrorReporter { // LINT.IfChange +const char* TFL_Version() { return TFLITE_VERSION_STRING; } + TFL_Model* TFL_NewModel(const void* model_data, size_t model_size) { auto model = tflite::FlatBufferModel::BuildFromBuffer( static_cast(model_data), model_size); diff --git a/tensorflow/lite/experimental/c/c_api.h b/tensorflow/lite/experimental/c/c_api.h index 49089011d13..dbb371206f9 100644 --- a/tensorflow/lite/experimental/c/c_api.h +++ b/tensorflow/lite/experimental/c/c_api.h @@ -59,6 +59,11 @@ typedef TfLiteStatus TFL_Status; typedef TfLiteTensor TFL_Tensor; typedef TfLiteType TFL_Type; +// -------------------------------------------------------------------------- +// TFL_Version returns a string describing version information of the +// TensorFlow Lite library. TensorFlow Lite uses semantic versioning. +TFL_CAPI_EXPORT extern const char* TFL_Version(void); + // -------------------------------------------------------------------------- // TFL_Model wraps a loaded TensorFlow Lite model. typedef struct TFL_Model TFL_Model; diff --git a/tensorflow/lite/experimental/c/c_api_test.cc b/tensorflow/lite/experimental/c/c_api_test.cc index 5fb14f342cb..bf2dcb4ec7f 100644 --- a/tensorflow/lite/experimental/c/c_api_test.cc +++ b/tensorflow/lite/experimental/c/c_api_test.cc @@ -23,6 +23,8 @@ limitations under the License. namespace { +TEST(CAPI, Version) { EXPECT_STRNE("", TFL_Version()); } + TEST(CApiSimple, Smoke) { TFL_Model* model = TFL_NewModelFromFile( "tensorflow/lite/testdata/add.bin"); diff --git a/tensorflow/lite/java/src/main/java/org/tensorflow/lite/DataType.java b/tensorflow/lite/java/src/main/java/org/tensorflow/lite/DataType.java index bd47574f71b..407e01c6e17 100644 --- a/tensorflow/lite/java/src/main/java/org/tensorflow/lite/DataType.java +++ b/tensorflow/lite/java/src/main/java/org/tensorflow/lite/DataType.java @@ -72,7 +72,7 @@ public enum DataType { "DataType error: DataType " + c + " is not recognized in Java (version " - + TensorFlowLite.version() + + TensorFlowLite.runtimeVersion() + ")"); } diff --git a/tensorflow/lite/java/src/main/java/org/tensorflow/lite/TensorFlowLite.java b/tensorflow/lite/java/src/main/java/org/tensorflow/lite/TensorFlowLite.java index deded101828..2b82f04f760 100644 --- a/tensorflow/lite/java/src/main/java/org/tensorflow/lite/TensorFlowLite.java +++ b/tensorflow/lite/java/src/main/java/org/tensorflow/lite/TensorFlowLite.java @@ -23,8 +23,21 @@ public final class TensorFlowLite { private TensorFlowLite() {} + /** + * Returns the version of the underlying TensorFlowLite model schema. + * + * @deprecated Prefer using {@link #runtimeVersion() or #schemaVersion()}. + */ + @Deprecated + public static String version() { + return schemaVersion(); + } + /** Returns the version of the underlying TensorFlowLite runtime. */ - public static native String version(); + public static native String runtimeVersion(); + + /** Returns the version of the underlying TensorFlowLite model schema. */ + public static native String schemaVersion(); /** * Initialize tensorflow's libraries. This will throw an exception if used when TensorFlow isn't diff --git a/tensorflow/lite/java/src/main/native/tensorflow_lite_jni.cc b/tensorflow/lite/java/src/main/native/tensorflow_lite_jni.cc index 2b8cf4201ce..54a97ce013a 100644 --- a/tensorflow/lite/java/src/main/native/tensorflow_lite_jni.cc +++ b/tensorflow/lite/java/src/main/native/tensorflow_lite_jni.cc @@ -19,7 +19,14 @@ limitations under the License. #include "tensorflow/lite/version.h" JNIEXPORT jstring JNICALL -Java_org_tensorflow_lite_TensorFlowLite_version(JNIEnv* env, jclass /*clazz*/) { +Java_org_tensorflow_lite_TensorFlowLite_runtimeVersion(JNIEnv* env, + jclass /*clazz*/) { + const char* kTfLiteVersionString = TFLITE_VERSION_STRING; + return env->NewStringUTF(kTfLiteVersionString); +} + +JNIEXPORT jstring JNICALL Java_org_tensorflow_lite_TensorFlowLite_schemaVersion( + JNIEnv* env, jclass /*clazz*/) { char buf[64]; snprintf(buf, sizeof(buf), "%d", TFLITE_SCHEMA_VERSION); return env->NewStringUTF(buf); diff --git a/tensorflow/lite/java/src/main/native/tensorflow_lite_jni.h b/tensorflow/lite/java/src/main/native/tensorflow_lite_jni.h index de3e703110c..7de218e7bf4 100644 --- a/tensorflow/lite/java/src/main/native/tensorflow_lite_jni.h +++ b/tensorflow/lite/java/src/main/native/tensorflow_lite_jni.h @@ -24,11 +24,19 @@ extern "C" { /* * Class: org_tensorflow_lite_TensorFlowLite - * Method: version + * Method: runtimeVersion * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL -Java_org_tensorflow_lite_TensorFlowLite_version(JNIEnv*, jclass); +Java_org_tensorflow_lite_TensorFlowLite_runtimeVersion(JNIEnv*, jclass); + +/* + * Class: org_tensorflow_lite_TensorFlowLite + * Method: schemaVersion + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL +Java_org_tensorflow_lite_TensorFlowLite_schemaVersion(JNIEnv*, jclass); #ifdef __cplusplus } // extern "C" diff --git a/tensorflow/lite/java/src/test/java/org/tensorflow/lite/TensorFlowLiteTest.java b/tensorflow/lite/java/src/test/java/org/tensorflow/lite/TensorFlowLiteTest.java index 665c937cb60..bf5c5ee0b80 100644 --- a/tensorflow/lite/java/src/test/java/org/tensorflow/lite/TensorFlowLiteTest.java +++ b/tensorflow/lite/java/src/test/java/org/tensorflow/lite/TensorFlowLiteTest.java @@ -26,7 +26,18 @@ import org.junit.runners.JUnit4; public final class TensorFlowLiteTest { @Test + @SuppressWarnings("deprecation") public void testVersion() { assertThat(TensorFlowLite.version()).isEqualTo("3"); } + + @Test + public void testSchemaVersion() { + assertThat(TensorFlowLite.schemaVersion()).isEqualTo("3"); + } + + @Test + public void testRuntimeVersion() { + assertThat(TensorFlowLite.runtimeVersion()).startsWith("1."); + } } diff --git a/tensorflow/lite/version.h b/tensorflow/lite/version.h index 639d5a336a1..f667447bc47 100644 --- a/tensorflow/lite/version.h +++ b/tensorflow/lite/version.h @@ -15,9 +15,15 @@ limitations under the License. #ifndef TENSORFLOW_LITE_VERSION_H_ #define TENSORFLOW_LITE_VERSION_H_ +#include "tensorflow/core/public/version.h" + // The version number of the Schema. Ideally all changes will be backward // compatible. If that ever changes, we must ensure that version is the first // entry in the new tflite root so that we can see that version is not 1. #define TFLITE_SCHEMA_VERSION (3) +// TensorFlow Lite Runtime version. +// This value is currently shared with that of TensorFlow. +#define TFLITE_VERSION_STRING TF_VERSION_STRING + #endif // TENSORFLOW_LITE_VERSION_H_