Example #1
0
        public void WriteAndReadDoubleTensorViaDiskFile()
        {
            const int size = 10;

            var file = new DiskFile("test20.dat", "rwb");

            Assert.NotNull(file);
            Assert.True(file.CanWrite);

            var tensor0 = new DoubleTensor(size);

            for (var i = 0; i < size; ++i)
            {
                tensor0[i] = (double)i;
            }

            file.WriteTensor(tensor0);
            Assert.Equal(size * sizeof(double), file.Position);
            file.Seek(0);

            var tensor1 = new DoubleTensor(size);
            var rd      = file.ReadTensor(tensor1);

            Assert.Equal(rd, size);
            Assert.Equal(size * sizeof(double), file.Position);

            for (var i = 0; i < rd; ++i)
            {
                Assert.Equal(tensor1[i], tensor1[i]);
            }

            file.Close();
            Assert.False(file.IsOpen);
        }
Example #2
0
        public void DoubleTensorArcTrigonometrics()
        {
            var x1 = DoubleTensor.Range(0.0f, 0.99f, 0.05f);

            Assert.IsNotNull(x1);
            Assert.AreEqual(1, x1.Shape.Length);

            var xsin = x1.Asin();

            Assert.AreEqual(x1.Shape.Length, xsin.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xsin.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Asin(x1[i]), (double)xsin[i]));
            }

            var xcos = x1.Acos();

            Assert.AreEqual(x1.Shape.Length, xcos.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xcos.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Acos(x1[i]), (double)xcos[i]));
            }

            var xtan = x1.Atan();

            Assert.AreEqual(x1.Shape.Length, xtan.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xtan.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Atan(x1[i]), (double)xtan[i]));
            }
        }
Example #3
0
        public void DiagDouble()
        {
            var x1 = new DoubleTensor(9);

            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                x1[i] = i + 1;
            }

            x1.Resize2d(3, 3);

            var diag0 = x1.Diagonal(0);
            var diag1 = x1.Diagonal(1);

            Assert.AreEqual(1, diag0.Shape.Length);
            Assert.AreEqual(3, diag0.Shape[0]);
            Assert.AreEqual(1, diag1.Shape.Length);
            Assert.AreEqual(2, diag1.Shape[0]);

            Assert.AreEqual(1, diag0[0]);
            Assert.AreEqual(5, diag0[1]);
            Assert.AreEqual(9, diag0[2]);

            Assert.AreEqual(2, diag1[0]);
            Assert.AreEqual(6, diag1[1]);
        }
Example #4
0
        public void DoubleTensorHyperbolics()
        {
            var x1 = DoubleTensor.Range(2f, 15f, 1f);

            Assert.IsNotNull(x1);
            Assert.AreEqual(1, x1.Shape.Length);

            var xsin = x1.Sinh();

            Assert.AreEqual(x1.Shape.Length, xsin.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xsin.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Sinh(x1[i]), (double)xsin[i]));
            }

            var xcos = x1.Cosh();

            Assert.AreEqual(x1.Shape.Length, xcos.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xcos.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Cosh(x1[i]), (double)xcos[i]));
            }

            var xtan = x1.Tanh();

            Assert.AreEqual(x1.Shape.Length, xtan.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xtan.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Tanh(x1[i]), (double)xtan[i]));
            }
        }
Example #5
0
        public void DoubleTensorTrigonometrics()
        {
            var x1 = DoubleTensor.Range(2f, 15f, 1f);

            Assert.NotNull(x1);
            Assert.True(1 == x1.Shape.Length);

            var xsin = x1.Sin();

            Assert.Equal(x1.Shape.Length, xsin.Shape.Length);
            Assert.Equal(x1.Shape[0], xsin.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.True(BasicTensorAPI.IsApproximatelyEqual(Math.Sin(x1[i]), (double)xsin[i]));
            }

            var xcos = x1.Cos();

            Assert.Equal(x1.Shape.Length, xcos.Shape.Length);
            Assert.Equal(x1.Shape[0], xcos.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.True(BasicTensorAPI.IsApproximatelyEqual(Math.Cos(x1[i]), (double)xcos[i]));
            }

            var xtan = x1.Tan();

            Assert.Equal(x1.Shape.Length, xtan.Shape.Length);
            Assert.Equal(x1.Shape[0], xtan.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.True(BasicTensorAPI.IsApproximatelyEqual(Math.Tan(x1[i]), (double)xtan[i]));
            }
        }
