aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/vasp/source/opfuns.h
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/vasp/source/opfuns.h')
-rw-r--r--externals/grill/vasp/source/opfuns.h529
1 files changed, 0 insertions, 529 deletions
diff --git a/externals/grill/vasp/source/opfuns.h b/externals/grill/vasp/source/opfuns.h
deleted file mode 100644
index 7abbec6f..00000000
--- a/externals/grill/vasp/source/opfuns.h
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
-
-VASP modular - vector assembling signal processor / objects for Max/MSP and PD
-
-Copyright (c) 2002 Thomas Grill (xovo@gmx.net)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-
-*/
-
-#ifndef __VASP_OPFUNS_H
-#define __VASP_OPFUNS_H
-
-#include "opdefs.h"
-#include <math.h>
-#include "util.h"
-
-
-namespace VecOp {
-
- // assignment
-
- template<class T> class f_copy {
- public:
- static I run_opt() { return 3; }
- static V run(T &v,T a) { v = a; }
- static I cun_opt() { return 2; }
- static V cun(T &rv,T &iv,T ra,T ia) { rv = ra,iv = ia; }
- };
-
- template<class T> class f_set {
- public:
- static I rbin_opt() { return 3; }
- static V rbin(T &v,T,T b) { v = b; }
- static I cbin_opt() { return 2; }
- static V cbin(T &rv,T &iv,T,T,T rb,T ib) { rv = rb,iv = ib; }
- };
-
- // arithmetic
-
- template<class T> class f_add {
- public:
- static I rbin_opt() { return 3; }
- static V rbin(T &v,T a,T b) { v = a+b; }
- static I cbin_opt() { return 2; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T ib) { rv = ra+rb,iv = ia+ib; }
- };
-
- template<class T> class f_sub {
- public:
- static I rbin_opt() { return 3; }
- static V rbin(T &v,T a,T b) { v = a-b; }
- static I cbin_opt() { return 2; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T ib) { rv = ra-rb,iv = ia-ib; }
- };
-
- template<class T> class f_subr {
- public:
- static I rbin_opt() { return 2; }
- static V rbin(T &v,T a,T b) { v = b-a; }
- static I cbin_opt() { return 2; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T ib) { rv = rb-ra,iv = ib-ia; }
- };
-
- template<class T> class f_mul {
- public:
- static I rbin_opt() { return 3; }
- static V rbin(T &v,T a,T b) { v = a*b; }
- static I cbin_opt() { return 1; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T ib) { rv = ra*rb-ia*ib, iv = ra*ib+rb*ia; }
- };
-
- template<class T> class f_div {
- public:
- static I rbin_opt() { return 2; }
- static V rbin(T &v,T a,T b) { v = a/b; }
-
- static I cbin_opt() { return 0; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T ib)
- {
- register const T den = sqabs(rb,ib);
- rv = (ra*rb+ia*ib)/den;
- iv = (ia*rb-ra*ib)/den;
- }
- };
-
- template<class T> class f_divr {
- public:
- static I rbin_opt() { return 2; }
- static V rbin(T &v,T a,T b) { v = b/a; }
-
- static I cbin_opt() { return 0; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T ib)
- {
- register const T den = sqabs(ra,ia);
- rv = (rb*ra+ib*ia)/den;
- iv = (ib*ra-rb*ia)/den;
- }
- };
-
- template<class T> class f_mod {
- public:
- static I rbin_opt() { return 0; }
- static V rbin(T &v,T a,T b) { v = fmod(a,b); }
- };
-
- template<class T> class f_abs {
- public:
- static I run_opt() { return 0; }
- static V run(T &v,T a) { v = fabs(a); }
- static I cun_opt() { return 0; }
- static V cun(T &rv,T &iv,T ra,T ia) { rv = sqrt(ra*ra+ia*ia),iv = 0; }
- };
-
- template<class T> class f_sign {
- public:
- static I run_opt() { return 0; }
- static V run(T &v,T a) { v = (a == 0?0:(a < 0?-1.:1.)); }
- };
-
- template<class T> class f_sqr {
- public:
- static I run_opt() { return 3; }
- static V run(T &v,T a) { v = a*a; }
- static I cun_opt() { return 1; }
- static V cun(T &rv,T &iv,T ra,T ia) { rv = ra*ra-ia*ia; iv = ra*ia*2; }
- };
-
- template<class T> class f_ssqr {
- public:
- static I run_opt() { return 0; }
- static V run(T &v,T a) { v = a*fabs(a); }
- };
-
-
- template<class T> class f_sumq {
- public:
- static I rop_opt() { return 2; }
- static V rop(T &,T ra,OpParam &p)
- {
- p.norm.minmax += ra;
- }
- };
-
- // transcendent
-
- template<class T> class f_powi {
- public:
- static I cop_opt() { return 0; }
- static V cop(T &rv,T &iv,T ra,T ia,OpParam &p)
- {
- register const I powi = p.ibin.arg;
- register T rt,it; VecOp::f_sqr<T>::cun(rt,it,ra,ia);
- for(I i = 2; i < powi; ++i) VecOp::f_mul<T>::cbin(rt,it,rt,it,ra,ia);
- rv = rt,iv = it;
- }
- };
-
- template<class T> class f_pow {
- public:
- static I rbin_opt() { return 0; }
- static V rbin(T &v,T a,T b) { v = pow(fabs(a),b)*sgn(a); }
-
- static I cbin_opt() { return 0; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T)
- {
- register const T _abs = sqrt(sqabs(ra,ia));
- if(_abs) {
- register const T _p = pow(_abs,rb)/_abs;
- rv = _p*ra,iv = _p*ia;
- }
- else
- rv = iv = 0;
- }
- protected:
- static T sgn(T x) { return x?(x > 0?1:-1):0; }
- };
-
- template<class T> class f_sqrt {
- public:
- static I run_opt() { return 0; }
- static V run(T &v,T a) { v = sqrt(fabs(a)); }
- };
-
- template<class T> class f_ssqrt {
- public:
- static I run_opt() { return 0; }
- static V run(T &v,T a) { v = sqrt(fabs(a))*sgn(a); }
- };
-
-
- template<class T> class f_exp {
- public:
- static I run_opt() { return 0; }
- static V run(T &v,T a) { v = exp(a); }
- };
-
- template<class T> class f_log {
- public:
- static I run_opt() { return 0; }
- static V run(T &v,T a) { v = log(a); } // \todo detect NANs
- };
-
- // comparisons
-
- template<class T> class f_lwr {
- public:
- static I rbin_opt() { return 1; }
- static V rbin(T &v,T a,T b) { v = a < b?1:0; }
- };
-
- template<class T> class f_gtr {
- public:
- static I rbin_opt() { return 1; }
- static V rbin(T &v,T a,T b) { v = a > b?1:0; }
- };
-
- template<class T> class f_alwr {
- public:
- static I rbin_opt() { return 0; }
- static V rbin(T &v,T a,T b) { v = fabs(a) < fabs(b)?1:0; }
- };
-
- template<class T> class f_agtr {
- public:
- static I rbin_opt() { return 0; }
- static V rbin(T &v,T a,T b) { v = fabs(a) > fabs(b)?1:0; }
- };
-
- template<class T> class f_leq {
- public:
- static I rbin_opt() { return 1; }
- static V rbin(T &v,T a,T b) { v = a <= b?1:0; }
- };
-
- template<class T> class f_geq {
- public:
- static I rbin_opt() { return 1; }
- static V rbin(T &v,T a,T b) { v = a >= b?1:0; }
- };
-
- template<class T> class f_aleq {
- public:
- static I rbin_opt() { return 0; }
- static V rbin(T &v,T a,T b) { v = fabs(a) <= fabs(b)?1:0; }
- };
-
- template<class T> class f_ageq {
- public:
- static I rbin_opt() { return 0; }
- static V rbin(T &v,T a,T b) { v = fabs(a) >= fabs(b)?1:0; }
- };
-
- template<class T> class f_equ {
- public:
- static I rbin_opt() { return 1; }
- static V rbin(T &v,T a,T b) { v = a == b?1:0; }
- };
-
- template<class T> class f_neq {
- public:
- static I rbin_opt() { return 1; }
- static V rbin(T &v,T a,T b) { v = a != b?1:0; }
- };
-
- // min/max
-
- template<class T> class f_min {
- public:
- static I rbin_opt() { return 1; }
- static V rbin(T &v,T a,T b) { v = a < b?a:b; }
-
- static I cbin_opt() { return 0; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T ib)
- {
- if(sqabs(ra,ia) < sqabs(rb,ib)) rv = ra,iv = ia;
- else rv = rb,iv = ib;
- }
- };
-
- template<class T> class f_max {
- public:
- static I rbin_opt() { return 1; }
- static V rbin(T &v,T a,T b) { v = a > b?a:b; }
-
- static I cbin_opt() { return 0; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T ib)
- {
- if(sqabs(ra,ia) > sqabs(rb,ib)) rv = ra,iv = ia;
- else rv = rb,iv = ib;
- }
- };
-
- template<class T> class f_minmax {
- public:
- static I cun_opt() { return 0; }
- static V cun(T &rv,T &iv,T ra,T ia)
- {
- if(ra < ia) rv = ra,iv = ia;
- else rv = ia,iv = ra;
- }
- };
-
- template<class T> class f_minq {
- public:
- static I rop_opt() { return 0; }
- static V rop(T &,T ra,OpParam &p)
- {
- if(ra < p.norm.minmax) p.norm.minmax = ra;
- }
-
- static I cop_opt() { return 0; }
- static V cop(T &,T &,T ra,T ia,OpParam &p)
- {
- register T s = sqabs(ra,ia);
- if(s < p.norm.minmax) p.norm.minmax = s;
- }
- };
-
- template<class T> class f_maxq {
- public:
- static I rop_opt() { return 0; }
- static V rop(T &,T ra,OpParam &p)
- {
- if(ra > p.norm.minmax) p.norm.minmax = ra;
- }
-
- static I cop_opt() { return 0; }
- static V cop(T &,T &,T ra,T ia,OpParam &p)
- {
- register T s = sqabs(ra,ia);
- if(s > p.norm.minmax) p.norm.minmax = s;
- }
- };
-
- template<class T> class f_aminq {
- public:
- static I rop_opt() { return 0; }
- static V rop(T &,T ra,OpParam &p)
- {
- register T s = fabs(ra);
- if(s < p.norm.minmax) p.norm.minmax = s;
- }
- };
-
- template<class T> class f_amaxq {
- public:
- static I rop_opt() { return 0; }
- static V rop(T &,T ra,OpParam &p)
- {
- register T s = fabs(ra);
- if(s > p.norm.minmax) p.norm.minmax = s;
- }
- };
-
-
- // gating
-
- template<class T> class f_gate {
- public:
- static I rbin_opt() { return 0; }
- static V rbin(T &rv,T ra,T rb) { rv = fabs(ra) >= rb?ra:0; }
-
- static I cbin_opt() { return 0; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T)
- {
- register const T _abs = sqabs(ra,ia);
-
- if(_abs >= rb*rb) rv = ra,iv = ia;
- else rv = iv = 0;
- }
- };
-
- template<class T> class f_igate {
- public:
- static I rbin_opt() { return 0; }
- static V rbin(T &rv,T ra,T rb) { rv = fabs(ra) <= rb?ra:0; }
-
- static I cbin_opt() { return 0; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T)
- {
- register const T _abs = sqabs(ra,ia);
-
- if(_abs <= rb*rb) rv = ra,iv = ia;
- else rv = iv = 0;
- }
- };
-
- // complex
-
- template<class T> class f_norm {
- public:
- static I cun_opt() { return 0; }
- static V cun(T &rv,T &iv,T ra,T ia)
- {
- register T f = sqabs(ra,ia);
- if(f) { f = 1./sqrt(f); rv = ra*f,iv = ia*f; }
- else rv = iv = 0;
- }
- };
-
- template<class T> class f_conj {
- public:
- static I cun_opt() { return 2; }
- static V cun(T &,T &iv,T,T ia) { iv = -ia; }
- };
-
- template<class T> class f_polar {
- public:
- static I cun_opt() { return 0; }
- static V cun(T &rv,T &iv,T ra,T ia) { rv = sqrt(sqabs(ra,ia)),iv = arg(ra,ia); }
- };
-
- template<class T> class f_rect {
- public:
- static I cun_opt() { return 0; }
- static V cun(T &rv,T &iv,T ra,T ia) { rv = ra*cos(ia),iv = ra*sin(ia); }
- };
-
- template<class T> class f_radd {
- public:
- static I cbin_opt() { return 0; }
- static V cbin(T &rv,T &iv,T ra,T ia,T rb,T)
- {
- register const T _abs = sqrt(sqabs(ra,ia))+rb;
- register const T _phi = arg(ra,ia);
-
- rv = _abs*cos(_phi),iv = _abs*sin(_phi);
- }
- };
-
- // extra
-
- template<class T> class f_fix {
- public:
- /*! \brief Bashes denormals and NANs to zero
-
- \param a argument list
- \param v destination vasp (NULL for in-place operation)
- \return normalized destination vasp
- */
- static I run_opt() { return 0; }
- static V run(T &v,T a)
- {
- if(a != a) // NAN
- v = 0;
- else {
- // denormal bashing (doesn't propagate to the next stage)
-
- static const T anti_denormal = (T)1.e-18;
- a += anti_denormal;
- a -= anti_denormal;
- v = a;
- }
- }
- };
-
-}
-
-
-
-#define DEFOP(T,FUN,OP,KIND) \
-namespace VecOp { inline BL FUN(OpParam &p) { return D__##KIND(T,f_##OP < T > ,p); } }
-
-
-#define DEFVEC_R(T,OP) \
- static BL r_##OP (I len,T *dr,I rds,const T *sr,I rss) { return VecOp::V__rbin<T,VecOp::f_##OP <T> >(sr,rss,dr,rds,len); } \
- static BL v_##OP##_(I layers,const T *sr,T *dr,const T *ar,I len) { return VecOp::V__vbin<T,VecOp::f_##OP <T> >(layers,sr,dr,ar,len); } \
- static BL v_##OP (I dim,const I *dims,I layers,T *dr,const T *sr,const T *ar) { return VecOp::V__vmulti<T>(v_##OP##_,layers,sr,dr,ar,dim,dims); }
-
-#define DEFVEC_C(T,OP) \
- static BL c_##OP (I len,T *dr,T *di,I rds,I ids,const T *sr,I rss,I iss) { return VecOp::V__cbin<T,VecOp::f_##OP <T> >(sr,rss,iss,dr,rds,ids,len); }
-
-#define DEFVEC_B(T,OP) DEFVEC_R(T,OP) DEFVEC_C(T,OP)
-
-
-template<class T>
-class VecFun {
-public:
- DEFVEC_B(T,copy)
-
- DEFVEC_B(T,add)
- DEFVEC_B(T,sub)
- DEFVEC_B(T,subr)
- DEFVEC_B(T,mul)
- DEFVEC_B(T,div)
- DEFVEC_B(T,divr)
- DEFVEC_R(T,mod)
- DEFVEC_B(T,abs)
- DEFVEC_R(T,sign)
- DEFVEC_B(T,sqr)
- DEFVEC_R(T,ssqr)
-
- DEFVEC_C(T,powi)
- DEFVEC_B(T,pow)
- DEFVEC_R(T,sqrt)
- DEFVEC_R(T,ssqrt)
- DEFVEC_R(T,exp)
- DEFVEC_R(T,log)
-
- DEFVEC_R(T,lwr)
- DEFVEC_R(T,gtr)
- DEFVEC_R(T,alwr)
- DEFVEC_R(T,agtr)
- DEFVEC_R(T,leq)
- DEFVEC_R(T,geq)
- DEFVEC_R(T,aleq)
- DEFVEC_R(T,ageq)
- DEFVEC_R(T,equ)
- DEFVEC_R(T,neq)
-
- DEFVEC_B(T,min)
- DEFVEC_B(T,max)
- DEFVEC_C(T,minmax)
- DEFVEC_C(T,gate)
- DEFVEC_C(T,igate)
-
- DEFVEC_C(T,norm)
- DEFVEC_C(T,conj)
- DEFVEC_C(T,polar)
- DEFVEC_C(T,rect)
- DEFVEC_C(T,radd)
-
- DEFVEC_R(T,fix)
-};
-
-
-
-#endif