Esempio n. 1
0
        private void recursiveBSP_WaveletsByConsts(List <GeoWave> geoWaveArr, int geoWaveId, int seed = 0)
        {
            //CALC APPROX_SOLUTION FOR GEO WAVE
            double error = geoWaveArr[geoWaveId].calc_MeanValueReturnError(_trainingLabel, geoWaveArr[geoWaveId].pointsIdArray);

            if (error < _rc.approxThresh ||
                geoWaveArr[geoWaveId].pointsIdArray.Count() <= _rc.minWaveSize ||
                _rc.boundDepthTree <= geoWaveArr[geoWaveId].level)
            {
                return;
            }

            int dimIndex      = -1;
            int Maingridindex = -1;

            bool IsPartitionOK = false;

            switch (_rc.split_type)
            {
            case 0:

                IsPartitionOK = getBestPartitionResult(ref dimIndex, ref Maingridindex, geoWaveArr, geoWaveId, error, _dime2Take);
                break;

            case 1:
                IsPartitionOK = getRandPartitionResult(ref dimIndex, ref Maingridindex, geoWaveArr, geoWaveId, error, seed);
                break;

            case 2:
            {
                Random ran1         = new Random(seed);
                Random ran2         = new Random(geoWaveId);
                int    one          = ran1.Next(0, int.MaxValue / 10);
                int    two          = ran2.Next(0, int.MaxValue / 10);
                bool[] Dim2TakeNode = getDim2Take(_rc, one + two);
                IsPartitionOK = getBestPartitionResult(ref dimIndex, ref Maingridindex, geoWaveArr, geoWaveId, error, Dim2TakeNode);
            }
            break;

            case 3:
                IsPartitionOK = getGiniPartitionResult(ref dimIndex, ref Maingridindex, geoWaveArr, geoWaveId, error, _dime2Take);
                break;

            case 4:
            {
                Random ran1         = new Random(seed);
                Random ran2         = new Random(geoWaveId);
                int    one          = ran1.Next(0, int.MaxValue / 10);
                int    two          = ran2.Next(0, int.MaxValue / 10);
                bool[] Dim2TakeNode = getDim2Take(_rc, one + two);
                IsPartitionOK = getGiniPartitionResult(ref dimIndex, ref Maingridindex, geoWaveArr, geoWaveId, error, Dim2TakeNode);
            }
            break;

            case 5:     //local pca at each parent node, recursion inside a case
            {
                recursiveBSP_LocalPCA(geoWaveArr, 0);
                return;
            }
                //break;
            }



            if (!IsPartitionOK)
            {
                return;
            }


            GeoWave child0 = new GeoWave(geoWaveArr[geoWaveId].boubdingBox, _trainingLabel[0].Count(), geoWaveArr[geoWaveId].rc);
            GeoWave child1 = new GeoWave(geoWaveArr[geoWaveId].boubdingBox, _trainingLabel[0].Count(), geoWaveArr[geoWaveId].rc);

            //set partition
            child0.boubdingBox[1][dimIndex] = Maingridindex;
            child1.boubdingBox[0][dimIndex] = Maingridindex;

            //DOCUMENT ON CHILDREN
            child0.dimIndex      = dimIndex;
            child0.Maingridindex = Maingridindex;
            child1.dimIndex      = dimIndex;
            child1.Maingridindex = Maingridindex;

            child0.MaingridValue = Form1.MainGrid[dimIndex][Maingridindex];
            child1.MaingridValue = Form1.MainGrid[dimIndex][Maingridindex];

            //calc norm
            //calc mean value

            if (Form1.isBoxSingular(child0.boubdingBox, _rc.dim) || Form1.isBoxSingular(child1.boubdingBox, _rc.dim))
            {
                return;
            }

            //SHOULD I VERIFY THAT THE CHILD IS NOT ITS PARENT ? (IN CASES WHERE CAN'T MODEFY THE PARTITION)

            setChildrensPointsAndMeanValue(ref child0, ref child1, dimIndex, geoWaveArr[geoWaveId].pointsIdArray);
            //SET TWO CHILDS
            child0.parentID = child1.parentID = geoWaveId;
            child0.child0   = child1.child0 = -1;
            child0.child1   = child1.child1 = -1;
            child0.level    = child1.level = geoWaveArr[geoWaveId].level + 1;

            child0.computeNormOfConsts(geoWaveArr[geoWaveId]);
            child1.computeNormOfConsts(geoWaveArr[geoWaveId]);
            geoWaveArr.Add(child0);
            geoWaveArr.Add(child1);
            geoWaveArr[geoWaveId].child0 = geoWaveArr.Count - 2;
            geoWaveArr[geoWaveId].child1 = geoWaveArr.Count - 1;



            //RECURSION STEP !!!
            recursiveBSP_WaveletsByConsts(geoWaveArr, geoWaveArr[geoWaveId].child0, seed);
            recursiveBSP_WaveletsByConsts(geoWaveArr, geoWaveArr[geoWaveId].child1, seed);
        }