Example #6
0
        public void DoubleTensorPower()
        {
            var x1 = DoubleTensor.Range(2f, 15f, 1f);

            Assert.IsNotNull(x1);
            Assert.AreEqual(1, x1.Shape.Length);

            var x2 = x1.Pow(2.0f);

            Assert.AreEqual(x1.Shape.Length, x2.Shape.Length);
            Assert.AreEqual(x1.Shape[0], x2.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Pow(x1[i], 2.0f), x2[i]));
            }

            var x3 = x1.TPow(2.0f);

            Assert.AreEqual(x1.Shape.Length, x3.Shape.Length);
            Assert.AreEqual(x1.Shape[0], x3.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Pow(2.0f, x1[i]), x3[i]));
            }
        }
Example #7
0
 public void TestMemoryDisposalOnes()
 {
     for (int i = 0; i < 1024; i++)
     {
         var x = DoubleTensor.Ones(new long[] { 1024, 1024 });
         x.Dispose();
     }
 }
Example #8
0
        public void RangeDouble()
        {
            var x1 = DoubleTensor.Range(0f, 100f, 1f);

            for (int i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.AreEqual(i, x1[i]);
            }
        }
Example #9
0
 public void TestMemoryDisposalZeros()
 {
     for (int i = 0; i < 1024; i++)
     {
         var x = DoubleTensor.Zeros(new long[] { 1024, 1024 });
         x.Dispose();
         //System.GC.Collect();
     }
 }
Example #10
0
        public void SignDouble()
        {
            var x1 = DoubleTensor.Range(-15f, 15f, 1f);
            var x2 = x1.Sign();

            for (var i = 0; i < x2.Shape[0]; ++i)
            {
                var sign = (x1[i] < 0) ? -1 : (x1[i] == 0) ? 0 : 1;
                Assert.AreEqual(sign, x2[i]);
            }
        }
Example #11
0
 public void TestMemoryDisposalScalarTensors()
 {
     for (int i = 0; i < 5; i++)
     {
         for (int j = 0; j < 1000 * 100; j++)
         {
             var x = DoubleTensor.From(i * j * 3.1415);
             x.Dispose();
         }
         //System.GC.Collect();
     }
 }
Example #12
0
        public void CreateDoubleTensorFromRange()
        {
            var x1 = DoubleTensor.Range(0f, 150f, 5f);

            Assert.IsNotNull(x1);
            Assert.AreEqual(1, x1.Shape.Length);

            float start = 0f;

            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.AreEqual(start + 5f * i, x1[i]);
            }
        }
