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-vrestrict.hpp,v 1.1 2005/07/11 10:03:55 jppavone Exp $ 00005 ********************************************************************/ 00006 template< class real_t > 00007 static void v0restrict( real_t * rs, bernstein::eenv * em, const real_t& l ) 00008 { 00009 int k,i,j; 00010 real_t * ri, * rip; 00011 // std::copy(ms,ms+em->data_size(),rs); 00012 for ( k = em->m_szs[0]-1; k >= 0; k-- ) 00013 { 00014 for ( i = 0; i < k; i ++ ) 00015 { 00016 ri = rs + i*em->m_str[0]; 00017 rip = ri + em->m_str[0]; 00018 for ( j = 0; j < em->m_str[0]; j ++ ) 00019 ri[j] = (1.0-l)*ri[j]+l*rip[j]; 00020 }; 00021 }; 00022 }; 00023 00024 template< class real_t > 00025 static void v0restrict( real_t * rs, real_t * ms, bernstein::eenv * em, const real_t& l ) 00026 { 00027 int k,i,j; 00028 real_t * ri, * rip; 00029 std::copy(ms,ms+em->data_size(),rs); 00030 v0restrict( rs, em, l ); 00031 }; 00032 00033 template<class X, class real_t > 00034 static void vrestrict( bernstein::eenv * oenv, bernstein::eenv * ienv, 00035 X *& dst, real_t * src, sz_t v, const X& prm ) 00036 { 00037 sz_t nvr = ienv->m_nvr-1; 00038 sz_t c = 0; 00039 sz_t vrs[ienv->m_nvr]; 00040 sz_t szs[ienv->m_nvr]; 00041 std::copy(ienv->m_vrs,ienv->m_vrs + ienv->m_nvr, vrs ); 00042 std::copy(ienv->m_szs,ienv->m_szs + ienv->m_nvr, szs ); 00043 std::swap(vrs[v],vrs[0]); 00044 std::swap(szs[v],szs[0]); 00045 bernstein::eenv veenv( ienv->m_nvr, szs, vrs ); 00046 unsigned * addr = new unsigned[ ienv->data_size() ]; 00047 oaddress( &veenv, addr, ienv, 0, 0 ); 00048 X * tmp = new X[ienv->data_size()]; 00049 for ( unsigned c = 0; c < ienv->data_size(); tmp[addr[c]] = src[c], c ++ ); 00050 delete[] addr; 00051 v0restrict(tmp,&veenv,prm); 00052 oenv->~eenv(); 00053 new(oenv) bernstein::eenv( ienv->m_nvr-1, szs+1, vrs+1 ); 00054 dst = new X[oenv->data_size()]; 00055 std::copy( tmp, tmp + oenv->data_size(), dst ); 00056 }; 00057