realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/bernstein_eenv_simplify.hpp File Reference

Go to the source code of this file.

Functions


Function Documentation

static void msimplify ( eenv *  ienv,
real_t *  data 
) [static]

Definition at line 7 of file bernstein_eenv_simplify.hpp.

References mmx::array::add(), assert, mmx::vct::fill(), and oaddress().

{
  unsigned * supp = new unsigned[ ienv->data_size() ];
  unsigned  nsupp = ienv->support( supp, data );
  sz_t      newszs[ienv->m_nvr];
  unsigned i,add;
  sz_t v;
  unsigned sz;
  std::fill(newszs,newszs+ienv->m_nvr,0);
  for ( i = 0; i < nsupp; i ++ )
    {
      for ( add = supp[i], v = ienv->m_nvr-1; add; add /= ienv->m_szs[v], v-- )
        {
          sz = add % ienv->m_szs[v] + 1;
          if ( sz > newszs[v] ) newszs[v] = sz;
        };
      for ( int v = 0; v < ienv->m_nvr; v ++ )
        if ( newszs[v] != ienv->m_szs[v] ) continue;
      break;
    };
  
  if ( i < nsupp ) { delete[] supp; return; };
  for ( sz_t v = 0; v < ienv->m_nvr; v ++ )
    if ( newszs[v] == 0 ) newszs[v] = 1;
  
  eenv senv(ienv->m_nvr,newszs,ienv->m_vrs);
  unsigned * oa = new unsigned[ nsupp ];
  oaddress( &senv, oa, ienv, supp, nsupp );
  for ( unsigned i = 0; i < nsupp; i ++ )
    {
      assert(oa[i]<supp[i]);
      data[oa[i]] = data[supp[i]];
    };
  ienv->swap(senv);
};