File Coverage

lib/PDL/MatrixOps-pp-svd.c
Criterion Covered Total %
statement 57 60 95.0
branch 56 90 62.2
condition n/a
subroutine n/a
pod n/a
total 113 150 75.3


line stmt bran cond sub pod time code
1              
2             #line 453 "lib/PDL/PP.pm"
3             /*
4             * THIS FILE WAS GENERATED BY PDL::PP from lib/PDL/MatrixOps.pd! Do not modify!
5             */
6              
7             #define PDL_FREE_CODE(trans, destroy, comp_free_code, ntpriv_free_code) \
8             if (destroy) { \
9             comp_free_code \
10             } \
11             if ((trans)->dims_redone) { \
12             ntpriv_free_code \
13             }
14              
15             #include "EXTERN.h"
16             #include "perl.h"
17             #include "XSUB.h"
18             #include "pdl.h"
19             #include "pdlcore.h"
20             #define PDL PDL_MatrixOps
21             extern Core* PDL; /* Structure hold core C functions */
22             #line 23 "lib/PDL/MatrixOps-pp-svd.c"
23              
24             #include
25              
26             #line 1857 "lib/PDL/PP.pm"
27             pdl_error pdl_svd_redodims(pdl_trans *__privtrans) {
28             pdl_error PDL_err = {0, NULL, 0};
29             #line 30 "lib/PDL/MatrixOps-pp-svd.c"
30 23           __privtrans->ind_sizes[2] = __privtrans->ind_sizes[1] * (__privtrans->ind_sizes[0] + __privtrans->ind_sizes[1]);
31             #ifndef PDL_DECLARE_PARAMS_svd_0
32             #define PDL_DECLARE_PARAMS_svd_0(PDL_TYPE_OP,PDL_PPSYM_OP) \
33             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, a, (__privtrans->pdls[0]), 0, PDL_PPSYM_OP) \
34             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, w, (__privtrans->pdls[1]), 0, PDL_PPSYM_OP) \
35             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, u, (__privtrans->pdls[2]), 0, PDL_PPSYM_OP) \
36             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, z, (__privtrans->pdls[3]), 0, PDL_PPSYM_OP) \
37             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, v, (__privtrans->pdls[4]), 0, PDL_PPSYM_OP)
38             #endif
39             #define PDL_IF_BAD(t,f) f
40 23 50         switch (__privtrans->__datatype) { /* Start generic switch */
41 23           case PDL_D: {
42 23 100         PDL_DECLARE_PARAMS_svd_0(PDL_Double,D)
    50          
    50          
    50          
    50          
43             {
44 23 50         if (__privtrans->ind_sizes[0]<__privtrans->ind_sizes[1])
45 0           return PDL->make_error(PDL_EUSERERROR, "Error in svd:" "svd requires input ndarrays to have m >= n; you have m=%td and n=%td. Try inputting the transpose. See the docs for svd.",__privtrans->ind_sizes[0],__privtrans->ind_sizes[1]);
46             }
47 23           } break;
48 0           default: return PDL->make_error(PDL_EUSERERROR, "PP INTERNAL ERROR in svd: unhandled datatype(%d), only handles (D)! PLEASE MAKE A BUG REPORT\n", __privtrans->__datatype);
49             }
50             #undef PDL_IF_BAD
51              
52 23 50         PDL_RETERROR(PDL_err, PDL->redodims_default(__privtrans));
53 23           return PDL_err;
54             }
55              
56              
57             #line 1857 "lib/PDL/PP.pm"
58             pdl_error pdl_svd_readdata(pdl_trans *__privtrans) {
59             pdl_error PDL_err = {0, NULL, 0};
60             #line 61 "lib/PDL/MatrixOps-pp-svd.c"
61 23           register PDL_Indx __m_size = __privtrans->ind_sizes[0];
62 23           register PDL_Indx __n_size = __privtrans->ind_sizes[1];
63 23 50         if (!__privtrans->broadcast.incs) return PDL->make_error(PDL_EUSERERROR, "Error in svd:" "broadcast.incs NULL");
64             /* broadcastloop declarations */
65             int __brcloopval;
66             register PDL_Indx __tind0,__tind1; /* counters along dim */
67 23           register PDL_Indx __tnpdls = __privtrans->broadcast.npdls;
68             /* dims here are how many steps along those dims */
69 23           register PDL_Indx __tinc0_a = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,0,0);
70 23           register PDL_Indx __tinc0_w = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,1,0);
71 23           register PDL_Indx __tinc0_u = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,2,0);
72 23           register PDL_Indx __tinc0_z = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,3,0);
73 23           register PDL_Indx __tinc0_v = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,4,0);
74 23           register PDL_Indx __tinc1_a = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,0,1);
75 23           register PDL_Indx __tinc1_w = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,1,1);
76 23           register PDL_Indx __tinc1_u = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,2,1);
77 23           register PDL_Indx __tinc1_z = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,3,1);
78 23           register PDL_Indx __tinc1_v = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,4,1);
79             #define PDL_BROADCASTLOOP_START_svd_readdata PDL_BROADCASTLOOP_START( \
80             readdata, \
81             __privtrans->broadcast, \
82             __privtrans->vtable, \
83             a_datap += __offsp[0]; \
84             w_datap += __offsp[1]; \
85             u_datap += __offsp[2]; \
86             z_datap += __offsp[3]; \
87             v_datap += __offsp[4]; \
88             , \
89             ( ,a_datap += __tinc1_a - __tinc0_a * __tdims0 \
90             ,w_datap += __tinc1_w - __tinc0_w * __tdims0 \
91             ,u_datap += __tinc1_u - __tinc0_u * __tdims0 \
92             ,z_datap += __tinc1_z - __tinc0_z * __tdims0 \
93             ,v_datap += __tinc1_v - __tinc0_v * __tdims0 \
94             ), \
95             ( ,a_datap += __tinc0_a \
96             ,w_datap += __tinc0_w \
97             ,u_datap += __tinc0_u \
98             ,z_datap += __tinc0_z \
99             ,v_datap += __tinc0_v \
100             ) \
101             )
102             #define PDL_BROADCASTLOOP_END_svd_readdata PDL_BROADCASTLOOP_END( \
103             __privtrans->broadcast, \
104             a_datap -= __tinc1_a * __tdims1 + __offsp[0]; \
105             w_datap -= __tinc1_w * __tdims1 + __offsp[1]; \
106             u_datap -= __tinc1_u * __tdims1 + __offsp[2]; \
107             z_datap -= __tinc1_z * __tdims1 + __offsp[3]; \
108             v_datap -= __tinc1_v * __tdims1 + __offsp[4]; \
109             )
110 23           register PDL_Indx __inc_a_n = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,0,0)]; (void)__inc_a_n;register PDL_Indx __inc_a_m = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,0,1)]; (void)__inc_a_m;
111 23           register PDL_Indx __inc_u_n = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,2,0)]; (void)__inc_u_n;register PDL_Indx __inc_u_m = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,2,1)]; (void)__inc_u_m;
112 23           register PDL_Indx __inc_v_n0 = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,4,0)]; (void)__inc_v_n0;register PDL_Indx __inc_v_n1 = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,4,1)]; (void)__inc_v_n1;
113 23           register PDL_Indx __inc_w_wsize = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,1,0)]; (void)__inc_w_wsize;
114 23           register PDL_Indx __inc_z_n = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,3,0)]; (void)__inc_z_n;
115             #ifndef PDL_DECLARE_PARAMS_svd_1
116             #define PDL_DECLARE_PARAMS_svd_1(PDL_TYPE_OP,PDL_PPSYM_OP) \
117             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, a, (__privtrans->pdls[0]), 1, PDL_PPSYM_OP) \
118             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, w, (__privtrans->pdls[1]), 1, PDL_PPSYM_OP) \
119             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, u, (__privtrans->pdls[2]), 1, PDL_PPSYM_OP) \
120             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, z, (__privtrans->pdls[3]), 1, PDL_PPSYM_OP) \
121             PDL_DECLARE_PARAMETER(PDL_TYPE_OP, v, (__privtrans->pdls[4]), 1, PDL_PPSYM_OP)
122             #endif
123             #define PDL_IF_BAD(t,f) f
124 23 50         switch (__privtrans->__datatype) { /* Start generic switch */
125 23           case PDL_D: {
126 23 100         PDL_DECLARE_PARAMS_svd_1(PDL_Double,D)
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
127 92 50         PDL_BROADCASTLOOP_START_svd_readdata {
    50          
    50          
    50          
    50          
    100          
    100          
128             extern void SVD( double *W, double *Z, int nRow, int nCol );
129 23           double *t = w_datap;
130 2963 100         {/* Open m */ PDL_EXPAND2(register PDL_Indx m=0, __m_stop=(__m_size)); for(; m<__m_stop; m+=1) {{/* Open n */ PDL_EXPAND2(register PDL_Indx n=0, __n_stop=(__n_size)); for(; n<__n_stop; n+=1) {
    100          
131 2531           *t++ = (a_datap)[0+(__inc_a_n*(n))+(__inc_a_m*(m))];
132             }} /* Close m */}} /* Close n */
133 23           SVD(w_datap, z_datap, __privtrans->ind_sizes[0], __privtrans->ind_sizes[1]);
134 142 100         {/* Open n */ PDL_EXPAND2(register PDL_Indx n=0, __n_stop=(__n_size)); for(; n<__n_stop; n+=1) {
135 119           (z_datap)[0+(__inc_z_n*(n))] = sqrt((z_datap)[0+(__inc_z_n*(n))]);
136             }} /* Close n */
137 23           t = w_datap;
138 2963 100         {/* Open m */ PDL_EXPAND2(register PDL_Indx m=0, __m_stop=(__m_size)); for(; m<__m_stop; m+=1) {{/* Open n */ PDL_EXPAND2(register PDL_Indx n=0, __n_stop=(__n_size)); for(; n<__n_stop; n+=1) {
    100          
139 2531           (u_datap)[0+(__inc_u_n*(n))+(__inc_u_m*(m))] = *t++/(z_datap)[0+(__inc_z_n*(n))];
140             }} /* Close m */}} /* Close n */
141 1145 100         {/* Open n1 */ PDL_EXPAND2(register PDL_Indx n1=0, __n1_stop=(__n_size)); for(; n1<__n1_stop; n1+=1) {{/* Open n0 */ PDL_EXPAND2(register PDL_Indx n0=0, __n0_stop=(__n_size)); for(; n0<__n0_stop; n0+=1) {
    100          
142 1003           (v_datap)[0+(__inc_v_n0*(n0))+(__inc_v_n1*(n1))] = *t++;
143             }} /* Close n1 */}} /* Close n0 */
144 23 50         }PDL_BROADCASTLOOP_END_svd_readdata
    50          
145 23           } break;
146 0           default: return PDL->make_error(PDL_EUSERERROR, "PP INTERNAL ERROR in svd: unhandled datatype(%d), only handles (D)! PLEASE MAKE A BUG REPORT\n", __privtrans->__datatype);
147             }
148             #undef PDL_IF_BAD
149 23           return PDL_err;
150             }
151              
152             static pdl_datatypes pdl_svd_vtable_gentypes[] = { PDL_D, -1 };
153             static PDL_Indx pdl_svd_vtable_realdims[] = { 2, 1, 2, 1, 2 };
154             static char *pdl_svd_vtable_parnames[] = { "a","w","u","z","v" };
155             static short pdl_svd_vtable_parflags[] = {
156             0,
157             PDL_PARAM_ISCREAT|PDL_PARAM_ISPHYS|PDL_PARAM_ISTEMP|PDL_PARAM_ISWRITE,
158             PDL_PARAM_ISCREAT|PDL_PARAM_ISOUT|PDL_PARAM_ISWRITE,
159             PDL_PARAM_ISCREAT|PDL_PARAM_ISOUT|PDL_PARAM_ISPHYS|PDL_PARAM_ISWRITE,
160             PDL_PARAM_ISCREAT|PDL_PARAM_ISOUT|PDL_PARAM_ISWRITE
161             };
162             static pdl_datatypes pdl_svd_vtable_partypes[] = { -1, -1, -1, -1, -1 };
163             static PDL_Indx pdl_svd_vtable_realdims_starts[] = { 0, 2, 3, 5, 6 };
164             static PDL_Indx pdl_svd_vtable_realdims_ind_ids[] = { 1, 0, 2, 1, 0, 1, 1, 1 };
165             static char *pdl_svd_vtable_indnames[] = { "m","n","wsize" };
166             pdl_transvtable pdl_svd_vtable = {
167             PDL_TRANS_DO_BROADCAST|PDL_TRANS_BADIGNORE, 0, pdl_svd_vtable_gentypes, 1, 5, NULL /*CORE21*/,
168             pdl_svd_vtable_realdims, pdl_svd_vtable_parnames,
169             pdl_svd_vtable_parflags, pdl_svd_vtable_partypes,
170             pdl_svd_vtable_realdims_starts, pdl_svd_vtable_realdims_ind_ids, 8,
171             3, pdl_svd_vtable_indnames,
172             pdl_svd_redodims, pdl_svd_readdata, NULL,
173             NULL,
174             0,"PDL::MatrixOps::svd"
175             };
176              
177              
178 23           pdl_error pdl_run_svd(pdl *a,pdl *u,pdl *z,pdl *v) {
179 23           pdl_error PDL_err = {0, NULL, 0};
180 23 50         if (!PDL) return (pdl_error){PDL_EFATAL, "PDL core struct is NULL, can't continue",0};
181 23           pdl_trans *__privtrans = PDL->create_trans(&pdl_svd_vtable);
182 23 50         if (!__privtrans) return PDL->make_error_simple(PDL_EFATAL, "Couldn't create trans");
183 23           __privtrans->pdls[0] = a;
184 23           __privtrans->pdls[2] = u;
185 23           __privtrans->pdls[3] = z;
186 23           __privtrans->pdls[4] = v;
187 23 50         PDL_RETERROR(PDL_err, PDL->type_coerce(__privtrans));
188 23 50         PDL_RETERROR(PDL_err, PDL->make_trans_mutual(__privtrans));
189 23           return PDL_err;
190             }