Ancient
view release on metacpan or search on metacpan
t/7013-nvec-boolean-truth.t view on Meta::CPAN
is_deeply($gt->to_array, [0, 0, 0, 1, 1], 'gt threshold');
is($gt->count, 2, 'gt count');
my $ge = $a->ge($thresh);
is_deeply($ge->to_array, [0, 0, 1, 1, 1], 'ge threshold');
is($ge->count, 3, 'ge count');
};
# ============================================
# Conditional selection with where()
# ============================================
subtest 'where with boolean masks' => sub {
my $data = nvec::range(0, 10); # 0-9
# Select even numbers
my $is_even = nvec::new([1, 0, 1, 0, 1, 0, 1, 0, 1, 0]);
my $evens = $data->where($is_even);
is_deeply($evens->to_array, [0, 2, 4, 6, 8], 'where: even numbers');
# Select values > 5
my $thresh = nvec::fill(10, 5);
my $gt5 = $data->gt($thresh);
my $big = $data->where($gt5);
is_deeply($big->to_array, [6, 7, 8, 9], 'where: > 5');
# Chained: values > 3 AND < 7
my $gt3 = $data->gt(nvec::fill(10, 3));
my $lt7 = $data->lt(nvec::fill(10, 7));
my $mask = $gt3->mul($lt7); # AND via multiplication
my $mid = $data->where($mask);
is_deeply($mid->to_array, [4, 5, 6], 'where: 3 < x < 7');
};
# ============================================
# Sign function truth
# ============================================
subtest 'sign function' => sub {
my $v = nvec::new([-5, -0.001, 0, 0.001, 5]);
my $s = $v->sign;
is_deeply($s->to_array, [-1, -1, 0, 1, 1], 'sign values');
# Sign of zeros
my $zeros = nvec::zeros(3);
is_deeply($zeros->sign->to_array, [0, 0, 0], 'sign of zeros');
# Sign of ones
my $ones = nvec::ones(3);
is_deeply($ones->sign->to_array, [1, 1, 1], 'sign of ones');
};
# ============================================
# Special value checks
# ============================================
subtest 'isfinite, isnan, isinf' => sub {
use POSIX qw(HUGE_VAL);
my $inf = HUGE_VAL;
my $nan = $inf - $inf; # NaN
my $v = nvec::new([1.0, $nan, $inf, -$inf, 0]);
my $finite = $v->isfinite;
is($finite->get(0), 1, 'isfinite: 1.0');
is($finite->get(1), 0, 'isfinite: NaN');
is($finite->get(2), 0, 'isfinite: Inf');
is($finite->get(3), 0, 'isfinite: -Inf');
is($finite->get(4), 1, 'isfinite: 0');
my $is_nan = $v->isnan;
is($is_nan->get(0), 0, 'isnan: 1.0');
is($is_nan->get(1), 1, 'isnan: NaN');
is($is_nan->get(2), 0, 'isnan: Inf');
my $is_inf = $v->isinf;
is($is_inf->get(0), 0, 'isinf: 1.0');
is($is_inf->get(1), 0, 'isinf: NaN');
is($is_inf->get(2), 1, 'isinf: Inf');
is($is_inf->get(3), 1, 'isinf: -Inf');
};
# ============================================
# Chained boolean operations
# ============================================
subtest 'chained truth operations' => sub {
my $data = nvec::new([1, 0, 3, 0, 5, 0, 7, 0, 9, 0]);
# Filter nonzero, then check if any > 5
my $nonzero_mask = $data->gt(nvec::zeros(10));
my $nonzero = $data->where($nonzero_mask);
ok($nonzero->gt(nvec::fill($nonzero->len, 5))->any, 'chained: some > 5');
# Count how many satisfy complex condition
my $gt3 = $data->gt(nvec::fill(10, 3));
my $lt8 = $data->lt(nvec::fill(10, 8));
my $both = $gt3->mul($lt8);
is($both->count, 2, 'chained: count 3 < x < 8');
};
done_testing;
( run in 0.540 second using v1.01-cache-2.11-cpan-df04353d9ac )