File Coverage

lib/PDL/Stats/Kmeans-pp-assign.c
Criterion Covered Total %
statement 75 127 59.0
branch 87 264 32.9
condition n/a
subroutine n/a
pod n/a
total 162 391 41.4


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/Stats/Kmeans.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_Stats_Kmeans
21             extern Core* PDL; /* Structure hold core C functions */
22             #line 23 "lib/PDL/Stats/Kmeans-pp-assign.c"
23              
24             #include
25             #include
26             #include
27              
28              
29             #line 1857 "lib/PDL/PP.pm"
30             pdl_error pdl_assign_readdata(pdl_trans *__privtrans) {
31             pdl_error PDL_err = {0, NULL, 0};
32             #line 33 "lib/PDL/Stats/Kmeans-pp-assign.c"
33 17           register PDL_Indx __c_size = __privtrans->ind_sizes[0];
34 17           register PDL_Indx __o_size = __privtrans->ind_sizes[1];
35 17           register PDL_Indx __v_size = __privtrans->ind_sizes[2];
36 17 50         if (!__privtrans->broadcast.incs) return PDL->make_error(PDL_EUSERERROR, "Error in assign:" "broadcast.incs NULL");
37             /* broadcastloop declarations */
38             int __brcloopval;
39             register PDL_Indx __tind0,__tind1; /* counters along dim */
40 17           register PDL_Indx __tnpdls = __privtrans->broadcast.npdls;
41             /* dims here are how many steps along those dims */
42 17           register PDL_Indx __tinc0_data = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,0,0);
43 17           register PDL_Indx __tinc0_centroid = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,1,0);
44 17           register PDL_Indx __tinc0_cluster = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,2,0);
45 17           register PDL_Indx __tinc1_data = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,0,1);
46 17           register PDL_Indx __tinc1_centroid = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,1,1);
47 17           register PDL_Indx __tinc1_cluster = PDL_BRC_INC(__privtrans->broadcast.incs,__tnpdls,2,1);
48             #define PDL_BROADCASTLOOP_START_assign_readdata PDL_BROADCASTLOOP_START( \
49             readdata, \
50             __privtrans->broadcast, \
51             __privtrans->vtable, \
52             data_datap += __offsp[0]; \
53             centroid_datap += __offsp[1]; \
54             cluster_datap += __offsp[2]; \
55             , \
56             ( ,data_datap += __tinc1_data - __tinc0_data * __tdims0 \
57             ,centroid_datap += __tinc1_centroid - __tinc0_centroid * __tdims0 \
58             ,cluster_datap += __tinc1_cluster - __tinc0_cluster * __tdims0 \
59             ), \
60             ( ,data_datap += __tinc0_data \
61             ,centroid_datap += __tinc0_centroid \
62             ,cluster_datap += __tinc0_cluster \
63             ) \
64             )
65             #define PDL_BROADCASTLOOP_END_assign_readdata PDL_BROADCASTLOOP_END( \
66             __privtrans->broadcast, \
67             data_datap -= __tinc1_data * __tdims1 + __offsp[0]; \
68             centroid_datap -= __tinc1_centroid * __tdims1 + __offsp[1]; \
69             cluster_datap -= __tinc1_cluster * __tdims1 + __offsp[2]; \
70             )
71 17           register PDL_Indx __inc_centroid_c = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,1,0)]; (void)__inc_centroid_c;register PDL_Indx __inc_centroid_v = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,1,1)]; (void)__inc_centroid_v;
72 17           register PDL_Indx __inc_cluster_o = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,2,0)]; (void)__inc_cluster_o;register PDL_Indx __inc_cluster_c = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,2,1)]; (void)__inc_cluster_c;
73 17           register PDL_Indx __inc_data_o = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,0,0)]; (void)__inc_data_o;register PDL_Indx __inc_data_v = __privtrans->inc_sizes[PDL_INC_ID(__privtrans->vtable,0,1)]; (void)__inc_data_v;
74             #ifndef PDL_DECLARE_PARAMS_assign_1
75             #define PDL_DECLARE_PARAMS_assign_1(PDL_TYPE_OP,PDL_PPSYM_OP,PDL_TYPE_PARAM_cluster,PDL_PPSYM_PARAM_cluster) \
76             PDL_DECLARE_PARAMETER_BADVAL(PDL_TYPE_OP, data, (__privtrans->pdls[0]), 1, PDL_PPSYM_OP) \
77             PDL_DECLARE_PARAMETER_BADVAL(PDL_TYPE_OP, centroid, (__privtrans->pdls[1]), 1, PDL_PPSYM_OP) \
78             PDL_DECLARE_PARAMETER_BADVAL(PDL_TYPE_PARAM_cluster, cluster, (__privtrans->pdls[2]), 1, PDL_PPSYM_PARAM_cluster)
79             #endif
80 17 100         if ( __privtrans->bvalflag ) { /* ** do 'bad' Code ** */
81             #define PDL_BAD_CODE
82             #define PDL_IF_BAD(t,f) t
83 7           switch (__privtrans->__datatype) { /* Start generic switch */
84 0           case PDL_F: {
85 0 0         PDL_DECLARE_PARAMS_assign_1(PDL_Float,F,PDL_Short,S)
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
86 0 0         PDL_BROADCASTLOOP_START_assign_readdata {
    0          
    0          
    0          
    0          
    0          
    0          
87 0           PDL_Indx cl = 0;
88 0 0         {/* Open o */ PDL_EXPAND2(register PDL_Indx o=0, __o_stop=(__o_size)); for(; o<__o_stop; o+=1) {
89 0           PDL_Float ssmin = -1;
90 0 0         {/* Open c */ PDL_EXPAND2(register PDL_Indx c=0, __c_stop=(__c_size)); for(; c<__c_stop; c+=1) {
91 0           PDL_Float ssc = 0;
92 0           PDL_Indx nvc = 0;
93 0 0         {/* Open v */ PDL_EXPAND2(register PDL_Indx v=0, __v_stop=(__v_size)); for(; v<__v_stop; v+=1) {
94 0 0         PDL_IF_BAD(if (PDL_ISBAD2((data_datap)[0+(__inc_data_o*(o))+(__inc_data_v*(v))],data_badval,F,data_badval_isnan) || PDL_ISBAD2((centroid_datap)[0+(__inc_centroid_c*(c))+(__inc_centroid_v*(v))],centroid_badval,F,centroid_badval_isnan)) continue;,)
    0          
    0          
    0          
    0          
    0          
95 0           PDL_Float diff = (data_datap)[0+(__inc_data_o*(o))+(__inc_data_v*(v))] - (centroid_datap)[0+(__inc_centroid_c*(c))+(__inc_centroid_v*(v))];
96 0           ssc += diff*diff;
97 0           nvc ++;
98             }} /* Close v */
99 0 0         if (nvc) {
100 0           ssc /= nvc;
101             }
102             else {
103             /* taking advantage of the fact that 1st valid ssmin takes precedence */
104             /* so ssc has no effect if there is already ssmin. or it is -1 */
105 0           ssc = ssmin;
106             }
107             /* notice that if multiple ssc == ssmin the 1st is taken as cluster */
108 0 0         if (ssmin < 0 || ssmin > ssc) {
    0          
109 0           cl = c;
110 0           ssmin = ssc;
111             }
112             }} /* Close c */
113 0 0         {/* Open c */ PDL_EXPAND2(register PDL_Indx c=0, __c_stop=(__c_size)); for(; c<__c_stop; c+=1) {
114 0 0         PDL_IF_BAD(if (ssmin < 0) { (cluster_datap)[0+(__inc_cluster_o*(o))+(__inc_cluster_c*(c))]=cluster_badval; continue; },)
115 0           (cluster_datap)[0+(__inc_cluster_o*(o))+(__inc_cluster_c*(c))] = (c == cl)? 1 : 0;
116             }} /* Close c */
117             }} /* Close o */
118 0 0         }PDL_BROADCASTLOOP_END_assign_readdata
    0          
119 0           } break;
120 7           case PDL_D: {
121 7 50         PDL_DECLARE_PARAMS_assign_1(PDL_Double,D,PDL_Short,S)
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
122 229 50         PDL_BROADCASTLOOP_START_assign_readdata {
    50          
    50          
    50          
    50          
    100          
    100          
123 151           PDL_Indx cl = 0;
124 1206 100         {/* Open o */ PDL_EXPAND2(register PDL_Indx o=0, __o_stop=(__o_size)); for(; o<__o_stop; o+=1) {
125 1055           PDL_Double ssmin = -1;
126 3165 100         {/* Open c */ PDL_EXPAND2(register PDL_Indx c=0, __c_stop=(__c_size)); for(; c<__c_stop; c+=1) {
127 2110           PDL_Double ssc = 0;
128 2110           PDL_Indx nvc = 0;
129 8440 100         {/* Open v */ PDL_EXPAND2(register PDL_Indx v=0, __v_stop=(__v_size)); for(; v<__v_stop; v+=1) {
130 6330 50         PDL_IF_BAD(if (PDL_ISBAD2((data_datap)[0+(__inc_data_o*(o))+(__inc_data_v*(v))],data_badval,D,data_badval_isnan) || PDL_ISBAD2((centroid_datap)[0+(__inc_centroid_c*(c))+(__inc_centroid_v*(v))],centroid_badval,D,centroid_badval_isnan)) continue;,)
    0          
    100          
    50          
    0          
    50          
131 6146           PDL_Double diff = (data_datap)[0+(__inc_data_o*(o))+(__inc_data_v*(v))] - (centroid_datap)[0+(__inc_centroid_c*(c))+(__inc_centroid_v*(v))];
132 6146           ssc += diff*diff;
133 6146           nvc ++;
134             }} /* Close v */
135 2110 50         if (nvc) {
136 2110           ssc /= nvc;
137             }
138             else {
139             /* taking advantage of the fact that 1st valid ssmin takes precedence */
140             /* so ssc has no effect if there is already ssmin. or it is -1 */
141 0           ssc = ssmin;
142             }
143             /* notice that if multiple ssc == ssmin the 1st is taken as cluster */
144 2110 100         if (ssmin < 0 || ssmin > ssc) {
    100          
145 1603           cl = c;
146 1603           ssmin = ssc;
147             }
148             }} /* Close c */
149 3165 100         {/* Open c */ PDL_EXPAND2(register PDL_Indx c=0, __c_stop=(__c_size)); for(; c<__c_stop; c+=1) {
150 2110 50         PDL_IF_BAD(if (ssmin < 0) { (cluster_datap)[0+(__inc_cluster_o*(o))+(__inc_cluster_c*(c))]=cluster_badval; continue; },)
151 2110           (cluster_datap)[0+(__inc_cluster_o*(o))+(__inc_cluster_c*(c))] = (c == cl)? 1 : 0;
152             }} /* Close c */
153             }} /* Close o */
154 7 50         }PDL_BROADCASTLOOP_END_assign_readdata
    50          
155 7           } break;
156 0           default: return PDL->make_error(PDL_EUSERERROR, "PP INTERNAL ERROR in assign: unhandled datatype(%d), only handles (FD)! PLEASE MAKE A BUG REPORT\n", __privtrans->__datatype);
157             }
158             #undef PDL_BAD_CODE
159             #undef PDL_IF_BAD
160             } else { /* ** else do 'good' Code ** */
161             #define PDL_IF_BAD(t,f) f
162 10           switch (__privtrans->__datatype) { /* Start generic switch */
163 0           case PDL_F: {
164 0 0         PDL_DECLARE_PARAMS_assign_1(PDL_Float,F,PDL_Short,S)
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
165 0 0         PDL_BROADCASTLOOP_START_assign_readdata {
    0          
    0          
    0          
    0          
    0          
    0          
166 0           PDL_Indx cl = 0;
167 0 0         {/* Open o */ PDL_EXPAND2(register PDL_Indx o=0, __o_stop=(__o_size)); for(; o<__o_stop; o+=1) {
168 0           PDL_Float ssmin = -1;
169 0 0         {/* Open c */ PDL_EXPAND2(register PDL_Indx c=0, __c_stop=(__c_size)); for(; c<__c_stop; c+=1) {
170 0           PDL_Float ssc = 0;
171 0           PDL_Indx nvc = 0;
172 0 0         {/* Open v */ PDL_EXPAND2(register PDL_Indx v=0, __v_stop=(__v_size)); for(; v<__v_stop; v+=1) {
173             PDL_IF_BAD(if (PDL_ISBAD2((data_datap)[0+(__inc_data_o*(o))+(__inc_data_v*(v))],data_badval,F,data_badval_isnan) || PDL_ISBAD2((centroid_datap)[0+(__inc_centroid_c*(c))+(__inc_centroid_v*(v))],centroid_badval,F,centroid_badval_isnan)) continue;,)
174 0           PDL_Float diff = (data_datap)[0+(__inc_data_o*(o))+(__inc_data_v*(v))] - (centroid_datap)[0+(__inc_centroid_c*(c))+(__inc_centroid_v*(v))];
175 0           ssc += diff*diff;
176 0           nvc ++;
177             }} /* Close v */
178 0 0         if (nvc) {
179 0           ssc /= nvc;
180             }
181             else {
182             /* taking advantage of the fact that 1st valid ssmin takes precedence */
183             /* so ssc has no effect if there is already ssmin. or it is -1 */
184 0           ssc = ssmin;
185             }
186             /* notice that if multiple ssc == ssmin the 1st is taken as cluster */
187 0 0         if (ssmin < 0 || ssmin > ssc) {
    0          
188 0           cl = c;
189 0           ssmin = ssc;
190             }
191             }} /* Close c */
192 0 0         {/* Open c */ PDL_EXPAND2(register PDL_Indx c=0, __c_stop=(__c_size)); for(; c<__c_stop; c+=1) {
193             PDL_IF_BAD(if (ssmin < 0) { (cluster_datap)[0+(__inc_cluster_o*(o))+(__inc_cluster_c*(c))]=cluster_badval; continue; },)
194 0           (cluster_datap)[0+(__inc_cluster_o*(o))+(__inc_cluster_c*(c))] = (c == cl)? 1 : 0;
195             }} /* Close c */
196             }} /* Close o */
197 0 0         }PDL_BROADCASTLOOP_END_assign_readdata
    0          
198 0           } break;
199 10           case PDL_D: {
200 10 50         PDL_DECLARE_PARAMS_assign_1(PDL_Double,D,PDL_Short,S)
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
201 490 50         PDL_BROADCASTLOOP_START_assign_readdata {
    50          
    50          
    50          
    50          
    100          
    100          
202 283           PDL_Indx cl = 0;
203 2261 100         {/* Open o */ PDL_EXPAND2(register PDL_Indx o=0, __o_stop=(__o_size)); for(; o<__o_stop; o+=1) {
204 1978           PDL_Double ssmin = -1;
205 5934 100         {/* Open c */ PDL_EXPAND2(register PDL_Indx c=0, __c_stop=(__c_size)); for(; c<__c_stop; c+=1) {
206 3956           PDL_Double ssc = 0;
207 3956           PDL_Indx nvc = 0;
208 15824 100         {/* Open v */ PDL_EXPAND2(register PDL_Indx v=0, __v_stop=(__v_size)); for(; v<__v_stop; v+=1) {
209             PDL_IF_BAD(if (PDL_ISBAD2((data_datap)[0+(__inc_data_o*(o))+(__inc_data_v*(v))],data_badval,D,data_badval_isnan) || PDL_ISBAD2((centroid_datap)[0+(__inc_centroid_c*(c))+(__inc_centroid_v*(v))],centroid_badval,D,centroid_badval_isnan)) continue;,)
210 11868           PDL_Double diff = (data_datap)[0+(__inc_data_o*(o))+(__inc_data_v*(v))] - (centroid_datap)[0+(__inc_centroid_c*(c))+(__inc_centroid_v*(v))];
211 11868           ssc += diff*diff;
212 11868           nvc ++;
213             }} /* Close v */
214 3956 50         if (nvc) {
215 3956           ssc /= nvc;
216             }
217             else {
218             /* taking advantage of the fact that 1st valid ssmin takes precedence */
219             /* so ssc has no effect if there is already ssmin. or it is -1 */
220 0           ssc = ssmin;
221             }
222             /* notice that if multiple ssc == ssmin the 1st is taken as cluster */
223 3956 100         if (ssmin < 0 || ssmin > ssc) {
    100          
224 2967           cl = c;
225 2967           ssmin = ssc;
226             }
227             }} /* Close c */
228 5934 100         {/* Open c */ PDL_EXPAND2(register PDL_Indx c=0, __c_stop=(__c_size)); for(; c<__c_stop; c+=1) {
229             PDL_IF_BAD(if (ssmin < 0) { (cluster_datap)[0+(__inc_cluster_o*(o))+(__inc_cluster_c*(c))]=cluster_badval; continue; },)
230 3956           (cluster_datap)[0+(__inc_cluster_o*(o))+(__inc_cluster_c*(c))] = (c == cl)? 1 : 0;
231             }} /* Close c */
232             }} /* Close o */
233 67 50         }PDL_BROADCASTLOOP_END_assign_readdata
    100          
234 10           } break;
235 0           default: return PDL->make_error(PDL_EUSERERROR, "PP INTERNAL ERROR in assign: unhandled datatype(%d), only handles (FD)! PLEASE MAKE A BUG REPORT\n", __privtrans->__datatype);
236             }
237             #undef PDL_IF_BAD
238             }
239 17           return PDL_err;
240             }
241              
242             static pdl_datatypes pdl_assign_vtable_gentypes[] = { PDL_F, PDL_D, -1 };
243             static PDL_Indx pdl_assign_vtable_realdims[] = { 2, 2, 2 };
244             static char *pdl_assign_vtable_parnames[] = { "data","centroid","cluster" };
245             static short pdl_assign_vtable_parflags[] = {
246             0,
247             0,
248             PDL_PARAM_ISCREAT|PDL_PARAM_ISOUT|PDL_PARAM_ISTYPED|PDL_PARAM_ISWRITE
249             };
250             static pdl_datatypes pdl_assign_vtable_partypes[] = { -1, -1, PDL_S };
251             static PDL_Indx pdl_assign_vtable_realdims_starts[] = { 0, 2, 4 };
252             static PDL_Indx pdl_assign_vtable_realdims_ind_ids[] = { 1, 2, 0, 2, 1, 0 };
253             static char *pdl_assign_vtable_indnames[] = { "c","o","v" };
254             pdl_transvtable pdl_assign_vtable = {
255             PDL_TRANS_DO_BROADCAST|PDL_TRANS_BADPROCESS, 0, pdl_assign_vtable_gentypes, 2, 3, NULL /*CORE21*/,
256             pdl_assign_vtable_realdims, pdl_assign_vtable_parnames,
257             pdl_assign_vtable_parflags, pdl_assign_vtable_partypes,
258             pdl_assign_vtable_realdims_starts, pdl_assign_vtable_realdims_ind_ids, 6,
259             3, pdl_assign_vtable_indnames,
260             NULL, pdl_assign_readdata, NULL,
261             NULL,
262             0,"PDL::Stats::Kmeans::assign"
263             };
264              
265              
266 17           pdl_error pdl_run_assign(pdl *data,pdl *centroid,pdl *cluster) {
267 17           pdl_error PDL_err = {0, NULL, 0};
268 17 50         if (!PDL) return (pdl_error){PDL_EFATAL, "PDL core struct is NULL, can't continue",0};
269 17           pdl_trans *__privtrans = PDL->create_trans(&pdl_assign_vtable);
270 17 50         if (!__privtrans) return PDL->make_error_simple(PDL_EFATAL, "Couldn't create trans");
271 17           __privtrans->pdls[0] = data;
272 17           __privtrans->pdls[1] = centroid;
273 17           __privtrans->pdls[2] = cluster;
274 17 50         PDL_RETERROR(PDL_err, PDL->type_coerce(__privtrans));
275 17 50         PDL_RETERROR(PDL_err, PDL->make_trans_mutual(__privtrans));
276 17           return PDL_err;
277             }