float bez_spline::BEZ(int k, int n, float u) { float a = (float)COMB(n, k); float b = (float)pow(u, (float)k); float c = (float)pow(1.0f - u, (float)(n - k)); return a * b * c; }
static PyObject *cosine_sim_expand_dkeys_cpu(PyObject *self, PyObject *args){ PyArrayObject *keys_in, *mem_in, *numpy_buffer_temp; float *keys, *mem, keys_sq_sum, *mem_sq_sum; float *comb; if (!PyArg_ParseTuple(args, "O!O!", &PyArray_Type, &keys_in, &PyArray_Type, &mem_in)) return NULL; int n_controllers = PyArray_DIM(keys_in, 0); int mem_length = PyArray_DIM(keys_in, 1); int M = PyArray_DIM(mem_in, 0); // num mem slots keys = (float *) PyArray_DATA(keys_in); mem = (float *) PyArray_DATA(mem_in); ///////////////////////// output buffer int dims[5]; dims[0] = n_controllers; dims[1] = M; dims[2] = n_controllers; dims[3] = mem_length; numpy_buffer_temp = (PyArrayObject *) PyArray_FromDims(4, dims, NPY_FLOAT); comb = (float *) PyArray_DATA(numpy_buffer_temp); //////////////////////// keys_sq_sum, mem_sq_sum MALLOC(mem_sq_sum, M * sizeof(DATA_TYPE)) memset(mem_sq_sum, 0, M * sizeof(DATA_TYPE)); for(int j = 0; j < M; j++){ for(int k = 0; k < mem_length; k++){ mem_sq_sum[j] += MEM(j,k) * MEM(j,k); } mem_sq_sum[j] = sqrt(mem_sq_sum[j]); } ///////////////////////// // mem*denom - temp (keys*numer*mem_sq_sum) float numer, denom; for(int i = 0; i < n_controllers; i++){ // [1] keys_sq_sum = 0; for(int k = 0; k < mem_length; k++){ keys_sq_sum += KEYS(i,k) * KEYS(i,k); } keys_sq_sum = sqrt(keys_sq_sum); for(int j = 0; j < M; j++){ denom = keys_sq_sum * mem_sq_sum[j]; numer = 0; for(int k = 0; k < mem_length; k++){ numer += KEYS(i,k) * MEM(j,k); COMB(i,j,i,k) = MEM(j,k) / denom; } numer /= keys_sq_sum * denom * denom / mem_sq_sum[j]; for(int k = 0; k < mem_length; k++){ // [2] COMB(i,j,i,k) -= KEYS(i,k) * numer; } } } free(mem_sq_sum); return PyArray_Return(numpy_buffer_temp); }
void Reassign_Weight() { int i,j; int is,id; double sumprob,maxprob,minprob; for (i=1;i<(nbin+1);i++) { if (tmpnpar[i]!=0) { sumprob=0; for (j=1;j<(tmpnpar[i]+1);j++) { sumprob+=tmppar[i][j].prob; } if (sumprob!=0) { maxprob=sumprob/npar[i]*sqrt(mmratio); minprob=sumprob/npar[i]/sqrt(mmratio); Min1(i); while (tmppar[i][tmpnpar[i]].prob<minprob) { Min2(i); COMB(i); Min1(i); } Max(i); while (tmppar[i][1].prob>maxprob) { SPLIT(i); Max(i); } while (tmpnpar[i]>npar[i]) { Min1(i); Min2(i); COMB(i); } while (tmpnpar[i]<npar[i]) { Max(i); SPLIT(i); } for (j=1;j<(npar[i]+1);j++) { par[i][j].prob=tmppar[i][j].prob; par[i][j].coord=tmppar[i][j].coord; par[i][j].numb=tmppar[i][j].numb; par[i][j].tb0=tmppar[i][j].tb0; par[i][j].distA=tmppar[i][j].distA; par[i][j].distB=tmppar[i][j].distB; } } } else { for (j=1;j<(npar[i]+1);j++) { if (Fava[0]!=0) { par[i][j].numb=Fava[Fava[0]]; Fava[0]-=1; } else { Fexc[0].i+=1; Fexc[0].j+=1; Fexc[Fexc[0].i].i=i; Fexc[Fexc[0].i].j=j; par[i][j].numb=Fexc[0].i+nallpar; } } Make_Ghost(i); } } while(Fexc[0].i!=0) { if (Fexc[0].i!=Fava[0]) { printf("Fava=%d\tFexc=%d!\n",Fava[0],Fexc[0].i); for (j=1;j<(Fava[0]+1);j++) { printf("Fava[%d]=%d\n",j,Fava[j]); } printf("Something is wrong!\n"); exit(1); } is=Fexc[0].i; id=Fava[is]; par[Fexc[is].i][Fexc[is].j].numb=id; is+=nallpar; free(rx_states[id-1]); rx_states[id-1]=(int *)malloc(nspecies*sizeof(int)); memcpy(rx_states[id-1],rx_states[is-1],nspecies*sizeof(int)); free(rx_states[is-1]); rx_states[is-1]=(int *)malloc(nspecies*sizeof(int)); Fexc[0].i-=1; Fexc[0].j-=1; Fava[0]-=1; } return; }
int main(int argc, char** argv, char** envp) { printf("COMB(0x800,%d) is %d\n", cone, COMB(0x800, cone)); printf("COMB(0x801,%d) is %d\n", cone, COMB(0x801, cone)); printf("COMB(%d,%d) is %d\n", one, two, COMB(one, two)); return(0); }