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()