ext/rumale/tree.c in rumale-0.22.2 vs ext/rumale/tree.c in rumale-0.22.3
- old
+ new
@@ -255,14 +255,17 @@
ndfunc_arg_out_t aout[1] = { {numo_cDFloat, 1, out_shape} };
ndfunc_t ndf = { (na_iter_func_t)iter_find_split_params_cls, NO_LOOP, 3, 1, ain, aout };
split_opts_cls opts = { StringValuePtr(criterion), NUM2LONG(n_classes), NUM2DBL(impurity) };
VALUE params = na_ndloop3(&ndf, &opts, 3, order, features, labels);
VALUE results = rb_ary_new2(4);
- rb_ary_store(results, 0, DBL2NUM(((double*)na_get_pointer_for_read(params))[0]));
- rb_ary_store(results, 1, DBL2NUM(((double*)na_get_pointer_for_read(params))[1]));
- rb_ary_store(results, 2, DBL2NUM(((double*)na_get_pointer_for_read(params))[2]));
- rb_ary_store(results, 3, DBL2NUM(((double*)na_get_pointer_for_read(params))[3]));
+ double* params_ptr = (double*)na_get_pointer_for_read(params);
+ rb_ary_store(results, 0, DBL2NUM(params_ptr[0]));
+ rb_ary_store(results, 1, DBL2NUM(params_ptr[1]));
+ rb_ary_store(results, 2, DBL2NUM(params_ptr[2]));
+ rb_ary_store(results, 3, DBL2NUM(params_ptr[3]));
+ RB_GC_GUARD(params);
+ RB_GC_GUARD(criterion);
return results;
}
/**
* @!visibility private
@@ -373,14 +376,17 @@
ndfunc_arg_out_t aout[1] = { {numo_cDFloat, 1, out_shape} };
ndfunc_t ndf = { (na_iter_func_t)iter_find_split_params_reg, NO_LOOP, 3, 1, ain, aout };
split_opts_reg opts = { StringValuePtr(criterion), NUM2DBL(impurity) };
VALUE params = na_ndloop3(&ndf, &opts, 3, order, features, targets);
VALUE results = rb_ary_new2(4);
- rb_ary_store(results, 0, DBL2NUM(((double*)na_get_pointer_for_read(params))[0]));
- rb_ary_store(results, 1, DBL2NUM(((double*)na_get_pointer_for_read(params))[1]));
- rb_ary_store(results, 2, DBL2NUM(((double*)na_get_pointer_for_read(params))[2]));
- rb_ary_store(results, 3, DBL2NUM(((double*)na_get_pointer_for_read(params))[3]));
+ double* params_ptr = (double*)na_get_pointer_for_read(params);
+ rb_ary_store(results, 0, DBL2NUM(params_ptr[0]));
+ rb_ary_store(results, 1, DBL2NUM(params_ptr[1]));
+ rb_ary_store(results, 2, DBL2NUM(params_ptr[2]));
+ rb_ary_store(results, 3, DBL2NUM(params_ptr[3]));
+ RB_GC_GUARD(params);
+ RB_GC_GUARD(criterion);
return results;
}
/**
* @!visibility private
@@ -462,12 +468,14 @@
ndfunc_arg_out_t aout[1] = { {numo_cDFloat, 1, out_shape} };
ndfunc_t ndf = { (na_iter_func_t)iter_find_split_params_grad_reg, NO_LOOP, 4, 1, ain, aout };
double opts[3] = { NUM2DBL(sum_gradient), NUM2DBL(sum_hessian), NUM2DBL(reg_lambda) };
VALUE params = na_ndloop3(&ndf, opts, 4, order, features, gradients, hessians);
VALUE results = rb_ary_new2(2);
- rb_ary_store(results, 0, DBL2NUM(((double*)na_get_pointer_for_read(params))[0]));
- rb_ary_store(results, 1, DBL2NUM(((double*)na_get_pointer_for_read(params))[1]));
+ double* params_ptr = (double*)na_get_pointer_for_read(params);
+ rb_ary_store(results, 0, DBL2NUM(params_ptr[0]));
+ rb_ary_store(results, 1, DBL2NUM(params_ptr[1]));
+ RB_GC_GUARD(params);
return results;
}
/**
* @!visibility private
@@ -495,10 +503,13 @@
ret = DBL2NUM(calc_impurity_cls(StringValuePtr(criterion), histogram, n_elements, n_classes));
xfree(histogram);
+ RB_GC_GUARD(y_nary);
+ RB_GC_GUARD(criterion);
+
return ret;
}
/**
* @!visibility private
@@ -528,9 +539,11 @@
}
ret = DBL2NUM(calc_impurity_reg(StringValuePtr(criterion), target_vecs, sum_vec));
xfree(sum_vec);
+
+ RB_GC_GUARD(criterion);
return ret;
}
void init_tree_module()