realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/bernstein_eenv_simplify.hpp
Go to the documentation of this file.
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 };