- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
template < int Order, typename T >
struct PrefixSum {
static inline void update ( T* a ) throw () { *a += *(a-1); PrefixSum < Order-1, T > :: update( a+1 ); }
};
template < typename T >
struct PrefixSum < 1,T > {
static inline void update ( T* a ) throw () { *a += *(a-1); }
};
template < int P, int N, int Condition = 0 >
struct Bpn {
enum { value = N * ( Bpn < P-1, N-1, (N > P) > :: value - Bpn < P-1, N, (N > P-1) > :: value ) };
};
template < int P, int N > struct Bpn < P, N, !0 > { enum { value = 0 }; };
template < int P > struct Bpn < P, 0, 0 > { enum { value = P ? 0 : 1 }; };
template < int P > struct Bpn < P, 1, 0 > { enum { value = P & 1 ? 1 : -1 }; };
template < typename Ta, typename Tb, bool C > struct IfThenElse;
template < typename Ta, typename Tb > struct IfThenElse < Ta, Tb, true > { typedef Ta TRes; };
template < typename Ta, typename Tb > struct IfThenElse < Ta, Tb, false > { typedef Tb TRes; };
template < int K, int I = 1 >
struct MomentSeries {
typedef typename IfThenElse < MomentSeries<K,I+1>, MomentSeries<K,K>, (I<K) >::TRes SubT;
static inline double accumulate ( double const* psum ) throw () {
return Bpn < K, I > :: value * psum [ I + 1 ] + SubT :: accumulate ( psum );
}
};
template < int K >
struct MomentSeries < K, K > {
static inline double accumulate ( double const* psum ) throw () {
return Bpn < K, K > :: value * psum [ K + 1 ];
}
};
template < int Order >
struct MomentLoop {
static inline void assign ( double *moments, size_t momentStride, double const* psum ) throw() {
*(moments - momentStride) = MomentSeries < Order-1 > :: accumulate ( psum );
MomentLoopAssign < Order-1 > :: assign ( moments - momentStride, momentStride, psum );
}
};
template <>
struct MomentLoop < 1 > {
static inline void assign ( double *moments, size_t momentStride, double const* psum ) throw() {
moments [ 0 ] = MomentSeries < 1, 1 > :: accumulate ( psum );
*(moments - momentStride) = psum [ 1 ];
}
};
/**
* Function computes a series of geometric moments by prefix summation method:
* Zhou F., Kornerup P. Computing Moments by Prefix Sums. // VLSI Signal Proc. - 2000. - 25. - P. 5 - 17.
* @param data is first data elemet address.
* @param ndataItems is number of data items.
* @param dataStride is the number of elements between two neighbor data items,
* in case of simple array dataStride is equal to 1.
* @param moments is address of 0-order moment.
* @param momentStride is number of elements between two neigbor moment items,
* in case of consequtive moments placement, momentStride is equal to 1.
*/
template < int Order, class OutPolicy >
inline void psmoment ( double const* data,
size_t const ndataItems,
size_t const dataStride,
double* moments,
size_t const momentStride ) throw() {
double psum [ Order+1 ] = { 0 };
// Initialize prefix sum
for ( size_t i = ndataItems, j = ndataItems * dataStride; i; ) {
--i; j -= dataStride; psum [ 0 ] = data [ j ];
PrefixSum < Order, double > :: update ( psum+1 );
}
// convert psum to moment values
OutPolicy :: assign ( moments + Order * momentStride, momentStride, psum );
}
Достоинства ФП - чистота, лаконичность кода, высокий уровень абстракции. А здесь - полный ужоснах!
Моноиды он соорудил, бля...
test.cpp: In static member function ‘static void MomentLoop<Order>::assign(double*, size_t, const double*)’:
test.cpp:155: error: ‘MomentLoopAssign’ was not declared in this scope
test.cpp:155: error: ‘::assign’ has not been declared
ПФП не нужна, ФП не нужно, сабжевые темплитоизъёбства не нужны,
работать это ладом не будет, зато будет со скрипом тормозить не хуже жабы.
Firefox не может найти сервер www.oonumerics.org.
* Проверьте, не допущена ли ошибка при наборе адреса, например, ww.example.com вместо www.example.com
* Если ни одна страница не загружается – проверьте настройки соединения с Интернетом.
* Если компьютер или сеть защищены брандмауэром или прокси-сервером – убедитесь, что Firefox разрешен выход в Интернет.
Error E2040 test.cpp 125: Declaration terminated incorrectly
Error E2190 test.cpp 125: Unexpected }
Error E2190 test.cpp 126: Unexpected }
Error E2238 test.cpp 161: Multiple declaration for 'MomentLoop<1>::assign(double *,unsigned int,const double *) throw()'
Error E2344 test.cpp 153: Earlier declaration of 'MomentLoop<1>::assign(double *,unsigned int,const double *) throw()'
Warning W8026 test.cpp 165: Functions with exception specifications are not expanded inline
Warning W8027 test.cpp 187: Functions containing for are not expanded inline
*** 6 errors in Compile **
Хотите замечаний - напишите то, что можно скомпилять без ошибок, запустить и получить какой-то результат.
- MomentLoopAssign < Order-1 > :: assign ( moments - momentStride, momentStride, psum );
+ MomentLoop < Order-1 > :: assign ( moments - momentStride, momentStride, psum );
Я не осилил этот код.
Ещё, это всё весьма древние техники, см. например, http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html
заменили цикл рекурсией - быстрей будет?
2. В сгенерированном коде нет рекурсии (разве что в очень древних компиляторах).
А все это из детства идет: да, тяжелое крестодество с деревянными игрушками и каленым железом выжженные в мозгах мысли -- "кроме крестов языков нет", "ооп -- наше всё", "не спалил хард после очередного сегфолта -- не мужик", "один раз -- не пидорас", в этой плоскости крестофильство пересекается с идеями долбославия: когда протестантизм завещает работать над собой и создавать блага, славя величие Господа, православие требует от последователя искупления греха, посредством непрерывного страдания, как страдал Иисус неся свой крест. Стрелять себе в ногу и нажираясь потом водкой, позерски ноя о тяжестях нищебродской жизни -- что может быть лучше для православного плюсоеба?
Легко объяснить сей факт: просто кто-то рядом с их курятником вскользь упомянул про какие-то DSL, Code-as-Data на Лиспе. Вот так петушки стали подозревать, что существует что-то помимо плюсов и говняшной. Это если не считать тех слухов про соседний вольер и макак обучаемых жаве и сисярпу.
Бедные, бедные недолюдишки, наверно им тяжело обитать на самой нижней ступени эволюции, не понимать и малой толики процессов, происходящих вокруг них и уж тем более зверски беспощадных мат. теорий, которых, надо заметить, в хвост и гриву имеют эти ироды - функциональные боги.
вот так будет компилится, но работь ессно не будет, впрочем ладно, не важно, похуй