@@ -215,5 +215,189 @@ public void addOpTests()
215215 }
216216 #endregion
217217 }
218+
219+ [ TestMethod ]
220+ public void subOpTests ( )
221+ {
222+ const int rows = 2 ; // to avoid broadcasting effect
223+ const int cols = 10 ;
224+
225+ #region intTest
226+ const int firstIntVal = - 2 ;
227+ const int secondIntVal = 3 ;
228+
229+ var firstIntFeed = Enumerable . Repeat ( firstIntVal , rows * cols ) . ToArray ( ) ;
230+ var secondIntFeed = Enumerable . Repeat ( secondIntVal , rows * cols ) . ToArray ( ) ;
231+ var intResult = firstIntFeed . Sum ( ) - secondIntFeed . Sum ( ) ;
232+ var intResultTwo = - firstIntFeed . Sum ( ) ;
233+
234+ var a = tf . placeholder ( tf . int32 , shape : new TensorShape ( rows , cols ) ) ;
235+ var b = tf . placeholder ( tf . int32 , shape : new TensorShape ( rows , cols ) ) ;
236+ var c = tf . reduce_sum ( tf . reduce_sum ( tf . sub ( a , b ) , 1 ) ) ;
237+
238+ using ( var sess = tf . Session ( ) )
239+ {
240+ var o = sess . run ( c ,
241+ new FeedItem ( a , new NDArray ( firstIntFeed , new Shape ( rows , cols ) ) ) ,
242+ new FeedItem ( b , new NDArray ( secondIntFeed , new Shape ( rows , cols ) ) ) ) ;
243+ Assert . AreEqual ( ( int ) o , intResult ) ;
244+ }
245+
246+ // Testing `operator -(Tensor x, Tensor y)
247+ c = tf . reduce_sum ( tf . reduce_sum ( a - b , 1 ) ) ;
248+ using ( var sess = tf . Session ( ) )
249+ {
250+ var o = sess . run ( c ,
251+ new FeedItem ( a , new NDArray ( firstIntFeed , new Shape ( rows , cols ) ) ) ,
252+ new FeedItem ( b , new NDArray ( secondIntFeed , new Shape ( rows , cols ) ) ) ) ;
253+ Assert . AreEqual ( ( int ) o , intResult ) ;
254+ }
255+
256+ // Testing `operator -(Tensor x, int y)
257+ c = tf . reduce_sum ( tf . reduce_sum ( a - secondIntVal , 1 ) ) ;
258+ using ( var sess = tf . Session ( ) )
259+ {
260+ var o = sess . run ( c ,
261+ new FeedItem ( a , new NDArray ( firstIntFeed , new Shape ( rows , cols ) ) ) ) ;
262+ Assert . AreEqual ( ( int ) o , intResult ) ;
263+ }
264+
265+ // Testing `operator -(int x, Tensor y)
266+ c = tf . reduce_sum ( tf . reduce_sum ( secondIntVal - a , 1 ) ) ;
267+ using ( var sess = tf . Session ( ) )
268+ {
269+ var o = sess . run ( c ,
270+ new FeedItem ( a , new NDArray ( firstIntFeed , new Shape ( rows , cols ) ) ) ) ;
271+ Assert . AreEqual ( ( int ) o , Math . Abs ( intResult ) ) ;
272+ }
273+
274+ // Testing `operator -(Tensor x)
275+ c = tf . reduce_sum ( tf . reduce_sum ( - a , 1 ) ) ;
276+ using ( var sess = tf . Session ( ) )
277+ {
278+ var o = sess . run ( c ,
279+ new FeedItem ( a , new NDArray ( firstIntFeed , new Shape ( rows , cols ) ) ) ) ;
280+ Assert . AreEqual ( ( int ) o , intResultTwo ) ;
281+ }
282+ #endregion
283+
284+ #region floatTest
285+ const float firstFloatVal = - 2.0f ;
286+ const float secondFloatVal = 3.0f ;
287+
288+ var firstFloatFeed = Enumerable . Repeat ( firstFloatVal , rows * cols ) . ToArray ( ) ;
289+ var secondFloatFeed = Enumerable . Repeat ( secondFloatVal , rows * cols ) . ToArray ( ) ;
290+ var floatResult = firstFloatFeed . Sum ( ) - secondFloatFeed . Sum ( ) ;
291+ var floatResultTwo = - firstFloatFeed . Sum ( ) ;
292+
293+ a = tf . placeholder ( tf . float32 , shape : new TensorShape ( rows , cols ) ) ;
294+ b = tf . placeholder ( tf . float32 , shape : new TensorShape ( rows , cols ) ) ;
295+ c = tf . reduce_sum ( tf . reduce_sum ( tf . sub ( a , b ) , 1 ) ) ;
296+
297+ using ( var sess = tf . Session ( ) )
298+ {
299+ var o = sess . run ( c ,
300+ new FeedItem ( a , new NDArray ( firstFloatFeed , new Shape ( rows , cols ) ) ) ,
301+ new FeedItem ( b , new NDArray ( secondFloatFeed , new Shape ( rows , cols ) ) ) ) ;
302+ Assert . AreEqual ( ( float ) o , floatResult ) ;
303+ }
304+
305+ // Testing `operator -(Tensor x, Tensor y)
306+ c = tf . reduce_sum ( tf . reduce_sum ( a - b , 1 ) ) ;
307+ using ( var sess = tf . Session ( ) )
308+ {
309+ var o = sess . run ( c ,
310+ new FeedItem ( a , new NDArray ( firstFloatFeed , new Shape ( rows , cols ) ) ) ,
311+ new FeedItem ( b , new NDArray ( secondFloatFeed , new Shape ( rows , cols ) ) ) ) ;
312+ Assert . AreEqual ( ( float ) o , floatResult ) ;
313+ }
314+
315+ // Testing `operator -(Tensor x, float y)
316+ c = tf . reduce_sum ( tf . reduce_sum ( a - secondFloatVal , 1 ) ) ;
317+ using ( var sess = tf . Session ( ) )
318+ {
319+ var o = sess . run ( c ,
320+ new FeedItem ( a , new NDArray ( firstFloatFeed , new Shape ( rows , cols ) ) ) ) ;
321+ Assert . AreEqual ( ( float ) o , floatResult ) ;
322+ }
323+
324+ // Testing `operator -(float x, Tensor y)
325+ c = tf . reduce_sum ( tf . reduce_sum ( secondFloatVal - a , 1 ) ) ;
326+ using ( var sess = tf . Session ( ) )
327+ {
328+ var o = sess . run ( c ,
329+ new FeedItem ( a , new NDArray ( firstFloatFeed , new Shape ( rows , cols ) ) ) ) ;
330+ Assert . AreEqual ( ( float ) o , Math . Abs ( floatResult ) ) ;
331+ }
332+
333+ // Testing `operator -(Tensor x)
334+ c = tf . reduce_sum ( tf . reduce_sum ( - a , 1 ) ) ;
335+ using ( var sess = tf . Session ( ) )
336+ {
337+ var o = sess . run ( c ,
338+ new FeedItem ( a , new NDArray ( firstFloatFeed , new Shape ( rows , cols ) ) ) ) ;
339+ Assert . AreEqual ( ( float ) o , floatResultTwo ) ;
340+ }
341+ #endregion
342+
343+ #region doubleTest
344+ const double firstDoubleVal = - 2.0 ;
345+ const double secondDoubleVal = 3.0 ;
346+
347+ var firstDoubleFeed = Enumerable . Repeat ( firstDoubleVal , rows * cols ) . ToArray ( ) ;
348+ var secondDoubleFeed = Enumerable . Repeat ( secondDoubleVal , rows * cols ) . ToArray ( ) ;
349+ var doubleResult = firstDoubleFeed . Sum ( ) - secondDoubleFeed . Sum ( ) ;
350+ var doubleResultTwo = - firstDoubleFeed . Sum ( ) ;
351+
352+ a = tf . placeholder ( tf . float64 , shape : new TensorShape ( rows , cols ) ) ;
353+ b = tf . placeholder ( tf . float64 , shape : new TensorShape ( rows , cols ) ) ;
354+ c = tf . reduce_sum ( tf . reduce_sum ( tf . sub ( a , b ) , 1 ) ) ;
355+
356+ using ( var sess = tf . Session ( ) )
357+ {
358+ var o = sess . run ( c ,
359+ new FeedItem ( a , new NDArray ( firstDoubleFeed , new Shape ( rows , cols ) ) ) ,
360+ new FeedItem ( b , new NDArray ( secondDoubleFeed , new Shape ( rows , cols ) ) ) ) ;
361+ Assert . AreEqual ( ( double ) o , doubleResult ) ;
362+ }
363+
364+ // Testing `operator -(Tensor x, Tensor y)
365+ c = tf . reduce_sum ( tf . reduce_sum ( a - b , 1 ) ) ;
366+ using ( var sess = tf . Session ( ) )
367+ {
368+ var o = sess . run ( c ,
369+ new FeedItem ( a , new NDArray ( firstDoubleFeed , new Shape ( rows , cols ) ) ) ,
370+ new FeedItem ( b , new NDArray ( secondDoubleFeed , new Shape ( rows , cols ) ) ) ) ;
371+ Assert . AreEqual ( ( double ) o , doubleResult ) ;
372+ }
373+
374+ // Testing `operator -(Tensor x, double y)
375+ c = tf . reduce_sum ( tf . reduce_sum ( a - secondFloatVal , 1 ) ) ;
376+ using ( var sess = tf . Session ( ) )
377+ {
378+ var o = sess . run ( c ,
379+ new FeedItem ( a , new NDArray ( firstDoubleFeed , new Shape ( rows , cols ) ) ) ) ;
380+ Assert . AreEqual ( ( double ) o , doubleResult ) ;
381+ }
382+
383+ // Testing `operator -(double x, Tensor y)
384+ c = tf . reduce_sum ( tf . reduce_sum ( secondFloatVal - a , 1 ) ) ;
385+ using ( var sess = tf . Session ( ) )
386+ {
387+ var o = sess . run ( c ,
388+ new FeedItem ( a , new NDArray ( firstDoubleFeed , new Shape ( rows , cols ) ) ) ) ;
389+ Assert . AreEqual ( ( double ) o , Math . Abs ( doubleResult ) ) ;
390+ }
391+
392+ // Testing `operator -(Tensor x)
393+ c = tf . reduce_sum ( tf . reduce_sum ( - a , 1 ) ) ;
394+ using ( var sess = tf . Session ( ) )
395+ {
396+ var o = sess . run ( c ,
397+ new FeedItem ( a , new NDArray ( firstDoubleFeed , new Shape ( rows , cols ) ) ) ) ;
398+ Assert . AreEqual ( ( double ) o , doubleResultTwo ) ;
399+ }
400+ #endregion
401+ }
218402 }
219403}
0 commit comments