Example #13
0
        public void ReshapeDoubleTensor()
        {
            var x2 = new DoubleTensor(200);

            Assert.AreEqual(1, x2.Shape.Length);
            Assert.AreEqual(200, x2.Shape[0]);

            for (var i = 0; i < x2.Shape[0]; ++i)
            {
                x2[i] = i * 47.11f;
            }

            x2.Resize2d(10, 20);
            Assert.AreEqual(2, x2.Shape.Length);
            Assert.AreEqual(10, x2.Shape[0]);
            Assert.AreEqual(20, x2.Shape[1]);

            x2.Resize3d(4, 25, 2);
            Assert.AreEqual(3, x2.Shape.Length);
            Assert.AreEqual(4, x2.Shape[0]);
            Assert.AreEqual(25, x2.Shape[1]);
            Assert.AreEqual(2, x2.Shape[2]);

            x2.Resize4d(4, 5, 5, 2);
            Assert.AreEqual(4, x2.Shape.Length);
            Assert.AreEqual(4, x2.Shape[0]);
            Assert.AreEqual(5, x2.Shape[1]);
            Assert.AreEqual(5, x2.Shape[2]);
            Assert.AreEqual(2, x2.Shape[3]);

            x2.Resize5d(2, 2, 5, 5, 2);
            Assert.AreEqual(5, x2.Shape.Length);
            Assert.AreEqual(2, x2.Shape[0]);
            Assert.AreEqual(2, x2.Shape[1]);
            Assert.AreEqual(5, x2.Shape[2]);
            Assert.AreEqual(5, x2.Shape[3]);
            Assert.AreEqual(2, x2.Shape[4]);

            // Check that the values are retained across resizings.

            x2.Resize1d(200);
            Assert.AreEqual(1, x2.Shape.Length);
            Assert.AreEqual(200, x2.Shape[0]);

            for (var i = 0; i < x2.Shape[0]; ++i)
            {
                Assert.AreEqual(i * 47.11f, x2[i]);
            }
        }
Example #14
0
        public void CreateDoubleTensor()
        {
            var x1 = new DoubleTensor(10);
            var x2 = new DoubleTensor(10, 20);

            var x1Shape = x1.Shape;
            var x2Shape = x2.Shape;

            Assert.AreEqual(1, x1Shape.Length);
            Assert.AreEqual(2, x2Shape.Length);

            Assert.AreEqual(10, x1Shape[0]);
            Assert.AreEqual(10, x2Shape[0]);
            Assert.AreEqual(20, x2Shape[1]);
        }
Example #15
0
        public void DoubleTensorLog2()
        {
            var x1 = DoubleTensor.Range(2f, 100f, 1f);

            Assert.NotNull(x1);
            Assert.True(1 == x1.Shape.Length);

            var x2 = x1.Log2();

            Assert.Equal(x1.Shape.Length, x2.Shape.Length);
            Assert.Equal(x1.Shape[0], x2.Shape[0]);

            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.True(BasicTensorAPI.IsApproximatelyEqual(Math.Log(x1[i], 2.0), (double)x2[i]));
            }
        }
Example #16
0
        public void DoubleTensorExp()
        {
            var x1 = DoubleTensor.Range(2f, 15f, 1f);

            Assert.IsNotNull(x1);
            Assert.AreEqual(1, x1.Shape.Length);

            var x2 = x1.Exp();

            Assert.AreEqual(x1.Shape.Length, x2.Shape.Length);
            Assert.AreEqual(x1.Shape[0], x2.Shape[0]);

            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Exp(x1[i]), (double)x2[i]));
            }
        }
Example #17
0
        public void TestSaveLoadTensorDouble()
        {
            var file = ".saveload.double.ts";

            if (File.Exists(file))
            {
                File.Delete(file);
            }
            var tensor = DoubleTensor.Ones(new long[] { 5, 6 });

            tensor.Save(file);
            var tensorLoaded = TorchTensor.Load(file);

            File.Delete(file);
            Assert.NotNull(tensorLoaded);
            Assert.Equal(tensorLoaded.Type, tensor.Type);
            Assert.Equal(tensorLoaded, tensor);
        }
Example #18
0
        public void IdentityDouble()
        {
            var x1 = DoubleTensor.Eye(10, 10);

            for (int i = 0; i < 10; ++i)
            {
                for (int j = 0; j < 10; ++j)
                {
                    if (i == j)
                    {
                        Assert.AreEqual(1, x1[i, j]);
                    }
                    else
                    {
                        Assert.AreEqual(0, x1[i, j]);
                    }
                }
            }
        }
