RangeIndex#

class numpy::RangeIndex#

numpy C++ class.

Example#

#include <numpy/np_ndarray.h>
using namespace numpy;

// Use RangeIndex
RangeIndex obj;
// ... operations ...

Constructors#

Signature

Location

Example

explicit RangeIndex(int64_t stop, const std::optional<std::string>& name = std::nullopt)

df_range_index.h:101

RangeIndex(const RangeIndex& other)

df_range_index.h:134

RangeIndex(RangeIndex&& other) noexcept

df_range_index.h:143

Construction#

Signature

Return Type

Location

Example

static RangeIndex from_range(int64_t start, int64_t stop, int64_t step = 1, const std::optional<std::string>& name = std::nullopt)

static RangeIndex

df_range_index.h:182

Array Creation#

Signature

Return Type

Location

Example

bool empty() const override

bool

df_range_index.h:220

View

Indexing / Selection#

Signature

Return Type

Location

Example

int64_t at(size_t i) const

int64_t

df_range_index.h:311

View

numpy::NDArray<numpy::int64> get_indexer(const std::vector<int64_t>& target) const

numpy::NDArray<numpy::int64>

df_range_index.h:404

numpy::NDArray<numpy::int64> get_indexer(const RangeIndex& target) const

numpy::NDArray<numpy::int64>

df_range_index.h:419

numpy::NDArray<numpy::int64> get_indexer_for(const std::vector<int64_t>& target) const

numpy::NDArray<numpy::int64>

df_range_index.h:1607

get_indexer_non_unique(const std::vector<int64_t>& target) const

df_range_index.h:1617

RangeIndex get_level_values(int level) const

RangeIndex

df_range_index.h:2158

RangeIndex get_level_values(const std::string& level_name) const

RangeIndex

df_range_index.h:2174

size_t get_loc(int64_t key) const

size_t

df_range_index.h:380

int64_t get_loc_str(const std::string& key_str) const override

int64_t

df_range_index.h:390

std::vector<std::optional<std::string>> get_names() const

std::vector<std::optional<std::string>>

df_range_index.h:2330

View

size_t get_slice_bound(int64_t label, const std::string& side) const

size_t

df_range_index.h:1649

std::string get_value_str(size_t index) const override

std::string

df_range_index.h:1229

int64_t item() const

int64_t

df_range_index.h:1754

View

Index<numpy::int64> putmask(const numpy::NDArray<numpy::bool\_>& mask, int64_t value) const

Index<numpy::int64>

df_range_index.h:1832

View

size_t searchsorted(int64_t value, const std::string& side = "left") const

size_t

df_range_index.h:1277

View

Index<numpy::int64> take(const std::vector<size_t>& indices) const

Index<numpy::int64>

df_range_index.h:491

View

Index<numpy::int64> where(const numpy::NDArray<numpy::bool\_>& cond, const std::vector<int64_t>& other) const

Index<numpy::int64>

df_range_index.h:1958

View

Shape Manipulation#

Signature

Return Type

Location

Example

numpy::NDArray<numpy::int64> ravel() const

numpy::NDArray<numpy::int64>

df_range_index.h:1818

View

RangeIndex transpose() const

RangeIndex

df_range_index.h:1802

View

Statistics#

Signature

Return Type

Location

Example

int64_t max() const

int64_t

df_range_index.h:1033

View

double mean() const

double

df_range_index.h:1075

View

int64_t min() const

int64_t

df_range_index.h:1023

View

int64_t sum() const

int64_t

df_range_index.h:1063

View

Sorting#

Signature

Return Type

Location

Example

numpy::NDArray<numpy::int64> argsort(bool ascending = true) const

numpy::NDArray<numpy::int64>

df_range_index.h:1090

View

RangeIndex sort(bool ascending = true) const

RangeIndex

df_range_index.h:2369

View

RangeIndex sort_values(bool ascending = true) const

RangeIndex

df_range_index.h:1111

std::pair<RangeIndex, numpy::NDArray<numpy::int64>> sortlevel( int level = 0, bool ascending = true, bool sort_remaining = true, const std::string& na_position = "first") const

std::pair<RangeIndex, numpy::NDArray<numpy::int64>>

df_range_index.h:2219

Math Operations#

Signature

Return Type

Location

Example

std::variant<RangeIndex, Index<numpy::int64>> abs() const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:765

View

RangeIndex round(int decimals = 0) const

RangeIndex

df_range_index.h:1914

View

Comparison#

Signature

Return Type

Location

Example

bool equals(const RangeIndex& other) const

bool

df_range_index.h:1198

Logical#

Signature

Return Type

Location

Example

bool all(bool skipna = true) const

bool

df_range_index.h:1497

View

bool any(bool skipna = true) const

bool

df_range_index.h:1511

View

Set Operations#

Signature

Return Type

Location

Example

numpy::NDArray<bool> isin(const std::vector<int64_t>& values) const

numpy::NDArray<bool>

df_range_index.h:505

View

Index<numpy::int64> unique() const

Index<numpy::int64>

df_range_index.h:2362

View

I/O#

Signature

Return Type

Location

Example

numpy::NDArray<numpy::int64> to_array() const

numpy::NDArray<numpy::int64>

df_range_index.h:321

RangeIndex to_flat_index() const

RangeIndex

df_range_index.h:1794

FrameData to_frame(bool index = true, const std::optional<std::string>& name = std::nullopt) const

FrameData

df_range_index.h:2254

Index<numpy::int64> to_index() const

Index<numpy::int64>

df_range_index.h:1263

std::vector<int64_t> to_list() const

std::vector<int64_t>

df_range_index.h:336

numpy::NDArray<numpy::int64> to_numpy() const

numpy::NDArray<numpy::int64>

df_range_index.h:1786

View

SeriesData to_series(const std::optional<RangeIndex>& index = std::nullopt, const std::optional<std::string>& name = std::nullopt) const

SeriesData

df_range_index.h:2294

std::string to_string() const override

std::string

df_range_index.h:1243

View

std::vector<std::string> to_string_vector() const override

std::vector<std::string>

df_range_index.h:1216

std::vector<int64_t> tolist() const

std::vector<int64_t>

df_range_index.h:1778

View

Joining / Splitting#

Signature

Return Type

Location

Example

std::variant<RangeIndex, Index<numpy::int64>> append(const RangeIndex& other) const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:997

View

std::variant<RangeIndex, Index<numpy::int64>> delete\_(size_t loc) const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:558

View

std::variant<RangeIndex, Index<numpy::int64>> delete\_(const std::vector<size_t>& locs) const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:584

View

std::variant<RangeIndex, Index<numpy::int64>> insert(size_t loc, int64_t item) const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:528

View

Index<numpy::int64> repeat(size_t repeats) const

Index<numpy::int64>

df_range_index.h:1870

View

Index<numpy::int64> repeat(const std::vector<size_t>& repeats) const

Index<numpy::int64>

df_range_index.h:1889

View

Type Handling#

Signature

Return Type

Location

Example

RangeIndex copy() const

RangeIndex

df_range_index.h:679

View

numpy::NDArray<numpy::int64> view() const

numpy::NDArray<numpy::int64>

df_range_index.h:1810

View

Type Checking#

Signature

Return Type

Location

Example

bool is\_(const RangeIndex& other) const

bool

df_range_index.h:2112

bool is_aligned(int64_t value) const

bool

df_range_index.h:81

bool is_boolean() const

bool

df_range_index.h:1390

bool is_categorical() const

bool

df_range_index.h:1398

bool is_floating() const

bool

df_range_index.h:1406

bool is_integer() const

bool

df_range_index.h:1414

bool is_interval() const

bool

df_range_index.h:1422

bool is_monotonic_decreasing() const

bool

df_range_index.h:288

bool is_monotonic_increasing() const

bool

df_range_index.h:281

bool is_numeric() const

bool

df_range_index.h:1430

View

bool is_object() const

bool

df_range_index.h:1438

bool is_unique() const override

bool

df_range_index.h:255

View

Other Methods#

Signature

Return Type

Location

Example

size_t argmax() const

size_t

df_range_index.h:1053

View

size_t argmin() const

size_t

df_range_index.h:1043

View

