1 /* Apache 2.0 INS-AMU 2015 */
3 #include <string.h> /* memcpy */
9 int n
, m
, nnz
, *M
, *Ms
, *Me
, ns
, ne
, *Or
, *Ic
;
10 double *w
, *d
, * restrict cn
;
13 /* flag for init1 use */
17 sk_net_data
*sk_net_alloc() {
18 return sk_malloc (sizeof(sk_net_data
));
24 double *xi
, *fi
, *gi
, *ci
;
25 sk_net_data
*d
= data
;
27 /* unused arguments */
28 (void) nx
; (void) Jf
; (void) Jg
; (void) Jce
; (void) nc
;
32 * solver deals with c following Ic,d, but here we wanted ce
34 for (l
=0; l
<d
->ne
; l
++)
35 for (d
->cn
[l
]=0.0, j
=d
->Or
[l
]; j
<d
->Or
[l
+1]; j
++)
36 /* c is len(ui), not ne! Ic[j] can't index it directly */
37 d
->cn
[l
] += c
[sk_hist_get_vi2i(hist
, d
->Ic
[j
])] * d
->w
[j
];
39 /* evaluate system(s) */
41 for (l
=0, xi
=x
, fi
=f
, gi
=g
, ci
=d
->cn
; l
<d
->n
; l
++,
42 xi
+=d
->Ms
[mi
], fi
+=d
->Ms
[mi
], gi
+=d
->Ms
[mi
], ci
+=d
->Me
[mi
])
45 (*(d
->models
[mi
]))(d
->models_data
[mi
], hist
, t
, i
,
46 d
->Ms
[mi
], xi
, fi
, gi
, NULL
, NULL
,
50 /* TODO evaluate & compute Jf/Jg/Jc
51 * in net, we expect sys to evaluate only its own Jf/Jg, not whole.
52 * we are responsible for Jf/Jg ? or need Jc? Jca, Jce?
54 * Jf/Jg include ca, i.e. [ df0/dx0 df0/dx1 .. df0/dca0 .. ]
56 * may need Jc [ dce0/dx0 .. dce0/dca0 .. ]
58 * system defines Jf/Jg as block, we handle full network Jf/Jg
59 * which may be sparse if have large network.
61 * assume sparse J by default: for small systems, penalty is small
62 * for large systems, need sparse; overall complexity is reduced.
67 * solver deals with c following Ic,d, but here we wanted ce
68 * so we need to pack our cn into c.
70 for (l
=0; l
<d
->nnz
; l
++)
71 c
[l
] = d
->cn
[d
->Ic
[l
]];
75 struct sk_net_regmap_data
{
76 int i
, *n
; /* n=1 for sum instead of averaging */
79 SK_DEFSYS(sk_net_regmap
)
82 sk_net_regmap_data
*d
= data
;
83 /* unused arguments */
84 (void) nx
;(void) t
; (void) Jf
; (void) Jg
; (void) Jce
; (void) hist
; (void) i
;
90 c
[0] = x
[0] / d
->n
[d
->i
];
94 int sk_net_init1(sk_net_data
*net
, int n
, sk_sys sys
, void *data
,
95 int ns
, int ne
, int nnz
, int *Or
, int *Ic
, double *w
, double *d
)
100 M
= sk_malloc (sizeof(int) * n
);
101 Ms
= sk_malloc (sizeof(int));
102 Me
= sk_malloc (sizeof(int));
103 models
= sk_malloc (sizeof(sk_sys
));
104 model_data
= sk_malloc (sizeof(void*));
110 model_data
[0] = data
;
111 sk_net_initn(net
, n
, 1, M
, Ms
, Me
, models
, model_data
, nnz
, Or
, Ic
, w
, d
);
116 void sk_net_free(sk_net_data
*net
)
122 sk_free(net
->models
);
123 sk_free((void*) net
->models_data
);
130 int sk_net_initn(sk_net_data
*net
, int n
, int m
,
131 int *M
, int *Ms
, int *Me
, sk_sys
*models
, void **models_data
,
132 int nnz
, int *Or
, int *Ic
, double *w
, double *d
)
141 net
->models
= models
;
142 net
->models_data
= models_data
;
144 net
->Ic
= Ic
; /* TODO ? same as Ie ? */
147 /* intialize based on passed attributes: Ie, cne, cna */
150 for (i
=0; i
<n
; i
++) {
151 net
->ns
+= net
->Ms
[net
->M
[i
]];
152 net
->ne
+= net
->Me
[net
->M
[i
]];
154 net
->cn
= sk_malloc (sizeof(double) * net
->ne
);
159 int sk_net_get_n(sk_net_data
*net
) {
163 int sk_net_get_m(sk_net_data
*net
) {
167 int sk_net_get_nnz(sk_net_data
*net
) {
171 int *sk_net_get_or(sk_net_data
*net
) {
175 int sk_net_get_or_i(sk_net_data
*net
, int i
) {
179 int *sk_net_get_ic(sk_net_data
*net
) {
183 int sk_net_get_ic_i(sk_net_data
*net
, int i
) {
187 double *sk_net_get_w(sk_net_data
*net
) {
191 double sk_net_get_w_i(sk_net_data
*net
, int i
) {
195 double *sk_net_get_d(sk_net_data
*net
) {
199 double sk_net_get_d_i(sk_net_data
*net
, int i
) {
203 int sk_net_get_ns(sk_net_data
*net
) {
207 int sk_net_get_ne(sk_net_data
*net
) {
211 int sk_net_cn_is_null(sk_net_data
*net
) {
212 return net
->cn
== NULL
;
215 int sk_net_get_Ms_i(sk_net_data
*net
, int i
) {
219 int sk_net_get_Me_i(sk_net_data
*net
, int i
) {
223 int sk_net_get_M_i(sk_net_data
*net
, int i
) {
227 sk_sys
sk_net_get_models_i(sk_net_data
*net
, int i
) {
228 return net
->models
[i
];
231 void *sk_net_get_models_data_i(sk_net_data
*net
, int i
) {
232 return net
->models_data
[i
];
235 int sk_net_get__init1(sk_net_data
*net
) {