using Microsoft.VisualStudio.TestTools.UnitTesting;
using Tensorflow;
namespace TensorFlowNET.UnitTest.control_flow_ops_test
{
///
/// excerpt of tensorflow/python/framework/ops/control_flow_ops_test.py
///
[TestClass]
public class SwitchTestCase : PythonTest
{
[Ignore("TODO")]
[TestMethod]
public void testResourceReadInLoop()
{
//var embedding_matrix = variable_scope.get_variable(
//"embedding_matrix", initializer: new double[,] { { 2.0 }, { 3.0 } }, use_resource: true);
/*
Tensor cond(Tensor it, Tensor _)
{
return it < 5;
}
*/
// TODO: below code doesn't compile
//(Tensor, Tensor) body(Tensor it, Tensor cost)
//{
// var embedding = embedding_ops.embedding_lookup(embedding_matrix, new int[]{0});
// cost += math_ops.reduce_sum(embedding);
// return (it + 1, cost);
//}
//var (_, cost1) = control_flow_ops.while_loop(
// cond, body, new[]
// {
// constant_op.constant(0),
// constant_op.constant(0.0)
// });
//with(this.cached_session(), sess =>
//{
// self.evaluate(variables.global_variables_initializer());
// self.assertAllEqual(10.0, self.evaluate(cost1));
//});
}
[Ignore("TODO")]
[TestMethod]
public void testIndexedSlicesGradientInCondInWhileLoop()
{
doTestIndexedSlicesGradientInCondInWhileLoop(use_resource: false);
}
[Ignore("TODO")]
[TestMethod]
public void testIndexedSlicesGradientInCondInWhileLoopResource()
{
doTestIndexedSlicesGradientInCondInWhileLoop(use_resource: true);
}
private void doTestIndexedSlicesGradientInCondInWhileLoop(bool use_resource = false)
{
//def doTestIndexedSlicesGradientInCondInWhileLoop(self, use_resource=False):
// embedding_matrix = variable_scope.get_variable(
// "embedding_matrix", [5, 5],
// initializer=init_ops.random_normal_initializer(),
// use_resource=use_resource)
// def cond(it, _):
// return it < 5
// def body(it, cost):
// embedding = embedding_ops.embedding_lookup(embedding_matrix, [0])
// cost = control_flow_ops.cond(
// math_ops.equal(it, 3), lambda: math_ops.square(cost),
// (lambda: cost + math_ops.reduce_sum(embedding)))
// return it + 1, cost
// _, cost = control_flow_ops.while_loop(
// cond, body, [constant_op.constant(0),
// constant_op.constant(0.0)])
// dynamic_grads = gradients_impl.gradients(cost, [embedding_matrix])[0]
// dynamic_grads = math_ops.segment_sum(dynamic_grads.values,
// dynamic_grads.indices)
// embedding = embedding_ops.embedding_lookup(embedding_matrix, [0])
// static = math_ops.square(
// math_ops.reduce_sum(embedding) + math_ops.reduce_sum(embedding) +
// math_ops.reduce_sum(embedding)) + math_ops.reduce_sum(embedding)
// static_grads = gradients_impl.gradients(static, [embedding_matrix])[0]
// static_grads = math_ops.segment_sum(static_grads.values,
// static_grads.indices)
// with self.cached_session():
// self.evaluate(variables.global_variables_initializer())
// self.assertAllEqual(*self.evaluate([static_grads, dynamic_grads]))
}
[Ignore("TODO")]
[TestMethod]
public void testIndexedSlicesWithShapeGradientInWhileLoop()
{
//@test_util.run_v1_only("b/120545219")
//def testIndexedSlicesWithShapeGradientInWhileLoop(self):
// for dtype in [dtypes.float32, dtypes.float64]:
// with self.cached_session() as sess:
// num_steps = 9
// inputs = array_ops.placeholder(dtype=dtype, shape=[num_steps])
// initial_outputs = tensor_array_ops.TensorArray(
// dtype=dtype, size=num_steps)
// initial_i = constant_op.constant(0, dtype=dtypes.int32)
// def cond(i, _):
// return i < num_steps # pylint: disable=cell-var-from-loop
// def body(i, outputs):
// x = array_ops.gather(inputs, i) # pylint: disable=cell-var-from-loop
// outputs = outputs.write(i, x)
// return i + 1, outputs
// _, outputs = control_flow_ops.while_loop(cond, body,
// [initial_i, initial_outputs])
// outputs = math_ops.reduce_sum(outputs.stack())
// r = gradients_impl.gradients([outputs], [inputs])[0]
// grad_wr_inputs = ops.convert_to_tensor(r)
// o, grad = sess.run([outputs, grad_wr_inputs],
// feed_dict={inputs: [4, 6, 0, 7, 0, 0, 1, 2, 0]})
// self.assertEquals(o, 20)
// self.assertAllEqual(grad, [1] * num_steps)
}
[Ignore("TODO")]
[TestMethod]
public void testIndexedSlicesWithDynamicShapeGradientInWhileLoop()
{
//@test_util.run_v1_only("b/120545219")
//def testIndexedSlicesWithDynamicShapeGradientInWhileLoop(self):
// for dtype in [dtypes.float32, dtypes.float64]:
// with self.cached_session() as sess:
// inputs = array_ops.placeholder(dtype=dtype)
// initial_outputs = tensor_array_ops.TensorArray(
// dtype=dtype, dynamic_size=True, size=1)
// initial_i = constant_op.constant(0, dtype=dtypes.int32)
// def cond(i, _):
// return i < array_ops.size(inputs) # pylint: disable=cell-var-from-loop
// def body(i, outputs):
// x = array_ops.gather(inputs, i) # pylint: disable=cell-var-from-loop
// outputs = outputs.write(i, x)
// return i + 1, outputs
// _, outputs = control_flow_ops.while_loop(cond, body,
// [initial_i, initial_outputs])
// outputs = math_ops.reduce_sum(outputs.stack())
// r = gradients_impl.gradients([outputs], [inputs])[0]
// grad_wr_inputs = ops.convert_to_tensor(r)
// o, grad = sess.run([outputs, grad_wr_inputs],
// feed_dict={inputs: [1, 3, 2]})
// self.assertEquals(o, 6)
// self.assertAllEqual(grad, [1] * 3)
}
}
}