diff --git a/inference/inference-core/src/commonMain/kotlin/io/kinference.core/operators/KIOperatorFactory.kt b/inference/inference-core/src/commonMain/kotlin/io/kinference.core/operators/KIOperatorFactory.kt index 077c2e018..ade212a36 100755 --- a/inference/inference-core/src/commonMain/kotlin/io/kinference.core/operators/KIOperatorFactory.kt +++ b/inference/inference-core/src/commonMain/kotlin/io/kinference.core/operators/KIOperatorFactory.kt @@ -126,6 +126,7 @@ object KIOperatorFactory : OperatorFactory> { "ScatterND" -> ScatterND(name, version, attributes, inputs, outputs) "Shape" -> Shape(name, version, attributes, inputs, outputs) "Sigmoid" -> Sigmoid(name, version, attributes, inputs, outputs) + "Size" -> Size(name, version, attributes, inputs, outputs) "SkipLayerNormalization" -> SkipLayerNormalization(name, version, attributes, inputs, outputs) "Slice" -> Slice(name, version, attributes, inputs, outputs) "Softmax" -> Softmax(name, version, attributes, inputs, outputs) diff --git a/inference/inference-core/src/commonMain/kotlin/io/kinference.core/operators/tensor/Size.kt b/inference/inference-core/src/commonMain/kotlin/io/kinference.core/operators/tensor/Size.kt new file mode 100644 index 000000000..ee3bc7ec8 --- /dev/null +++ b/inference/inference-core/src/commonMain/kotlin/io/kinference.core/operators/tensor/Size.kt @@ -0,0 +1,58 @@ +package io.kinference.core.operators.tensor + +import io.kinference.attribute.Attribute +import io.kinference.core.data.tensor.KITensor +import io.kinference.core.data.tensor.asTensor +import io.kinference.data.ONNXData +import io.kinference.graph.Contexts +import io.kinference.ndarray.arrays.* +import io.kinference.operator.* +import io.kinference.protobuf.message.TensorProto + +sealed class Size( + name: String, + info: OperatorInfo, + attributes: Map>, + inputs: List, + outputs: List +) : Operator(name, info, attributes, inputs, outputs) { + companion object { + private val DEFAULT_VERSION = VersionInfo(sinceVersion = 1) + + operator fun invoke(name: String, version: Int?, attributes: Map>, inputs: List, outputs: List): Size { + return when (version ?: DEFAULT_VERSION.sinceVersion) { + in SizeVer1.VERSION.asRange() -> SizeVer1(name, attributes, inputs, outputs) + else -> error("Unsupported version of Size operator: $version") + } + } + } +} + + +class SizeVer1( + name: String, + attributes: Map>, + inputs: List, + outputs: List +) : Size(name, INFO, attributes, inputs, outputs) { + companion object { + private val ATTRIBUTES_INFO = emptyList() + + private val INPUTS_INFO = listOf( + IOInfo(0, PRIMITIVE_DATA_TYPES, "data", differentiable = true, optional = false) + ) + + private val OUTPUTS_INFO = listOf( + IOInfo(0, setOf(TensorProto.DataType.INT64), "size", differentiable = true, optional = false) + ) + + internal val VERSION = VersionInfo(sinceVersion = 1) + private val INFO = OperatorInfo("Size", ATTRIBUTES_INFO, INPUTS_INFO, OUTPUTS_INFO, VERSION, OperatorInfo.DEFAULT_DOMAIN) + } + + override suspend fun > apply(contexts: Contexts, inputs: List): List { + val inputSize = inputs[0]!!.data.linearSize + val dataSize = LongNDArray.scalar(inputSize.toLong()) + return listOf(dataSize.asTensor("size")) + } +} diff --git a/inference/inference-core/src/commonTest/kotlin/io/kinference/operators/activations/TanTest.kt b/inference/inference-core/src/commonTest/kotlin/io/kinference/operators/activations/TanTest.kt index a9366b052..b4dc5ddcd 100644 --- a/inference/inference-core/src/commonTest/kotlin/io/kinference/operators/activations/TanTest.kt +++ b/inference/inference-core/src/commonTest/kotlin/io/kinference/operators/activations/TanTest.kt @@ -8,12 +8,12 @@ class TanTest { private fun getTargetPath(dirName: String) = "tan/$dirName/" @Test - fun test_tanh_example() = TestRunner.runTest { + fun test_tan_example() = TestRunner.runTest { KITestEngine.KIAccuracyRunner.runFromResources(getTargetPath("test_tan_example")) } @Test - fun test_tanh() = TestRunner.runTest { + fun test_tan() = TestRunner.runTest { KITestEngine.KIAccuracyRunner.runFromResources(getTargetPath("test_tan")) } } diff --git a/inference/inference-core/src/commonTest/kotlin/io/kinference/operators/operations/SizeTest.kt b/inference/inference-core/src/commonTest/kotlin/io/kinference/operators/operations/SizeTest.kt new file mode 100644 index 000000000..5b9281012 --- /dev/null +++ b/inference/inference-core/src/commonTest/kotlin/io/kinference/operators/operations/SizeTest.kt @@ -0,0 +1,19 @@ +package io.kinference.operators.operations + +import io.kinference.KITestEngine +import io.kinference.utils.TestRunner +import kotlin.test.Test + +class SizeTest { + private fun getTargetPath(dirName: String) = "size/$dirName/" + + @Test + fun test_size_example() = TestRunner.runTest { + KITestEngine.KIAccuracyRunner.runFromResources(getTargetPath("test_size_example")) + } + + @Test + fun test_size() = TestRunner.runTest { + KITestEngine.KIAccuracyRunner.runFromResources(getTargetPath("test_size")) + } +} diff --git a/inference/inference-tfjs/src/jsMain/kotlin/io.kinference.tfjs/operators/TFJSOperatorFactory.kt b/inference/inference-tfjs/src/jsMain/kotlin/io.kinference.tfjs/operators/TFJSOperatorFactory.kt index 3c82fec04..dc1bf81fe 100755 --- a/inference/inference-tfjs/src/jsMain/kotlin/io.kinference.tfjs/operators/TFJSOperatorFactory.kt +++ b/inference/inference-tfjs/src/jsMain/kotlin/io.kinference.tfjs/operators/TFJSOperatorFactory.kt @@ -109,6 +109,7 @@ object TFJSOperatorFactory : OperatorFactory> { "ScatterND" -> ScatterND(name, version, attributes, inputs, outputs) "Shape" -> Shape(name, version, attributes, inputs, outputs) "Sigmoid" -> Sigmoid(name, version, attributes, inputs, outputs) + "Size" -> Size(name, version, attributes, inputs, outputs) "SkipLayerNormalization" -> SkipLayerNormalization(name, version, attributes, inputs, outputs) "Slice" -> Slice(name, version, attributes, inputs, outputs) "Softmax" -> Softmax(name, version, attributes, inputs, outputs) diff --git a/inference/inference-tfjs/src/jsMain/kotlin/io.kinference.tfjs/operators/tensor/Size.kt b/inference/inference-tfjs/src/jsMain/kotlin/io.kinference.tfjs/operators/tensor/Size.kt new file mode 100644 index 000000000..744557d46 --- /dev/null +++ b/inference/inference-tfjs/src/jsMain/kotlin/io.kinference.tfjs/operators/tensor/Size.kt @@ -0,0 +1,58 @@ +package io.kinference.tfjs.operators.tensor + +import io.kinference.attribute.Attribute +import io.kinference.data.ONNXData +import io.kinference.graph.Contexts +import io.kinference.ndarray.arrays.NDArrayTFJS +import io.kinference.operator.* +import io.kinference.protobuf.message.TensorProto +import io.kinference.tfjs.data.tensors.TFJSTensor +import io.kinference.tfjs.data.tensors.asTensor + +sealed class Size( + name: String, + info: OperatorInfo, + attributes: Map>, + inputs: List, + outputs: List +) : Operator(name, info, attributes, inputs, outputs) { + companion object { + private val DEFAULT_VERSION = VersionInfo(sinceVersion = 1) + + operator fun invoke(name: String, version: Int?, attributes: Map>, inputs: List, outputs: List): Size { + return when (version ?: DEFAULT_VERSION.sinceVersion) { + in SizeVer1.VERSION.asRange() -> SizeVer1(name, attributes, inputs, outputs) + else -> error("Unsupported version of Size operator: $version") + } + } + } +} + + +class SizeVer1( + name: String, + attributes: Map>, + inputs: List, + outputs: List +) : Size(name, INFO, attributes, inputs, outputs) { + companion object { + private val ATTRIBUTES_INFO = emptyList() + + private val INPUTS_INFO = listOf( + IOInfo(0, PRIMITIVE_DATA_TYPES, "data", differentiable = true, optional = false) + ) + + private val OUTPUTS_INFO = listOf( + IOInfo(0, setOf(TensorProto.DataType.INT64), "size", differentiable = true, optional = false) + ) + + internal val VERSION = VersionInfo(sinceVersion = 1) + private val INFO = OperatorInfo("Size", ATTRIBUTES_INFO, INPUTS_INFO, OUTPUTS_INFO, VERSION, OperatorInfo.DEFAULT_DOMAIN) + } + + override suspend fun > apply(contexts: Contexts, inputs: List): List { + val inputSize = inputs[0]!!.data.linearSize + val dataSize = NDArrayTFJS.intScalar(inputSize) + return listOf(dataSize.asTensor("size")) + } +} diff --git a/inference/inference-tfjs/src/jsTest/kotlin/io/kinference/tfjs/operators/activations/TanTest.kt b/inference/inference-tfjs/src/jsTest/kotlin/io/kinference/tfjs/operators/activations/TanTest.kt index 84aa3099f..35dae8ec6 100644 --- a/inference/inference-tfjs/src/jsTest/kotlin/io/kinference/tfjs/operators/activations/TanTest.kt +++ b/inference/inference-tfjs/src/jsTest/kotlin/io/kinference/tfjs/operators/activations/TanTest.kt @@ -8,12 +8,12 @@ class TanTest { private fun getTargetPath(dirName: String) = "tan/$dirName/" @Test - fun test_tanh_example() = TestRunner.runTest { + fun test_tan_example() = TestRunner.runTest { TFJSAccuracyRunner.runFromResources(getTargetPath("test_tan_example")) } @Test - fun test_tanh() = TestRunner.runTest { + fun test_tan() = TestRunner.runTest { TFJSAccuracyRunner.runFromResources(getTargetPath("test_tan")) } } diff --git a/inference/inference-tfjs/src/jsTest/kotlin/io/kinference/tfjs/operators/tensor/SizeTest.kt b/inference/inference-tfjs/src/jsTest/kotlin/io/kinference/tfjs/operators/tensor/SizeTest.kt new file mode 100644 index 000000000..8976ba6fd --- /dev/null +++ b/inference/inference-tfjs/src/jsTest/kotlin/io/kinference/tfjs/operators/tensor/SizeTest.kt @@ -0,0 +1,19 @@ +package io.kinference.tfjs.operators.tensor + +import io.kinference.tfjs.runners.TFJSTestEngine.TFJSAccuracyRunner +import io.kinference.utils.TestRunner +import kotlin.test.Test + +class SizeTest { + private fun getTargetPath(dirName: String) = "size/$dirName/" + + @Test + fun test_size_example() = TestRunner.runTest { + TFJSAccuracyRunner.runFromResources(getTargetPath("test_size_example")) + } + + @Test + fun test_size() = TestRunner.runTest { + TFJSAccuracyRunner.runFromResources(getTargetPath("test_size")) + } +} diff --git a/utils/utils-testing/src/commonMain/resources/size/test_size/descriptor.txt b/utils/utils-testing/src/commonMain/resources/size/test_size/descriptor.txt new file mode 100644 index 000000000..7967d1896 --- /dev/null +++ b/utils/utils-testing/src/commonMain/resources/size/test_size/descriptor.txt @@ -0,0 +1,2 @@ +test_data_set_0/input_0.pb +test_data_set_0/output_0.pb \ No newline at end of file diff --git a/utils/utils-testing/src/commonMain/resources/size/test_size/model.onnx b/utils/utils-testing/src/commonMain/resources/size/test_size/model.onnx new file mode 100644 index 000000000..215968302 Binary files /dev/null and b/utils/utils-testing/src/commonMain/resources/size/test_size/model.onnx differ diff --git a/utils/utils-testing/src/commonMain/resources/size/test_size/test_data_set_0/input_0.pb b/utils/utils-testing/src/commonMain/resources/size/test_size/test_data_set_0/input_0.pb new file mode 100644 index 000000000..bae0ffd63 --- /dev/null +++ b/utils/utils-testing/src/commonMain/resources/size/test_size/test_data_set_0/input_0.pb @@ -0,0 +1 @@ +BxJx?h>z?j@$ ?.z8s?bhdӽ9>(>%?^B?0= B>]ת>=?RiJ>Z/d#S'?K]?=C@(Hm;= ?2??>>Ec! >*z??Oƾmǚ6&õgڿ?xFKྙ[ G?4οYL=e> kQN>.:=ݚ>b"6 \ No newline at end of file diff --git a/utils/utils-testing/src/commonMain/resources/size/test_size/test_data_set_0/output_0.pb b/utils/utils-testing/src/commonMain/resources/size/test_size/test_data_set_0/output_0.pb new file mode 100644 index 000000000..2355ec352 Binary files /dev/null and b/utils/utils-testing/src/commonMain/resources/size/test_size/test_data_set_0/output_0.pb differ diff --git a/utils/utils-testing/src/commonMain/resources/size/test_size_example/descriptor.txt b/utils/utils-testing/src/commonMain/resources/size/test_size_example/descriptor.txt new file mode 100644 index 000000000..7967d1896 --- /dev/null +++ b/utils/utils-testing/src/commonMain/resources/size/test_size_example/descriptor.txt @@ -0,0 +1,2 @@ +test_data_set_0/input_0.pb +test_data_set_0/output_0.pb \ No newline at end of file diff --git a/utils/utils-testing/src/commonMain/resources/size/test_size_example/model.onnx b/utils/utils-testing/src/commonMain/resources/size/test_size_example/model.onnx new file mode 100644 index 000000000..1cff6f9be Binary files /dev/null and b/utils/utils-testing/src/commonMain/resources/size/test_size_example/model.onnx differ diff --git a/utils/utils-testing/src/commonMain/resources/size/test_size_example/test_data_set_0/input_0.pb b/utils/utils-testing/src/commonMain/resources/size/test_size_example/test_data_set_0/input_0.pb new file mode 100644 index 000000000..9a18aeeb9 Binary files /dev/null and b/utils/utils-testing/src/commonMain/resources/size/test_size_example/test_data_set_0/input_0.pb differ diff --git a/utils/utils-testing/src/commonMain/resources/size/test_size_example/test_data_set_0/output_0.pb b/utils/utils-testing/src/commonMain/resources/size/test_size_example/test_data_set_0/output_0.pb new file mode 100644 index 000000000..6ca8cb761 Binary files /dev/null and b/utils/utils-testing/src/commonMain/resources/size/test_size_example/test_data_set_0/output_0.pb differ