📄 elemop.cc
字号:
}/////////////////////////////////////////////////////////////////////////// SCElementInvert membersstatic ClassDesc SCElementInvert_cd( typeid(SCElementInvert),"SCElementInvert",1,"public SCElementOp", 0, 0, create<SCElementInvert>);SCElementInvert::SCElementInvert(double threshold): threshold_(threshold), nbelowthreshold_(0), deferred_(0){}SCElementInvert::SCElementInvert(StateIn&s): SCElementOp(s){ s.get(threshold_); s.get(nbelowthreshold_); s.get(deferred_);}voidSCElementInvert::save_data_state(StateOut&s){ s.put(threshold_); s.put(nbelowthreshold_); s.put(deferred_);}SCElementInvert::~SCElementInvert() {}voidSCElementInvert::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { double val = i.get(); if (fabs(val) > threshold_) val = 1.0/val; else { val = 0.0; nbelowthreshold_++; } i.set(val); }}intSCElementInvert::has_side_effects(){ return 1;}intSCElementInvert::has_collect(){ return 1;}voidSCElementInvert::defer_collect(int h){ deferred_=h;}voidSCElementInvert::collect(const Ref<MessageGrp>&msg){ if (!deferred_) msg->sum(nbelowthreshold_);}/////////////////////////////////////////////////////////////////////////// SCElementSquareRoot membersstatic ClassDesc SCElementSquareRoot_cd( typeid(SCElementSquareRoot),"SCElementSquareRoot",1,"public SCElementOp", 0, 0, create<SCElementSquareRoot>);SCElementSquareRoot::SCElementSquareRoot() {}SCElementSquareRoot::SCElementSquareRoot(double a) {}SCElementSquareRoot::SCElementSquareRoot(StateIn&s): SCElementOp(s){}voidSCElementSquareRoot::save_data_state(StateOut&s){}SCElementSquareRoot::~SCElementSquareRoot() {}voidSCElementSquareRoot::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { double val = i.get(); if (val > 0.0) i.set(sqrt(i.get())); else i.set(0.0); }}intSCElementSquareRoot::has_side_effects(){ return 1;}/////////////////////////////////////////////////////////////////////////// SCElementMaxAbs membersstatic ClassDesc SCElementMaxAbs_cd( typeid(SCElementMaxAbs),"SCElementMaxAbs",1,"public SCElementOp", 0, 0, create<SCElementMaxAbs>);SCElementMaxAbs::SCElementMaxAbs():deferred_(0), r(0.0) {}SCElementMaxAbs::SCElementMaxAbs(StateIn&s): SCElementOp(s){ s.get(r); s.get(deferred_);}voidSCElementMaxAbs::save_data_state(StateOut&s){ s.put(r); s.put(deferred_);}SCElementMaxAbs::~SCElementMaxAbs() {}voidSCElementMaxAbs::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { if (fabs(i.get()) > r) r = fabs(i.get()); }}doubleSCElementMaxAbs::result(){ return r;}intSCElementMaxAbs::has_collect(){ return 1;}voidSCElementMaxAbs::defer_collect(int h){ deferred_=h;}voidSCElementMaxAbs::collect(const Ref<MessageGrp>&msg){ if (!deferred_) msg->max(r);}/////////////////////////////////////////////////////////////////////////// SCElementMin membersstatic ClassDesc SCElementMinAbs_cd( typeid(SCElementMinAbs),"SCElementMinAbs",1,"public SCElementOp", 0, 0, create<SCElementMinAbs>);SCElementMinAbs::SCElementMinAbs(double rinit):deferred_(0), r(rinit) {}SCElementMinAbs::SCElementMinAbs(StateIn&s): SCElementOp(s){ s.get(r); s.get(deferred_);}voidSCElementMinAbs::save_data_state(StateOut&s){ s.put(r); s.put(deferred_);}SCElementMinAbs::~SCElementMinAbs() {}voidSCElementMinAbs::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { if (fabs(i.get()) < r) r = fabs(i.get()); }}doubleSCElementMinAbs::result(){ return r;}intSCElementMinAbs::has_collect(){ return 1;}voidSCElementMinAbs::defer_collect(int h){ deferred_=h;}voidSCElementMinAbs::collect(const Ref<MessageGrp>&msg){ if (!deferred_) msg->min(r);}/////////////////////////////////////////////////////////////////////////// SCElementSumAbs membersstatic ClassDesc SCElementSumAbs_cd( typeid(SCElementSumAbs),"SCElementSumAbs",1,"public SCElementOp", 0, 0, create<SCElementSumAbs>);SCElementSumAbs::SCElementSumAbs():deferred_(0), r(0.0) {}SCElementSumAbs::SCElementSumAbs(StateIn&s): SCElementOp(s){ s.get(r); s.get(deferred_);}voidSCElementSumAbs::save_data_state(StateOut&s){ s.put(r); s.put(deferred_);}SCElementSumAbs::~SCElementSumAbs() {}voidSCElementSumAbs::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { r += fabs(i.get()); }}doubleSCElementSumAbs::result(){ return r;}intSCElementSumAbs::has_collect(){ return 1;}voidSCElementSumAbs::defer_collect(int h){ deferred_=h;}voidSCElementSumAbs::collect(const Ref<MessageGrp>&msg){ if (!deferred_) msg->sum(r);}/////////////////////////////////////////////////////////////////////////// SCElementAssign membersstatic ClassDesc SCElementAssign_cd( typeid(SCElementAssign),"SCElementAssign",1,"public SCElementOp", 0, 0, create<SCElementAssign>);SCElementAssign::SCElementAssign(double a):assign(a) {}SCElementAssign::SCElementAssign(StateIn&s): SCElementOp(s){ s.get(assign);}voidSCElementAssign::save_data_state(StateOut&s){ s.put(assign);}SCElementAssign::~SCElementAssign() {}voidSCElementAssign::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { i.set(assign); }}intSCElementAssign::has_side_effects(){ return 1;}/////////////////////////////////////////////////////////////////////////// SCElementRandomize membersstatic ClassDesc SCElementRandomize_cd( typeid(SCElementRandomize),"SCElementRandomize",1,"public SCElementOp", 0, 0, create<SCElementRandomize>);SCElementRandomize::SCElementRandomize() {}SCElementRandomize::SCElementRandomize(StateIn&s): SCElementOp(s){}voidSCElementRandomize::save_data_state(StateOut&s){}SCElementRandomize::~SCElementRandomize() {}voidSCElementRandomize::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) {#ifdef HAVE_DRAND48 i.set(drand48()*(drand48()<0.5?1.0:-1.0));#else int r=rand(); double dr = (double) r / 32767.0; i.set(dr*(dr<0.5?1.0:-1.0));#endif }}intSCElementRandomize::has_side_effects(){ return 1;}/////////////////////////////////////////////////////////////////////////// SCElementShiftDiagonal membersstatic ClassDesc SCElementShiftDiagonal_cd( typeid(SCElementShiftDiagonal),"SCElementShiftDiagonal",1,"public SCElementOp", 0, 0, create<SCElementShiftDiagonal>);SCElementShiftDiagonal::SCElementShiftDiagonal(double a):shift_diagonal(a) {}SCElementShiftDiagonal::SCElementShiftDiagonal(StateIn&s): SCElementOp(s){ s.get(shift_diagonal);}voidSCElementShiftDiagonal::save_data_state(StateOut&s){ s.put(shift_diagonal);}SCElementShiftDiagonal::~SCElementShiftDiagonal() {}voidSCElementShiftDiagonal::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { if (i.i() == i.j()) i.set(shift_diagonal+i.get()); }}intSCElementShiftDiagonal::has_side_effects(){ return 1;}/////////////////////////////////////////////////////////////////////////// SCElementScaleDiagonal membersstatic ClassDesc SCElementScaleDiagonal_cd( typeid(SCElementScaleDiagonal),"SCElementScaleDiagonal",1,"public SCElementOp", 0, 0, create<SCElementScaleDiagonal>);SCElementScaleDiagonal::SCElementScaleDiagonal(double a):scale_diagonal(a) {}SCElementScaleDiagonal::SCElementScaleDiagonal(StateIn&s): SCElementOp(s){ s.get(scale_diagonal);}voidSCElementScaleDiagonal::save_data_state(StateOut&s){ s.put(scale_diagonal);}SCElementScaleDiagonal::~SCElementScaleDiagonal() {}voidSCElementScaleDiagonal::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { if (i.i() == i.j()) i.set(scale_diagonal*i.get()); }}intSCElementScaleDiagonal::has_side_effects(){ return 1;}/////////////////////////////////////////////////////////////////////////// SCElementDot membersstatic ClassDesc SCElementDot_cd( typeid(SCElementDot),"SCElementDot",1,"public SCElementOp", 0, 0, create<SCElementDot>);SCElementDot::SCElementDot(double**a, double**b, int n): avects(a), bvects(b), length(n){}SCElementDot::SCElementDot(StateIn&s){ ExEnv::errn() << indent << "SCElementDot does not permit StateIn CTOR\n"; abort();}voidSCElementDot::save_data_state(StateOut&s){ ExEnv::errn() << indent << "SCElementDot does not permit save_data_state\n"; abort();}intSCElementDot::has_side_effects(){ return 1;}voidSCElementDot::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { double tmp = i.get(); double* a = avects[i.i()]; double* b = bvects[i.j()]; for (int j = length; j; j--, a++, b++) { tmp += *a * *b; } i.accum(tmp); }}/////////////////////////////////////////////////////////////////////////// SCElementAccumulateSCMatrix membersstatic ClassDesc SCElementAccumulateSCMatrix_cd( typeid(SCElementAccumulateSCMatrix),"SCElementAccumulateSCMatrix",1,"public SCElementOp", 0, 0, 0);SCElementAccumulateSCMatrix::SCElementAccumulateSCMatrix(SCMatrix*a): m(a){}intSCElementAccumulateSCMatrix::has_side_effects(){ return 1;}voidSCElementAccumulateSCMatrix::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { i.accum(m->get_element(i.i(), i.j())); }}/////////////////////////////////////////////////////////////////////////// SCElementAccumulateSymmSCMatrix membersstatic ClassDesc SCElementAccumulateSymmSCMatrix_cd( typeid(SCElementAccumulateSymmSCMatrix),"SCElementAccumulateSymmSCMatrix",1,"public SCElementOp", 0, 0, 0);SCElementAccumulateSymmSCMatrix::SCElementAccumulateSymmSCMatrix( SymmSCMatrix*a): m(a){}intSCElementAccumulateSymmSCMatrix::has_side_effects(){ return 1;}voidSCElementAccumulateSymmSCMatrix::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { i.accum(m->get_element(i.i(), i.j())); }}/////////////////////////////////////////////////////////////////////////// SCElementAccumulateDiagSCMatrix membersstatic ClassDesc SCElementAccumulateDiagSCMatrix_cd( typeid(SCElementAccumulateDiagSCMatrix),"SCElementAccumulateDiagSCMatrix",1,"public SCElementOp", 0, 0, 0);SCElementAccumulateDiagSCMatrix::SCElementAccumulateDiagSCMatrix( DiagSCMatrix*a): m(a){}intSCElementAccumulateDiagSCMatrix::has_side_effects(){ return 1;}voidSCElementAccumulateDiagSCMatrix::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { i.accum(m->get_element(i.i())); }}/////////////////////////////////////////////////////////////////////////// SCElementAccumulateSCVector membersstatic ClassDesc SCElementAccumulateSCVector_cd( typeid(SCElementAccumulateSCVector),"SCElementAccumulateSCVector",1,"public SCElementOp", 0, 0, 0);SCElementAccumulateSCVector::SCElementAccumulateSCVector(SCVector*a): m(a){}intSCElementAccumulateSCVector::has_side_effects(){ return 1;}voidSCElementAccumulateSCVector::process(SCMatrixBlockIter&i){ for (i.reset(); i; ++i) { i.accum(m->get_element(i.i())); }}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -