45 #include "RTOp_obj_null_vtbl.h"
51 struct RTOp_TOp_set_sub_vector_state_t {
56 static int get_op_type_num_entries(
64 const struct RTOp_TOp_set_sub_vector_state_t *state = NULL;
67 assert( num_indexes );
71 state = (
const struct RTOp_TOp_set_sub_vector_state_t*)obj_data;
72 *num_values = state->sub_vec.sub_nz;
75 + (state->sub_vec.indices ? state->sub_vec.sub_nz : 0 );
82 , RTOp_ReductTarget* obj )
84 struct RTOp_TOp_set_sub_vector_state_t *state = NULL;
85 *obj = malloc(
sizeof(
struct RTOp_TOp_set_sub_vector_state_t));
86 state = (
struct RTOp_TOp_set_sub_vector_state_t*)*obj;
87 RTOp_sparse_sub_vector_null( &state->sub_vec );
96 struct RTOp_TOp_set_sub_vector_state_t *state = NULL;
100 state = (
struct RTOp_TOp_set_sub_vector_state_t*)*obj_data;
101 if( state->owns_mem ) {
102 free( (
void*)state->sub_vec.values );
103 free( (
void*)state->sub_vec.indices );
110 static int extract_op_state(
115 ,RTOp_value_type value_data[]
117 ,RTOp_index_type index_data[]
119 ,RTOp_char_type char_data[]
122 const struct RTOp_TOp_set_sub_vector_state_t *state = NULL;
123 register RTOp_index_type k, j;
127 state = (
const struct RTOp_TOp_set_sub_vector_state_t*)obj_data;
129 assert( num_values == state->sub_vec.sub_nz );
130 assert( num_indexes == 8 + (state->sub_vec.indices ? state->sub_vec.sub_nz : 0 ) );
131 assert( num_chars == 0 );
132 assert( value_data );
133 assert( index_data );
135 for( k = 0; k < state->sub_vec.sub_nz; ++k )
136 value_data[k] = state->sub_vec.values[k];
137 index_data[k=0] = state->sub_vec.global_offset;
138 index_data[++k] = state->sub_vec.sub_dim;
139 index_data[++k] = state->sub_vec.sub_nz;
140 index_data[++k] = state->sub_vec.values_stride;
141 index_data[++k] = state->sub_vec.indices_stride;
142 index_data[++k] = state->sub_vec.local_offset;
143 index_data[++k] = state->sub_vec.is_sorted;
144 index_data[++k] = state->owns_mem;
145 if( state->sub_vec.indices ) {
146 for( j = 0; j < state->sub_vec.sub_nz; ++j )
147 index_data[++k] = state->sub_vec.indices[j];
152 static int load_op_state(
156 ,
const RTOp_value_type value_data[]
158 ,
const RTOp_index_type index_data[]
160 ,
const RTOp_char_type char_data[]
164 struct RTOp_TOp_set_sub_vector_state_t *state = NULL;
165 register RTOp_index_type k, j;
166 RTOp_value_type *values = NULL;
168 if( *obj_data == NULL ) {
169 *obj_data = (
void*)malloc(
sizeof(
struct RTOp_TOp_set_sub_vector_state_t));
170 state = (
struct RTOp_TOp_set_sub_vector_state_t*)*obj_data;
171 RTOp_sparse_sub_vector_null( &state->sub_vec );
178 state = (
struct RTOp_TOp_set_sub_vector_state_t*)*obj_data;
180 if( num_indexes > 8 ) assert( num_values == num_indexes - 8 );
183 if( num_values != state->sub_vec.sub_nz || !state->owns_mem ) {
185 if( state->owns_mem ) {
186 free( (RTOp_value_type*)state->sub_vec.values );
187 free( (RTOp_index_type*)state->sub_vec.indices );
190 state->sub_vec.values = (RTOp_value_type*)malloc(num_values*
sizeof(RTOp_value_type));
191 if( num_indexes > 8 )
192 state->sub_vec.indices = (RTOp_index_type*)malloc(num_values*
sizeof(RTOp_index_type));
197 assert( num_chars == 0 );
198 assert( value_data );
199 assert( index_data );
201 for( values = (RTOp_value_type*)state->sub_vec.values, k = 0; k < num_values; ++k )
202 *values++ = value_data[k];
203 state->sub_vec.global_offset = index_data[k=0];
204 state->sub_vec.sub_dim = index_data[++k];
205 state->sub_vec.sub_nz = index_data[++k];
206 state->sub_vec.values_stride = index_data[++k];
207 state->sub_vec.indices_stride = index_data[++k];
208 state->sub_vec.local_offset = index_data[++k];
209 state->sub_vec.is_sorted = index_data[++k];
210 state->owns_mem = index_data[++k];
211 if( num_indexes > 8 ) {
212 for( j = 0; j < num_values; ++j )
213 ((RTOp_index_type*)state->sub_vec.indices)[j] = index_data[++k];
220 get_op_type_num_entries
230 static int RTOp_TOp_set_sub_vector_apply_op(
234 , RTOp_ReductTarget targ_obj )
236 const struct RTOp_TOp_set_sub_vector_state_t *state = NULL;
237 RTOp_index_type v_global_offset;
238 RTOp_index_type v_sub_dim;
239 RTOp_index_type v_sub_nz;
240 const RTOp_value_type *v_val;
242 const RTOp_index_type *v_ind;
246 RTOp_index_type z_global_offset;
247 RTOp_index_type z_sub_dim;
248 RTOp_value_type *z_val;
250 register RTOp_index_type k, i;
251 RTOp_index_type num_overlap;
257 return RTOp_ERR_INVALID_NUM_VECS;
258 if( num_targ_vecs != 1 )
259 return RTOp_ERR_INVALID_NUM_TARG_VECS;
261 assert(targ_obj == RTOp_REDUCT_OBJ_NULL);
269 state = (
const struct RTOp_TOp_set_sub_vector_state_t*)obj_data;
272 v_global_offset = state->sub_vec.global_offset;
273 v_sub_dim = state->sub_vec.sub_dim;
274 v_sub_nz = state->sub_vec.sub_nz;
275 v_val = state->sub_vec.values;
276 v_val_s = state->sub_vec.values_stride;
277 v_ind = state->sub_vec.indices;
278 v_ind_s = state->sub_vec.indices_stride;
279 v_l_off = state->sub_vec.local_offset;
280 v_sorted = state->sub_vec.is_sorted;
283 z_global_offset = targ_vecs[0].global_offset;
284 z_sub_dim = targ_vecs[0].sub_dim;
285 z_val = targ_vecs[0].values;
286 z_val_s = targ_vecs[0].values_stride;
292 if( v_global_offset + v_sub_dim < z_global_offset + 1
293 || z_global_offset + z_sub_dim < v_global_offset + 1 )
300 if( v_global_offset <= z_global_offset ) {
301 if( v_global_offset + v_sub_dim >= z_global_offset + z_sub_dim )
302 num_overlap = z_sub_dim;
304 num_overlap = (v_global_offset + v_sub_dim) - z_global_offset;
307 if( z_global_offset + z_sub_dim >= v_global_offset + v_sub_dim )
308 num_overlap = v_sub_dim;
310 num_overlap = (z_global_offset + z_sub_dim) - v_global_offset;
314 if( v_ind != NULL ) {
317 if( v_global_offset >= z_global_offset )
318 z_val += (v_global_offset - z_global_offset) * z_val_s;
319 for( k = 0; k < num_overlap; ++k, z_val += z_val_s )
322 z_val = targ_vecs[0].values;
323 for( k = 0; k < v_sub_nz; ++k, v_val += v_val_s, v_ind += v_ind_s ) {
324 i = v_global_offset + v_l_off + (*v_ind);
325 if( z_global_offset < i && i <= z_global_offset + z_sub_dim )
326 z_val[ z_val_s * (i - z_global_offset - 1) ] = *v_val;
333 if( v_global_offset <= z_global_offset )
334 v_val += (z_global_offset - v_global_offset) * v_val_s;
336 z_val += (v_global_offset - z_global_offset) * z_val_s;
337 for( k = 0; k < num_overlap; ++k, v_val += v_val_s, z_val += z_val_s )
350 ,
"RTOp_TOp_set_sub_vector"
352 ,RTOp_TOp_set_sub_vector_apply_op
364 op->vtbl = &RTOp_TOp_set_sub_vector_vtbl;
365 op->vtbl->obj_data_vtbl->
obj_create(NULL,NULL,&op->obj_data);
372 struct RTOp_TOp_set_sub_vector_state_t *state = NULL;
374 assert( op->obj_data );
376 state = (
struct RTOp_TOp_set_sub_vector_state_t*)op->obj_data;
377 if( state->owns_mem ) {
378 free( (
void*)state->sub_vec.values );
379 free( (
void*)state->sub_vec.indices );
381 state->sub_vec = *sub_vec;
388 op_free(NULL,NULL,&op->obj_data);
int(* obj_create)(const struct RTOp_obj_type_vtbl_t *vtbl, const void *instance_data, void **obj)
int RTOp_TOp_set_sub_vector_destroy(struct RTOp_RTOp *op)
int RTOp_TOp_set_sub_vector_set_sub_vec(const struct RTOp_SparseSubVector *sub_vec, struct RTOp_RTOp *op)
int RTOp_TOp_set_sub_vector_construct(const struct RTOp_SparseSubVector *sub_vec, struct RTOp_RTOp *op)