00001
00002
00003
00004
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 };