public unsafe void AddFloat32_Test()
        {
            const int size  = 11;
            const int size2 = 5;

            float[] x1, x2, expres;
            x1 = new float[size] {
                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
            };
            x2 = new float[size2] {
                1, 2, 3, 4, 5
            };
            expres = new float[size];

            for (int i = 0; i < size; i++)
            {
                expres[i] = x1[i] + x2[i % size2];
            }

            Tensor expected_res = expres.ToDisposedTensor(new Shape(size));

            Tensor t1, t2;

            t1 = x1.ToDisposedTensor(new Shape(size));
            t2 = x2.ToDisposedTensor(new Shape(size2));
            Tensor myres = CpuKernels.AddFloat32(t1, t2);


            Console.WriteLine(myres);
            Console.WriteLine(expected_res);
            Assert.AreEqual(expected_res.ToString(), myres.ToString());
            myres.Dispose();
        }
        public void Add()
        {
            Tensor expected = new Tensor(new Shape(3, 3), TensorConfig.Host_Float32);

            expected.SetValue(15);
            Tensor calculated = new Tensor(new Shape(3, 3), TensorConfig.Host_Float32);

            calculated.SetValue(0);
            Tensor[] inputs = new Tensor[5];
            for (int i = 0; i < 5; i++)
            {
                inputs[i] = new Tensor(new Shape(3, 3), TensorConfig.Host_Float32);
                inputs[i].SetValue(3);
            }
            CpuKernels.AddFloat32(calculated, inputs);
            Assert.AreEqual(expected.ToString(), calculated.ToString());
            Tensor calculated2 = CpuKernels.AddFloat32(inputs);

            Assert.AreEqual(expected.ToString(), calculated2.ToString());

            expected.Dispose();
            calculated.Dispose();
            for (int i = 0; i < 5; i++)
            {
                inputs[i].Dispose();
            }
        }
        public void AddRandom()
        {
            int arrSize    = 5;
            int tensorSize = 9;

            // initialize test tensors
            Tensor expected, calculated;

            float[] expectedArr = new float[tensorSize];
            (_, calculated) = CreateRandomTensor(tensorSize);
            Tensor[]  inputs = new Tensor[arrSize];
            float[][] arrays = new float[arrSize][];
            for (int i = 0; i < arrSize; i++)
            {
                (arrays[i], inputs[i]) = CreateRandomTensor(tensorSize);
                for (int j = 0; j < tensorSize; j++)
                {
                    expectedArr[j] += arrays[i][j];
                }
            }

            // add tensors
            expected = Tensor.ToDisposedTensor(expectedArr, new Shape(tensorSize), NumberType.Float32);


            CpuKernels.AddFloat32(calculated, inputs);

            Console.WriteLine(calculated.ToString());
            Console.WriteLine(expected.ToString());

            Assert.AreEqual(calculated.ToString(), expected.ToString());

            //need to dipose tensors to remove them from memory
            //we don't need to do this manually but better doing
            calculated.Dispose();
            for (int i = 0; i < arrSize; i++)
            {
                inputs[i].Dispose();
            }

            //expected.Dispose(); don't dispose expected tensor because it is already disposed tensor. line 72
        }