static PyObject* multinomial(PyObject* self, PyObject* args) { int n=-1, i; long num_trials, num_categories; char* out_ptr; PyArrayObject* priors_array; PyObject* priors_object; PyArrayObject* op; int out_dimensions[2]; if( !PyArg_ParseTuple(args, "lO|i", &num_trials, &priors_object, &n) ) { return NULL; } priors_array = (PyArrayObject*) PyArray_ContiguousFromObject(priors_object, PyArray_FLOAT, 1, 1); if( priors_array == NULL ) { return NULL; } num_categories = priors_array->dimensions[0]+1; if( n==-1 ) { n = 1; } /* Create an n by num_categories array of long */ out_dimensions[0] = n; out_dimensions[1] = num_categories; op = (PyArrayObject*) PyArray_FromDims(2, out_dimensions, PyArray_LONG); if( op == NULL ) { return NULL; } out_ptr = op->data; for(i=0; i<n; i++) { genmul(num_trials, (float*)(priors_array->data), num_categories, (long*) out_ptr); out_ptr += op->strides[0]; } return PyArray_Return(op); }
int genbinop(int op, int p1, int p2) { binopchk(op, p1, p2); switch (op) { case PLUS: return genadd(p1, p2, 1); case MINUS: return gensub(p1, p2, 1); case STAR: genmul(); break; case SLASH: gendiv(1); break; case MOD: genmod(1); break; case LSHIFT: genshl(1); break; case RSHIFT: genshr(1); break; case AMPER: genand(); break; case CARET: genxor(); break; case PIPE: genior(); break; case EQUAL: queue_cmp(equal); break; case NOTEQ: queue_cmp(not_equal); break; case LESS: queue_cmp(less); break; case GREATER: queue_cmp(greater); break; case LTEQ: queue_cmp(less_equal); break; case GTEQ: queue_cmp(greater_equal); break; } return PINT; }
void genasop(int op, int p1, int p2, int swapped) { binopchk(op, p1, p2); switch (op) { case ASDIV: gendiv(swapped); break; case ASMUL: genmul(); break; case ASMOD: genmod(swapped); break; case ASPLUS: genadd(p1, p2, swapped); break; case ASMINUS: gensub(p1, p2, swapped); break; case ASLSHIFT: genshl(swapped); break; case ASRSHIFT: genshr(swapped); break; case ASAND: genand(); break; case ASXOR: genxor(); break; case ASOR: genior(); break; } }