Max 5 API Reference
00001 /* 00002 Copyright 2001-2005 - Cycling '74 00003 Joshua Kit Clayton jkc@cycling74.com 00004 */ 00005 00006 #include "jit.common.h" 00007 #include "jit.fixmath.h" 00008 00009 typedef struct _jit_la_mult 00010 { 00011 t_object ob; 00012 } t_jit_la_mult; 00013 00014 void *_jit_la_mult_class; 00015 00016 t_jit_la_mult *jit_la_mult_new(void); 00017 void jit_la_mult_free(t_jit_la_mult *x); 00018 t_jit_err jit_la_mult_matrix_calc(t_jit_la_mult *x, void *inputs, void *outputs); 00019 00020 void jit_la_mult_calculate_2d_real(t_jit_la_mult *x, t_jit_matrix_info *in1_minfo, char *bip1, 00021 t_jit_matrix_info *in2_minfo, char *bip2, t_jit_matrix_info *out_minfo, char *bop); 00022 void jit_la_mult_calculate_2d_complex(t_jit_la_mult *x, t_jit_matrix_info *in1_minfo, char *bip1, 00023 t_jit_matrix_info *in2_minfo, char *bip2, t_jit_matrix_info *out_minfo, char *bop); 00024 00025 t_jit_err jit_la_mult_init(void) 00026 { 00027 long attrflags=0; 00028 t_jit_object *attr,*mop,*o; 00029 t_atom a[2]; 00030 00031 _jit_la_mult_class = jit_class_new("jit_la_mult",(method)jit_la_mult_new,(method)jit_la_mult_free, 00032 sizeof(t_jit_la_mult),0L); 00033 00034 //add mop 00035 mop = jit_object_new(_jit_sym_jit_mop,2,1); 00036 o = jit_object_method(mop,_jit_sym_getinput,2); 00037 jit_object_method(o,_jit_sym_ioproc,jit_mop_ioproc_copy_adapt); 00038 jit_attr_setlong(o,_jit_sym_maxplanecount,2); 00039 jit_attr_setlong(o,_jit_sym_dimlink,0); 00040 jit_atom_setsym(a,_jit_sym_float32); //default 00041 jit_atom_setsym(a+1,_jit_sym_float64); 00042 jit_object_method(o,_jit_sym_types,2,a); 00043 o = jit_object_method(mop,_jit_sym_getoutput,1); 00044 jit_attr_setlong(o,_jit_sym_maxplanecount,2); 00045 jit_attr_setlong(o,_jit_sym_dimlink,0); 00046 jit_atom_setsym(a,_jit_sym_float32); //default 00047 jit_atom_setsym(a+1,_jit_sym_float64); 00048 jit_object_method(o,_jit_sym_types,2,a); 00049 jit_class_addadornment(_jit_la_mult_class,mop); 00050 //add methods 00051 jit_class_addmethod(_jit_la_mult_class, (method)jit_la_mult_matrix_calc, "matrix_calc", A_CANT, 0L); 00052 //add attributes 00053 attrflags = JIT_ATTR_GET_DEFER_LOW | JIT_ATTR_SET_USURP_LOW; 00054 00055 jit_class_register(_jit_la_mult_class); 00056 00057 return JIT_ERR_NONE; 00058 } 00059 00060 t_jit_err jit_la_mult_matrix_calc(t_jit_la_mult *x, void *inputs, void *outputs) 00061 { 00062 t_jit_err err=JIT_ERR_NONE; 00063 long in1_savelock,in2_savelock,out_savelock; 00064 t_jit_matrix_info in1_minfo,in2_minfo,out_minfo; 00065 char *in1_bp,*in2_bp,*out_bp; 00066 long i,dimcount,planecount,dim[JIT_MATRIX_MAX_DIMCOUNT]; 00067 long tmpsize; 00068 void *in1_matrix,*in2_matrix,*out_matrix; 00069 00070 in1_matrix = jit_object_method(inputs,_jit_sym_getindex,0); 00071 in2_matrix = jit_object_method(inputs,_jit_sym_getindex,1); 00072 out_matrix = jit_object_method(outputs,_jit_sym_getindex,0); 00073 00074 if (x&&in1_matrix&&in2_matrix&&out_matrix) { 00075 jit_object_method(in1_matrix,_jit_sym_getinfo,&in1_minfo); 00076 jit_object_method(in2_matrix,_jit_sym_getinfo,&in2_minfo); 00077 jit_object_method(out_matrix,_jit_sym_getinfo,&out_minfo); 00078 //check dimensions MxN, NxP -> MxP (BUT ROW MAJOR) 00079 if (((in1_minfo.dim[0]==in2_minfo.dim[1])&& 00080 ((in1_minfo.dim[1]!=out_minfo.dim[1])|| 00081 (in2_minfo.dim[0]!=out_minfo.dim[0])))) 00082 { 00083 out_minfo.dim[1]=in1_minfo.dim[1]; 00084 out_minfo.dim[0]=in2_minfo.dim[0]; 00085 jit_object_method(out_matrix,_jit_sym_setinfo,&out_minfo); 00086 jit_object_method(out_matrix,_jit_sym_getinfo,&out_minfo); 00087 } 00088 00089 in1_savelock = (long) jit_object_method(in1_matrix,_jit_sym_lock,1); 00090 in2_savelock = (long) jit_object_method(in2_matrix,_jit_sym_lock,1); 00091 out_savelock = (long) jit_object_method(out_matrix,_jit_sym_lock,1); 00092 jit_object_method(in1_matrix,_jit_sym_getdata,&in1_bp); 00093 jit_object_method(in2_matrix,_jit_sym_getdata,&in2_bp); 00094 jit_object_method(out_matrix,_jit_sym_getdata,&out_bp); 00095 if (!in1_bp) { err=JIT_ERR_INVALID_INPUT; goto out;} 00096 if (!in2_bp) { err=JIT_ERR_INVALID_INPUT; goto out;} 00097 if (!out_bp) { err=JIT_ERR_INVALID_OUTPUT; goto out;} 00098 //compatible types? 00099 if (((in2_minfo.type!=_jit_sym_float32)&&(in2_minfo.type!=_jit_sym_float64))|| 00100 (in1_minfo.type!=in2_minfo.type)||(in1_minfo.type!=out_minfo.type)) { err=JIT_ERR_MISMATCH_TYPE; goto out;} 00101 //compatible planecounts? 00102 //planecount 1=real. planecount 2=complex 00103 if (((in2_minfo.planecount!=1)&&(in2_minfo.planecount!=2))|| 00104 (in1_minfo.planecount!=in2_minfo.planecount)|| 00105 (in1_minfo.planecount!=out_minfo.planecount)) { err=JIT_ERR_MISMATCH_PLANE; goto out;} 00106 //check dimensions MxN, NxP -> MxP (BUT ROW MAJOR) 00107 if ((in1_minfo.dim[0]!=in2_minfo.dim[1])|| 00108 (in1_minfo.dim[1]!=out_minfo.dim[1])|| 00109 (in2_minfo.dim[0]!=out_minfo.dim[0])) { err=JIT_ERR_MISMATCH_DIM; goto out;} 00110 //get dimensions/planecount 00111 dimcount = out_minfo.dimcount; 00112 planecount = out_minfo.planecount; 00113 00114 //only 2d 00115 if (planecount==1) 00116 jit_la_mult_calculate_2d_real(x, &in1_minfo, in1_bp, &in2_minfo, in2_bp, &out_minfo, out_bp); 00117 else 00118 jit_la_mult_calculate_2d_complex(x, &in1_minfo, in1_bp, &in2_minfo, in2_bp, &out_minfo, out_bp); 00119 } else { 00120 return JIT_ERR_INVALID_PTR; 00121 } 00122 00123 out: 00124 jit_object_method(out_matrix,_jit_sym_lock,out_savelock); 00125 jit_object_method(in2_matrix,_jit_sym_lock,in2_savelock); 00126 jit_object_method(in1_matrix,_jit_sym_lock,in1_savelock); 00127 return err; 00128 } 00129 00130 void jit_la_mult_calculate_2d_real(t_jit_la_mult *x, t_jit_matrix_info *in1_minfo, char *bip1, 00131 t_jit_matrix_info *in2_minfo, char *bip2, t_jit_matrix_info *out_minfo, char *bop) 00132 { 00133 long i,j,n; 00134 t_jit_op_info in1_opinfo,in2_opinfo; 00135 double c; 00136 char *op; 00137 00138 n = in1_minfo->dim[0]; 00139 if (out_minfo->type==_jit_sym_float32) { 00140 in1_opinfo.stride = in1_minfo->dimstride[0]/4; //row vector 00141 in2_opinfo.stride = in2_minfo->dimstride[1]/4; //column vector 00142 for (i=0;i<out_minfo->dim[1];i++) { 00143 for (j=0;j<out_minfo->dim[0];j++) { 00144 in1_opinfo.p = bip1 + i*in1_minfo->dimstride[1]; 00145 in2_opinfo.p = bip2 + j*in2_minfo->dimstride[0]; 00146 op = bop + i*out_minfo->dimstride[1] + j*out_minfo->dimstride[0]; 00147 jit_op_vector_dotprod_float32(n, &c, &in1_opinfo, &in2_opinfo, NULL); 00148 *((float *)op) = c; 00149 } 00150 } 00151 } else if (out_minfo->type==_jit_sym_float64) { 00152 in1_opinfo.stride = in1_minfo->dimstride[0]/8; //row vector 00153 in2_opinfo.stride = in2_minfo->dimstride[1]/8; //column vector 00154 for (i=0;i<out_minfo->dim[1];i++) { 00155 for (j=0;j<out_minfo->dim[0];j++) { 00156 in1_opinfo.p = bip1 + i*in1_minfo->dimstride[1]; 00157 in2_opinfo.p = bip2 + j*in2_minfo->dimstride[0]; 00158 op = bop + i*out_minfo->dimstride[1] + j*out_minfo->dimstride[0]; 00159 jit_op_vector_dotprod_float64(n, &c, &in1_opinfo, &in2_opinfo, NULL); 00160 *((double *)op) = c; 00161 } 00162 } 00163 } 00164 } 00165 00166 void jit_la_mult_calculate_2d_complex(t_jit_la_mult *x, t_jit_matrix_info *in1_minfo, char *bip1, 00167 t_jit_matrix_info *in2_minfo, char *bip2, t_jit_matrix_info *out_minfo, char *bop) 00168 { 00169 long i,j,n; 00170 t_jit_op_info in1_opinfo,in2_opinfo; 00171 double c[2]; 00172 char *op; 00173 00174 n = in1_minfo->dim[0]; 00175 if (out_minfo->type==_jit_sym_float32) { 00176 in1_opinfo.stride = in1_minfo->dimstride[0]/4; //row vector 00177 in2_opinfo.stride = in2_minfo->dimstride[1]/4; //column vector 00178 for (i=0;i<out_minfo->dim[1];i++) { 00179 for (j=0;j<out_minfo->dim[0];j++) { 00180 in1_opinfo.p = bip1 + i*in1_minfo->dimstride[1]; 00181 in2_opinfo.p = bip2 + j*in2_minfo->dimstride[0]; 00182 op = bop + i*out_minfo->dimstride[1] + j*out_minfo->dimstride[0]; 00183 jit_op_vector_dotprod_float32_complex(n, c, &in1_opinfo, &in2_opinfo, NULL); 00184 ((float *)op)[0] = c[0]; 00185 ((float *)op)[1] = c[1]; 00186 } 00187 } 00188 } else if (out_minfo->type==_jit_sym_float64) { 00189 in1_opinfo.stride = in1_minfo->dimstride[0]/8; //row vector 00190 in2_opinfo.stride = in2_minfo->dimstride[1]/8; //column vector 00191 for (i=0;i<out_minfo->dim[1];i++) { 00192 for (j=0;j<out_minfo->dim[0];j++) { 00193 in1_opinfo.p = bip1 + i*in1_minfo->dimstride[1]; 00194 in2_opinfo.p = bip2 + j*in2_minfo->dimstride[0]; 00195 op = bop + i*out_minfo->dimstride[1] + j*out_minfo->dimstride[0]; 00196 jit_op_vector_dotprod_float64_complex(n, c, &in1_opinfo, &in2_opinfo, NULL); 00197 ((double *)op)[0] = c[0]; 00198 ((double *)op)[1] = c[1]; 00199 } 00200 } 00201 } 00202 } 00203 00204 t_jit_la_mult *jit_la_mult_new(void) 00205 { 00206 t_jit_la_mult *x; 00207 00208 if (x=(t_jit_la_mult *)jit_object_alloc(_jit_la_mult_class)) { 00209 } else { 00210 x = NULL; 00211 } 00212 return x; 00213 } 00214 00215 void jit_la_mult_free(t_jit_la_mult *x) 00216 { 00217 }
Copyright © 2008, Cycling '74