38 uint mNodeDepth, fNodeDepth, fNodeDepthSize;
40 mRange = (uint) male->size();
41 fRange = (uint) female->size();
44 std::vector < std::vector<uint> > femaleSizeIndexes;
46 femaleSizeIndexes.resize( fRange + 1 );
48 for(uint i = 0; i < fRange; i++)
49 femaleSizeIndexes[ female->at( i )->size_ ].push_back( i );
54 mIndex = state_->getRandomizer()->getRandomInteger(0 , (
int) mRange -1 );
57 uint subtreeSize = calculateSize ((
int) male->at( mIndex )->size_);
60 if( subtreeSize <= fRange && femaleSizeIndexes[ subtreeSize ].size())
break;
63 uint tmpRnd = state_->getRandomizer()->getRandomInteger(0 , (
int) femaleSizeIndexes[ subtreeSize ].size() - 1 );
64 fIndex = femaleSizeIndexes[ subtreeSize ][ tmpRnd ];
66 mNodeDepth = male->at( mIndex )->depth_;
67 fNodeDepth = female->at( fIndex )->depth_;
70 uint maxDepth = fNodeDepth, depth;
71 for(uint i = 0; i < female->at( fIndex )->size_; i++) {
72 depth = female->at( fIndex + i )->depth_;
73 maxDepth = depth > maxDepth ? depth : maxDepth;
76 fNodeDepthSize = maxDepth - fNodeDepth;
79 if(nTries > 4 || mNodeDepth + fNodeDepthSize <= male->maxDepth_ )
break;
82 if(nTries > 4 && mNodeDepth + fNodeDepthSize > male->maxDepth_) {
83 ECF_LOG(state_, 5,
"TreeCrxSizeFair not successful.");
88 child->maxDepth_ = male->maxDepth_;
89 child->minDepth_ = male->minDepth_;
90 child->startDepth_ = male->startDepth_;
93 for(uint i = 0; i < mIndex; i++) {
94 NodeP node =
static_cast<NodeP
> (
new Node( male->at(i)->primitive_));
95 child->push_back( node );
96 child->at( i )->depth_ = male->at( i )->depth_;
100 for(uint i = 0; i < female->at( fIndex )->size_; i++) {
101 NodeP node =
static_cast<NodeP
> (
new Node( female->at( fIndex + i)->primitive_));
102 child->push_back( node );
105 for(uint i = mIndex + male->at( mIndex )->size_; i < mRange; i++) {
106 NodeP node =
static_cast<NodeP
> (
new Node( male->at( i )->primitive_));
107 child->push_back( node );