private void recursiveBSP_LocalPCA(List <GeoWave> geoWaveArr, int geoWaveId) { GeoWave parentNode = geoWaveArr[geoWaveId]; double error = parentNode.calc_MeanValueReturnError(_trainingLabel, parentNode.pointsIdArray); if (error < _rc.approxThresh || parentNode.pointsIdArray.Count() <= _rc.minWaveSize || _rc.boundDepthTree <= parentNode.level) { return; } bool IsPartitionOK = false; int dimIndex = -1; int splitId = -1; double splitValue = -1; List <int> sortedIds = new List <int>(); // sortedIds used to save partition Ids of trasformed data IsPartitionOK = getPcaPartitionAllDim(ref dimIndex, ref splitId, ref splitValue, parentNode, error, ref sortedIds); if (!IsPartitionOK) { return; } GeoWave child0 = new GeoWave(_rc.dim, _rc.labelDim, _rc); GeoWave child1 = new GeoWave(_rc.dim, _rc.labelDim, _rc); child0.dimIndex = dimIndex; child1.dimIndex = dimIndex; //set childs id's child0.pointsIdArray = sortedIds.GetRange(0, sortedIds.IndexOf(splitId)); child1.pointsIdArray = sortedIds.GetRange(sortedIds.IndexOf(splitId), sortedIds.Count - child0.pointsIdArray.Count); // set upper split value only child0.pcaUpperSplitValue = splitValue; //set mean values setLocalPcaChildMeanValue(ref child0); setLocalPcaChildMeanValue(ref child1); //set parent id child0.parentID = geoWaveId; child1.parentID = geoWaveId; //set level child0.level = parentNode.level + 1; child1.level = parentNode.level + 1; //compute norms child0.computeNormOfConsts(parentNode); child1.computeNormOfConsts(parentNode); geoWaveArr.Add(child0); geoWaveArr.Add(child1); parentNode.child0 = geoWaveArr.IndexOf(child0); parentNode.child1 = geoWaveArr.IndexOf(child1); //RECURSION STEP !!! recursiveBSP_LocalPCA(geoWaveArr, parentNode.child0); recursiveBSP_LocalPCA(geoWaveArr, parentNode.child1); }
// Transformed data decomposition private void recursiveBSP_TransformedData(IList <GeoWave> geoWaveArr, int geoWaveId, List <SplitType> splitTypes) { GeoWave parentNode = geoWaveArr[geoWaveId]; double error = parentNode.calc_MeanValueReturnError(_trainingLabel, parentNode.pointsIdArray); if (error < _rc.approxThresh || parentNode.pointsIdArray.Count() <= _rc.minWaveSize || _rc.boundDepthTree <= parentNode.level) { return; } List <SplitProps> resultSplitsProperties = (from splitType in splitTypes select getTransformedPartitionAllDim(parentNode, error, splitType)).ToList(); resultSplitsProperties = resultSplitsProperties.Where(x => x.isPartitionOk).ToList(); //not exist split that may help if (resultSplitsProperties.Count == 0) { return; } SplitProps bestSplit = resultSplitsProperties.Aggregate((a, b) => (a.error < b.error) ? a : b); if (!bestSplit.isPartitionOk) { return; } parentNode.typeTransformed = bestSplit.type; GeoWave child0 = new GeoWave(_rc.dim, _rc.labelDim, _rc); GeoWave child1 = new GeoWave(_rc.dim, _rc.labelDim, _rc); child0.dimIndex = bestSplit.dimIndex; child1.dimIndex = bestSplit.dimIndex; List <int> sortedIds = bestSplit.sortedIds; int splitId = bestSplit.splitId; //set childs id's child0.pointsIdArray = sortedIds.GetRange(0, sortedIds.IndexOf(splitId)); child1.pointsIdArray = sortedIds.GetRange(sortedIds.IndexOf(splitId), sortedIds.Count - child0.pointsIdArray.Count); // set upper split value only child0.upperSplitValue = bestSplit.splitValue; //set mean values setTransformedChildMeanValue(ref child0); setTransformedChildMeanValue(ref child1); //set parent id child0.parentID = geoWaveId; child1.parentID = geoWaveId; //set level child0.level = parentNode.level + 1; child1.level = parentNode.level + 1; //debug writelines Debug.WriteLine("************Parent Size:" + parentNode.pointsIdArray.Count); Debug.WriteLine("************Level:" + (parentNode.level + 1)); Debug.WriteLine("************Type Splitted:" + bestSplit.type); Debug.WriteLine("***********************************************************"); //!!! START DEBUG VISULIZE SPIRAL SPLIT /* double[][] child0Data = child0.pointsIdArray.Select(id => _trainingDt[id]).ToArray(); * double[][] child1Data = child1.pointsIdArray.Select(id => _trainingDt[id]).ToArray(); * double[][] child0responce = child0.pointsIdArray.Select(id => _trainingLabel[id]).ToArray(); * double[][] child1responce = child1.pointsIdArray.Select(id => _trainingLabel[id]).ToArray(); * int level = child0.level; * PrintEngine.debugVisualizeSpiralSplit(child0Data, child1Data, * child0responce, child1responce, * level, parentNode.typeTransformed, debugAnalysisFolderName);*/ //!!! END DEBUG VISUALIZE SPIRAL SPLIT' //compute norms child0.computeNormOfConsts(parentNode); child1.computeNormOfConsts(parentNode); child0.meanDiffFromParent = child0.MeanValue[0] - parentNode.MeanValue[0]; child1.meanDiffFromParent = child1.MeanValue[0] - parentNode.MeanValue[0]; geoWaveArr.Add(child0); geoWaveArr.Add(child1); parentNode.child0 = geoWaveArr.IndexOf(child0); parentNode.child1 = geoWaveArr.IndexOf(child1); //RECURSION STEP !!! recursiveBSP_TransformedData(geoWaveArr, parentNode.child0, splitTypes); recursiveBSP_TransformedData(geoWaveArr, parentNode.child1, splitTypes); }
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); }