Max 5 API Reference
00001 /* 00002 * jit.transfer.bias.c 00003 * 00004 * Copyright 2001-2005 - Cycling '74 00005 * Derek Gerstmann - derek@cycling74.com 00006 * 00007 * functor for perlin's "bias" transfer function 00008 * 00009 */ 00010 00011 // -------------------------------------------------------------------------- 00012 00013 #include "jit.common.h" 00014 #include "jit.functor.h" 00015 00016 // -------------------------------------------------------------------------- 00017 00018 typedef struct _jit_functor_transfer_bias 00019 { 00020 t_jit_object ob; 00021 double beta; // 0.5 is no change, smaller values bias towards 0, larger towards 1. 00022 double invbeta; 00023 } t_jit_functor_transfer_bias; 00024 00025 // -------------------------------------------------------------------------- 00026 00027 t_jit_object *jit_functor_transfer_bias_new(void); 00028 t_jit_err jit_functor_transfer_bias_free(t_jit_functor_transfer_bias *x); 00029 t_jit_err jit_functor_transfer_bias_setattr_beta(t_jit_functor_transfer_bias *x, void *attr, long argc, t_atom *argv); 00030 t_jit_err jit_functor_transfer_bias_recalc(t_jit_functor_transfer_bias *x); 00031 00032 long jit_functor_transfer_bias_eval_fixed(t_jit_functor_transfer_bias *x, long dimcount, long *vals); 00033 float jit_functor_transfer_bias_eval_float32(t_jit_functor_transfer_bias *x, long dimcount, float *vals); 00034 double jit_functor_transfer_bias_eval_float64(t_jit_functor_transfer_bias *x, long dimcount, double *vals); 00035 long jit_functor_transfer_bias_eval_fixed_scalar(t_jit_functor_transfer_bias *x, long val); 00036 float jit_functor_transfer_bias_eval_float32_scalar(t_jit_functor_transfer_bias *x, float val); 00037 double jit_functor_transfer_bias_eval_float64_scalar(t_jit_functor_transfer_bias *x, double val); 00038 00039 t_class * _jit_functor_transfer_bias_class; 00040 00041 // -------------------------------------------------------------------------- 00042 00043 t_jit_err jit_functor_transfer_bias_init(void) 00044 { 00045 t_jit_object *attr; 00046 00047 // create the functor class 00048 _jit_functor_transfer_bias_class = jit_class_new("jit_functor_transfer_bias", 00049 (method)jit_functor_transfer_bias_new,(method)jit_functor_transfer_bias_free, 00050 sizeof(t_jit_functor_transfer_bias),0L); 00051 00052 // add attribute methods 00053 attr = jit_object_new(_jit_sym_jit_attr_offset,"beta",_jit_sym_float64,0, 00054 (method)0L,(method)jit_functor_transfer_bias_setattr_beta, 00055 calcoffset(t_jit_functor_transfer_bias,beta)); 00056 jit_class_addattr(_jit_functor_transfer_bias_class,attr); 00057 00058 // add evaluation methods 00059 jit_class_addmethod(_jit_functor_transfer_bias_class, 00060 (method)jit_functor_transfer_bias_eval_fixed, "evalfixed", A_CANT, 0L); 00061 jit_class_addmethod(_jit_functor_transfer_bias_class, 00062 (method)jit_functor_transfer_bias_eval_float32, "evalfloat32", A_CANT, 0L); 00063 jit_class_addmethod(_jit_functor_transfer_bias_class, 00064 (method)jit_functor_transfer_bias_eval_float64, "evalfloat64", A_CANT, 0L); 00065 00066 // important to add last for subclassing methods 00067 jit_functor_setup_class(_jit_functor_transfer_bias_class,"transfer","bias"); 00068 jit_class_register(_jit_functor_transfer_bias_class); 00069 00070 return JIT_ERR_NONE; 00071 } 00072 00073 t_jit_object *jit_functor_transfer_bias_new(void) 00074 { 00075 t_jit_functor_transfer_bias *x; 00076 00077 if (x = (t_jit_functor_transfer_bias *)jit_object_alloc(_jit_functor_transfer_bias_class)) { 00078 00079 // initialization 00080 x->beta = 0.5; 00081 jit_functor_transfer_bias_recalc(x); 00082 } 00083 00084 return (t_jit_object *)x; 00085 } 00086 00087 t_jit_err jit_functor_transfer_bias_free(t_jit_functor_transfer_bias *x) 00088 { 00089 x->invbeta = (1.0 / x->beta - 2 ); 00090 return JIT_ERR_NONE; 00091 } 00092 00093 t_jit_err jit_functor_transfer_bias_setattr_beta( 00094 t_jit_functor_transfer_bias *x, void *attr, long argc, t_atom *argv) 00095 { 00096 double v; 00097 00098 if (x) { 00099 v=jit_atom_getfloat(argv); 00100 if (x->beta != v) { 00101 x->beta = v; 00102 jit_functor_transfer_bias_recalc(x); 00103 } 00104 return JIT_ERR_NONE; 00105 } 00106 return JIT_ERR_INVALID_PTR; 00107 } 00108 00109 t_jit_err jit_functor_transfer_bias_recalc(t_jit_functor_transfer_bias *x) 00110 { 00111 // calculate intermediary values for efficiency 00112 return JIT_ERR_NONE; 00113 } 00114 00115 // -------------------------------------------------------------------------- 00116 // vector evaluation functions (calls scalar functions and generates a product of scalar evaluation for each dimension) 00117 // -------------------------------------------------------------------------- 00118 long jit_functor_transfer_bias_eval_fixed(t_jit_functor_transfer_bias *x, long dimcount, long *vals) 00119 { 00120 return jit_functor_eval_fixed_with_float64((t_jit_object *)x,dimcount,vals, 00121 (t_jit_functor_float64_sig)jit_functor_transfer_bias_eval_float64); 00122 } 00123 00124 float jit_functor_transfer_bias_eval_float32(t_jit_functor_transfer_bias *x, long dimcount, float *vals) 00125 { 00126 return jit_functor_eval_float32_with_scalar_product((t_jit_object *)x,dimcount,vals, 00127 (t_jit_functor_float32_scalar_sig)jit_functor_transfer_bias_eval_float32_scalar); 00128 } 00129 00130 double jit_functor_transfer_bias_eval_float64(t_jit_functor_transfer_bias *x, long dimcount, double *vals) 00131 { 00132 return jit_functor_eval_float64_with_scalar_product((t_jit_object *)x,dimcount,vals, 00133 (t_jit_functor_float64_scalar_sig)jit_functor_transfer_bias_eval_float64_scalar); 00134 } 00135 00136 // -------------------------------------------------------------------------- 00137 // scalar evaluation functions 00138 // -------------------------------------------------------------------------- 00139 long jit_functor_transfer_bias_eval_fixed_scalar(t_jit_functor_transfer_bias *x, long val) 00140 { 00141 return FloatToFixed(jit_functor_transfer_bias_eval_float32_scalar(x,FixedToFloat(val))); 00142 } 00143 00144 float jit_functor_transfer_bias_eval_float32_scalar(t_jit_functor_transfer_bias *x, float val) 00145 { 00146 // return (float)jit_math_pow(val, jit_math_log(x->beta) / jit_math_log(0.5)); 00147 return val / ( x->invbeta * (1.0f - val) + 1 ); // fast approximation to above 00148 } 00149 00150 double jit_functor_transfer_bias_eval_float64_scalar(t_jit_functor_transfer_bias *x, double val) 00151 { 00152 // return (float)jit_math_pow(val, jit_math_log(x->beta) / jit_math_log(0.5)); 00153 return val / ( x->invbeta * (1.0 - val) + 1 ); // fast approximation to above 00154 } 00155 // --------------------------------------------------------------------------
Copyright © 2008, Cycling '74