|
|
@@ -467,5 +467,371 @@ namespace TensorFlowNET.UnitTest |
|
|
|
} |
|
|
|
#endregion |
|
|
|
} |
|
|
|
|
|
|
|
private IEnumerable<int> MultiplyArray(IReadOnlyCollection<int> first, IReadOnlyCollection<int> second) |
|
|
|
{ |
|
|
|
if(first.Count != second.Count) |
|
|
|
throw new ArgumentException("Arrays should be of equal size!"); |
|
|
|
|
|
|
|
var firstEnumerator = first.GetEnumerator(); |
|
|
|
var secondEnumerator = second.GetEnumerator(); |
|
|
|
var result = new List<int>(); |
|
|
|
while (firstEnumerator.MoveNext()) |
|
|
|
{ |
|
|
|
secondEnumerator.MoveNext(); |
|
|
|
result.Add(firstEnumerator.Current * secondEnumerator.Current); |
|
|
|
} |
|
|
|
|
|
|
|
firstEnumerator.Dispose(); |
|
|
|
secondEnumerator.Dispose(); |
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
private IEnumerable<float> MultiplyArray(IReadOnlyCollection<float> first, IReadOnlyCollection<float> second) |
|
|
|
{ |
|
|
|
if(first.Count != second.Count) |
|
|
|
throw new ArgumentException("Arrays should be of equal size!"); |
|
|
|
|
|
|
|
var firstEnumerator = first.GetEnumerator(); |
|
|
|
var secondEnumerator = second.GetEnumerator(); |
|
|
|
var result = new List<float>(); |
|
|
|
while (firstEnumerator.MoveNext()) |
|
|
|
{ |
|
|
|
secondEnumerator.MoveNext(); |
|
|
|
result.Add(firstEnumerator.Current * secondEnumerator.Current); |
|
|
|
} |
|
|
|
|
|
|
|
firstEnumerator.Dispose(); |
|
|
|
secondEnumerator.Dispose(); |
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
private IEnumerable<double> MultiplyArray(IReadOnlyCollection<double> first, IReadOnlyCollection<double> second) |
|
|
|
{ |
|
|
|
if(first.Count != second.Count) |
|
|
|
throw new ArgumentException("Arrays should be of equal size!"); |
|
|
|
|
|
|
|
var firstEnumerator = first.GetEnumerator(); |
|
|
|
var secondEnumerator = second.GetEnumerator(); |
|
|
|
var result = new List<double>(); |
|
|
|
while (firstEnumerator.MoveNext()) |
|
|
|
{ |
|
|
|
secondEnumerator.MoveNext(); |
|
|
|
result.Add(firstEnumerator.Current * secondEnumerator.Current); |
|
|
|
} |
|
|
|
|
|
|
|
firstEnumerator.Dispose(); |
|
|
|
secondEnumerator.Dispose(); |
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
[TestMethod] |
|
|
|
public void mulOpTests() |
|
|
|
{ |
|
|
|
const int rows = 2; // to avoid broadcasting effect |
|
|
|
const int cols = 10; |
|
|
|
|
|
|
|
#region intTest |
|
|
|
const int firstIntVal = 2; |
|
|
|
const int secondIntVal = 3; |
|
|
|
|
|
|
|
var firstIntFeed = Enumerable.Repeat(firstIntVal, rows * cols).ToArray(); |
|
|
|
var secondIntFeed = Enumerable.Repeat(secondIntVal, rows * cols).ToArray(); |
|
|
|
var intResult = MultiplyArray(firstIntFeed, secondIntFeed).Sum(); |
|
|
|
|
|
|
|
var a = tf.placeholder(tf.int32, shape: new TensorShape(rows, cols)); |
|
|
|
var b = tf.placeholder(tf.int32, shape: new TensorShape(rows, cols)); |
|
|
|
var c = tf.reduce_sum(tf.reduce_sum(tf.multiply(a, b), 1)); |
|
|
|
|
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstIntFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondIntFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((int)o, intResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator *(Tensor x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a * b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstIntFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondIntFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((int)o, intResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator *(Tensor x, int y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a * secondIntVal, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstIntFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((int)o, intResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator *(int x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(firstIntVal * b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(b, new NDArray(secondIntFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((int)o, intResult); |
|
|
|
} |
|
|
|
#endregion |
|
|
|
|
|
|
|
#region floatTest |
|
|
|
const float firstFloatVal = 2.0f; |
|
|
|
const float secondFloatVal = 3.0f; |
|
|
|
|
|
|
|
var firstFloatFeed = Enumerable.Repeat(firstFloatVal, rows * cols).ToArray(); |
|
|
|
var secondFloatFeed = Enumerable.Repeat(secondFloatVal, rows * cols).ToArray(); |
|
|
|
var floatResult = MultiplyArray(firstFloatFeed, secondFloatFeed).Sum(); |
|
|
|
|
|
|
|
a = tf.placeholder(tf.float32, shape: new TensorShape(rows, cols)); |
|
|
|
b = tf.placeholder(tf.float32, shape: new TensorShape(rows, cols)); |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(tf.multiply(a, b), 1)); |
|
|
|
|
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstFloatFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondFloatFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((float)o, floatResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator *(Tensor x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a * b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstFloatFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondFloatFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((float)o, floatResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator *(Tensor x, float y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a * secondFloatVal, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstFloatFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((float)o, floatResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator *(float x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(firstFloatVal * b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(b, new NDArray(secondFloatFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((float)o, floatResult); |
|
|
|
} |
|
|
|
#endregion |
|
|
|
|
|
|
|
#region doubleTest |
|
|
|
const double firstDoubleVal = 2.0; |
|
|
|
const double secondDoubleVal = 3.0; |
|
|
|
|
|
|
|
var firstDoubleFeed = Enumerable.Repeat(firstDoubleVal, rows * cols).ToArray(); |
|
|
|
var secondDoubleFeed = Enumerable.Repeat(secondDoubleVal, rows * cols).ToArray(); |
|
|
|
var doubleResult = MultiplyArray(firstDoubleFeed, secondDoubleFeed).Sum(); |
|
|
|
|
|
|
|
a = tf.placeholder(tf.float64, shape: new TensorShape(rows, cols)); |
|
|
|
b = tf.placeholder(tf.float64, shape: new TensorShape(rows, cols)); |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(tf.multiply(a, b), 1)); |
|
|
|
|
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstDoubleFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondDoubleFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((double)o, doubleResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator *(Tensor x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a * b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstDoubleFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondDoubleFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((double)o, doubleResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator *(Tensor x, double y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a * secondFloatVal, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstDoubleFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((double)o, doubleResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator *(double x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(firstFloatVal * b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(b, new NDArray(secondDoubleFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((double) o, doubleResult); |
|
|
|
} |
|
|
|
#endregion |
|
|
|
} |
|
|
|
|
|
|
|
[TestMethod] |
|
|
|
public void divOpTests() |
|
|
|
{ |
|
|
|
const int rows = 2; // to avoid broadcasting effect |
|
|
|
const int cols = 10; |
|
|
|
|
|
|
|
#region intTest |
|
|
|
const int firstIntVal = 6; |
|
|
|
const int secondIntVal = 3; |
|
|
|
|
|
|
|
var firstIntFeed = Enumerable.Repeat(firstIntVal, rows * cols).ToArray(); |
|
|
|
var secondIntFeed = Enumerable.Repeat(secondIntVal, rows * cols).ToArray(); |
|
|
|
var intResult = (int)(firstIntFeed.Sum() / (float)secondIntVal); |
|
|
|
|
|
|
|
var a = tf.placeholder(tf.int32, shape: new TensorShape(rows, cols)); |
|
|
|
var b = tf.placeholder(tf.int32, shape: new TensorShape(rows, cols)); |
|
|
|
var c = tf.reduce_sum(tf.reduce_sum(gen_math_ops.floor_div(a, b), 1)); |
|
|
|
|
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstIntFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondIntFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((int)o, intResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator /(Tensor x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a / b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstIntFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondIntFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((int)o, intResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator /(Tensor x, int y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a / secondIntVal, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstIntFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((int)o, intResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator /(int x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(firstIntVal / b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(b, new NDArray(secondIntFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((int)o, intResult); |
|
|
|
} |
|
|
|
#endregion |
|
|
|
|
|
|
|
#region floatTest |
|
|
|
const float firstFloatVal = 6.0f; |
|
|
|
const float secondFloatVal = 3.0f; |
|
|
|
|
|
|
|
var firstFloatFeed = Enumerable.Repeat(firstFloatVal, rows * cols).ToArray(); |
|
|
|
var secondFloatFeed = Enumerable.Repeat(secondFloatVal, rows * cols).ToArray(); |
|
|
|
var floatResult = MultiplyArray(firstFloatFeed, secondFloatFeed.Select(x => 1/x).ToArray()).Sum(); |
|
|
|
|
|
|
|
a = tf.placeholder(tf.float32, shape: new TensorShape(rows, cols)); |
|
|
|
b = tf.placeholder(tf.float32, shape: new TensorShape(rows, cols)); |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(tf.divide(a, b), 1)); |
|
|
|
|
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstFloatFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondFloatFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((float)o, floatResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator /(Tensor x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a / b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstFloatFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondFloatFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((float)o, floatResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator /(Tensor x, float y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a / secondFloatVal, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstFloatFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((float)o, floatResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator /(float x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(firstFloatVal / b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(b, new NDArray(secondFloatFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((float)o, floatResult); |
|
|
|
} |
|
|
|
#endregion |
|
|
|
|
|
|
|
#region doubleTest |
|
|
|
const double firstDoubleVal = 6.0; |
|
|
|
const double secondDoubleVal = 3.0; |
|
|
|
|
|
|
|
var firstDoubleFeed = Enumerable.Repeat(firstDoubleVal, rows * cols).ToArray(); |
|
|
|
var secondDoubleFeed = Enumerable.Repeat(secondDoubleVal, rows * cols).ToArray(); |
|
|
|
var doubleResult = MultiplyArray(firstDoubleFeed, secondDoubleFeed.Select(x => 1/x).ToArray()).Sum(); |
|
|
|
|
|
|
|
a = tf.placeholder(tf.float64, shape: new TensorShape(rows, cols)); |
|
|
|
b = tf.placeholder(tf.float64, shape: new TensorShape(rows, cols)); |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(tf.divide(a, b), 1)); |
|
|
|
|
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstDoubleFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondDoubleFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((double)o, doubleResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator /(Tensor x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a / b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstDoubleFeed, new Shape(rows, cols))), |
|
|
|
new FeedItem(b, new NDArray(secondDoubleFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((double)o, doubleResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator /(Tensor x, double y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(a / secondFloatVal, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(a, new NDArray(firstDoubleFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((double)o, doubleResult); |
|
|
|
} |
|
|
|
|
|
|
|
// Testing `operator /(double x, Tensor y) |
|
|
|
c = tf.reduce_sum(tf.reduce_sum(firstFloatVal / b, 1)); |
|
|
|
using (var sess = tf.Session()) |
|
|
|
{ |
|
|
|
var o = sess.run(c, |
|
|
|
new FeedItem(b, new NDArray(secondDoubleFeed, new Shape(rows, cols)))); |
|
|
|
Assert.AreEqual((double)o, doubleResult); |
|
|
|
} |
|
|
|
#endregion |
|
|
|
} |
|
|
|
} |
|
|
|
} |