Example #19
0
        public void CreateDoubleTensorLike()
        {
            var x1 = new DoubleTensor(200, 200);
            var x2 = x1.OnesLike();
            var x3 = x1.ZerosLike();

            Assert.IsNotNull(x1);
            Assert.IsNotNull(x2);
            Assert.IsNotNull(x3);
            Assert.AreEqual(x1.Shape.Length, x2.Shape.Length);
            Assert.AreEqual(x1.Shape.Length, x3.Shape.Length);

            x2.Resize1d(200 * 200);
            x3.Resize1d(200 * 200);
            for (var i = 0; i < x2.Shape[0]; ++i)
            {
                Assert.AreEqual(1, x2[i]);
                Assert.AreEqual(0, x3[i]);
            }
        }
Example #20
0
        public void ConcatenateDouble()
        {
            var x1 = new DoubleTensor(9);
            var x2 = new DoubleTensor(9);

            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                x1[i] = i + 1;
                x2[i] = i + 1 + x1.Shape[0];
            }

            var x3 = x1.Concatenate(x2, 0);

            Assert.AreEqual(1, x3.Shape.Length);
            Assert.AreEqual(18, x3.Shape[0]);

            for (var i = 0; i < x3.Shape[0]; ++i)
            {
                Assert.AreEqual(i + 1, x3[i]);
            }
        }
Example #21
0
 /// <summary>
 ///   Read doubles from the file into the given double tensor.
 /// </summary>
 /// <param name="tensor">A tensor to place the data in after reading it from the file.</param>
 /// <returns>The number of doubles read.</returns>
 public long ReadTensor(DoubleTensor tensor)
 {
     return(THFile_readDoubleRaw(this.handle, tensor.Data, tensor.NumElements));
 }
Example #22
0
        public void DoubleTensorUnaries()
        {
            var x1 = DoubleTensor.Range(2f, 15f, 1f);

            Assert.IsNotNull(x1);
            Assert.AreEqual(1, x1.Shape.Length);

            var xsqrt = x1.Sqrt();

            Assert.AreEqual(x1.Shape.Length, xsqrt.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xsqrt.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Sqrt(x1[i]), (double)xsqrt[i]));
            }

            x1 = DoubleTensor.Range(-15f, 15f, .1f);

            var xceil = x1.Ceil();

            Assert.AreEqual(x1.Shape.Length, xceil.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xceil.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Ceiling(x1[i]), (double)xceil[i]));
            }

            var xfloor = x1.Floor();

            Assert.AreEqual(x1.Shape.Length, xfloor.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xfloor.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Floor(x1[i]), (double)xfloor[i]));
            }

            var xabs = x1.Abs();

            Assert.AreEqual(x1.Shape.Length, xabs.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xabs.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Abs(x1[i]), (double)xabs[i]));
            }

            var xneg = x1.neg();

            Assert.AreEqual(x1.Shape.Length, xneg.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xneg.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(-x1[i], (double)xneg[i]));
            }

#if false
            // DISABLED: libtorch appears to round away from zero for N.5, which means that comparing
            //           against Math.Round() will fail.
            x1 = DoubleTensor.Range(0f, 15f, .1f);

            var xrnd = x1.Round();
            Assert.AreEqual(x1.Shape.Length, xrnd.Shape.Length);
            Assert.AreEqual(x1.Shape[0], xrnd.Shape[0]);
            for (var i = 0; i < x1.Shape[0]; ++i)
            {
                Console.WriteLine($"{x1[i]}, {Math.Round(x1[i])}, {(double)xrnd[i]}");
                Assert.IsTrue(BasicTensorAPI.IsApproximatelyEqual(Math.Round(x1[i]), (double)xrnd[i]));
            }
#endif
        }
Example #23
0
 /// <summary>
 ///   Write doubles to the file from the given double tensor.
 /// </summary>
 /// <param name="tensor">A tensor containing data to be written to the file.</param>
 /// <returns>The number of doubles written.</returns>
 public long WriteTensor(DoubleTensor tensor)
 {
     return(THFile_writeDoubleRaw(this.handle, tensor.Data, tensor.NumElements));
 }