- 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 );
}
koodeer 13.05.2011 05:04 # −2
Достоинства ФП - чистота, лаконичность кода, высокий уровень абстракции. А здесь - полный ужоснах!
Моноиды он соорудил, бля...
guest 13.05.2011 09:39 # −2
guest 13.05.2011 06:53 # −2
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
ПФП не нужна, ФП не нужно, сабжевые темплитоизъёбства не нужны,
работать это ладом не будет, зато будет со скрипом тормозить не хуже жабы.
ngry 13.05.2011 08:38 # −2
guest 13.05.2011 09:20 # −7
Firefox не может найти сервер www.oonumerics.org.
* Проверьте, не допущена ли ошибка при наборе адреса, например, ww.example.com вместо www.example.com
* Если ни одна страница не загружается – проверьте настройки соединения с Интернетом.
* Если компьютер или сеть защищены брандмауэром или прокси-сервером – убедитесь, что Firefox разрешен выход в Интернет.
Govnocoder#0xFF 19.05.2011 18:14 # −3
guest 13.05.2011 08:09 # 0
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 **
Хотите замечаний - напишите то, что можно скомпилять без ошибок, запустить и получить какой-то результат.
ngry 13.05.2011 08:36 # −2
- MomentLoopAssign < Order-1 > :: assign ( moments - momentStride, momentStride, psum );
+ MomentLoop < Order-1 > :: assign ( moments - momentStride, momentStride, psum );
guest 13.05.2011 09:50 # 0
TarasB 13.05.2011 10:51 # +3
Я не осилил этот код.
guest 13.05.2011 11:24 # −2
ReL 13.05.2011 21:13 # −7
Aleskey 16.05.2011 12:07 # 0
ngry 16.05.2011 14:48 # 0
Ещё, это всё весьма древние техники, см. например, http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html
Aleskey 16.05.2011 17:12 # 0
ngry 16.05.2011 17:54 # 0
Aleskey 16.05.2011 17:23 # 0
заменили цикл рекурсией - быстрей будет?
ngry 16.05.2011 17:49 # 0
2. В сгенерированном коде нет рекурсии (разве что в очень древних компиляторах).
Aleskey 16.05.2011 18:14 # 0
guest 16.05.2011 15:46 # +2
А все это из детства идет: да, тяжелое крестодество с деревянными игрушками и каленым железом выжженные в мозгах мысли -- "кроме крестов языков нет", "ооп -- наше всё", "не спалил хард после очередного сегфолта -- не мужик", "один раз -- не пидорас", в этой плоскости крестофильство пересекается с идеями долбославия: когда протестантизм завещает работать над собой и создавать блага, славя величие Господа, православие требует от последователя искупления греха, посредством непрерывного страдания, как страдал Иисус неся свой крест. Стрелять себе в ногу и нажираясь потом водкой, позерски ноя о тяжестях нищебродской жизни -- что может быть лучше для православного плюсоеба?
ngry 16.05.2011 15:57 # +1
guest 16.05.2011 16:04 # 0
ngry 16.05.2011 16:50 # 0
Aleskey 16.05.2011 17:34 # −2
guest 16.05.2011 19:43 # 0
guest 16.05.2011 21:51 # 0
Легко объяснить сей факт: просто кто-то рядом с их курятником вскользь упомянул про какие-то DSL, Code-as-Data на Лиспе. Вот так петушки стали подозревать, что существует что-то помимо плюсов и говняшной. Это если не считать тех слухов про соседний вольер и макак обучаемых жаве и сисярпу.
Бедные, бедные недолюдишки, наверно им тяжело обитать на самой нижней ступени эволюции, не понимать и малой толики процессов, происходящих вокруг них и уж тем более зверски беспощадных мат. теорий, которых, надо заметить, в хвост и гриву имеют эти ироды - функциональные боги.
eth0 16.05.2011 21:58 # +2
SmackMyBitchUp 17.05.2011 18:46 # −2
absolut 17.05.2011 20:48 # 0
Altravert 01.06.2011 06:08 # 0
guest 19.05.2011 17:56 # 0
вот так будет компилится, но работь ессно не будет, впрочем ладно, не важно, похуй
guest 21.05.2011 22:31 # 0
guest8 08.04.2019 20:46 # −999
guest8 08.04.2019 22:11 # −999
guest8 09.04.2019 10:45 # −999