The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

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