using Microsoft.VisualStudio.TestTools.UnitTesting; using Tensorflow.NumPy; using System.Linq; using static Tensorflow.Binding; using System; namespace TensorFlowNET.UnitTest.Basics { [TestClass] public class VariableTest : EagerModeTestBase { [TestMethod] public void NewVariable() { var x = tf.Variable(10, name: "x"); Assert.AreEqual(0, x.shape.ndim); Assert.AreEqual(x.numpy(), 10); } [TestMethod] public void StringVar() { var mammal1 = tf.Variable("Elephant", name: "var1", dtype: tf.@string); var mammal2 = tf.Variable("Tiger"); } [TestMethod] public void VarSum() { var x = tf.constant(3, name: "x"); var y = tf.Variable(x + 1, name: "y"); Assert.AreEqual(y.numpy(), 4); } [TestMethod] public void Assign1() { var variable = tf.Variable(31, name: "tree"); var unread = variable.assign(12); Assert.AreEqual(unread.numpy(), 12); } [TestMethod] public void Assign2() { var v1 = tf.Variable(10.0f, name: "v1"); var v2 = v1.assign(v1 + 1.0f); Assert.AreEqual(v1.numpy(), v2.numpy()); Assert.AreEqual(v1.numpy(), 11f); } [TestMethod] public void Assign3() { var v1 = tf.Variable(10.0f, name: "v1"); var v2 = tf.Variable(v1, name: "v2"); Assert.AreEqual(v1.numpy(), v2.numpy()); v1.assign(30.0f); Assert.AreNotEqual(v1.numpy(), v2.numpy()); } /// /// Assign tensor to slice of other tensor. /// https://www.tensorflow.org/api_docs/python/tf/Variable#__getitem__ /// [TestMethod] public void SliceAssign() { NDArray nd = new float[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; var x = tf.Variable(nd); // get slice form variable var sliced = x[":2", ":2"]; Assert.AreEqual(nd[0][":2"], sliced[0].numpy()); Assert.AreEqual(nd[1][":2"], sliced[1].numpy()); // assign to the sliced tensor sliced.assign(22 * tf.ones((2, 2))); // test assigned value nd = new float[,] { { 22, 22, 3 }, { 22, 22, 6 }, { 7, 8, 9 } }; Assert.AreEqual(nd[0], x[0].numpy()); Assert.AreEqual(nd[1], x[1].numpy()); Assert.AreEqual(nd[2], x[2].numpy()); } [TestMethod] [ExpectedException(typeof(ArrayTypeMismatchException))] public void TypeMismatchedSliceAssign() { NDArray intNd = new int[] { 1, -2, 3 }; NDArray doubleNd = new double[] { -5, 6, -7 }; var x = tf.Variable(doubleNd); x[":"].assign(intNd); } [TestMethod] public void Accumulation() { var x = tf.Variable(10, name: "x"); for (int i = 0; i < 5; i++) x.assign(x + 1); Assert.AreEqual(x.numpy(), 15); } [TestMethod] public void ShouldReturnNegative() { var x = tf.constant(new[,] { { 1, 2 } }); var neg_x = tf.negative(x); Assert.IsTrue(Enumerable.SequenceEqual(new long[] { 1, 2 }, neg_x.shape.dims)); Assert.IsTrue(Enumerable.SequenceEqual(new[] { -1, -2 }, neg_x.numpy().ToArray())); } [TestMethod] public void IdentityOriginalTensor() { var a = tf.Variable(5); var a_identity = tf.identity(a); a.assign_add(1); Assert.AreEqual(a_identity.numpy(), 5); Assert.AreEqual(a.numpy(), 6); } } }