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);
}
}
}