realroot_doc 0.1.1
|
00001 /******************************************************************** 00002 * This file is part of the source code of the realroot library. 00003 * Author(s): J.P. Pavone, GALAAD, INRIA 00004 * $Id: eenv-simplify.hpp,v 1.1 2005/07/11 10:03:55 jppavone Exp $ 00005 ********************************************************************/ 00006 template< class real_t > 00007 static void msimplify( eenv * ienv, real_t * data ) 00008 { 00009 unsigned * supp = new unsigned[ ienv->data_size() ]; 00010 unsigned nsupp = ienv->support( supp, data ); 00011 sz_t newszs[ienv->m_nvr]; 00012 unsigned i,add; 00013 sz_t v; 00014 unsigned sz; 00015 std::fill(newszs,newszs+ienv->m_nvr,0); 00016 for ( i = 0; i < nsupp; i ++ ) 00017 { 00018 for ( add = supp[i], v = ienv->m_nvr-1; add; add /= ienv->m_szs[v], v-- ) 00019 { 00020 sz = add % ienv->m_szs[v] + 1; 00021 if ( sz > newszs[v] ) newszs[v] = sz; 00022 }; 00023 for ( int v = 0; v < ienv->m_nvr; v ++ ) 00024 if ( newszs[v] != ienv->m_szs[v] ) continue; 00025 break; 00026 }; 00027 00028 if ( i < nsupp ) { delete[] supp; return; }; 00029 for ( sz_t v = 0; v < ienv->m_nvr; v ++ ) 00030 if ( newszs[v] == 0 ) newszs[v] = 1; 00031 00032 eenv senv(ienv->m_nvr,newszs,ienv->m_vrs); 00033 unsigned * oa = new unsigned[ nsupp ]; 00034 oaddress( &senv, oa, ienv, supp, nsupp ); 00035 for ( unsigned i = 0; i < nsupp; i ++ ) 00036 { 00037 assert(oa[i]<supp[i]); 00038 data[oa[i]] = data[supp[i]]; 00039 }; 00040 ienv->swap(senv); 00041 };