diff options
Diffstat (limited to 'src/phenotypebinary.cpp')
| -rw-r--r-- | src/phenotypebinary.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/phenotypebinary.cpp b/src/phenotypebinary.cpp index 0d32c9f..9d9e26c 100644 --- a/src/phenotypebinary.cpp +++ b/src/phenotypebinary.cpp | |||
| @@ -18,6 +18,8 @@ Genetic::PhenotypeBinary::PhenotypeBinary( int iSize, bool bRandom ) : | |||
| 18 | aGenes = new uint_fast32_t[iWords]; | 18 | aGenes = new uint_fast32_t[iWords]; |
| 19 | if( bRandom ) | 19 | if( bRandom ) |
| 20 | randomize(); | 20 | randomize(); |
| 21 | else | ||
| 22 | memset( aGenes, 0, sizeof(uint_fast32_t)*iWords ); | ||
| 21 | } | 23 | } |
| 22 | 24 | ||
| 23 | Genetic::PhenotypeBinary::~PhenotypeBinary() | 25 | Genetic::PhenotypeBinary::~PhenotypeBinary() |
| @@ -57,12 +59,16 @@ Genetic::Phenotype *Genetic::PhenotypeBinary::makeEmptyOffspring( | |||
| 57 | Genetic::Phenotype &Genetic::PhenotypeBinary::copyFrom( const Phenotype &rSrc, | 59 | Genetic::Phenotype &Genetic::PhenotypeBinary::copyFrom( const Phenotype &rSrc, |
| 58 | int iStart, int iCount, int iDest ) | 60 | int iStart, int iCount, int iDest ) |
| 59 | { | 61 | { |
| 62 | if( iCount <= 0 ) | ||
| 63 | return *this; | ||
| 64 | |||
| 60 | const PhenotypeBinary &rbSrc = | 65 | const PhenotypeBinary &rbSrc = |
| 61 | dynamic_cast<const Genetic::PhenotypeBinary &>(rSrc); | 66 | dynamic_cast<const Genetic::PhenotypeBinary &>(rSrc); |
| 62 | if( iDest < 0 ) | 67 | if( iDest < 0 ) |
| 63 | iDest = iStart; | 68 | iDest = iStart; |
| 64 | 69 | ||
| 65 | // Fist draft, very sloppy: bit by bit copy, this is stupid, but easy | 70 | // Fist draft, very sloppy: bit by bit copy, this is stupid, but easy |
| 71 | /* | ||
| 66 | for( int j = 0; j < iCount; j++ ) | 72 | for( int j = 0; j < iCount; j++ ) |
| 67 | { | 73 | { |
| 68 | int wd = wordWithBit(j+iDest); | 74 | int wd = wordWithBit(j+iDest); |
| @@ -76,6 +82,56 @@ Genetic::Phenotype &Genetic::PhenotypeBinary::copyFrom( const Phenotype &rSrc, | |||
| 76 | aGenes[wd] |= (1<<((j+iDest)%BPW)); | 82 | aGenes[wd] |= (1<<((j+iDest)%BPW)); |
| 77 | } | 83 | } |
| 78 | } | 84 | } |
| 85 | */ | ||
| 86 | |||
| 87 | { | ||
| 88 | if( iDest == iStart ) | ||
| 89 | { | ||
| 90 | if( wordWithBit(iStart) == wordWithBit(iStart+iCount-1) ) | ||
| 91 | { | ||
| 92 | uint_fast32_t uMask = -1; | ||
| 93 | uMask = (uMask << (iStart%BPW)) & | ||
| 94 | (uMask >> (BPW-(((iStart+iCount))%BPW))); | ||
| 95 | // sio << Fmt().radix(2).width(32).fill('0') << uMask << sio.nl; | ||
| 96 | aGenes[wordWithBit( iDest )] = | ||
| 97 | (aGenes[wordWithBit( iDest )]&(~uMask)) | | ||
| 98 | (rbSrc.aGenes[wordWithBit( iStart )]&uMask); | ||
| 99 | } | ||
| 100 | else | ||
| 101 | { | ||
| 102 | int iStartWord = wordWithBit( iStart ); | ||
| 103 | int iEndWord = wordWithBit( iStart+iCount ); | ||
| 104 | |||
| 105 | // sio << wordWithBit( iStart+iCount ) << "/" << iWords << sio.nl; | ||
| 106 | // sio << iStart << " + " << iCount << " = " << iStart+iCount << " / " << iSize << sio.nl; | ||
| 107 | |||
| 108 | |||
| 109 | uint_fast32_t uMask = -1; | ||
| 110 | uMask = uMask << (iStart%BPW); | ||
| 111 | // sio << Fmt().radix(2).width(32).fill('0') << uMask << sio.nl; | ||
| 112 | aGenes[wordWithBit( iDest )] = | ||
| 113 | (aGenes[wordWithBit( iDest )]&(~uMask)) | | ||
| 114 | (rbSrc.aGenes[wordWithBit( iStart )]&uMask); | ||
| 115 | |||
| 116 | for( int j = iStartWord+1; j < iEndWord; j++ ) | ||
| 117 | aGenes[j] = rbSrc.aGenes[j]; | ||
| 118 | |||
| 119 | uMask = ((uint_fast32_t)-1) >> (BPW-(((iStart+iCount))%BPW)); | ||
| 120 | // sio << Fmt().radix(2).width(32).fill('0') << uMask << sio.nl; | ||
| 121 | aGenes[wordWithBit( iDest+iCount-1 )] = | ||
| 122 | (aGenes[wordWithBit( iDest+iCount-1 )]&(~uMask)) | | ||
| 123 | (rbSrc.aGenes[wordWithBit( iStart+iCount-1 )]&uMask); | ||
| 124 | } | ||
| 125 | } | ||
| 126 | else if( iDest < iStart ) | ||
| 127 | { | ||
| 128 | sio << "iDest < iStart not finished." << sio.nl; | ||
| 129 | } | ||
| 130 | else | ||
| 131 | { | ||
| 132 | sio << "iDest > iStart not finished." << sio.nl; | ||
| 133 | } | ||
| 134 | } | ||
| 79 | 135 | ||
| 80 | /* | 136 | /* |
| 81 | iStart%BPW | 137 | iStart%BPW |
