public void TestTwoAttributeAxes()
        {
            List <DataPoint> dataPoints = new List <DataPoint> {
                new DataPoint {
                    Class      = 1,
                    Attributes = new float[] { 123, 987 },
                    Categories = new uint[] { },
                    Weight     = 1.0f,
                },
                new DataPoint {
                    Class      = 0,
                    Attributes = new float[] { 123, 876 },
                    Categories = new uint[] { },
                    Weight     = 1.0f,
                },
                new DataPoint {
                    Class      = 1,
                    Attributes = new float[] { 456, 765 },
                    Categories = new uint[] { },
                    Weight     = 1.0f,
                },
                new DataPoint {
                    Class      = 1,
                    Attributes = new float[] { 456, 543 },
                    Categories = new uint[] { },
                    Weight     = 1.0f,
                },
            };

            using (CudaManager cudaManager = Provider.CudaManagerPool.GetCudaManagerForThread(Provider.Logger))
                using (DecisionLearner decisionLearner = new DecisionLearner(cudaManager, dataPoints)) {
                    IDataNode root = decisionLearner.FitDecisionTree().Node;
                    Assert.AreEqual(1.0, Accuracy(root, dataPoints));
                }
        }
        public void TestSimpleAttributeSplit()
        {
            List <DataPoint> dataPoints = new List <DataPoint> {
                new DataPoint {
                    Class      = 0,
                    Attributes = new float[] { 123 },
                    Categories = new uint[] { },
                    Weight     = 1.0f,
                },
                new DataPoint {
                    Class      = 1,
                    Attributes = new float[] { 456 },
                    Categories = new uint[] { },
                    Weight     = 1.0f,
                },
            };

            using (CudaManager cudaManager = Provider.CudaManagerPool.GetCudaManagerForThread(Provider.Logger))
                using (DecisionLearner decisionLearner = new DecisionLearner(cudaManager, dataPoints)) {
                    IDataNode root = decisionLearner.FitDecisionTree().Node;

                    AttributeSplit attributeSplit = (AttributeSplit)root;
                    Assert.AreEqual(0, attributeSplit.Axis);
                    Assert.AreEqual(456, attributeSplit.SplitValue);

                    DataLeaf left = (DataLeaf)attributeSplit.Left;
                    Assert.AreEqual(1, left.ClassDistribution[0]);
                    Assert.AreEqual(0, left.ClassDistribution[1]);

                    DataLeaf right = (DataLeaf)attributeSplit.Right;
                    Assert.AreEqual(0, right.ClassDistribution[0]);
                    Assert.AreEqual(1, right.ClassDistribution[1]);

                    Assert.AreEqual(1.0, Accuracy(root, dataPoints));
                }
        }
        public void TestCategoryPlusAttributeSplit()
        {
            List <DataPoint> dataPoints = new List <DataPoint> {
                new DataPoint {
                    Class      = 1,
                    Attributes = new float[] { 99, 987 },
                    Categories = new uint[] { 0x3, 0x1 },
                    Weight     = 1.0f,
                },
                new DataPoint {
                    Class      = 0,
                    Attributes = new float[] { 99, 987 },
                    Categories = new uint[] { 0x3, 0x1 | 0x2 },
                    Weight     = 1.0f,
                },
                new DataPoint {
                    Class      = 1,
                    Attributes = new float[] { 99, 765 },
                    Categories = new uint[] { 0x3, 0x1 | 0x2 },
                    Weight     = 1.0f,
                },
                new DataPoint {
                    Class      = 1,
                    Attributes = new float[] { 99, 765 },
                    Categories = new uint[] { 0x3, 0x1 },
                    Weight     = 1.0f,
                },
            };

            using (CudaManager cudaManager = Provider.CudaManagerPool.GetCudaManagerForThread(Provider.Logger))
                using (DecisionLearner decisionLearner = new DecisionLearner(cudaManager, dataPoints)) {
                    IDataNode root = decisionLearner.FitDecisionTree().Node;

                    Assert.AreEqual(1.0, Accuracy(root, dataPoints));
                }
        }