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 00008 #define JIT_LA_INVERSE_DEF_THRESH 0.000000001 00009 00010 typedef struct _jit_la_inverse 00011 { 00012 t_object ob; 00013 double thresh; 00014 } t_jit_la_inverse; 00015 00016 void *_jit_la_inverse_class; 00017 00018 t_jit_la_inverse *jit_la_inverse_new(void); 00019 void jit_la_inverse_free(t_jit_la_inverse *x); 00020 t_jit_err jit_la_inverse_matrix_calc(t_jit_la_inverse *x, void *inputs, void *outputs); 00021 void jit_la_inverse_ident(t_jit_matrix_info *in_minfo, char *bip); 00022 00023 long jit_la_inverse_calculate_normupper_2d_real(t_jit_la_inverse *x, long *swapcount, t_jit_matrix_info *in_minfo, char *bip, t_jit_matrix_info *p_minfo, char *bpp); 00024 long jit_la_inverse_calculate_normupper_2d_complex(t_jit_la_inverse *x, long *swapcount, t_jit_matrix_info *in_minfo, char *bip, t_jit_matrix_info *p_minfo, char *bpp); 00025 void jit_la_inverse_calculate_backsub_2d_real(t_jit_la_inverse *x, t_jit_matrix_info *in_minfo, char *bip, t_jit_matrix_info *p_minfo, char *bpp); 00026 void jit_la_inverse_calculate_backsub_2d_complex(t_jit_la_inverse *x, t_jit_matrix_info *in_minfo, char *bip, t_jit_matrix_info *p_minfo, char *bpp); 00027 00028 t_jit_err jit_la_inverse_init(void) 00029 { 00030 long attrflags=0; 00031 t_jit_object *attr,*mop,*o; 00032 t_atom a[2]; 00033 00034 _jit_la_inverse_class = jit_class_new("jit_la_inverse",(method)jit_la_inverse_new,(method)jit_la_inverse_free, 00035 sizeof(t_jit_la_inverse),0L); 00036 00037 //add mop 00038 mop = jit_object_new(_jit_sym_jit_mop,1,1); 00039 o = jit_object_method(mop,_jit_sym_getoutput,1); 00040 jit_attr_setlong(o,_jit_sym_maxplanecount,2); 00041 jit_atom_setsym(a,_jit_sym_float32); //default 00042 jit_atom_setsym(a+1,_jit_sym_float64); 00043 jit_object_method(o,_jit_sym_types,2,a); 00044 jit_class_addadornment(_jit_la_inverse_class,mop); 00045 //add methods 00046 jit_class_addmethod(_jit_la_inverse_class, (method)jit_la_inverse_matrix_calc, "matrix_calc", A_CANT, 0L); 00047 //add attributes 00048 attrflags = JIT_ATTR_GET_DEFER_LOW | JIT_ATTR_SET_USURP_LOW; 00049 attr = jit_object_new(_jit_sym_jit_attr_offset,"thresh",_jit_sym_float64,attrflags, 00050 (method)0L,(method)0L,calcoffset(t_jit_la_inverse,thresh)); 00051 jit_class_addattr(_jit_la_inverse_class,attr); 00052 00053 jit_class_register(_jit_la_inverse_class); 00054 00055 return JIT_ERR_NONE; 00056 } 00057 00058 t_jit_err jit_la_inverse_matrix_calc(t_jit_la_inverse *x, void *inputs, void *outputs) 00059 { 00060 t_jit_err err=JIT_ERR_NONE; 00061 long in_savelock,out_savelock; 00062 t_jit_matrix_info in_minfo,out_minfo,tmp_minfo; 00063 char *in_bp,*out_bp,*tmp_bp; 00064 long i,dimcount,planecount,dim[JIT_MATRIX_MAX_DIMCOUNT]; 00065 long tmpsize,swapcount; 00066 void *tmp_matrix=NULL; 00067 void *in_matrix,*out_matrix; 00068 00069 in_matrix = jit_object_method(inputs,_jit_sym_getindex,0); 00070 out_matrix = jit_object_method(outputs,_jit_sym_getindex,0); 00071 00072 if (x&&in_matrix&&out_matrix) { 00073 swapcount=0; 00074 in_savelock = (long) jit_object_method(in_matrix,_jit_sym_lock,1); 00075 out_savelock = (long) jit_object_method(out_matrix,_jit_sym_lock,1); 00076 jit_object_method(in_matrix,_jit_sym_getinfo,&in_minfo); 00077 jit_object_method(out_matrix,_jit_sym_getinfo,&out_minfo); 00078 jit_object_method(in_matrix,_jit_sym_getdata,&in_bp); 00079 jit_object_method(out_matrix,_jit_sym_getdata,&out_bp); 00080 if (!in_bp) { err=JIT_ERR_INVALID_INPUT; goto out;} 00081 if (!out_bp) { err=JIT_ERR_INVALID_OUTPUT; goto out;} 00082 //compatible types? 00083 if (((in_minfo.type!=_jit_sym_float32)&&(in_minfo.type!=_jit_sym_float64))|| 00084 (in_minfo.type!=out_minfo.type)) { err=JIT_ERR_MISMATCH_TYPE; goto out;} 00085 //compatible planecounts? 00086 //planecount 1=real. planecount 2=complex 00087 if (((in_minfo.planecount!=1)&&(in_minfo.planecount!=2))|| 00088 (in_minfo.planecount!=out_minfo.planecount)) { err=JIT_ERR_MISMATCH_PLANE; goto out;} 00089 //check dimensions (square?) 00090 if ((in_minfo.dim[0]!=out_minfo.dim[1])|| 00091 (in_minfo.dim[0]!=out_minfo.dim[0])|| 00092 (in_minfo.dim[1]!=out_minfo.dim[1])) { err=JIT_ERR_MISMATCH_DIM; goto out;} 00093 //get dimensions/planecount 00094 dimcount = out_minfo.dimcount; 00095 planecount = out_minfo.planecount; 00096 00097 //set output matrix to be identity 00098 jit_object_method(out_matrix,_jit_sym_clear); 00099 jit_la_inverse_ident(&out_minfo, out_bp); 00100 00101 //first copy matrix, and then calculate normalized upper trianglular matrix inplace 00102 if (!(tmp_matrix=jit_object_new(_jit_sym_jit_matrix,&in_minfo))) 00103 { err=JIT_ERR_OUT_OF_MEM; goto out;} 00104 jit_object_method(tmp_matrix,_jit_sym_lock,1); 00105 jit_object_method(tmp_matrix,_jit_sym_frommatrix,in_matrix,NULL); 00106 jit_object_method(tmp_matrix,_jit_sym_getinfo,&tmp_minfo); 00107 jit_object_method(tmp_matrix,_jit_sym_getdata,&tmp_bp); 00108 if (!tmp_bp) goto cleanup; 00109 00110 if (planecount==1) { 00111 if (jit_la_inverse_calculate_normupper_2d_real(x, &swapcount, &tmp_minfo, tmp_bp, &out_minfo, out_bp)) 00112 { jit_object_method(out_matrix,_jit_sym_clear); err = JIT_ERR_GENERIC; goto cleanup; } 00113 jit_la_inverse_calculate_backsub_2d_real(x, &tmp_minfo, tmp_bp, &out_minfo, out_bp); 00114 } else { 00115 if (jit_la_inverse_calculate_normupper_2d_complex(x, &swapcount, &tmp_minfo, tmp_bp, &out_minfo, out_bp)) 00116 { jit_object_method(out_matrix,_jit_sym_clear); err = JIT_ERR_GENERIC; goto cleanup; } 00117 jit_la_inverse_calculate_backsub_2d_complex(x, &tmp_minfo, tmp_bp, &out_minfo, out_bp); 00118 } 00119 00120 cleanup: 00121 if (tmp_matrix) { 00122 jit_object_method(tmp_matrix,_jit_sym_lock,0); 00123 jit_object_free(tmp_matrix); 00124 } 00125 } else { 00126 return JIT_ERR_INVALID_PTR; 00127 } 00128 00129 out: 00130 jit_object_method(out_matrix,_jit_sym_lock,out_savelock); 00131 jit_object_method(in_matrix,_jit_sym_lock,in_savelock); 00132 return err; 00133 } 00134 00135 //assumes input is all zeros 00136 void jit_la_inverse_ident(t_jit_matrix_info *in_minfo, char *bip) 00137 { 00138 long i,rows; 00139 char *p; 00140 00141 rows = in_minfo->dim[1]; 00142 if (in_minfo->type==_jit_sym_float32) { 00143 for (i=0;i<rows;i++) { 00144 p = bip + i*in_minfo->dimstride[1] + i*in_minfo->dimstride[0]; 00145 *((float *)p) = 1.; 00146 } 00147 } else if (in_minfo->type==_jit_sym_float64) { 00148 for (i=0;i<rows;i++) { 00149 p = bip + i*in_minfo->dimstride[1] + i*in_minfo->dimstride[0]; 00150 *((double *)p) = 1.; 00151 } 00152 } 00153 } 00154 00155 00156 long jit_la_inverse_calculate_normupper_2d_real(t_jit_la_inverse *x, long *swapcount, t_jit_matrix_info *in_minfo, char *bip, t_jit_matrix_info *p_minfo, char *bpp) 00157 { 00158 long i,j,n,rows; 00159 t_jit_op_info in_opinfo,tmp_opinfo,p_opinfo,p_tmp_opinfo; 00160 double val,val2,val_inv; 00161 char *op; 00162 00163 n = in_minfo->dim[0]; 00164 if (in_minfo->type==_jit_sym_float32) { 00165 tmp_opinfo.stride = in_opinfo.stride = in_minfo->dimstride[0]/4; //row vector 00166 p_opinfo.stride = p_tmp_opinfo.stride = p_minfo->dimstride[0]/4; 00167 rows = in_minfo->dim[1]; 00168 for (i=0;i<rows;i++) { 00169 in_opinfo.p = bip + i*in_minfo->dimstride[1]; 00170 p_opinfo.p = bpp + i*p_minfo->dimstride[1]; 00171 val = *((float *)(((char *)in_opinfo.p) + i*in_minfo->dimstride[0])); 00172 //perform row swapping if necessary 00173 if (ABS(val)<x->thresh) { 00174 j=i+1; 00175 while ((j<rows)&&(ABS(val)<x->thresh)) { 00176 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00177 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00178 val = *((float *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0])); 00179 j++; 00180 } 00181 if (!(ABS(val)<x->thresh)) { 00182 jit_op_vector_swap_float32(n,NULL,&in_opinfo,&tmp_opinfo,NULL); 00183 jit_op_vector_swap_float32(n,NULL,&p_opinfo,&p_tmp_opinfo,NULL); 00184 *swapcount += 1; 00185 } else { 00186 return -1; 00187 } 00188 } 00189 00190 if (!(ABS(val)<x->thresh)) { // thresh? 00191 //normalize 00192 val2 = 1./val; 00193 jit_op_vector_ax_float32(n,&val2,&in_opinfo,NULL,&in_opinfo); // note in place 00194 jit_op_vector_ax_float32(n,&val2,&p_opinfo,NULL,&p_opinfo); // note in place 00195 //eliminate all non zero values in column i 00196 j=i+1; 00197 val_inv=-1.; 00198 while (j<rows) { 00199 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00200 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00201 val2 = *((float *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0])); 00202 if (!(ABS(val2)<x->thresh)) { // thresh? 00203 val2 = val2*val_inv; 00204 jit_op_vector_axpy_float32(n,&val2,&in_opinfo,&tmp_opinfo,&tmp_opinfo); // note in place 00205 jit_op_vector_axpy_float32(n,&val2,&p_opinfo,&p_tmp_opinfo,&p_tmp_opinfo); // note in place 00206 } 00207 j++; 00208 } 00209 } 00210 } 00211 } else if (in_minfo->type==_jit_sym_float64) { 00212 tmp_opinfo.stride = in_opinfo.stride = in_minfo->dimstride[0]/8; //row vector 00213 p_opinfo.stride = p_tmp_opinfo.stride = p_minfo->dimstride[0]/8; 00214 rows = in_minfo->dim[1]; 00215 for (i=0;i<rows;i++) { 00216 in_opinfo.p = bip + i*in_minfo->dimstride[1]; 00217 p_opinfo.p = bpp + i*p_minfo->dimstride[1]; 00218 val = *((double *)(((char *)in_opinfo.p) + i*in_minfo->dimstride[0])); 00219 //perform row swapping if necessary 00220 if ((ABS(val)<x->thresh)) { 00221 j=i+1; 00222 while ((j<rows)&&(ABS(val)<x->thresh)) { 00223 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00224 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00225 val = *((double *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0])); 00226 j++; 00227 } 00228 if (!(ABS(val)<x->thresh)) { 00229 jit_op_vector_swap_float64(n,NULL,&in_opinfo,&tmp_opinfo,NULL); 00230 jit_op_vector_swap_float64(n,NULL,&p_opinfo,&p_tmp_opinfo,NULL); 00231 *swapcount += 1; 00232 } else { 00233 return -1; 00234 } 00235 } 00236 if (!(ABS(val)<x->thresh)) { // thresh? 00237 //normalize 00238 val2 = 1./val; 00239 jit_op_vector_ax_float64(n,&val2,&in_opinfo,NULL,&in_opinfo); // note in place 00240 jit_op_vector_ax_float64(n,&val2,&p_opinfo,NULL,&p_opinfo); // note in place 00241 //eliminate all non zero values in column i 00242 j=i+1; 00243 val_inv=-1.; 00244 while (j<rows) { 00245 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00246 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00247 val2 = *((double *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0])); 00248 if (!(ABS(val2)<x->thresh)) { // thresh? 00249 val2 = val2*val_inv; 00250 jit_op_vector_axpy_float64(n,&val2,&in_opinfo,&tmp_opinfo,&tmp_opinfo); // note in place 00251 jit_op_vector_axpy_float64(n,&val2,&p_opinfo,&p_tmp_opinfo,&p_tmp_opinfo); // note in place 00252 } 00253 j++; 00254 } 00255 } 00256 } 00257 } 00258 return 0; 00259 } 00260 00261 void jit_la_inverse_calculate_backsub_2d_real(t_jit_la_inverse *x, t_jit_matrix_info *in_minfo, char *bip, t_jit_matrix_info *p_minfo, char *bpp) 00262 { 00263 long i,j,n,rows; 00264 t_jit_op_info in_opinfo,tmp_opinfo,p_opinfo,p_tmp_opinfo; 00265 double val2; 00266 char *op; 00267 00268 n = in_minfo->dim[0]; 00269 if (in_minfo->type==_jit_sym_float32) { 00270 tmp_opinfo.stride = in_opinfo.stride = in_minfo->dimstride[0]/4; //row vector 00271 p_opinfo.stride = p_tmp_opinfo.stride = p_minfo->dimstride[0]/4; 00272 rows = in_minfo->dim[1]; 00273 for (i=rows-1;i>=0;i--) { 00274 in_opinfo.p = bip + i*in_minfo->dimstride[1]; 00275 p_opinfo.p = bpp + i*p_minfo->dimstride[1]; 00276 00277 //eliminate all non zero values in column i 00278 j=i-1; 00279 while (j>=0) { 00280 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00281 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00282 val2 = *((float *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0])); 00283 if (!(ABS(val2)<x->thresh)) { // thresh? 00284 val2 = -val2; 00285 jit_op_vector_axpy_float32(n,&val2,&in_opinfo,&tmp_opinfo,&tmp_opinfo); // note in place 00286 jit_op_vector_axpy_float32(n,&val2,&p_opinfo,&p_tmp_opinfo,&p_tmp_opinfo); // note in place 00287 } 00288 j--; 00289 } 00290 } 00291 } else if (in_minfo->type==_jit_sym_float64) { 00292 tmp_opinfo.stride = in_opinfo.stride = in_minfo->dimstride[0]/8; //row vector 00293 p_opinfo.stride = p_tmp_opinfo.stride = p_minfo->dimstride[0]/8; 00294 rows = in_minfo->dim[1]; 00295 for (i=rows-1;i>=0;i--) { 00296 in_opinfo.p = bip + i*in_minfo->dimstride[1]; 00297 p_opinfo.p = bpp + i*p_minfo->dimstride[1]; 00298 00299 //eliminate all non zero values in column i 00300 j=i-1; 00301 while (j>=0) { 00302 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00303 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00304 val2 = *((double *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0])); 00305 if (!(ABS(val2)<x->thresh)) { // thresh? 00306 val2 = -val2; 00307 jit_op_vector_axpy_float64(n,&val2,&in_opinfo,&tmp_opinfo,&tmp_opinfo); // note in place 00308 jit_op_vector_axpy_float64(n,&val2,&p_opinfo,&p_tmp_opinfo,&p_tmp_opinfo); // note in place 00309 } 00310 j--; 00311 } 00312 } 00313 } 00314 } 00315 00316 #define COMPLEX_IS_ZERO(a,b) (((a)==0)&&((b)==0)) 00317 #define COMPLEX_IS_ZERO_THRESH(a,b,thresh) ((ABS(a)<(thresh))&&(ABS(b)<(thresh))) 00318 #define COMPLEX_RECIP_REAL(a,b) ((a)/(((a)*(a))+((b)*(b)))) 00319 #define COMPLEX_RECIP_IMAG(a,b) (-(b)/(((a)*(a))+((b)*(b)))) 00320 #define COMPLEX_MULT_REAL(a,b,c,d) (((a)*(c))-((b)*(d))) 00321 #define COMPLEX_MULT_IMAG(a,b,c,d) (((a)*(d))+((b)*(c))) 00322 00323 long jit_la_inverse_calculate_normupper_2d_complex(t_jit_la_inverse *x, long *swapcount, t_jit_matrix_info *in_minfo, char *bip,t_jit_matrix_info *p_minfo, char *bpp ) 00324 { 00325 long i,j,n,rows; 00326 t_jit_op_info in_opinfo,tmp_opinfo,p_opinfo,p_tmp_opinfo; 00327 double val[2],val2[2],val3[2],val_inv[2]; 00328 char *op; 00329 00330 n = in_minfo->dim[0]; 00331 if (in_minfo->type==_jit_sym_float32) { 00332 tmp_opinfo.stride = in_opinfo.stride = in_minfo->dimstride[0]/4; //row vector 00333 p_opinfo.stride = p_tmp_opinfo.stride = p_minfo->dimstride[0]/4; 00334 rows = in_minfo->dim[1]; 00335 for (i=0;i<rows;i++) { 00336 in_opinfo.p = bip + i*in_minfo->dimstride[1]; 00337 p_opinfo.p = bpp + i*p_minfo->dimstride[1]; 00338 val[0] = ((float *)(((char *)in_opinfo.p) + i*in_minfo->dimstride[0]))[0]; 00339 val[1] = ((float *)(((char *)in_opinfo.p) + i*in_minfo->dimstride[0]))[1]; 00340 00341 //perform row swapping if necessary 00342 if (COMPLEX_IS_ZERO_THRESH(val[0],val[1],x->thresh)) { 00343 j=i+1; 00344 while ((j<rows)&&COMPLEX_IS_ZERO_THRESH(val[0],val[1],x->thresh)) { 00345 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00346 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00347 val[0] = ((float *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[0]; 00348 val[1] = ((float *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[1]; 00349 j++; 00350 } 00351 if (!COMPLEX_IS_ZERO_THRESH(val[0],val[1],x->thresh)) { 00352 jit_op_vector_swap_float32_complex(n,NULL,&in_opinfo,&tmp_opinfo,NULL); 00353 jit_op_vector_swap_float32_complex(n,NULL,&p_opinfo,&p_tmp_opinfo,NULL); 00354 *swapcount += 1; 00355 } else { 00356 return -1; 00357 } 00358 } 00359 if (!COMPLEX_IS_ZERO_THRESH(val[0],val[1],x->thresh)) { // thresh? 00360 //normalize 00361 val2[0] = COMPLEX_RECIP_REAL(val[0],val[1]); 00362 val2[1] = COMPLEX_RECIP_IMAG(val[0],val[1]); 00363 jit_op_vector_ax_float32_complex(n,val2,&in_opinfo,NULL,&in_opinfo); // note in place 00364 jit_op_vector_ax_float32_complex(n,val2,&p_opinfo,NULL,&p_opinfo); // note in place 00365 //eliminate all non zero values in column i 00366 j=i+1; 00367 val_inv[0] = -1; 00368 val_inv[1] = -0; 00369 while (j<rows) { 00370 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00371 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00372 val2[0] = ((float *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[0]; 00373 val2[1] = ((float *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[1]; 00374 if (!COMPLEX_IS_ZERO_THRESH(val2[0],val2[1],x->thresh)) { // thresh? 00375 val3[0] = COMPLEX_MULT_REAL(val2[0],val2[1],val_inv[0],val_inv[1]); 00376 val3[1] = COMPLEX_MULT_IMAG(val2[0],val2[1],val_inv[0],val_inv[1]); 00377 jit_op_vector_axpy_float32_complex(n,val3,&in_opinfo,&tmp_opinfo,&tmp_opinfo); // note in place 00378 jit_op_vector_axpy_float32_complex(n,val3,&p_opinfo,&p_tmp_opinfo,&p_tmp_opinfo); // note in place 00379 } 00380 j++; 00381 } 00382 } 00383 } 00384 } else if (in_minfo->type==_jit_sym_float64) { 00385 tmp_opinfo.stride = in_opinfo.stride = in_minfo->dimstride[0]/8; //row vector 00386 p_opinfo.stride = p_tmp_opinfo.stride = p_minfo->dimstride[0]/8; 00387 rows = in_minfo->dim[1]; 00388 for (i=0;i<rows;i++) { 00389 in_opinfo.p = bip + i*in_minfo->dimstride[1]; 00390 p_opinfo.p = bpp + i*p_minfo->dimstride[1]; 00391 val[0] = ((double *)(((char *)in_opinfo.p) + i*in_minfo->dimstride[0]))[0]; 00392 val[1] = ((double *)(((char *)in_opinfo.p) + i*in_minfo->dimstride[0]))[1]; 00393 00394 //perform row swapping if necessary 00395 if (COMPLEX_IS_ZERO_THRESH(val[0],val[1],x->thresh)) { 00396 j=i+1; 00397 while ((j<rows)&&COMPLEX_IS_ZERO_THRESH(val[0],val[1],x->thresh)) { 00398 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00399 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00400 val[0] = ((double *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[0]; 00401 val[1] = ((double *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[1]; 00402 j++; 00403 } 00404 if (!COMPLEX_IS_ZERO_THRESH(val[0],val[1],x->thresh)) { 00405 jit_op_vector_swap_float64_complex(n,NULL,&in_opinfo,&tmp_opinfo,NULL); 00406 jit_op_vector_swap_float64_complex(n,NULL,&p_opinfo,&p_tmp_opinfo,NULL); 00407 *swapcount += 1; 00408 } else { 00409 return -1; 00410 } 00411 } 00412 if (!COMPLEX_IS_ZERO_THRESH(val[0],val[1],x->thresh)) { // thresh? 00413 //normalize 00414 val2[0] = COMPLEX_RECIP_REAL(val[0],val[1]); 00415 val2[1] = COMPLEX_RECIP_IMAG(val[0],val[1]); 00416 jit_op_vector_ax_float64_complex(n,val2,&in_opinfo,NULL,&in_opinfo); // note in place 00417 jit_op_vector_ax_float64_complex(n,val2,&p_opinfo,NULL,&p_opinfo); // note in place 00418 //eliminate all non zero values in column i 00419 j=i+1; 00420 val_inv[0] = -1; 00421 val_inv[1] = -0; 00422 while (j<rows) { 00423 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00424 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00425 val2[0] = ((double *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[0]; 00426 val2[1] = ((double *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[1]; 00427 if (!COMPLEX_IS_ZERO_THRESH(val2[0],val2[1],x->thresh)) { // thresh? 00428 val3[0] = COMPLEX_MULT_REAL(val2[0],val2[1],val_inv[0],val_inv[1]); 00429 val3[1] = COMPLEX_MULT_IMAG(val2[0],val2[1],val_inv[0],val_inv[1]); 00430 jit_op_vector_axpy_float64_complex(n,val3,&in_opinfo,&tmp_opinfo,&tmp_opinfo); // note in place 00431 jit_op_vector_axpy_float64_complex(n,val3,&p_opinfo,&p_tmp_opinfo,&p_tmp_opinfo); // note in place 00432 } 00433 j++; 00434 } 00435 } 00436 } 00437 } 00438 return 0; 00439 } 00440 00441 void jit_la_inverse_calculate_backsub_2d_complex(t_jit_la_inverse *x, t_jit_matrix_info *in_minfo, char *bip, t_jit_matrix_info *p_minfo, char *bpp) 00442 { 00443 long i,j,n,rows; 00444 t_jit_op_info in_opinfo,tmp_opinfo,p_opinfo,p_tmp_opinfo; 00445 double val2[2]; 00446 char *op; 00447 00448 n = in_minfo->dim[0]; 00449 if (in_minfo->type==_jit_sym_float32) { 00450 tmp_opinfo.stride = in_opinfo.stride = in_minfo->dimstride[0]/4; //row vector 00451 p_opinfo.stride = p_tmp_opinfo.stride = p_minfo->dimstride[0]/4; 00452 rows = in_minfo->dim[1]; 00453 for (i=rows-1;i>=0;i--) { 00454 in_opinfo.p = bip + i*in_minfo->dimstride[1]; 00455 p_opinfo.p = bpp + i*p_minfo->dimstride[1]; 00456 00457 //eliminate all non zero values in column i 00458 j=i-1; 00459 while (j>=0) { 00460 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00461 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00462 val2[0] = ((float *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[0]; 00463 val2[1] = ((float *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[1]; 00464 if (!COMPLEX_IS_ZERO_THRESH(val2[0],val2[1],x->thresh)) { // thresh? 00465 val2[0] = -val2[0]; 00466 val2[1] = -val2[1]; 00467 jit_op_vector_axpy_float32_complex(n,val2,&in_opinfo,&tmp_opinfo,&tmp_opinfo); // note in place 00468 jit_op_vector_axpy_float32_complex(n,val2,&p_opinfo,&p_tmp_opinfo,&p_tmp_opinfo); // note in place 00469 } 00470 j--; 00471 } 00472 } 00473 } else if (in_minfo->type==_jit_sym_float64) { 00474 tmp_opinfo.stride = in_opinfo.stride = in_minfo->dimstride[0]/8; //row vector 00475 p_opinfo.stride = p_tmp_opinfo.stride = p_minfo->dimstride[0]/8; 00476 rows = in_minfo->dim[1]; 00477 for (i=rows-1;i>=0;i--) { 00478 in_opinfo.p = bip + i*in_minfo->dimstride[1]; 00479 p_opinfo.p = bpp + i*p_minfo->dimstride[1]; 00480 00481 //eliminate all non zero values in column i 00482 j=i-1; 00483 while (j>=0) { 00484 tmp_opinfo.p = bip + j*in_minfo->dimstride[1]; //row j 00485 p_tmp_opinfo.p = bpp + j*p_minfo->dimstride[1]; 00486 val2[0] = ((double *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[0]; 00487 val2[1] = ((double *)(((char *)tmp_opinfo.p) + i*in_minfo->dimstride[0]))[1]; 00488 if (!COMPLEX_IS_ZERO_THRESH(val2[0],val2[1],x->thresh)) { // thresh? 00489 val2[0] = -val2[0]; 00490 val2[1] = -val2[1]; 00491 jit_op_vector_axpy_float64_complex(n,val2,&in_opinfo,&tmp_opinfo,&tmp_opinfo); // note in place 00492 jit_op_vector_axpy_float64_complex(n,val2,&p_opinfo,&p_tmp_opinfo,&p_tmp_opinfo); // note in place 00493 } 00494 j--; 00495 } 00496 } 00497 } 00498 } 00499 00500 t_jit_la_inverse *jit_la_inverse_new(void) 00501 { 00502 t_jit_la_inverse *x; 00503 00504 if (x=(t_jit_la_inverse *)jit_object_alloc(_jit_la_inverse_class)) { 00505 x->thresh = JIT_LA_INVERSE_DEF_THRESH; 00506 } else { 00507 x = NULL; 00508 } 00509 return x; 00510 } 00511 00512 void jit_la_inverse_free(t_jit_la_inverse *x) 00513 { 00514 }
Copyright © 2008, Cycling '74