1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* ---- includes ----------------------------------------------------------- */ 18 19 #include "b_APIEm/Functions.h" 20 #include "b_BasicEm/Memory.h" 21 22 23 /* ---- related objects --------------------------------------------------- */ 24 25 /* ---- typedefs ----------------------------------------------------------- */ 26 27 /* ---- constants ---------------------------------------------------------- */ 28 29 /* ------------------------------------------------------------------------- */ 30 31 /* ========================================================================= */ 32 /* */ 33 /* ---- \ghd{ external functions } ----------------------------------------- */ 34 /* */ 35 /* ========================================================================= */ 36 37 /* ------------------------------------------------------------------------- */ 38 39 void bpi_normalizeSimilarities( struct bbs_Context* cpA, 40 const int32* rawSimArrA, 41 const int32* rawIdArrA, 42 uint32 rawSizeA, 43 const int32* refSimArrA, 44 const int32* refIdArrA, 45 uint32 refSizeA, 46 enum bpi_SimType simTypeA, 47 int32* outSimArrA ) 48 { 49 /* 8.24 */ 50 int32 refSimL = 0; 51 uint32 iL, jL, kL; 52 int32* outPtrL = outSimArrA; 53 const int32* rawPtrL = rawSimArrA; 54 55 switch( simTypeA ) 56 { 57 case bpi_RAW_SIM: 58 { 59 /* nothing to do */ 60 } 61 break; 62 63 case bpi_SUB_MEAN: 64 { 65 int32 shiftL = 0; 66 int32 roundL = 0; 67 refSimL = 0; 68 for( iL = 0; iL < refSizeA; iL++ ) 69 { 70 refSimL += ( refSimArrA[ iL ] + roundL ) >> shiftL; 71 if( refSimL > 0x40000000 ) 72 { 73 refSimL = ( refSimL + 1 ) >> 1; 74 shiftL++; 75 roundL = ( int32 )1 << ( shiftL - 1 ); 76 } 77 } 78 refSimL = ( refSimL / refSizeA ) << shiftL; 79 } 80 break; 81 82 case bpi_SUB_MAX_2: 83 { 84 int32 maxL = 0; 85 uint32 maxIndexL = 0; 86 int32 idL = 0; 87 88 /* find raw maximum */ 89 for( iL = 0; iL < rawSizeA; iL++ ) 90 { 91 if( maxL < rawSimArrA[ iL ] ) 92 { 93 maxL = refSimArrA[ iL ]; 94 maxIndexL = iL; 95 } 96 } 97 98 /* consider id of maximum equal to probe id */ 99 idL = rawIdArrA[ maxIndexL ]; 100 101 /* find maximum similarity in ref array of different id */ 102 for( iL = 0; iL < refSizeA; iL++ ) 103 { 104 if( refIdArrA[ iL ] != idL ) 105 { 106 refSimL = ( refSimL > refSimArrA[ iL ] ) ? refSimL : refSimArrA[ iL ]; 107 } 108 } 109 } 110 break; 111 112 case bpi_SUB_16_MAX_2: 113 { 114 int32 maxL = 0; 115 uint32 maxIndexL = 0; 116 int32 idL = 0; 117 118 int32 maxSimArrL[ 16 ]; 119 bbs_memset32( maxSimArrL, ( uint32 )-1, bbs_SIZEOF32( maxSimArrL ) ); 120 121 /* find raw maximum */ 122 for( iL = 0; iL < rawSizeA; iL++ ) 123 { 124 if( maxL < rawSimArrA[ iL ] ) 125 { 126 maxL = rawSimArrA[ iL ]; 127 maxIndexL = iL; 128 } 129 } 130 131 /* consider id of maximum equal to probe id */ 132 idL = rawIdArrA[ maxIndexL ]; 133 134 /* find 16 maximum similarities of different id in ref array */ 135 for( iL = 0; iL < refSizeA; iL++ ) 136 { 137 if( refIdArrA[ iL ] != idL ) 138 { 139 int32 simL = refSimArrA[ iL ]; 140 for( jL = 0; jL < 16; jL++ ) 141 { 142 if( simL > maxSimArrL[ jL ] ) break; 143 } 144 for( kL = 15; kL > jL; kL-- ) 145 { 146 maxSimArrL[ kL ] = maxSimArrL[ kL - 1 ]; 147 } 148 if( jL < 16 ) maxSimArrL[ jL ] = simL; 149 } 150 } 151 152 refSimL = 0; 153 for( jL = 0; jL < 16; jL++ ) 154 { 155 if( maxSimArrL[ jL ] == -1 ) break; 156 refSimL += maxSimArrL[ jL ]; 157 } 158 159 if( jL > 0 ) 160 { 161 refSimL /= jL; 162 } 163 } 164 break; 165 166 default: 167 { 168 bbs_ERROR1( "void bpi_Identifier_normalizeSimilarities(): simTypeA '%i' is handled", simTypeA ); 169 return; 170 } 171 } 172 173 /* refSimL -= 1.0 */ 174 refSimL -= ( (uint32)1 << 24 ); 175 176 for( iL = rawSizeA; iL > 0; iL-- ) 177 { 178 *outPtrL++ = ( *rawPtrL++ - refSimL + 1 ) >> 1; 179 } 180 181 } 182 183 /* ------------------------------------------------------------------------- */ 184 185 int32 bpi_normalizedSimilarity( struct bbs_Context* cpA, 186 int32 rawSimA, 187 int32 rawIdA, 188 const int32* refSimArrA, 189 const int32* refIdArrA, 190 uint32 refSizeA, 191 enum bpi_SimType simTypeA ) 192 { 193 /* 8.24 */ 194 int32 refSimL = 0; 195 uint32 iL, jL, kL; 196 197 switch( simTypeA ) 198 { 199 case bpi_RAW_SIM: 200 { 201 /* nothing to do */ 202 return rawSimA; /* return without adjustment of value range */ 203 } 204 205 case bpi_SUB_MEAN: 206 { 207 int32 shiftL = 0; 208 int32 roundL = 0; 209 refSimL = 0; 210 for( iL = 0; iL < refSizeA; iL++ ) 211 { 212 refSimL += ( refSimArrA[ iL ] + roundL ) >> shiftL; 213 if( refSimL > 0x40000000 ) 214 { 215 refSimL = ( refSimL + 1 ) >> 1; 216 shiftL++; 217 roundL = ( int32 )1 << ( shiftL - 1 ); 218 } 219 } 220 refSimL = ( refSimL / refSizeA ) << shiftL; 221 } 222 break; 223 224 case bpi_SUB_MAX_2: 225 { 226 /* find maximum similarity in ref array of different rawIdA */ 227 for( iL = 0; iL < refSizeA; iL++ ) 228 { 229 if( refIdArrA[ iL ] != rawIdA ) 230 { 231 refSimL = ( refSimL > refSimArrA[ iL ] ) ? refSimL : refSimArrA[ iL ]; 232 } 233 } 234 } 235 break; 236 237 case bpi_SUB_16_MAX_2: 238 { 239 int32 maxSimArrL[ 16 ]; 240 int32 idL = rawIdA; 241 bbs_memset32( maxSimArrL, ( uint32 )-1, bbs_SIZEOF32( maxSimArrL ) ); 242 243 /* find 16 maximum similarities of different id in ref array */ 244 for( iL = 0; iL < refSizeA; iL++ ) 245 { 246 if( refIdArrA[ iL ] != idL ) 247 { 248 int32 simL = refSimArrA[ iL ]; 249 for( jL = 0; jL < 16; jL++ ) 250 { 251 if( simL > maxSimArrL[ jL ] ) break; 252 } 253 for( kL = 15; kL > jL; kL-- ) 254 { 255 maxSimArrL[ kL ] = maxSimArrL[ kL - 1 ]; 256 } 257 if( jL < 16 ) maxSimArrL[ jL ] = simL; 258 } 259 } 260 261 refSimL = 0; 262 for( jL = 0; jL < 16; jL++ ) 263 { 264 if( maxSimArrL[ jL ] == -1 ) break; 265 refSimL += maxSimArrL[ jL ]; 266 } 267 268 if( jL > 0 ) 269 { 270 refSimL /= jL; 271 } 272 } 273 break; 274 275 default: 276 { 277 bbs_ERROR1( "void bpi_Identifier_normalizeSimilarities(): simTypeA '%i' is handled", simTypeA ); 278 } 279 break; 280 } 281 282 /* refSimL -= 1.0 */ 283 refSimL -= ( (uint32)1 << 24 ); 284 return ( rawSimA - refSimL + 1 ) >> 1; 285 } 286 287 /* ------------------------------------------------------------------------- */ 288 289 uint32 bpi_memWriteCsa16( uint16* memPtrA, uint32 memSizeA, uint16 chkSumA ) 290 { 291 uint16* memPtrL = memPtrA - memSizeA + 1; 292 uint32 iL; 293 uint16 sumL = 0; 294 uint16 csaL = 0; 295 296 bbs_memWrite16( &csaL, memPtrA ); 297 for( iL = 0; iL < memSizeA; iL++ ) 298 { 299 uint16 valL = 0; 300 memPtrL += bbs_memRead16( &valL, memPtrL ); 301 sumL += valL; 302 } 303 csaL = chkSumA - sumL; 304 305 return bbs_memWrite16( &csaL, memPtrA ); 306 } 307 308 /* ------------------------------------------------------------------------- */ 309 310 uint32 bpi_memReadCsa16( const uint16* memPtrA ) 311 { 312 return bbs_SIZEOF16( uint16 ); 313 } 314 315 /* ------------------------------------------------------------------------- */ 316 317