annotate _FullBNT/BNT/potentials/Tables/divide_by_table.c @ 9:4ea6619cb3f5 tip

removed log files
author matthiasm
date Fri, 11 Apr 2014 15:55:11 +0100
parents b5b38998ef3b
children
rev   line source
matthiasm@8 1 /* divide_by_table.c ../potential/tables */
matthiasm@8 2
matthiasm@8 3
matthiasm@8 4 /******************************************/
matthiasm@8 5 /* 6 input & 1 output */
matthiasm@8 6 /* Big table [0] */
matthiasm@8 7 /* Big domain [1] */
matthiasm@8 8 /* big sizes [2] */
matthiasm@8 9 /* Small table [3] */
matthiasm@8 10 /* small domain [4] */
matthiasm@8 11 /* small sizes [5] */
matthiasm@8 12 /* */
matthiasm@8 13 /* New big table[0] */
matthiasm@8 14 /******************************************/
matthiasm@8 15
matthiasm@8 16 #include "mex.h"
matthiasm@8 17
matthiasm@8 18 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
matthiasm@8 19 int i, j, count, NB, NS, siz_b, siz_s, ndim, temp;
matthiasm@8 20 int *mask, *sx, *sy, *cpsy, *subs, *s, *cpsy2;
matthiasm@8 21 double *pbDomain, *psDomain, *sp, *zp, *bs, value;
matthiasm@8 22
matthiasm@8 23 plhs[0] = mxDuplicateArray(prhs[0]);
matthiasm@8 24 zp = mxGetPr(plhs[0]);
matthiasm@8 25
matthiasm@8 26 siz_b = mxGetNumberOfElements(prhs[1]);
matthiasm@8 27 siz_s = mxGetNumberOfElements(prhs[4]);
matthiasm@8 28 pbDomain = mxGetPr(prhs[1]);
matthiasm@8 29 psDomain = mxGetPr(prhs[4]);
matthiasm@8 30
matthiasm@8 31 NB = mxGetNumberOfElements(prhs[0]);
matthiasm@8 32 NS = mxGetNumberOfElements(prhs[3]);
matthiasm@8 33 sp = mxGetPr(prhs[3]);
matthiasm@8 34
matthiasm@8 35 bs = mxGetPr(prhs[2]);
matthiasm@8 36
matthiasm@8 37 if(NS == 1){
matthiasm@8 38 value = *sp;
matthiasm@8 39 if(value == 0) value = 1;
matthiasm@8 40 for(i=0; i<NB; i++){
matthiasm@8 41 zp[i] /= value;
matthiasm@8 42 }
matthiasm@8 43 return;
matthiasm@8 44 }
matthiasm@8 45
matthiasm@8 46 if(NS == NB){
matthiasm@8 47 for(i=0; i<NB; i++){
matthiasm@8 48 value = sp[i];
matthiasm@8 49 if(value == 0) value = 1;
matthiasm@8 50 zp[i] /= value;
matthiasm@8 51 }
matthiasm@8 52 return;
matthiasm@8 53 }
matthiasm@8 54
matthiasm@8 55 mask = malloc(siz_s * sizeof(int));
matthiasm@8 56 count = 0;
matthiasm@8 57 for(i=0; i<siz_s; i++){
matthiasm@8 58 for(j=0; j<siz_b; j++){
matthiasm@8 59 if(psDomain[i] == pbDomain[j]){
matthiasm@8 60 mask[count] = j;
matthiasm@8 61 count++;
matthiasm@8 62 break;
matthiasm@8 63 }
matthiasm@8 64 }
matthiasm@8 65 }
matthiasm@8 66
matthiasm@8 67 ndim = siz_b;
matthiasm@8 68 sx = (int *)malloc(sizeof(int)*ndim);
matthiasm@8 69 sy = (int *)malloc(sizeof(int)*ndim);
matthiasm@8 70 for(i=0; i<ndim; i++){
matthiasm@8 71 sx[i] = (int)bs[i];
matthiasm@8 72 sy[i] = 1;
matthiasm@8 73 }
matthiasm@8 74 for(i=0; i<count; i++){
matthiasm@8 75 temp = mask[i];
matthiasm@8 76 sy[temp] = sx[temp];
matthiasm@8 77 }
matthiasm@8 78
matthiasm@8 79 s = (int *)malloc(sizeof(int)*ndim);
matthiasm@8 80 *(cpsy = (int *)malloc(sizeof(int)*ndim)) = 1;
matthiasm@8 81 subs = (int *)malloc(sizeof(int)*ndim);
matthiasm@8 82 cpsy2 = (int *)malloc(sizeof(int)*ndim);
matthiasm@8 83 for(i = 0; i < ndim; i++){
matthiasm@8 84 subs[i] = 0;
matthiasm@8 85 s[i] = sx[i] - 1;
matthiasm@8 86 }
matthiasm@8 87
matthiasm@8 88 for(i = 0; i < ndim-1; i++){
matthiasm@8 89 cpsy[i+1] = cpsy[i]*sy[i]--;
matthiasm@8 90 cpsy2[i] = cpsy[i]*sy[i];
matthiasm@8 91 }
matthiasm@8 92 cpsy2[ndim-1] = cpsy[ndim-1]*(--sy[ndim-1]);
matthiasm@8 93
matthiasm@8 94 for(j=0; j<NB; j++){
matthiasm@8 95 value = *sp;
matthiasm@8 96 if(value == 0) value = 1;
matthiasm@8 97 *zp++ /= value;
matthiasm@8 98 for(i = 0; i < ndim; i++){
matthiasm@8 99 if(subs[i] == s[i]){
matthiasm@8 100 subs[i] = 0;
matthiasm@8 101 if(sy[i])
matthiasm@8 102 sp -= cpsy2[i];
matthiasm@8 103 }
matthiasm@8 104 else{
matthiasm@8 105 subs[i]++;
matthiasm@8 106 if(sy[i])
matthiasm@8 107 sp += cpsy[i];
matthiasm@8 108 break;
matthiasm@8 109 }
matthiasm@8 110 }
matthiasm@8 111 }
matthiasm@8 112 free(sx);
matthiasm@8 113 free(sy);
matthiasm@8 114 free(s);
matthiasm@8 115 free(cpsy);
matthiasm@8 116 free(subs);
matthiasm@8 117 free(cpsy2);
matthiasm@8 118 free(mask);
matthiasm@8 119 }
matthiasm@8 120