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); }
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])); } }
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]); }
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])); } }
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])); } }
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])); } }
public void TestMemoryDisposalOnes() { for (int i = 0; i < 1024; i++) { var x = DoubleTensor.Ones(new long[] { 1024, 1024 }); x.Dispose(); } }
public void RangeDouble() { var x1 = DoubleTensor.Range(0f, 100f, 1f); for (int i = 0; i < x1.Shape[0]; ++i) { Assert.AreEqual(i, x1[i]); } }
public void TestMemoryDisposalZeros() { for (int i = 0; i < 1024; i++) { var x = DoubleTensor.Zeros(new long[] { 1024, 1024 }); x.Dispose(); //System.GC.Collect(); } }
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]); } }
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(); } }
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]); } }
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]); } }
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]); }
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])); } }
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])); } }
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); }
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]); } } } }
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]); } }
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]); } }
/// <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)); }
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 }
/// <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)); }