numpy::NDArray<numpy::int64> arr(std::vector<size_t>

numpy::NDArray<numpy::int64>

df_range_index.h:324

View

std::optional<int64_t> asof(int64_t label) const

std::optional<int64_t>

df_range_index.h:1542

numpy::NDArray<numpy::int64> asof_locs(const std::vector<int64_t>& where) const

numpy::NDArray<numpy::int64>

df_range_index.h:1587

size_t cache_memory_usage() const override

size_t

df_range_index.h:1366

void clear_cache() const override

void

df_range_index.h:1348

std::unique_ptr<IndexBase> clone() const override

std::unique_ptr<IndexBase>

df_range_index.h:1236

View

numpy::NDArray<numpy::int64> codes(std::vector<size_t>

numpy::NDArray<numpy::int64>

df_range_index.h:1332

size_t compute_size() const

size_t

df_range_index.h:56

bool contains(int64_t value) const

bool

df_range_index.h:355

View

bool contains_str(const std::string& key_str) const override

bool

df_range_index.h:365

numpy::NDArray<numpy::int64> counts(std::vector<size_t>

numpy::NDArray<numpy::int64>

df_range_index.h:2350

View

Index<numpy::int64> diff(int64_t periods = 1) const

Index<numpy::int64>

df_range_index.h:1666

View

std::variant<RangeIndex, Index<numpy::int64>> difference(const RangeIndex& other) const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:911

View

std::variant<RangeIndex, Index<numpy::int64>> drop(const std::vector<int64_t>& labels) const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:634

RangeIndex drop_duplicates(const std::string& keep = "first") const

RangeIndex

df_range_index.h:1708

RangeIndex droplevel(int level = 0) const

RangeIndex

df_range_index.h:2142

RangeIndex dropna() const

RangeIndex

df_range_index.h:1699

std::string dtype_name() const override

std::string

df_range_index.h:227

View

numpy::NDArray<numpy::bool\_> duplicated(const std::string& keep = "first") const

numpy::NDArray<numpy::bool_>

df_range_index.h:1718

std::pair<numpy::NDArray<numpy::int64>, RangeIndex> factorize() const

std::pair<numpy::NDArray<numpy::int64>, RangeIndex>

df_range_index.h:1330

RangeIndex fillna(int64_t value) const

RangeIndex

df_range_index.h:1690

std::vector<std::string> format(const std::string& na_rep = "NaN") const

std::vector<std::string>

df_range_index.h:1737

View

std::unordered_map<GroupT, std::vector<size_t>> groupby( const std::vector<GroupT>& values) const

std::unordered_map<GroupT, std::vector<size_t>>

df_range_index.h:2193

bool has_cached_values() const override

bool

df_range_index.h:1357

bool has_duplicates() const override

bool

df_range_index.h:262

bool holds_integer() const

bool

df_range_index.h:1382

bool identical(const RangeIndex& other) const

bool

df_range_index.h:1205

bool in_bounds(int64_t value) const

bool

df_range_index.h:70

numpy::NDArray<numpy::int64> indexer_arr(std::vector<size_t>

numpy::NDArray<numpy::int64>

df_range_index.h:1630

RangeIndex infer_objects() const

RangeIndex

df_range_index.h:1746

std::string inferred_type() const override

std::string

df_range_index.h:248

std::variant<RangeIndex, Index<numpy::int64>> intersection(const RangeIndex& other) const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:847

numpy::NDArray<numpy::bool\_> isna() const

numpy::NDArray<numpy::bool_>

df_range_index.h:1450

numpy::NDArray<numpy::bool\_> isnull() const

numpy::NDArray<numpy::bool_>

df_range_index.h:1463

join(const RangeIndex& other, const std::string& how = "left", bool sort = false) const

df_range_index.h:1988

View

numpy::NDArray<numpy::int64> left_arr(std::vector<size_t>

numpy::NDArray<numpy::int64>

df_range_index.h:2083

size_t memory_usage(bool deep = false) const

size_t

df_range_index.h:1766

numpy::NDArray<numpy::int64> missing_arr(std::vector<size_t>

numpy::NDArray<numpy::int64>

df_range_index.h:1635

std::optional<std::string> name() const override

std::optional<std::string>

df_range_index.h:234

View

name\_(other.name\_)

df_range_index.h:136

name\_(std::move(other.name\_)), cached_array\_(std::move(other.cached_array\_))

df_range_index.h:145

size_t nbytes() const override

size_t

df_range_index.h:273

View

size_t nlevels() const

size_t

df_range_index.h:2322

numpy::NDArray<numpy::bool\_> notna() const

numpy::NDArray<numpy::bool_>

df_range_index.h:1471

numpy::NDArray<numpy::bool\_> notnull() const

numpy::NDArray<numpy::bool_>

df_range_index.h:1484

size_t nunique(bool dropna = true) const

size_t

df_range_index.h:1528

std::pair<RangeIndex, numpy::NDArray<numpy::int64>> reindex( const RangeIndex& target, const std::string& method = "") const

std::pair<RangeIndex, numpy::NDArray<numpy::int64>>

df_range_index.h:1857

RangeIndex rename(const std::optional<std::string>& new_name) const

RangeIndex

df_range_index.h:686

std::string repr() const override

std::string

df_range_index.h:1256

RangeIndex result(\*this)

RangeIndex

df_range_index.h:687

View

numpy::NDArray<numpy::int64> right_arr(std::vector<size_t>

numpy::NDArray<numpy::int64>

df_range_index.h:2084

void set_name(const std::optional<std::string>& name) override

void

df_range_index.h:241

RangeIndex set_names(const std::optional<std::string>& name) const

RangeIndex

df_range_index.h:2099

Index<numpy::int64> shift(int64_t periods = 1, int64_t fill_value = 0) const

Index<numpy::int64>

df_range_index.h:1925

View

size_t size() const override

size_t

df_range_index.h:213

View

RangeIndex slice(size_t start_idx, size_t stop_idx, int64_t step_idx = 1) const

RangeIndex

df_range_index.h:434

View

std::pair<size_t, size_t> slice_indexer(std::optional<int64_t> start = std::nullopt, std::optional<int64_t> stop = std::nullopt, size_t step = 1) const

std::pair<size_t, size_t>

df_range_index.h:2123

std::pair<size_t, size_t> slice_locs( std::optional<int64_t> start = std::nullopt, std::optional<int64_t> stop = std::nullopt) const

std::pair<size_t, size_t>

df_range_index.h:455

int64_t start() const

int64_t

df_range_index.h:194

View

int64_t step() const

int64_t

df_range_index.h:204

View

int64_t stop() const

int64_t

df_range_index.h:199

std::variant<RangeIndex, Index<numpy::int64>> symmetric_difference(const RangeIndex& other) const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:950

std::variant<RangeIndex, Index<numpy::int64>> union\_(const RangeIndex& other) const

std::variant<RangeIndex, Index<numpy::int64>>

df_range_index.h:796

std::pair<Index<numpy::int64>, numpy::NDArray<numpy::int64>> value_counts( bool normalize = false, bool sort = true, bool ascending = false, bool dropna = true) const

std::pair<Index<numpy::int64>, numpy::NDArray<numpy::int64>>

df_range_index.h:2338

Code Examples#

The following examples are extracted from the test suite.

empty (np_test_1_all.cpp:6316)
6306}
6307
6308void test_data_generator_emptyBenchmarkSorting() {
6309    std::cout << "========= test_data_generator_empty =======================";
6310
6311    DataGenerator<int> gen(42);
6312
6313    // Test empty data generation
6314    std::vector<int> data = gen.generate(0, DataPattern::RANDOM);
6315
6316    if (!(data.empty())) {
6317        std::string description = std::string("test_data_generator_emptyBenchmarkSorting():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(data.empty())";
6318        std::cout << std::string("[FAIL] ") + description << std::endl;
6319        throw std::runtime_error(description);
6320    }
6321
6322    // std::cout << "Empty data generation test passed" << std::endl;
6323
6324    std::cout << " -> tests passed" << std::endl;
6325}
at (np_test_1_all.cpp:144)
134    array.setElementAt({0, 0}, 1);
135    array.setElementAt({0, 1}, 2);
136    array.setElementAt({0, 2}, 3);
137    array.setElementAt({1, 1}, 5);
138    array.setElementAt({2, 2}, 9);
139
140    // std::cout << "Array after setting elements:" << std::endl;
141    //array.printArray();
142
143    // std::cout << "Element at (1,1): " << array.getElementAt({1, 1}) << std::endl;
144    // std::cout << "Element at (2,2): " << array.getElementAt({2, 2});
145
146    std::cout << " -> tests passed" << std::endl;
147}
148
149void testArithmetic() {
150    std::cout << "========= testArithmeticOperations =======================";
151
152    auto array1 = createFloat32Array({2, 2}, 5.0f);
153    auto array2 = createFloat32Array({2, 2}, 3.0f);
get_names (np_test_1_all.cpp:21728)
21718    RecordArray base(dtype, { 2 });
21719    base.setFieldValue({ 0 }, "name", std::string("Alice"));
21720    base.setFieldValue({ 0 }, "score", static_cast<int32>(85));
21721    base.setFieldValue({ 1 }, "name", std::string("Bob"));
21722    base.setFieldValue({ 1 }, "score", static_cast<int32>(92));
21723
21724    // std::cout << "Base array:" << std::endl;
21725    //base.printArray();
21726
21727    std::vector<std::string> names = get_names(base);
21728    // std::cout << "Field names: ";
21729    for (const auto& name : names) {
21730      // std::cout << name << " ";
21731    }
21732    // std::cout << std::endl;
21733
21734    // std::cout << "Field structure: " << get_fieldstructure(base) << std::endl;
21735
21736    auto dropped = drop_fields(base, { "score" });
21737    // std::cout << "After dropping 'score' field:";
item (np_test_4_all.cpp:20048)
20038/**
20039 * @file np_test_phase6.cpp
20040 * @brief Test suite for Phase 6A - HIGH PRIORITY NDArray methods and masked array utilities
20041 *
20042 * Tests:
20043 * - ndarray.nonzero() - Return indices of non-zero elements
20044 * - ndarray.tobytes() - Convert to bytes representation
20045 * - ndarray.tolist() - Convert to nested list string
20046 * - ndarray.fill() - Fill with scalar value (in-place)
20047 * - ndarray.item() - Get single element as scalar
20048 * - ndarray.itemset() - Set single element value
20049 * - ma.masked_all_like() - Create masked array with all elements masked
20050 *
20051 * Created: 2025-10-28
20052 * Status: Phase 6A Implementation - HIGH PRIORITY functions
20053 */
20054
20055#include "../numpy/np_ndarray.h"
20056#include "../numpy/np_masked_array.h"
20057#include <iostream>
putmask (np_test_5_all.cpp:4659)
4649      mask.setElementAt({ 1 }, false);
4650      mask.setElementAt({ 2 }, true);
4651      mask.setElementAt({ 3 }, false);
4652      mask.setElementAt({ 4 }, true);
4653
4654      // Create value array
4655      numpy::NDArray<int32_t> values({ 1 });
4656      values.setElementAt({ 0 }, 99);
4657
4658      // Apply putmask
4659      numpy::putmask(arr, mask, values);
4660
4661      // Expected: [99, 2, 99, 4, 99]
4662      if (arr.getElementAt({ 0 }) != 99 || arr.getElementAt({ 1 }) != 2 ||
4663        arr.getElementAt({ 2 }) != 99 || arr.getElementAt({ 3 }) != 4 ||
4664        arr.getElementAt({ 4 }) != 99) {
4665        std::cout << "  [FAIL] : in np_test_putmask() : Incorrect result";
4666        throw std::runtime_error("Test failed");
4667      }
4668
4669      // Test with multiple values
searchsorted (np_test_2_all.cpp:8204)
8194      // Test missing NumPy functions
8195      void test_numpy_functions() {
8196        std::cout << "========= NumPy Functions Test ==========================";
8197
8198        // Test searchsorted
8199        {
8200          std::vector<int> sorted_arr = { 1, 3, 5, 7, 9 };
8201          std::vector<int> values = { 2, 6, 8 };
8202
8203          auto result = numpy::searchsorted(sorted_arr, values, "left");
8204          std::vector<size_t> expected = { 1, 3, 4 };
8205
8206          if (result != expected) {
8207            std::cout << "   searchsorted (left):                                                                   -> [FAIL]";
8208            throw std::runtime_error("searchsorted (left): FAILED - incorrect result indices");
8209          }
8210          // std::cout << "[OK] searchsorted (left): PASSED" << std::endl;
8211
8212          auto result_right = numpy::searchsorted(sorted_arr, values, "right");
8213          std::vector<size_t> expected_right = { 1, 3, 4 };
take (np_test_5_all.cpp:4313)
4303      for (size_t i = 0; i < 6; ++i) {
4304        arr.setElementAt({ i }, static_cast<int32_t>(i * 10));  // [0, 10, 20, 30, 40, 50]
4305      }
4306
4307      // Take specific indices
4308      numpy::NDArray<size_t> indices({ 3 });
4309      indices.setElementAt({ 0 }, 5);  // 50
4310      indices.setElementAt({ 1 }, 2);  // 20
4311      indices.setElementAt({ 2 }, 0);  // 0
4312
4313      auto result = numpy::take(arr, indices);
4314
4315      if (result.getSize() != 3) {
4316        std::cout << "  [FAIL] : in np_test_take_basic() : Wrong result size";
4317        throw std::runtime_error("Test failed");
4318      }
4319
4320      if (result.getElementAt({ 0 }) != 50 || result.getElementAt({ 1 }) != 20 || result.getElementAt({ 2 }) != 0) {
4321        std::cout << "  [FAIL] : in np_test_take_basic() : Wrong values extracted";
4322        throw std::runtime_error("Test failed");
4323      }
where (np_test_3_all.cpp:15253)
15243      auto y_data = createInt32Array({ 4 }, 0);
15244      y_data.setElementAt({ 0 }, 100);
15245      y_data.setElementAt({ 1 }, 200);
15246      y_data.setElementAt({ 2 }, 300);
15247      y_data.setElementAt({ 3 }, 400);
15248
15249      auto y_mask = createBoolArray({ 4 }, false);
15250      MaskedArray<int32> y(y_data, y_mask, -999);
15251
15252      // Test where() selection
15253      auto result = where(condition, x, y);
15254
15255      if (!(result.getElementAt({ 0 }) == 10)) {
15256          std::string description = std::string("test_where_selection():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(result.getElementAt({ 0 }) == 10)";
15257          std::cout << std::string("[FAIL] ") + description << std::endl;
15258          throw std::runtime_error(description);
15259      }
15260      if (!(result.getElementAt({ 1 }) == 200)) {
15261          std::string description = std::string("test_where_selection():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(result.getElementAt({ 1 }) == 200)";
15262          std::cout << std::string("[FAIL] ") + description << std::endl;
ravel (np_test_1_all.cpp:4082)
4072    std::cout << "Testing ravel function...\n";
4073
4074    // Test with 2-D array
4075    auto arr_2d = createFloat64Array({ 2, 3 });
4076    for (size_t i = 0; i < 2; ++i) {
4077        for (size_t j = 0; j < 3; ++j) {
4078            arr_2d.setElementAt({ i, j }, static_cast<double>(i * 3 + j));
4079        }
4080    }
4081
4082    auto raveled = ravel(arr_2d);
4083    if (!(raveled.getShape() == std::vector<size_t>({ 6 }))) {
4084        std::string description = std::string("testRavelFunction():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(raveled.getShape() == std::vector<size_t>({ 6 }))";
4085        std::cout << std::string("[FAIL] ") + description << std::endl;
4086        throw std::runtime_error(description);
4087    }
4088
4089    for (size_t i = 0; i < 6; ++i) {
4090        if (!(isApproxEqualExt(raveled.getElementAt({ i }), static_cast<double>(i)))) {
4091            std::string description = std::string("testRavelFunction():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(isApproxEqualExt(raveled.getElementAt({ i }), static_cast<double>(i)))";
4092            std::cout << std::string("[FAIL] ") + description << std::endl;
transpose (np_test_2_all.cpp:4973)
4963    }
4964
4965    /**
4966     * Test matrix properties and methods
4967     */
4968    void testMatrixProperties() {
4969      std::cout << "========= testMatrixProperties =======================";
4970
4971      // Test transpose
4972      numpy::Matrix<double> m("1 2 3; 4 5 6");
4973      auto mt = m.transpose();
4974      assert_test(mt.rows() == 3, "Transpose rows");
4975      assert_test(mt.cols() == 2, "Transpose cols");
4976      assert_test(std::abs(mt(0, 1) - 4.0) < 1e-10, "Transpose element");
4977      assert_test(std::abs(mt(2, 0) - 3.0) < 1e-10, "Transpose element");
4978
4979      // Test trace for square matrix
4980      numpy::Matrix<double> square("1 2; 3 4");
4981      double tr = square.trace();
4982      assert_test(std::abs(tr - 5.0) < 1e-10, "Matrix trace");
max (np_test_1_all.cpp:7274)
7264    if (sizeof(uintp) == sizeof(void*)) {
7265        // std::cout << "                -> uintp size matches pointer size";
7266    } else {
7267        // std::cout << "  ✗ uintp size doesn't match pointer size" << std::endl;
7268    }
7269
7270    // Test range limits
7271    // std::cout << "Range Information:" << std::endl;
7272    // std::cout << "  intp min: " << std::numeric_limits<intp>::min() << std::endl;
7273    // std::cout << "  intp max: " << std::numeric_limits<intp>::max() << std::endl;
7274    // std::cout << "  uintp max: " << std::numeric_limits<uintp>::max() << std::endl;
7275    // std::cout << "  longdouble digits: " << std::numeric_limits<longdouble>::digits << std::endl;
7276
7277    std::cout << " -> tests passed" << std::endl;
7278}
7279
7280void testComplexArithmeticExtendedTypes() {
7281    std::cout << "========= testComplexArithmeticExtendedTypes =======================";
7282
7283    clongdouble c1(3.0L, 4.0L);  // 3 + 4i
mean (np_test_1_all.cpp:11714)
11704    // Create test array
11705    auto array = createInt32Array({ 2, 3 }, 0);
11706    array.setElementAt({ 0, 0 }, 1);
11707    array.setElementAt({ 0, 1 }, 2);
11708    array.setElementAt({ 0, 2 }, 3);
11709    array.setElementAt({ 1, 0 }, 4);
11710    array.setElementAt({ 1, 1 }, 5);
11711    array.setElementAt({ 1, 2 }, 6);
11712
11713    // Test mean without axis
11714    auto mean_all = mean(array);
11715    if (!(approx_equal(mean_all.getElementAt({ 0 }), 3.5, 1e-10))) {
11716        std::string description = std::string("testBasicStatistics():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(approx_equal(mean_all.getElementAt({ 0 }), 3.5, 1e-10))";
11717        std::cout << std::string("[FAIL] ") + description << std::endl;
11718        throw std::runtime_error(description);
11719    }
11720    // std::cout << "[OK] mean (all elements) works correctly\n";
11721
11722    // Test mean along axis 0
11723    auto mean_axis0 = mean(array, 0);
11724    if (!(mean_axis0.getShape()[0] == 3)) {
min (np_test_1_all.cpp:2350)
2340        if (i % 3 == 0) {
2341            large_array.setElementAt({i}, object_(static_cast<int>(i)));
2342        } else if (i % 3 == 1) {
2343            large_array.setElementAt({i}, object_(static_cast<double>(i) * 0.5));
2344        } else {
2345            large_array.setElementAt({i}, object_(std::string("str") + std::to_string(i)));
2346        }
2347    }
2348
2349    // Verify pattern
2350    for (size_t i = 0; i < std::min(large_size, size_t(100)); ++i) {  // Check first 100
2351        object_ obj = large_array.getElementAt({i});
2352        if (i % 3 == 0) {
2353            if (!(obj.is_type<int>())) {
2354                std::string description = std::string("testArrayEdgeCases():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(obj.is_type<int>())";
2355                std::cout << std::string("[FAIL] ") + description << std::endl;
2356                throw std::runtime_error(description);
2357            }
2358        } else if (i % 3 == 1) {
2359            if (!(obj.is_type<double>())) {
2360                std::string description = std::string("unknown_function():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(obj.is_type<double>())";
sum (np_test_1_all.cpp:11766)
11756        throw std::runtime_error(description);
11757    }
11758    if (!(approx_equal(mean_axis1.getElementAt({ 1 }), 5.0, 1e-10))) {
11759        std::string description = std::string("testBasicStatistics():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(approx_equal(mean_axis1.getElementAt({ 1 }), 5.0, 1e-10))";
11760        std::cout << std::string("[FAIL] ") + description << std::endl;
11761        throw std::runtime_error(description);
11762    }
11763    // std::cout << "[OK] mean along axis 1 works correctly\n";
11764
11765    // Test sum
11766    auto sum_all = sum(array);
11767    if (!(sum_all.getElementAt({ 0 }) == 21)) {
11768        std::string description = std::string("testBasicStatistics():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(sum_all.getElementAt({ 0 }) == 21)";
11769        std::cout << std::string("[FAIL] ") + description << std::endl;
11770        throw std::runtime_error(description);
11771    }
11772    // std::cout << "[OK] sum works correctly\n";
11773
11774    // Test min and max
11775    auto min_all = min(array);
11776    auto max_all = max(array);
argsort (np_test_1_all.cpp:16841)
16831    std::cout << "========= test_argsort =======================";
16832
16833    // Test 1D array argsort
16834    NDArray<int> arr1d({ 5 });
16835    arr1d.setElementAt({ 0 }, 30);  // index 0
16836    arr1d.setElementAt({ 1 }, 10);  // index 1
16837    arr1d.setElementAt({ 2 }, 40);  // index 2
16838    arr1d.setElementAt({ 3 }, 20);  // index 3
16839    arr1d.setElementAt({ 4 }, 50);  // index 4
16840
16841    auto indices = argsort(arr1d);
16842
16843    // Expected order: 10(idx1), 20(idx3), 30(idx0), 40(idx2), 50(idx4)
16844    if (!(indices.getElementAt({ 0 }) == 1)) {
16845        std::string description = std::string("test_argsort():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(indices.getElementAt({ 0 }) == 1)";
16846        std::cout << std::string("[FAIL] ") + description << std::endl;
16847        throw std::runtime_error(description);
16848    }
16849    if (!(indices.getElementAt({ 1 }) == 3)) {
16850        std::string description = std::string("test_argsort():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(indices.getElementAt({ 1 }) == 3)";
16851        std::cout << std::string("[FAIL] ") + description << std::endl;
sort (np_test_1_all.cpp:6258)
6248    std::vector<int> data = gen.generate(100, DataPattern::FEW_UNIQUE);
6249
6250    if (!(data.size() == 100)) {
6251        std::string description = std::string("test_data_generator_few_uniqueBenchmarkSorting():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(data.size() == 100)";
6252        std::cout << std::string("[FAIL] ") + description << std::endl;
6253        throw std::runtime_error(description);
6254    }
6255
6256    // Count unique values
6257    std::vector<int> sorted_copy = data;
6258    std::sort(sorted_copy.begin(), sorted_copy.end());
6259    auto unique_end = std::unique(sorted_copy.begin(), sorted_copy.end());
6260    size_t unique_count = std::distance(sorted_copy.begin(), unique_end);
6261
6262    // Should have significantly fewer unique values than total elements
6263    if (!(unique_count < data.size() / 2)) {
6264        std::string description = std::string("test_data_generator_few_uniqueBenchmarkSorting():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(unique_count < data.size() / 2)";
6265        std::cout << std::string("[FAIL] ") + description << std::endl;
6266        throw std::runtime_error(description);
6267    }
abs (np_test_1_all.cpp:101)
 91        if (arr.getShape().size() == 1 && arr.getShape()[0] <= 10) {
 92            for (size_t i = 0; i < arr.getShape()[0]; ++i) {
 93                // std::cout << static_cast<int64_t>(arr.getElementAt({i})) << " ";
 94            }
 95        }
 96        // std::cout << std::endl;
 97    }
 98
 99    // Helper function for core array extensions tests
100    bool isApproxEqualExt(double a, double b, double tolerance = 1e-10) {
101        return std::abs(a - b) < tolerance;
102    }
103}
104
105void f_nothing() {
106    // This function does nothing and tests nothing
107    // It's a placeholder test function
108}
109
110// ------ merging np_test_advanced_indexing.cpp -- number of functions merged=16 --------------------------------
round (np_test_1_all.cpp:23769)
23759          throw std::runtime_error(description);
23760      }
23761      if (!(power_scalar_result.getShape() == array.getShape())) {
23762          std::string description = std::string("testMathFunctionSignatures():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(power_scalar_result.getShape() == array.getShape())";
23763          std::cout << std::string("[FAIL] ") + description << std::endl;
23764          throw std::runtime_error(description);
23765      }
23766      // std::cout << "[OK] Power functions have correct signatures\n";
23767
23768      // Test rounding functions with new decimals parameter
23769      auto round_result = round(array);        // Default decimals=0
23770      auto round_decimals_result = round(array, 2);  // With decimals
23771      if (!(round_result.getShape() == array.getShape())) {
23772          std::string description = std::string("testMathFunctionSignatures():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(round_result.getShape() == array.getShape())";
23773          std::cout << std::string("[FAIL] ") + description << std::endl;
23774          throw std::runtime_error(description);
23775      }
23776      if (!(round_decimals_result.getShape() == array.getShape())) {
23777          std::string description = std::string("testMathFunctionSignatures():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(round_decimals_result.getShape() == array.getShape())";
23778          std::cout << std::string("[FAIL] ") + description << std::endl;
23779          throw std::runtime_error(description);
all (np_test_4_all.cpp:23928)
23918                        }
23919                    }
23920                }
23921
23922                auto result = numpy::einsum<numpy::float64>("ijk->ik", {A});
23923
23924                if (result.getShape()[0] != 2 || result.getShape()[1] != 2) {
23925                    throw std::runtime_error("einsum partial sum shape wrong");
23926                }
23927
23928                // Sum over j: 1+2+3 = 6 for all (i,k) positions
23929                if (std::abs(result.getElementAt({0, 0}) - 6.0) > 1e-10 ||
23930                    std::abs(result.getElementAt({1, 1}) - 6.0) > 1e-10) {
23931                    throw std::runtime_error("einsum partial sum values wrong");
23932                }
23933
23934                // std::cout << "  OK: Partial sum: 'ijk->ik'\n";
23935            }
23936
23937            // Test 5: Size-1 dimension handling
23938            {
any (np_test_2_all.cpp:16758)
16748    // ANY() TESTS - SCALAR RESULT
16749    // ============================================================================
16750
16751    void np_test_logic_any_scalar_all_false() {
16752      std::cout << "========= any: all false elements =======================";
16753
16754      // Create array with all false/zero elements
16755      std::vector<double> data = { 0.0, 0.0, 0.0 };
16756      numpy::NDArray<double> arr = numpy::createArrayFromVector<double>({ 3 }, data);
16757
16758      bool result = numpy::any(arr);
16759
16760      if (result != false) {
16761        std::cout << "  [FAIL] : in np_test_logic_any_scalar_all_false() : expected false for all-zero array";
16762        throw std::runtime_error("np_test_logic_any_scalar_all_false failed: expected false");
16763      }
16764
16765      std::cout << " -> tests passed" << std::endl;
16766    }
16767
16768    void np_test_logic_any_scalar_all_true() {
isin (np_test_1_all.cpp:19434)
19424        std::cout << std::string("[FAIL] ") + description << std::endl;
19425        throw std::runtime_error(description);
19426    }
19427    if (!(membership.getElementAt({ 5 }) == false)) {
19428        std::string description = std::string("testMembershipOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(membership.getElementAt({ 5 }) == false)";
19429        std::cout << std::string("[FAIL] ") + description << std::endl;
19430        throw std::runtime_error(description);
19431    }
19432    // std::cout << "[OK] Membership testing (in1d) works correctly\n";
19433
19434    // Test isin (alias for in1d)
19435    auto isin_result = isin(test_array, test_values);
19436
19437    // Should be identical to in1d result
19438    for (size_t i = 0; i < membership.getSize(); ++i) {
19439      if (!(isin_result.getElementAt({ i }) == membership.getElementAt({ i }))) {
19440          std::string description = std::string("testMembershipOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(isin_result.getElementAt({ i }) == membership.getElementAt({ i }))";
19441          std::cout << std::string("[FAIL] ") + description << std::endl;
19442          throw std::runtime_error(description);
19443      }
19444    }
unique (np_test_1_all.cpp:6259)
6249    if (!(data.size() == 100)) {
6250        std::string description = std::string("test_data_generator_few_uniqueBenchmarkSorting():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(data.size() == 100)";
6251        std::cout << std::string("[FAIL] ") + description << std::endl;
6252        throw std::runtime_error(description);
6253    }
6254
6255    // Count unique values
6256    std::vector<int> sorted_copy = data;
6257    std::sort(sorted_copy.begin(), sorted_copy.end());
6258    auto unique_end = std::unique(sorted_copy.begin(), sorted_copy.end());
6259    size_t unique_count = std::distance(sorted_copy.begin(), unique_end);
6260
6261    // Should have significantly fewer unique values than total elements
6262    if (!(unique_count < data.size() / 2)) {
6263        std::string description = std::string("test_data_generator_few_uniqueBenchmarkSorting():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(unique_count < data.size() / 2)";
6264        std::cout << std::string("[FAIL] ") + description << std::endl;
6265        throw std::runtime_error(description);
6266    }
6267
6268    // std::cout << "Few unique data generation test passed. Unique values: " << unique_count << std::endl;
to_numpy (np_test_5_all.cpp:21373)
21363    if (errors == 0) {
21364        std::cout << "np_test_timedelta_components -> tests passed" << std::endl;
21365    }
21366    return errors;
21367}
21368
21369// =============================================================================
21370// Test 4: Total Conversion Properties
21371// =============================================================================
21372int np_test_timedelta_total_conversions() {
21373    int errors = 0;
21374
21375    numpy::Timedelta td(1, 12, 0);  // 1 day 12 hours = 1.5 days = 36 hours
21376
21377    // total_seconds
21378    {
21379        double secs = td.total_seconds();
21380        double expected = (24 + 12) * 3600.0;
21381        if (std::abs(secs - expected) > 0.0001) {
21382            std::cout << "[FAIL] np_test_timedelta_total_conversions: total_seconds expected "
21383                      << expected << ", got " << secs << std::endl;
to_string (np_test_1_all.cpp:454)
444    // Modify through different views
445    view1.setElementAt({0, 0}, 100);
446    view2.setElementAt({2, 1}, 200);  // This is (1, 2) in original
447    view3.setElementAt({0, 0}, 300);  // This is (1, 1) in original
448
449    // std::cout << "After modifications through multiple views:" << std::endl;
450    //original.printArray();
451
452    // Verify all changes are reflected
453    if (!(original.getElementAt({0, 0}) == 100)) {
454        std::string description = std::string("testAdvancedViewLifecycle():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(original.getElementAt({0, 0}) == 100)";
455        std::cout << std::string("[FAIL] ") + description << std::endl;
456        throw std::runtime_error(description);
457    }
458    if (!(original.getElementAt({1, 2}) == 200)) {
459        std::string description = std::string("testAdvancedViewLifecycle():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(original.getElementAt({1, 2}) == 200)";
460        std::cout << std::string("[FAIL] ") + description << std::endl;
461        throw std::runtime_error(description);
462    }
463    if (!(original.getElementAt({1, 1}) == 300)) {
464        std::string description = std::string("testAdvancedViewLifecycle():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(original.getElementAt({1, 1}) == 300)";
tolist (np_test_4_all.cpp:20046)
20036} // namespace numpy_tests
20037
20038/**
20039 * @file np_test_phase6.cpp
20040 * @brief Test suite for Phase 6A - HIGH PRIORITY NDArray methods and masked array utilities
20041 *
20042 * Tests:
20043 * - ndarray.nonzero() - Return indices of non-zero elements
20044 * - ndarray.tobytes() - Convert to bytes representation
20045 * - ndarray.tolist() - Convert to nested list string
20046 * - ndarray.fill() - Fill with scalar value (in-place)
20047 * - ndarray.item() - Get single element as scalar
20048 * - ndarray.itemset() - Set single element value
20049 * - ma.masked_all_like() - Create masked array with all elements masked
20050 *
20051 * Created: 2025-10-28
20052 * Status: Phase 6A Implementation - HIGH PRIORITY functions
20053 */
20054
20055#include "../numpy/np_ndarray.h"
append (np_test_2_all.cpp:7028)
7018          throw std::runtime_error(description);
7019      }
7020      if (!(deleted_dups.getElementAt({ 2 }) == 3)) {
7021          std::string description = std::string("testModificationOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(deleted_dups.getElementAt({ 2 }) == 3)";
7022          std::cout << std::string("[FAIL] ") + description << std::endl;
7023          throw std::runtime_error(description);
7024      }
7025      // std::cout << "[OK] Delete with duplicate indices works correctly\n";
7026
7027      // Test append
7028      auto appended = append(array, 100);
7029      if (!(appended.getSize() == array.getSize() + 1)) {
7030          std::string description = std::string("testModificationOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(appended.getSize() == array.getSize() + 1)";
7031          std::cout << std::string("[FAIL] ") + description << std::endl;
7032          throw std::runtime_error(description);
7033      }
7034      if (!(appended.getElementAt({ appended.getSize() - 1 }) == 100)) {
7035          std::string description = std::string("testModificationOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(appended.getElementAt({ appended.getSize() - 1 }) == 100)";
7036          std::cout << std::string("[FAIL] ") + description << std::endl;
7037          throw std::runtime_error(description);
7038      }
delete_ (np_test_4_all.cpp:18411)
18401    }
18402
18403    // ============================================================================
18404    // SPRINT 1.2: ESSENTIAL OPERATIONS TESTS
18405    // ============================================================================
18406
18407    void np_test_phase1_delete() {
18408      std::cout << "========= delete_: element deletion ====";
18409
18410      auto arr = numpy::array({10, 20, 30, 40, 50});
18411      auto result = numpy::delete_(arr, 2);  // Delete index 2 (value 30)
18412
18413      // Verify size reduced
18414      if (result.getSize() != 4) {
18415        std::cout << "  [FAIL] : delete_ result size is " << result.getSize() << ", expected 4\n";
18416        throw std::runtime_error("delete_ failed: wrong size");
18417      }
18418
18419      // Verify correct element was removed
18420      if (result.getElementAt({0}) != 10 || result.getElementAt({1}) != 20 ||
18421          result.getElementAt({2}) != 40 || result.getElementAt({3}) != 50) {
delete_ (np_test_4_all.cpp:18411)
18401    }
18402
18403    // ============================================================================
18404    // SPRINT 1.2: ESSENTIAL OPERATIONS TESTS
18405    // ============================================================================
18406
18407    void np_test_phase1_delete() {
18408      std::cout << "========= delete_: element deletion ====";
18409
18410      auto arr = numpy::array({10, 20, 30, 40, 50});
18411      auto result = numpy::delete_(arr, 2);  // Delete index 2 (value 30)
18412
18413      // Verify size reduced
18414      if (result.getSize() != 4) {
18415        std::cout << "  [FAIL] : delete_ result size is " << result.getSize() << ", expected 4\n";
18416        throw std::runtime_error("delete_ failed: wrong size");
18417      }
18418
18419      // Verify correct element was removed
18420      if (result.getElementAt({0}) != 10 || result.getElementAt({1}) != 20 ||
18421          result.getElementAt({2}) != 40 || result.getElementAt({3}) != 50) {
insert (np_test_1_all.cpp:6990)
6980}
6981
6982void testBusinessDateRangeDateTime() {
6983    std::cout << "========= testBusinessDateRangeDateTime =======================";
6984
6985    datetime64 start("2024-03-11");  // Monday
6986    datetime64 end("2024-03-22");    // Friday (2 weeks later)
6987
6988    // Create holidays set
6989    std::set<datetime64> holidays;
6990    holidays.insert(datetime64("2024-03-15"));  // Friday holiday
6991
6992    auto business_dates = createBusinessDateRange(start, end, holidays);
6993    // std::cout << "Business dates from " << start.toString()
6994              // << " to " << end.toString() << " (excluding 2024-03-15):" << std::endl;
6995    //business_dates.printArray();
6996
6997        std::cout << " -> tests passed" << std::endl;
6998}
6999
7000void testMonthRangeDateTime() {
repeat (np_test_1_all.cpp:18268)
18258    // Create test array
18259    auto array = createInt32Array({ 2, 3 }, 0);
18260    for (size_t i = 0; i < 2; ++i) {
18261      for (size_t j = 0; j < 3; ++j) {
18262        array.setElementAt({ i, j }, static_cast<int32_t>(i * 3 + j + 1));
18263      }
18264    }
18265
18266    // Test repeat without axis (flattened)
18267    auto repeated_flat = repeat(array, 2);
18268    if (!(repeated_flat.getShape()[0] == 12)) {
18269        std::string description = std::string("testRepeat():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(repeated_flat.getShape()[0] == 12)";
18270        std::cout << std::string("[FAIL] ") + description << std::endl;
18271        throw std::runtime_error(description);
18272    }
18273    if (!(repeated_flat.getElementAt({ 0 }) == 1)) {
18274        std::string description = std::string("testRepeat():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(repeated_flat.getElementAt({ 0 }) == 1)";
18275        std::cout << std::string("[FAIL] ") + description << std::endl;
18276        throw std::runtime_error(description);
18277    }
repeat (np_test_1_all.cpp:18268)
18258    // Create test array
18259    auto array = createInt32Array({ 2, 3 }, 0);
18260    for (size_t i = 0; i < 2; ++i) {
18261      for (size_t j = 0; j < 3; ++j) {
18262        array.setElementAt({ i, j }, static_cast<int32_t>(i * 3 + j + 1));
18263      }
18264    }
18265
18266    // Test repeat without axis (flattened)
18267    auto repeated_flat = repeat(array, 2);
18268    if (!(repeated_flat.getShape()[0] == 12)) {
18269        std::string description = std::string("testRepeat():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(repeated_flat.getShape()[0] == 12)";
18270        std::cout << std::string("[FAIL] ") + description << std::endl;
18271        throw std::runtime_error(description);
18272    }
18273    if (!(repeated_flat.getElementAt({ 0 }) == 1)) {
18274        std::string description = std::string("testRepeat():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(repeated_flat.getElementAt({ 0 }) == 1)";
18275        std::cout << std::string("[FAIL] ") + description << std::endl;
18276        throw std::runtime_error(description);
18277    }
copy (np_test_1_all.cpp:9812)
9802    //original.printArray();
9803
9804    // The modification should be at position (1,1) in original
9805    if (!(original.getElementAt({1, 1}) == 9999)) {
9806        std::string description = std::string("testSliceCopyVsViewMemoryOwnership():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(original.getElementAt({1, 1}) == 9999)";
9807        std::cout << std::string("[FAIL] ") + description << std::endl;
9808        throw std::runtime_error(description);
9809    }
9810    // std::cout << "[OK] Slice view shares memory with original";
9811
9812    // Test slice copy (should be independent)
9813    auto slice_copy = original.sliceArray({{2, 4}, {2, 4}});
9814    // std::cout << "Slice copy [2:4, 2:4]:";
9815    //slice_copy.printArray();
9816
9817    slice_copy.setElementAt({0, 0}, 7777);
9818
9819    // std::cout << "After modifying slice copy at (0,0):" << std::endl;
9820    // std::cout << "Original array:" << std::endl;
9821    //original.printArray();
9822    // std::cout << "Slice copy:" << std::endl;
view (np_test_1_all.cpp:440)
430    for (size_t i = 0; i < 3; ++i) {
431        for (size_t j = 0; j < 3; ++j) {
432            original.setElementAt({i, j}, static_cast<int32_t>(i * 3 + j));
433        }
434    }
435
436    // std::cout << "Original array:" << std::endl;
437    //original.printArray();
438
439    // Create multiple views
440    auto view1 = original.view();
441    auto view2 = original.transposeView();
442    auto view3 = original.sliceView({{1, 3}, {1, 3}});
443
444    // Modify through different views
445    view1.setElementAt({0, 0}, 100);
446    view2.setElementAt({2, 1}, 200);  // This is (1, 2) in original
447    view3.setElementAt({0, 0}, 300);  // This is (1, 1) in original
448
449    // std::cout << "After modifications through multiple views:" << std::endl;
450    //original.printArray();
is_numeric (np_test_1_all.cpp:7511)
7501    std::cout << " -> tests passed" << std::endl;
7502}
7503
7504void testNumericConversionStringTypes() {
7505    std::cout << "========= testNumericStringOperationsStringTypes =======================";
7506
7507    str32 num_str1("123.45");
7508    str32 num_str2("67.89");
7509    str32 not_num("hello");
7510
7511    // std::cout << "String '" << num_str1 << "' is numeric: " << is_numeric(num_str1) << std::endl;
7512    // std::cout << "String '" << not_num << "' is numeric: " << is_numeric(not_num) << std::endl;
7513
7514    if (is_numeric(num_str1)) {
7515        double val1 = to_numeric(num_str1);
7516        // std::cout << "Numeric value of '" << num_str1 << "': " << val1 << std::endl;
7517    }
7518
7519    if (is_numeric(num_str2)) {
7520        double val2 = to_numeric(num_str2);
7521        // std::cout << "Numeric value of '" << num_str2 << "': " << val2 << std::endl;
is_unique (np_test_1_all.cpp:19676)
19666    unique_array.setElementAt({ 1 }, 2);
19667    unique_array.setElementAt({ 2 }, 3);
19668    unique_array.setElementAt({ 3 }, 4);
19669
19670    auto duplicate_array = createInt32Array({ 4 }, 0);
19671    duplicate_array.setElementAt({ 0 }, 1);
19672    duplicate_array.setElementAt({ 1 }, 2);
19673    duplicate_array.setElementAt({ 2 }, 2);  // Duplicate
19674    duplicate_array.setElementAt({ 3 }, 4);
19675
19676    if (!(set_ops::is_unique(unique_array) == true)) {
19677        std::string description = std::string("testUtilityFunctions():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(set_ops::is_unique(unique_array) == true)";
19678        std::cout << std::string("[FAIL] ") + description << std::endl;
19679        throw std::runtime_error(description);
19680    }
19681    if (!(set_ops::is_unique(duplicate_array) == false)) {
19682        std::string description = std::string("testUtilityFunctions():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(set_ops::is_unique(duplicate_array) == false)";
19683        std::cout << std::string("[FAIL] ") + description << std::endl;
19684        throw std::runtime_error(description);
19685    }
19686    // std::cout << "[OK] is_unique function works correctly\n";
argmax (np_test_3_all.cpp:20521)
20511    auto result = numpy::argmin(arr);
20512    // Should return 1 (index of (1,5))
20513    if (result.getElementAt({0}) != 1) {
20514        throw std::runtime_error("argmin() failed: expected index 1");
20515    }
20516    std::cout << "PASSED\n";
20517}
20518
20519void test_argmax_complex128() {
20520    std::cout << "  Testing argmax() with complex128... ";
20521    numpy::NDArray<complex128> arr({3});
20522    arr.setElementAt({0}, complex128(3.0, 1.0));  // index 0 - largest
20523    arr.setElementAt({1}, complex128(1.0, 5.0));  // index 1
20524    arr.setElementAt({2}, complex128(2.0, 2.0));  // index 2
20525
20526    auto result = numpy::argmax(arr);
20527    // Should return 0 (index of (3,1))
20528    if (result.getElementAt({0}) != 0) {
20529        throw std::runtime_error("argmax() failed: expected index 0");
20530    }
argmin (np_test_3_all.cpp:20506)
20496    if (min_result.getElementAt({0}).real() != 2.0 || min_result.getElementAt({0}).imag() != 1.0) {
20497        throw std::runtime_error("min() tie-breaking failed: expected (2,1)");
20498    }
20499    if (max_result.getElementAt({0}).real() != 2.0 || max_result.getElementAt({0}).imag() != 5.0) {
20500        throw std::runtime_error("max() tie-breaking failed: expected (2,5)");
20501    }
20502    std::cout << "PASSED\n";
20503}
20504
20505void test_argmin_complex128() {
20506    std::cout << "  Testing argmin() with complex128... ";
20507    numpy::NDArray<complex128> arr({3});
20508    arr.setElementAt({0}, complex128(3.0, 1.0));  // index 0
20509    arr.setElementAt({1}, complex128(1.0, 5.0));  // index 1 - smallest
20510    arr.setElementAt({2}, complex128(2.0, 2.0));  // index 2
20511
20512    auto result = numpy::argmin(arr);
20513    // Should return 1 (index of (1,5))
20514    if (result.getElementAt({0}) != 1) {
20515        throw std::runtime_error("argmin() failed: expected index 1");
20516    }
arr (np_test_1_all.cpp:1388)
1378        std::cout << std::string("[FAIL] ") + description << std::endl;
1379        throw std::runtime_error(description);
1380    }
1381    if (!(*str_obj.get_as<std::string>() == "hello")) {
1382        std::string description = std::string("testObjectConstruction():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(*str_obj.get_as<std::string>() == \"hello\")";
1383        std::cout << std::string("[FAIL] ") + description << std::endl;
1384        throw std::runtime_error(description);
1385    }
1386
1387    // Test NDArray construction
1388    NDArray<double> arr({2, 2}, 3.14);
1389    object_ arr_obj(arr);
1390    if (!(!arr_obj.is_null())) {
1391        std::string description = std::string("testObjectConstruction():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(!arr_obj.is_null())";
1392        std::cout << std::string("[FAIL] ") + description << std::endl;
1393        throw std::runtime_error(description);
1394    }
1395    if (!(arr_obj.is_array())) {
1396        std::string description = std::string("testObjectConstruction():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(arr_obj.is_array())";
1397        std::cout << std::string("[FAIL] ") + description << std::endl;
1398        throw std::runtime_error(description);
clone (np_test_1_all.cpp:24942)
24932      }
24933
24934      // Test reproducibility
24935      numpy::random::PCG64DXSM rng2(11111);
24936      if (rng2.next_uint64() != val) {
24937        std::cout << "  [FAIL] : in np_test_bitgen_pcg64dxsm() : not reproducible";
24938        throw std::runtime_error("np_test_bitgen_pcg64dxsm failed");
24939      }
24940
24941      // Test clone
24942      auto cloned = rng.clone();
24943      if (cloned->name() != "PCG64DXSM") {
24944        std::cout << "  [FAIL] : in np_test_bitgen_pcg64dxsm() : clone name incorrect";
24945        throw std::runtime_error("np_test_bitgen_pcg64dxsm failed");
24946      }
24947
24948      std::cout << " -> tests passed" << std::endl;
24949    }
24950
24951    // ============================================================================
24952    // PHILOX TESTS
contains (np_test_2_all.cpp:10521)
10511      auto npz_file = load_npz(TEMP_DIR + "test_multiple.npz");
10512
10513      // Verify keys
10514      auto keys = npz_file.keys();
10515      if (!(keys.size() == 3)) {
10516          std::string description = std::string("testNPZOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(keys.size() == 3)";
10517          std::cout << std::string("[FAIL] ") + description << std::endl;
10518          throw std::runtime_error(description);
10519      }
10520      if (!(npz_file.contains("integers"))) {
10521          std::string description = std::string("testNPZOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(npz_file.contains(\"integers\"))";
10522          std::cout << std::string("[FAIL] ") + description << std::endl;
10523          throw std::runtime_error(description);
10524      }
10525      if (!(npz_file.contains("floats"))) {
10526          std::string description = std::string("testNPZOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(npz_file.contains(\"floats\"))";
10527          std::cout << std::string("[FAIL] ") + description << std::endl;
10528          throw std::runtime_error(description);
10529      }
10530      if (!(npz_file.contains("complex_nums"))) {
counts (np_test_1_all.cpp:19042)
19032        std::string description = std::string("testUniqueOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(unique_full_result.values.getSize() == 4)";
19033        std::cout << std::string("[FAIL] ") + description << std::endl;
19034        throw std::runtime_error(description);
19035    }
19036    if (!(unique_full_result.counts.getSize() == 4)) {
19037        std::string description = std::string("testUniqueOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(unique_full_result.counts.getSize() == 4)";
19038        std::cout << std::string("[FAIL] ") + description << std::endl;
19039        throw std::runtime_error(description);
19040    }
19041
19042    // Check counts (1 appears 2 times, 2 appears 2 times, 3 appears 2 times, 4 appears 1 time)
19043    if (!(unique_full_result.counts.getElementAt({ 0 }) == 2)) {
19044        std::string description = std::string("testUniqueOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(unique_full_result.counts.getElementAt({ 0 }) == 2)";
19045        std::cout << std::string("[FAIL] ") + description << std::endl;
19046        throw std::runtime_error(description);
19047    }
19048    if (!(unique_full_result.counts.getElementAt({ 1 }) == 2)) {
19049        std::string description = std::string("testUniqueOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(unique_full_result.counts.getElementAt({ 1 }) == 2)";
19050        std::cout << std::string("[FAIL] ") + description << std::endl;
19051        throw std::runtime_error(description);
19052    }
diff (np_test_2_all.cpp:4947)
4937      // Test matrix addition and subtraction
4938      numpy::Matrix<double> a("1 2; 3 4");
4939      numpy::Matrix<double> b("5 6; 7 8");
4940
4941      auto sum = a + b;
4942      assert_test(std::abs(sum(0, 0) - 6.0) < 1e-10, "Matrix addition");
4943      assert_test(std::abs(sum(1, 1) - 12.0) < 1e-10, "Matrix addition");
4944
4945      auto diff = b - a;
4946      assert_test(std::abs(diff(0, 0) - 4.0) < 1e-10, "Matrix subtraction");
4947      assert_test(std::abs(diff(1, 1) - 4.0) < 1e-10, "Matrix subtraction");
4948
4949      // Test matrix multiplication (not element-wise!)
4950      auto product = a * b;
4951      assert_test(std::abs(product(0, 0) - 19.0) < 1e-10, "Matrix multiplication 0,0");
4952      assert_test(std::abs(product(0, 1) - 22.0) < 1e-10, "Matrix multiplication 0,1");
4953      assert_test(std::abs(product(1, 0) - 43.0) < 1e-10, "Matrix multiplication 1,0");
4954      assert_test(std::abs(product(1, 1) - 50.0) < 1e-10, "Matrix multiplication 1,1");
4955
4956      // Test scalar multiplication
difference (np_test_1_all.cpp:19333)
19323        std::cout << std::string("[FAIL] ") + description << std::endl;
19324        throw std::runtime_error(description);
19325    }
19326    if (!(difference.getElementAt({ 2 }) == 5)) {
19327        std::string description = std::string("testSetDifferenceOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(difference.getElementAt({ 2 }) == 5)";
19328        std::cout << std::string("[FAIL] ") + description << std::endl;
19329        throw std::runtime_error(description);
19330    }
19331    // std::cout << "[OK] Set difference works correctly\n";
19332
19333    // Test symmetric difference (XOR)
19334    auto xor_result = setxor1d(arr1, arr2);
19335
19336    if (!(xor_result.getSize() == 4)) {
19337        std::string description = std::string("testSetDifferenceOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(xor_result.getSize() == 4)";
19338        std::cout << std::string("[FAIL] ") + description << std::endl;
19339        throw std::runtime_error(description);
19340    }
19341    if (!(xor_result.getElementAt({ 0 }) == 1)) {
19342        std::string description = std::string("testSetDifferenceOperations():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(xor_result.getElementAt({ 0 }) == 1)";
19343        std::cout << std::string("[FAIL] ") + description << std::endl;
dtype_name (np_test_2_all.cpp:3567)
3557          std::cout << std::string("[FAIL] ") + description << std::endl;
3558          throw std::runtime_error(description);
3559      }
3560      if (!(flags_info.writeable == true)) {
3561          std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(flags_info.writeable == true)";
3562          std::cout << std::string("[FAIL] ") + description << std::endl;
3563          throw std::runtime_error(description);
3564      }
3565
3566      // Test dtype functions
3567      if (!(dtype_name(arr) == "float64")) {
3568          std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(dtype_name(arr) == \"float64\")";
3569          std::cout << std::string("[FAIL] ") + description << std::endl;
3570          throw std::runtime_error(description);
3571      }
3572      if (!(dtype_itemsize(arr) == sizeof(double))) {
3573          std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(dtype_itemsize(arr) == sizeof(double))";
3574          std::cout << std::string("[FAIL] ") + description << std::endl;
3575          throw std::runtime_error(description);
3576      }
format (main.cpp:22)
12int main() {
13  // Automatically log all output to temp/test_output.log
14  numpy::TestLogger logger("temp/test_output.log");
15
16  int res = 0;
17  int res1 = 0;
18  std::string resS = "";
19
20  // call all the tests
21  res1 = numpy_tests::np_test_main();
22  resS += std::format("             np_test_main: {}  errors\n", res1);
23  res += res1;
24
25  std::cout << "\n------------------------- main --------------------------------------------\n";
26  std::cout << std::endl << "All tests completed. Nb errors = " << res << std::endl;
27  std::cout << "Details: \n" << resS;
28  std::cout << "\n---------------------------------------------------------------------------\n";
29  return res;
30}
join (np_test_5_all.cpp:1341)
1331    // ============================================================================
1332
1333    void np_test_string_join() {
1334      std::cout << "========= join operation =======================";
1335
1336      // Join takes a separator string and vector of CharArrays
1337      std::vector<numpy::CharArray<32>> arrays;
1338      arrays.push_back(numpy::char_::array<32>({ "a", "b", "c" }));
1339      arrays.push_back(numpy::char_::array<32>({ "x", "y", "z" }));
1340
1341      auto result = numpy::char_::join("-", arrays);
1342
1343      bool passed = true;
1344
1345      if (!passed) {
1346        std::cout << "  [FAIL] : in np_test_string_join() : join operation failed";
1347        throw std::runtime_error("np_test_string_join failed");
1348      }
1349
1350      std::cout << " -> tests passed" << std::endl;
1351    }
name (np_test_1_all.cpp:24865)
24855      uint64_t before_restore = rng.next_uint64();
24856      rng.set_state(state);
24857      uint64_t after_restore = rng.next_uint64();
24858
24859      if (before_restore != after_restore) {
24860        std::cout << "  [FAIL] : in np_test_bitgen_mt19937() : state restore failed";
24861        throw std::runtime_error("np_test_bitgen_mt19937 failed: state");
24862      }
24863
24864      // Test name
24865      if (rng.name() != "MT19937") {
24866        std::cout << "  [FAIL] : in np_test_bitgen_mt19937() : incorrect name";
24867        throw std::runtime_error("np_test_bitgen_mt19937 failed: name");
24868      }
24869
24870      std::cout << " -> tests passed" << std::endl;
24871    }
24872
24873    // ============================================================================
24874    // PCG64 TESTS
24875    // ============================================================================
nbytes (np_test_2_all.cpp:3547)
3537      }
3538
3539      // Test itemsize
3540      if (!(itemsize(arr) == sizeof(double))) {
3541          std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(itemsize(arr) == sizeof(double))";
3542          std::cout << std::string("[FAIL] ") + description << std::endl;
3543          throw std::runtime_error(description);
3544      }
3545
3546      // Test nbytes
3547      if (!(nbytes(arr) == 24 * sizeof(double))) {
3548          std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(nbytes(arr) == 24 * sizeof(double))";
3549          std::cout << std::string("[FAIL] ") + description << std::endl;
3550          throw std::runtime_error(description);
3551      }
3552
3553      // Test flags
3554      auto flags_info = flags(arr);
3555      if (!(flags_info.owndata == true)) {
3556          std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(flags_info.owndata == true)";
3557          std::cout << std::string("[FAIL] ") + description << std::endl;
result (np_test_1_all.cpp:6090)
6080        throw std::runtime_error(description);
6081    }
6082    // std::cout << "Timer restart test passed. Second: " << second_elapsed << " ms" << std::endl;
6083
6084    std::cout << " -> tests passed" << std::endl;
6085}
6086
6087void test_benchmark_result_storageBenchmarkSorting() {
6088    std::cout << "========= test_benchmark_result_storage =======================";
6089
6090    BenchmarkResult result("TestAlgorithm", 1000, 15.5, true, 4096);
6091
6092    if (!(result.algorithm_name == "TestAlgorithm")) {
6093        std::string description = std::string("test_benchmark_result_storageBenchmarkSorting():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(result.algorithm_name == \"TestAlgorithm\")";
6094        std::cout << std::string("[FAIL] ") + description << std::endl;
6095        throw std::runtime_error(description);
6096    }
6097    if (!(result.array_size == 1000)) {
6098        std::string description = std::string("test_benchmark_result_storageBenchmarkSorting():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(result.array_size == 1000)";
6099        std::cout << std::string("[FAIL] ") + description << std::endl;
6100        throw std::runtime_error(description);
shift (np_test_1_all.cpp:2761)
2751        throw std::runtime_error(description);
2752    }
2753    if (!(left_array.getElementAt({3}) == 16384)) {
2754        std::string description = std::string("testBitShifts():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(left_array.getElementAt({3}) == 16384)";
2755        std::cout << std::string("[FAIL] ") + description << std::endl;
2756        throw std::runtime_error(description);
2757    }
2758
2759    // std::cout << "[OK] Left shift by array\n";
2760
2761    // Test excessive shift (should result in 0)
2762    auto excessive_left = left_shift(arr, 20); // More than 16 bits
2763    if (!(excessive_left.getElementAt({0}) == 0)) {
2764        std::string description = std::string("testBitShifts():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(excessive_left.getElementAt({0}) == 0)";
2765        std::cout << std::string("[FAIL] ") + description << std::endl;
2766        throw std::runtime_error(description);
2767    }
2768    if (!(excessive_left.getElementAt({1}) == 0)) {
2769        std::string description = std::string("testBitShifts():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(excessive_left.getElementAt({1}) == 0)";
2770        std::cout << std::string("[FAIL] ") + description << std::endl;
2771        throw std::runtime_error(description);
size (np_test_1_all.cpp:47)
37using namespace numpy;
38using namespace numpy::benchmark;
39using namespace numpy::char_;
40
41// Helper functions for array comparison tests
42namespace {
43    const double TOLERANCE = 1e-10;
44
45    bool allTrue(const NDArray<bool>& arr) {
46        std::vector<size_t> indices(arr.getShape().size(), 0);
47        do {
48            if (!arr.getElementAt(indices)) {
49                return false;
50            }
51        } while (incrementIndices(indices, arr.getShape()));
52        return true;
53    }
54
55    bool allFalse(const NDArray<bool>& arr) {
56        std::vector<size_t> indices(arr.getShape().size(), 0);
slice (np_test_1_all.cpp:13009)
12999    // Test substr valid start but excessive length
13000    auto result3 = str1.substr(2, 10);  // start=2, len=10 on string of length 5
13001    if (!(result3.to_string() == "llo")) {
13002        std::string description = std::string("test_variable_string_out_of_bounds():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(result3.to_string() == \"llo\")";
13003        std::cout << std::string("[FAIL] ") + description << std::endl;
13004        throw std::runtime_error(description);
13005    }
13006    // std::cout << "[OK] vstring_ substr(2, 10) on 'hello' returns 'llo'\n";
13007
13008    // Test slice method with out-of-bounds
13009    auto result4 = str1.slice(10, 15);  // slice[10:15] on string of length 5
13010    if (!(result4.to_string() == "")) {
13011        std::string description = std::string("test_variable_string_out_of_bounds():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(result4.to_string() == \"\")";
13012        std::cout << std::string("[FAIL] ") + description << std::endl;
13013        throw std::runtime_error(description);
13014    }
13015    // std::cout << "[OK] vstring_ slice(10, 15) on 'hello' returns empty string\n";
13016
13017    // Test slice with negative indices
13018    auto result5 = str1.slice(-2, -1);  // slice[-2:-1] should be "l"
13019    if (!(result5.to_string() == "l")) {
start (np_test_1_all.cpp:6043)
6033    std::cout << " -> tests passed" << std::endl;
6034}
6035
6036// ------ merging np_test_benchmark_sorting.cpp -- number of functions merged= 11 --------------------------------
6037
6038void test_timer_accuracyBenchmarkSorting() {
6039    std::cout << "========= test_timer_accuracy =======================";
6040
6041    Timer timer;
6042    timer.start();
6043
6044    // Sleep for a known duration (10ms)
6045    std::this_thread::sleep_for(std::chrono::milliseconds(10));
6046
6047    double elapsed = timer.elapsed_milliseconds();
6048
6049    // Timer should be approximately 10ms (allow 5ms tolerance for system variance)
6050    if (!(elapsed >= 3.0 && elapsed <= 105.0)) {
6051        std::string description = std::string("test_timer_accuracyBenchmarkSorting():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(elapsed >= 3.0 && elapsed <= 105.0)";
6052        std::cout << std::string("[FAIL] ") + description << std::endl;
step (np_test_1_all.cpp:6929)
6919    // Create array of dates
6920    datetime64 start("2024-01-01");
6921    auto date_array = createDateTimeArray({5}, start);
6922
6923    // std::cout << "Array of 5 dates initialized to 2024-01-01:" << std::endl;
6924    //date_array.printArray();
6925
6926    // Create date range
6927    datetime64 range_start("2024-01-01");
6928    datetime64 range_end("2024-01-10");
6929    timedelta64 step(1, DateTimeUnit::Day);
6930
6931    auto date_range = createDateRange(range_start, range_end, step);
6932    // std::cout << "Date range from 2024-01-01 to 2024-01-10:" << std::endl;
6933    //date_range.printArray();
6934
6935    // Create timedelta array
6936    timedelta64 one_day(1, DateTimeUnit::Day);
6937    auto timedelta_array = createTimeDeltaArray({3}, one_day);
6938
6939    // std::cout << "Array of 3 timedeltas (1 day each):" << std::endl;