using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using Tensorflow.Eager; using static Tensorflow.Binding; namespace Tensorflow.Native.UnitTest.Eager { public partial class CApiEagerTest { /// /// TEST(CAPI, Execute_MatMul_CPU) /// [TestMethod] public unsafe void Execute_MatMul_CPU() { Execute_MatMul_CPU(false); } unsafe void Execute_MatMul_CPU(bool async) { using var status = TF_NewStatus(); static SafeContextHandle NewContext(bool async, SafeStatusHandle status) { using var opts = c_api.TFE_NewContextOptions(); c_api.TFE_ContextOptionsSetAsync(opts, Convert.ToByte(async)); return c_api.TFE_NewContext(opts, status); } SafeTensorHandle t; using (var ctx = NewContext(async, status)) { CHECK_EQ(TF_OK, TF_GetCode(status), TF_Message(status)); var retvals = new SafeEagerTensorHandle[2]; using (var m = TestMatrixTensorHandle()) using (var matmul = MatMulOp(ctx, m, m)) { int num_retvals; c_api.TFE_Execute(matmul, retvals, out num_retvals, status); EXPECT_EQ(1, num_retvals); EXPECT_EQ(TF_OK, TF_GetCode(status), TF_Message(status)); } try { t = TFE_TensorHandleResolve(retvals[0], status); ASSERT_EQ(TF_OK, TF_GetCode(status), TF_Message(status)); } finally { retvals[0].Dispose(); } } ASSERT_EQ(TF_OK, TF_GetCode(status), TF_Message(status)); var product = new float[4]; EXPECT_EQ(product.Length * sizeof(float), (int)TF_TensorByteSize(t)); tf.memcpy(product, TF_TensorData(t), TF_TensorByteSize(t)); t.Dispose(); EXPECT_EQ(7f, product[0]); EXPECT_EQ(10f, product[1]); EXPECT_EQ(15f, product[2]); EXPECT_EQ(22f, product[3]); } } }