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