فهرست منبع

Now Nx may be >=1, also fixed some errors in yafl python extension.

shkolnick-kun 4 ماه پیش
والد
کامیت
02fbe67cd5
2فایلهای تغییر یافته به همراه28 افزوده شده و 14 حذف شده
  1. 6 6
      src/yafl.c
  2. 22 8
      src/yaflpy/yaflpy.pyx

+ 6 - 6
src/yafl.c

@@ -61,7 +61,7 @@ yaflStatusEn yafl_ekf_base_predict(yaflKalmanBaseSt * self)
     YAFL_CHECK(_DP,     YAFL_ST_INV_ARG_1);
     YAFL_CHECK(_UQ,     YAFL_ST_INV_ARG_1);
     YAFL_CHECK(_DQ,     YAFL_ST_INV_ARG_1);
-    YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1);
+    YAFL_CHECK(_NX > 0, YAFL_ST_INV_ARG_1);
 
     YAFL_CHECK(_W,      YAFL_ST_INV_ARG_1);
     YAFL_CHECK(_D,      YAFL_ST_INV_ARG_1);
@@ -166,7 +166,7 @@ yaflStatusEn _yafl_ekf_compute_error(yaflKalmanBaseSt * self, yaflFloat * z)
     YAFL_CHECK(_X,      YAFL_ST_INV_ARG_1);
     YAFL_CHECK(_Y,      YAFL_ST_INV_ARG_1);
 
-    YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1);
+    YAFL_CHECK(_NX > 0, YAFL_ST_INV_ARG_1);
     YAFL_CHECK(_NZ > 0, YAFL_ST_INV_ARG_1);
 
     YAFL_TRY(status, _HX(self, _Y,  _X)); /* self.y = h(x,...) */
@@ -201,7 +201,7 @@ yaflStatusEn yafl_ekf_base_update(yaflKalmanBaseSt * self, yaflFloat * z, yaflKa
     YAFL_CHECK(_Y,      YAFL_ST_INV_ARG_1);
     YAFL_CHECK(_UR,     YAFL_ST_INV_ARG_1);
 
-    YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1);
+    YAFL_CHECK(_NX > 0, YAFL_ST_INV_ARG_1);
     YAFL_CHECK(_NZ > 0, YAFL_ST_INV_ARG_1);
 
     YAFL_CHECK(_JHX,    YAFL_ST_INV_ARG_1);
@@ -360,7 +360,7 @@ do {                                              \
 /*---------------------------------------------------------------------------*/
 #define _EKF_BIERMAN_SELF_INTERNALS_CHECKS()  \
 do {                                          \
-    YAFL_CHECK(_NX > 1,   YAFL_ST_INV_ARG_1); \
+    YAFL_CHECK(_NX > 0,   YAFL_ST_INV_ARG_1); \
     YAFL_CHECK(_UP, YAFL_ST_INV_ARG_1);       \
     YAFL_CHECK(_DP, YAFL_ST_INV_ARG_1);       \
     YAFL_CHECK(_HY, YAFL_ST_INV_ARG_1);       \
@@ -461,7 +461,7 @@ static inline yaflStatusEn \
 /*---------------------------------------------------------------------------*/
 #define _EKF_JOSEPH_SELF_INTERNALS_CHECKS() \
 do {                                        \
-    YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1); \
+    YAFL_CHECK(_NX > 0, YAFL_ST_INV_ARG_1); \
     YAFL_CHECK(_UP,     YAFL_ST_INV_ARG_1); \
     YAFL_CHECK(_DP,     YAFL_ST_INV_ARG_1); \
     YAFL_CHECK(_HY,     YAFL_ST_INV_ARG_1); \
@@ -1495,7 +1495,7 @@ yaflStatusEn yafl_ukf_base_update(yaflUKFBaseSt * self, yaflFloat * z, \
 
 #define _UKF_BIERMAN_SELF_INTERNALS_CHECKS()  \
 do {                                          \
-    YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1);   \
+    YAFL_CHECK(_NX > 0, YAFL_ST_INV_ARG_1);   \
     YAFL_CHECK(_UP,     YAFL_ST_INV_ARG_1);   \
     YAFL_CHECK(_DP,     YAFL_ST_INV_ARG_1);   \
     YAFL_CHECK(_UPZX,   YAFL_ST_INV_ARG_1);   \

+ 22 - 8
src/yaflpy/yaflpy.pyx

@@ -472,6 +472,7 @@ ST_INV_ARG_12 = YAFL_ST_INV_ARG_12
 #                            Helper functions
 #==============================================================================
 cdef int _U_sz(int dim_u):
+    assert 0 < dim_u
     return max(1, (dim_u * (dim_u - 1))//2)
 
 #==============================================================================
@@ -2163,6 +2164,7 @@ def _mwgs(W, D):
     cdef yaflFloat [::1]    v_d = d
 
     res = yafl_math_mwgsu(nr, nc, &v_u[0], &v_d[0], &v_W[0,0], &v_D[0])
+
     return res, u, d
 
 #------------------------------------------------------------------------------
@@ -2433,8 +2435,12 @@ cdef class yaflKalmanBase:
     #--------------------------------------------------------------------------
     @property
     def P(self):
-        _,u = _set_u(self._Up)
-        return u.dot(np.diag(self._Dp).dot(u.T))
+        #
+        if self.c_self.base.base.Nx > 1:
+            _,u = _set_u(self._Up)
+            return u.dot(np.diag(self._Dp).dot(u.T))
+        #
+        return self._Dp.copy().reshape((1,1))
 
     @P.setter
     def P(self, value):
@@ -2443,8 +2449,12 @@ cdef class yaflKalmanBase:
     #--------------------------------------------------------------------------
     @property
     def Q(self):
-        _,u = _set_u(self._Uq)
-        return u.dot(np.diag(self._Dq).dot(u.T))
+        #
+        if self.c_self.base.base.Nx > 1:
+            _,u = _set_u(self._Uq)
+            return u.dot(np.diag(self._Dq).dot(u.T))
+        #
+        return self._Dq.copy().reshape((1,1))
 
     @Q.setter
     def Q(self, value):
@@ -2453,8 +2463,12 @@ cdef class yaflKalmanBase:
     #--------------------------------------------------------------------------
     @property
     def R(self):
-        _,u = _set_u(self._Ur)
-        return u.dot(np.diag(self._Dr).dot(u.T))
+        #
+        if self.c_self.base.base.Nz > 1:
+            _,u = _set_u(self._Ur)
+            return u.dot(np.diag(self._Dr).dot(u.T))
+        #
+        return self._Dr.copy().reshape((1,1))
 
     @R.setter
     def R(self, value):
@@ -2564,7 +2578,7 @@ cdef yaflStatusEn yafl_py_kalman_hx(yaflPyKalmanBaseSt * self, \
             raise ValueError('nx must be > 0!')
 
         nz = self.base.base.Nz
-        if nx <= 0:
+        if nz <= 0:
             raise ValueError('nz must be > 0!')
 
         _x = np.asarray(<yaflFloat[:nx]> x) #
@@ -2593,7 +2607,7 @@ cdef yaflStatusEn yafl_py_kalman_zrf(yaflPyKalmanBaseSt * self, yaflFloat * res,
 
         nz = self.base.base.Nz
         if nz <= 0:
-            raise ValueError('nx must be > 0!')
+            raise ValueError('nz must be > 0!')
 
         _res   = np.asarray(<yaflFloat[:nz]> res)   #
         _sigma = np.asarray(<yaflFloat[:nz]> sigma) #