# Copyright (c) 2024 Yuki Kimoto
# MIT License
class R::NDArray::Float extends R::NDArray {
# Fields
method data : float[] () {
return (float[])$self->{data};
}
# Class Mehtods
static method new : R::NDArray::Float ($options : object[] = undef) {
my $self = new R::NDArray::Float;
$self->init($options);
return $self;
}
# Instance Methods
method create_default_data : float[] ($length : int = 0) {
unless ($length >= 0) {
die "The length \$length must be more than or equal to 0.";
}
my $data = new float[$length];
return $data;
}
method elem_to_string : string ($data : float[], $data_index : int) {
my $string = (string)$data->[$data_index];
return $string;
}
method elem_assign : void ($dist_data : float[], $dist_data_index : int, $src_data : float[], $src_data_index : int) {
$dist_data->[$dist_data_index] = $src_data->[$src_data_index];
}
method elem_clone : void ($dist_data : float[], $dist_data_index : int, $src_data : float[], $src_data_index : int) {
$dist_data->[$dist_data_index] = $src_data->[$src_data_index];
}
method elem_cmp : int ($a_data : float[], $a_data_index : int, $b_data : float[], $b_data_index : int) {
my $cmp = $a_data->[$a_data_index] <=> $b_data->[$b_data_index];
return $cmp;
}
method elem_is_na : int ($data : float[], $data_index : int) {
my $elem_is_na = 0;
if (Math->isnan($data->[$data_index])) {
$elem_is_na = 1;
}
return $elem_is_na;
}
method clone : R::NDArray::Float ($shallow : int = 0) {
return (R::NDArray::Float)$self->SUPER::clone($shallow);
}
method slice : R::NDArray::Float ($indexes_product : R::NDArray::Int[]) {
return (R::NDArray::Float)$self->SUPER::slice($indexes_product);
}
precompile method to_int_ndarray : R::NDArray::Int () {
my $length = $self->length;
my $dim = $self->dim;
my $ret_ndarray = R::OP::Int->c(undef, $dim);
my $data = $self->data;
my $ret_data = $ret_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
$ret_data->[$i] = (int)$data->[$i];
}
return $ret_ndarray;
}
precompile method to_long_ndarray : R::NDArray::Long () {
my $length = $self->length;
my $dim = $self->dim;
my $ret_ndarray = R::OP::Long->c(undef, $dim);
my $data = $self->data;
my $ret_data = $ret_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
$ret_data->[$i] = (long)$data->[$i];
}
return $ret_ndarray;
}
precompile method to_double_ndarray : R::NDArray::Double () {
my $length = $self->length;
my $dim = $self->dim;
my $ret_ndarray = R::OP::Double->c(undef, $dim);
my $data = $self->data;
my $ret_data = $ret_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
$ret_data->[$i] = (double)$data->[$i];
}
return $ret_ndarray;
}
precompile method to_float_complex_ndarray : R::NDArray::FloatComplex () {
my $length = $self->length;
my $dim = $self->dim;
my $ret_ndarray = R::OP::FloatComplex->c(undef, $dim);
my $data = $self->data;
my $ret_data = $ret_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
$ret_data->[$i]{re} = $data->[$i];
$ret_data->[$i]{im} = 0f;
}
return $ret_ndarray;
}
}