using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using Tensorflow; using Tensorflow.Graphs; using static Tensorflow.Binding; namespace TensorFlowNET.UnitTest.ManagedAPI { [TestClass] public class FunctionApiTest : EagerModeTestBase { Tensor Min(Tensor a, Tensor b) { return tf.cond(a < b, () => a, () => b); } [TestMethod] public void MulInAutoGraph() { var a = tf.constant(1); var b = tf.constant(2); // For first time running, tf.net will record the operations in graph mode. // And register to tensorflow op library. var output = Mul(a, b); Assert.AreEqual(2, (int)output); var c = tf.constant(3); // for the following invoke, Mul will be intercepted and run it in eager mode. output = Mul(b, c); Assert.AreEqual(6, (int)output); } /// /// Method with AutoGraph attribute will be converted to FuncGraph /// when it's invoked for the first time. /// /// /// /// [AutoGraph] Tensor Mul(Tensor a, Tensor b) { return a * b; } [TestMethod] public void TwoInputs_OneOutput() { var func = tf.autograph.to_graph(Add); var a = tf.constant(1); var b = tf.constant(2); var output = func(a, b); Assert.AreEqual(3, (int)output); } Tensor Add(Tensor a, Tensor b) { return a + b; } [TestMethod] public void TwoInputs_OneOutput_Condition() { var func = tf.autograph.to_graph(Condition); var a = tf.constant(3); var b = tf.constant(2); var output = func(a, b); Assert.AreEqual(2, (int)output); } Tensor Condition(Tensor a, Tensor b) { return tf.cond(a < b, a, b); } [TestMethod] public void TwoInputs_OneOutput_Lambda() { var func = tf.autograph.to_graph((x, y) => x * y); var output = func(tf.constant(3), tf.constant(2)); Assert.AreEqual(6, (int)output); } [TestMethod] public void TwoInputs_OneOutput_WhileLoop() { var func = tf.autograph.to_graph((x, y) => x * y); var output = func(tf.constant(3), tf.constant(2)); Assert.AreEqual(6, (int)output); } Tensor WhileLoop() { var i = tf.constant(0); Func c = i => tf.less(i, 10); Func b = i => tf.add(i, 1); //var r = tf.(c, b, [i]) throw new NotImplementedException(""); } } }