static int PyLWPR_S_init_D(PyLWPR *self,PyObject *value, void *closure) { int err; LWPR_Model *m = &(self->model); if (!PyArray_Check(value)) { PyErr_SetString(PyExc_TypeError, "Attribute 'init_D' must be a numpy array."); return -1; } /* First, set init_M to the matrix, and do a Cholesky decomposition in place ** If this fails, keep and decompose the original init_D */ err = set_matrix_from_array(m->nIn, m->nInStore, m->nIn, m->init_M, (PyArrayObject *)value); if (err) { lwpr_math_cholesky(m->nIn, m->nInStore, m->init_M, m->init_D); return -1; } if (!lwpr_math_cholesky(m->nIn, m->nInStore, m->init_M, NULL)) { /* Revert to original init_M */ lwpr_math_cholesky(m->nIn, m->nInStore, m->init_M, m->init_D); PyErr_SetString(PyExc_ValueError, "'init_D' must be a positive definite matrix."); return -1; } /* Ok, everything was fine, init_M is already the factor, copy the contents again to init_D */ set_matrix_from_array(m->nIn, m->nInStore, m->nIn, m->init_D, (PyArrayObject *)value); return 0; }
static void gst_perspective_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPerspective *perspective; GstGeometricTransform *gt; gboolean matrix_ok; gt = GST_GEOMETRIC_TRANSFORM_CAST (object); perspective = GST_PERSPECTIVE_CAST (object); GST_OBJECT_LOCK (perspective); switch (prop_id) { case PROP_MATRIX: matrix_ok = set_matrix_from_array (perspective, g_value_get_boxed (value)); if (matrix_ok) { gst_geometric_transform_set_need_remap (gt); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (perspective); }
static int PyLWPR_S_init_alpha(PyLWPR *self,PyObject *value, void *closure) { if (!PyArray_Check(value)) { PyErr_SetString(PyExc_TypeError, "Attribute 'init_alpha' must be a numpy array."); return -1; } return set_matrix_from_array(self->model.nIn, self->model.nInStore, self->model.nIn, self->model.init_alpha, (PyArrayObject *)value); }
static int PyLWPR_S_init_M(PyLWPR *self,PyObject *value, void *closure) { int err; int i,j; LWPR_Model *m = &(self->model); int nIn = m->nIn; int nInS = m->nInStore; if (!PyArray_Check(value)) { PyErr_SetString(PyExc_TypeError, "Attribute 'init_M' must be a numpy array."); return -1; } err = set_matrix_from_array(nIn, nInS, nIn, m->init_M, (PyArrayObject *)value); if (err) { /* There was a problem with the matrix, revert to original cholesky factor of init_D */ lwpr_math_cholesky(nIn, nInS, m->init_M, m->init_D); return -1; } for (j=0;j<nIn;j++) { for (i=j+1;i<nIn;i++) { if (m->init_M[i+j*nInS] != 0.0) { PyErr_SetString(PyExc_ValueError, "Attribute 'init_M' must be upper triangular."); return -1; } } } /* Everything seems to be ok, update init_D from init_M */ for (j=0;j<nIn;j++) { /* Calculate in lower triangle, fill upper */ for (i=0;i<j;i++) { m->init_D[i+j*nInS] = m->init_D[j+i*nInS]; } for (i=j;i<nIn;i++) { m->init_D[i+j*nInS] = lwpr_math_dot_product(m->init_M + i*nInS, m->init_M + j*nInS,j+1); } } return 0; }