17f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* 27f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 37f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 47f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * you may not use this file except in compliance with the License. 67f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * You may obtain a copy of the License at 77f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 87f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * See the License for the specific language governing permissions and 147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * limitations under the License. 157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */ 167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- includes ----------------------------------------------------------- */ 187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_TensorEm/Int32Mat.h" 207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_TensorEm/Functions.h" 217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Math.h" 227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Functions.h" 237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Memory.h" 247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ auxiliary functions } ---------------------------------------- */ 307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Int32Mat_reduceToNBits( int32* ptrA, uint32 sizeA, int32* bbpPtrA, uint32 nBitsA ) 367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 shiftL; 387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* find max element */ 407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 maxL = 0; 417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* ptrL = ptrA; 427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 iL = sizeA; 437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( iL-- ) 447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 xL = *ptrL++; 467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( xL < 0 ) xL = -xL; 477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( xL > maxL ) maxL = xL; 487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* determine shift */ 517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = bts_absIntLog2( maxL ) + 1 - nBitsA; 527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( shiftL > 0 ) 547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrL = ptrA; 567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project iL = sizeA; 577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( iL-- ) 587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *ptrL = ( ( *ptrL >> ( shiftL - 1 ) ) + 1 ) >> 1; 607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrL++; 617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *bbpPtrA -= shiftL; 647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */ 727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Int32Mat_init( struct bbs_Context* cpA, 787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int32Mat* ptrA ) 797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->widthE = 0; 817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int32Arr_init( cpA, &ptrA->arrE ); 827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Int32Mat_exit( struct bbs_Context* cpA, 877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int32Mat* ptrA ) 887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->widthE = 0; 907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int32Arr_exit( cpA, &ptrA->arrE ); 917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */ 977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */ 1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */ 1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Int32Mat_create( struct bbs_Context* cpA, 1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int32Mat* ptrA, 1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 widthA, 1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_MemSeg* mspA ) 1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( bbs_Context_error( cpA ) ) return; 1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int32Arr_create( cpA, &ptrA->arrE, widthA * widthA, mspA ); 1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->widthE = widthA; 1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Int32Mat_copy( struct bbs_Context* cpA, 1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int32Mat* ptrA, 1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bts_Int32Mat* srcPtrA ) 1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ptrA->widthE != srcPtrA->widthE ) 1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR0( "void bts_Int32Mat_copy( struct bts_Int32Mat* ptrA, struct bts_Int32Mat* srcPtrA ):\n" 1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project "size mismatch" ); 1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return; 1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int32Arr_copy( cpA, &ptrA->arrE, &srcPtrA->arrE ); 1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */ 1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Int32Mat_memSize( struct bbs_Context* cpA, 1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bts_Int32Mat *ptrA ) 1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return bbs_SIZEOF16( uint32 ) 1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project + bbs_SIZEOF16( uint32 ) /* version */ 1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project + bbs_SIZEOF16( ptrA->widthE ) 1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project + bbs_Int32Arr_memSize( cpA, &ptrA->arrE ); 1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Int32Mat_memWrite( struct bbs_Context* cpA, 1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bts_Int32Mat* ptrA, 1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* memPtrA ) 1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 memSizeL = bts_Int32Mat_memSize( cpA, ptrA ); 1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &memSizeL, memPtrA ); 1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWriteUInt32( bts_INT32MAT_VERSION, memPtrA ); 1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->widthE, memPtrA ); 1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_Int32Arr_memWrite( cpA, &ptrA->arrE, memPtrA ); 1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return memSizeL; 1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Int32Mat_memRead( struct bbs_Context* cpA, 1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int32Mat* ptrA, 1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint16* memPtrA, 1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_MemSeg* mspA ) 1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 memSizeL, versionL; 1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( bbs_Context_error( cpA ) ) return 0; 1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &memSizeL, memPtrA ); 1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memReadVersion32( cpA, &versionL, bts_INT32MAT_VERSION, memPtrA ); 1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->widthE, memPtrA ); 1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_Int32Arr_memRead( cpA, &ptrA->arrE, memPtrA, mspA ); 1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( memSizeL != bts_Int32Mat_memSize( cpA, ptrA ) ) 1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bts_Int32Mat_memRead( const struct bts_Int32Mat* ptrA, const void* memPtrA ):\n" 1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project "size mismatch" ); 1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return memSizeL; 1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */ 2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bts_Int32Mat_solve( struct bbs_Context* cpA, 2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const int32* matA, 2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 matWidthA, 2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const int32* inVecA, 2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* outVecA, 2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 bbpA, 2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* tmpMatA, 2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* tmpVecA ) 2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_memcpy32( tmpMatA, matA, ( matWidthA * matWidthA ) * bbs_SIZEOF32( int32 ) ); 2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return bts_Int32Mat_solve2( cpA, 2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project tmpMatA, 2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project matWidthA, 2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project inVecA, 2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project outVecA, 2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbpA, 2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project tmpVecA ); 2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bts_Int32Mat_solve2( struct bbs_Context* cpA, 2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* matA, 2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 matWidthA, 2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const int32* inVecA, 2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* outVecA, 2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 bbpA, 2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* tmpVecA ) 2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 sizeL = matWidthA; 2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 bbpL = bbpA; 2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 iL, jL, kL; 2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 iPivL; 2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 jPivL; 2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* vecL = outVecA; 2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* matL = matA; 2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* checkArrL = tmpVecA; 2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeL; iL++ ) 2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project checkArrL[ iL ] = 0; 2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_memcpy32( outVecA, inVecA, sizeL * bbs_SIZEOF32( int32 ) ); 2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project iPivL = 0; 2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( kL = 0; kL < sizeL; kL++ ) 2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* find pivot */ 2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 maxAbsL = 0; 2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* pivRowL; 2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 bbp_pivRowL, bbp_vecL, shiftL; 2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project jPivL = -1; 2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeL; iL++ ) 2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( checkArrL[ iL ] != 1 ) 2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* rowL = matL + ( iL * sizeL ); 2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( jL = 0; jL < sizeL; jL++ ) 2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( checkArrL[ jL ] == 0 ) 2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 absElemL = rowL[ jL ]; 2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( absElemL < 0 ) absElemL = -absElemL; 2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( maxAbsL < absElemL ) 2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project maxAbsL = absElemL; 2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project iPivL = iL; 2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project jPivL = jL; 2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else if( checkArrL[ jL ] > 1 ) 2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return FALSE; 2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* successfull ? */ 2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( jPivL < 0 ) 2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return FALSE; 2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project checkArrL[ jPivL ]++; 3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* exchange rows to put pivot on diagonal, if neccessary */ 3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( iPivL != jPivL ) 3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* row1PtrL = matL + ( iPivL * sizeL ); 3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* row2PtrL = matL + ( jPivL * sizeL ); 3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( jL = 0; jL < sizeL; jL++ ) 3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 tmpL = *row1PtrL; 3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *row1PtrL++ = *row2PtrL; 3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *row2PtrL++ = tmpL; 3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 tmpL = vecL[ jPivL ]; 3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecL[ jPivL ] = vecL[ iPivL ]; 3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecL[ iPivL ] = tmpL; 3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* now index jPivL specifies pivot row and maximum element */ 3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /** Overflow protection: only if the highest bit of the largest matrix element is set, 3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * we need to shift the whole matrix and the right side vector 1 bit to the right, 3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * to make sure there can be no overflow when the pivot row gets subtracted from the 3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * other rows. 3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Getting that close to overflow is a rare event, so this shift will happen only 3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * occasionally, or not at all. 3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */ 3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( maxAbsL & 1073741824 ) /*( 1 << 30 )*/ 3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* right shift matrix by 1 */ 3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 iL = sizeL * sizeL; 3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* ptrL = matL; 3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( iL-- ) 3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *ptrL = ( *ptrL + 1 ) >> 1; 3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrL++; 3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* right shift right side vector by 1 */ 3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project iL = sizeL; 3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrL = vecL; 3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( iL-- ) 3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *ptrL = ( *ptrL + 1 ) >> 1; 3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrL++; 3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* decrement bbpL */ 3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbpL--; 3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* reduce elements of pivot row to 15 bit */ 3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pivRowL = matL + jPivL * sizeL; 3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbp_pivRowL = bbpL; 3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Int32Mat_reduceToNBits( pivRowL, sizeL, &bbp_pivRowL, 15 ); 3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* scale pivot row such that maximum equals 1 */ 3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 maxL = pivRowL[ jPivL ]; 3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 bbp_maxL = bbp_pivRowL; 3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 factorL = 1073741824 / maxL; /*( 1 << 30 )*/ 3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( jL = 0; jL < sizeL; jL++ ) 3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pivRowL[ jL ] = ( pivRowL[ jL ] * factorL + ( 1 << 14 ) ) >> 15; 3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbp_pivRowL = 15; 3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* set to 1 to avoid computational errors */ 3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pivRowL[ jPivL ] = ( int32 )1 << bbp_pivRowL; 3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = 30 - bts_absIntLog2( vecL[ jPivL ] ); 3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecL[ jPivL ] = ( vecL[ jPivL ] << shiftL ) / maxL; 3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbp_vecL = bbpL + shiftL - bbp_maxL; 3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_int32ReduceToNBits( &( vecL[ jPivL ] ), &bbp_vecL, 15 ); 3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* subtract pivot row from all other rows */ 3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeL; iL++ ) 3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( iL != jPivL ) 3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* rowPtrL = matL + iL * sizeL; 3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 tmpL = *( rowPtrL + jPivL ); 3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 bbp_tmpL = bbpL; 3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_int32ReduceToNBits( &tmpL, &bbp_tmpL, 15 ); 3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = bbp_tmpL + bbp_pivRowL - bbpL; 3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( shiftL > 0 ) 3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( jL = 0; jL < sizeL; jL++ ) 3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *rowPtrL++ -= ( ( ( tmpL * pivRowL[ jL ] ) >> ( shiftL - 1 ) ) + 1 ) >> 1; 3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( jL = 0; jL < sizeL; jL++ ) 4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *rowPtrL++ -= ( tmpL * pivRowL[ jL ] ) << -shiftL; 4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = bbp_tmpL + bbp_vecL - bbpL; 4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( shiftL > 0 ) 4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecL[ iL ] -= ( ( ( tmpL * vecL[ jPivL ] ) >> ( shiftL - 1 ) ) + 1 ) >> 1; 4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecL[ iL ] -= ( tmpL * vecL[ jPivL ] ) << -shiftL; 4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* change bbp of pivot row back to bbpL */ 4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = bbpL - bbp_pivRowL; 4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( shiftL >= 0 ) 4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( jL = 0; jL < sizeL; jL++ ) 4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pivRowL[ jL ] <<= shiftL; 4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = -shiftL; 4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( jL = 0; jL < sizeL; jL++ ) 4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project pivRowL[ jL ] = ( ( pivRowL[ jL ] >> ( shiftL - 1 ) ) + 1 ) >> 1; 4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = bbpL - bbp_vecL; 4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( shiftL >= 0 ) 4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecL[ jPivL ] <<= shiftL; 4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = -shiftL; 4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecL[ jPivL ] = ( ( vecL[ jPivL ] >> ( shiftL - 1 ) ) + 1 ) >> 1; 4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* 4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectif( sizeL <= 5 ) bts_Int32Mat_print( matL, vecL, sizeL, bbpL ); 4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project*/ 4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } /* of kL */ 4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* in case bbpL has been decreased by the overflow protection, change it back now */ 4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( bbpA > bbpL ) 4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* find largest element of solution vector */ 4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 maxL = 0; 4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 iL, shiftL; 4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeL; iL++ ) 4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 xL = vecL[ iL ]; 4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( xL < 0 ) xL = -xL; 4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( xL > maxL ) maxL = xL; 4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* check whether we can left shift without overflow */ 4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = 30 - bts_absIntLog2( maxL ); 4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( shiftL < ( bbpA - bbpL ) ) 4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* 4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_WARNING1( "flag bts_Int32Mat_solve2( ... ): getting overflow when trying to " 4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project "compute solution vector with bbp = %d. Choose smaller bbp.\n", bbpA ); 4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */ 4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return FALSE; 4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* shift left */ 4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project shiftL = bbpA - bbpL; 4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeL; iL++ ) vecL[ iL ] <<= shiftL; 4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return TRUE; 4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 491