DatetimeArray#
-
class numpy::DatetimeArray#
numpy C++ class.
Example#
#include <numpy/np_ndarray.h>
using namespace numpy;
// Use DatetimeArray
DatetimeArray obj;
// ... operations ...
Constructors#
Signature |
Location |
Example |
|---|---|---|
|
df_datetime_array.h:77 |
|
|
df_datetime_array.h:95 |
|
|
df_datetime_array.h:141 |
|
|
df_datetime_array.h:163 |
Construction#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
static DatetimeArray |
df_datetime_array.h:389 |
Array Creation#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
bool |
df_datetime_array.h:230 |
Indexing / Selection#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
numpy::datetime64 |
df_datetime_array.h:296 |
|
|
DatetimeArray |
df_datetime_array.h:343 |
Statistics#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
std::optional<numpy::datetime64> |
df_datetime_array.h:770 |
|
|
std::optional<numpy::datetime64> |
df_datetime_array.h:761 |
|
|
IntegerArray<numpy::int32> |
df_datetime_array.h:859 |
Sorting#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
numpy::NDArray<size_t> |
df_datetime_array.h:690 |
Linear Algebra#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
void |
df_datetime_array.h:1268 |
|
|
DatetimeArray |
df_datetime_array.h:1149 |
Set Operations#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
DatetimeArray |
df_datetime_array.h:628 |
I/O#
Type Handling#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
DatetimeArray |
df_datetime_array.h:336 |
Type Checking#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
BooleanArray |
df_datetime_array.h:1085 |
|
|
BooleanArray |
df_datetime_array.h:980 |
|
|
BooleanArray |
df_datetime_array.h:961 |
|
|
bool |
df_datetime_array.h:307 |
|
|
BooleanArray |
df_datetime_array.h:1023 |
|
|
BooleanArray |
df_datetime_array.h:1002 |
|
|
bool |
df_datetime_array.h:258 |
|
|
BooleanArray |
df_datetime_array.h:1066 |
|
|
BooleanArray |
df_datetime_array.h:1047 |
Other Methods#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
std::optional<size_t> |
df_datetime_array.h:741 |
|
|
std::optional<size_t> |
df_datetime_array.h:721 |
|
|
static DatetimeArray |
df_datetime_array.h:397 |
|
|
size_t |
df_datetime_array.h:466 |
|
|
const numpy::NDArray<numpy::datetime64>& |
df_datetime_array.h:269 |
|
|
IntegerArray<numpy::int32> |
df_datetime_array.h:821 |
|
|
IntegerArray<numpy::int32> |
df_datetime_array.h:897 |
|
|
IntegerArray<numpy::int32> |
df_datetime_array.h:918 |
|
|
DatetimeArray |
df_datetime_array.h:440 |
|
|
numpy::datetime64 |
df_datetime_array.h:176 |
|
|
dtype_type |
df_datetime_array.h:195 |
|
|
std::pair<numpy::NDArray<numpy::int64>, DatetimeArray> |
df_datetime_array.h:654 |
|
|
DatetimeArray |
df_datetime_array.h:426 |
|
|
bool |
df_datetime_array.h:479 |
|
|
IntegerArray<numpy::int32> |
df_datetime_array.h:840 |
|
|
numpy::NDArray<numpy::bool_> |
df_datetime_array.h:318 |
|
|
size_t |
df_datetime_array.h:237 |
|
|
const numpy::NDArray<numpy::bool_>& |
df_datetime_array.h:276 |
|
|
IntegerArray<numpy::int32> |
df_datetime_array.h:802 |
|
|
size_t |
df_datetime_array.h:209 |
|
|
constexpr int |
df_datetime_array.h:216 |
|
|
numpy::NDArray<numpy::bool_> |
df_datetime_array.h:325 |
|
|
IntegerArray<numpy::int32> |
df_datetime_array.h:937 |
|
|
std::string |
df_datetime_array.h:1237 |
|
|
IntegerArray<numpy::int32> |
df_datetime_array.h:878 |
|
|
std::vector<size_t> |
df_datetime_array.h:223 |
|
|
size_t |
df_datetime_array.h:202 |
|
|
std::shared_ptr<numpy::TimezoneInfo> |
df_datetime_array.h:251 |
|
|
DatetimeArray |
df_datetime_array.h:1197 |
|
|
DatetimeArray |
df_datetime_array.h:1211 |
|
|
DatetimeArray |
df_datetime_array.h:1175 |
|
|
DatetimeArray |
df_datetime_array.h:1188 |
|
|
numpy::DateTimeUnit |
df_datetime_array.h:244 |
|
|
void |
df_datetime_array.h:1250 |
|
|
IntegerArray<numpy::int32> |
df_datetime_array.h:783 |
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);
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 }
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
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>())";
minute (np_test_5_all.cpp:22186)
22176 errors++;
22177 }
22178
22179 numpy::Timedelta td3("45s");
22180 if (std::abs(td3.total_seconds() - 45.0) > 0.0001) {
22181 std::cout << "[FAIL] np_test_timedelta_edge_cases: '45s' expected 45 sec"
22182 << std::endl;
22183 errors++;
22184 }
22185
22186 numpy::Timedelta td4("NaT");
22187 if (!td4.isNaT()) {
22188 std::cout << "[FAIL] np_test_timedelta_edge_cases: 'NaT' should parse to NaT"
22189 << std::endl;
22190 errors++;
22191 }
22192 }
22193
22194 // Stream operator
22195 {
22196 numpy::Timedelta td(1, 2, 30);
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;
normalize (np_test_5_all.cpp:22817)
22807 if (str.find("2024") == std::string::npos) { pass = false; fail_msg = "toString should contain year"; }
22808
22809 // isoformat
22810 std::string iso = ts.isoformat();
22811 if (iso.find("2024-06-15") == std::string::npos) { pass = false; fail_msg = "isoformat should contain date"; }
22812
22813 // isoformat with space separator
22814 std::string iso_space = ts.isoformat(' ');
22815 if (iso_space.find(" ") == std::string::npos) { pass = false; fail_msg = "isoformat with space separator"; }
22816
22817 // strftime
22818 std::string fmt = ts.strftime("%Y/%m/%d");
22819 if (fmt != "2024/06/15") { pass = false; fail_msg = "strftime format"; }
22820
22821 // ctime
22822 std::string ct = ts.ctime();
22823 if (ct.find("2024") == std::string::npos) { pass = false; fail_msg = "ctime should contain year"; }
22824
22825 // day_name
22826 std::string dayname = ts.day_name();
22827 if (dayname != "Saturday") { pass = false; fail_msg = "2024-06-15 is Saturday"; }
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)";
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;
is_leap_year (np_test_5_all.cpp:22577)
22567 numpy::Timestamp::strptime("", "%Y-%m-%d");
22568 } catch (const std::invalid_argument&) {
22569 threw = true;
22570 }
22571 if (!threw) {
22572 throw std::runtime_error("strptime failed: should throw for empty string");
22573 }
22574
22575 // Test 9: Empty format should throw
22576 threw = false;
22577 try {
22578 numpy::Timestamp::strptime("2024-03-15", "");
22579 } catch (const std::invalid_argument&) {
22580 threw = true;
22581 }
22582 if (!threw) {
22583 throw std::runtime_error("strptime failed: should throw for empty format");
22584 }
22585
22586 // Test 10: Literal percent
22587 numpy::Timestamp ts10 = numpy::Timestamp::strptime("100%2024-03-15", "100%%%Y-%m-%d");
is_month_end (np_test_5_all.cpp:22590)
22580 threw = true;
22581 }
22582 if (!threw) {
22583 throw std::runtime_error("strptime failed: should throw for empty format");
22584 }
22585
22586 // Test 10: Literal percent
22587 numpy::Timestamp ts10 = numpy::Timestamp::strptime("100%2024-03-15", "100%%%Y-%m-%d");
22588 if (ts10.year() != 2024) {
22589 throw std::runtime_error("strptime failed: literal percent parsing");
22590 }
22591
22592 std::cout << " -> tests passed" << std::endl;
22593 }
22594
22595 // ============================================================================
22596 // COMPONENT PROPERTIES TESTS
22597 // ============================================================================
22598
22599 void np_test_timestamp_properties() {
22600 std::cout << "========= timestamp: component properties ========================";
is_month_start (np_test_5_all.cpp:22585)
22575 // Test 9: Empty format should throw
22576 threw = false;
22577 try {
22578 numpy::Timestamp::strptime("2024-03-15", "");
22579 } catch (const std::invalid_argument&) {
22580 threw = true;
22581 }
22582 if (!threw) {
22583 throw std::runtime_error("strptime failed: should throw for empty format");
22584 }
22585
22586 // Test 10: Literal percent
22587 numpy::Timestamp ts10 = numpy::Timestamp::strptime("100%2024-03-15", "100%%%Y-%m-%d");
22588 if (ts10.year() != 2024) {
22589 throw std::runtime_error("strptime failed: literal percent parsing");
22590 }
22591
22592 std::cout << " -> tests passed" << std::endl;
22593 }
22594
22595 // ============================================================================
is_quarter_end (np_test_5_all.cpp:22591)
22581 }
22582 if (!threw) {
22583 throw std::runtime_error("strptime failed: should throw for empty format");
22584 }
22585
22586 // Test 10: Literal percent
22587 numpy::Timestamp ts10 = numpy::Timestamp::strptime("100%2024-03-15", "100%%%Y-%m-%d");
22588 if (ts10.year() != 2024) {
22589 throw std::runtime_error("strptime failed: literal percent parsing");
22590 }
22591
22592 std::cout << " -> tests passed" << std::endl;
22593 }
22594
22595 // ============================================================================
22596 // COMPONENT PROPERTIES TESTS
22597 // ============================================================================
22598
22599 void np_test_timestamp_properties() {
22600 std::cout << "========= timestamp: component properties ========================";
is_quarter_start (np_test_5_all.cpp:22586)
22576 threw = false;
22577 try {
22578 numpy::Timestamp::strptime("2024-03-15", "");
22579 } catch (const std::invalid_argument&) {
22580 threw = true;
22581 }
22582 if (!threw) {
22583 throw std::runtime_error("strptime failed: should throw for empty format");
22584 }
22585
22586 // Test 10: Literal percent
22587 numpy::Timestamp ts10 = numpy::Timestamp::strptime("100%2024-03-15", "100%%%Y-%m-%d");
22588 if (ts10.year() != 2024) {
22589 throw std::runtime_error("strptime failed: literal percent parsing");
22590 }
22591
22592 std::cout << " -> tests passed" << std::endl;
22593 }
22594
22595 // ============================================================================
22596 // COMPONENT PROPERTIES TESTS
is_year_end (np_test_5_all.cpp:22589)
22579 } catch (const std::invalid_argument&) {
22580 threw = true;
22581 }
22582 if (!threw) {
22583 throw std::runtime_error("strptime failed: should throw for empty format");
22584 }
22585
22586 // Test 10: Literal percent
22587 numpy::Timestamp ts10 = numpy::Timestamp::strptime("100%2024-03-15", "100%%%Y-%m-%d");
22588 if (ts10.year() != 2024) {
22589 throw std::runtime_error("strptime failed: literal percent parsing");
22590 }
22591
22592 std::cout << " -> tests passed" << std::endl;
22593 }
22594
22595 // ============================================================================
22596 // COMPONENT PROPERTIES TESTS
22597 // ============================================================================
22598
22599 void np_test_timestamp_properties() {
is_year_start (np_test_5_all.cpp:22584)
22574 // Test 9: Empty format should throw
22575 threw = false;
22576 try {
22577 numpy::Timestamp::strptime("2024-03-15", "");
22578 } catch (const std::invalid_argument&) {
22579 threw = true;
22580 }
22581 if (!threw) {
22582 throw std::runtime_error("strptime failed: should throw for empty format");
22583 }
22584
22585 // Test 10: Literal percent
22586 numpy::Timestamp ts10 = numpy::Timestamp::strptime("100%2024-03-15", "100%%%Y-%m-%d");
22587 if (ts10.year() != 2024) {
22588 throw std::runtime_error("strptime failed: literal percent parsing");
22589 }
22590
22591 std::cout << " -> tests passed" << std::endl;
22592 }
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 }
count (np_test_1_all.cpp:3616)
3606 // Create larger arrays for performance testing
3607 auto large_arr = NDArray<double>::createOnes({100, 100});
3608 auto broadcast_arr = NDArray<double>::createOnes({1, 100});
3609
3610 // Time the operation (basic timing)
3611 auto start = std::chrono::high_resolution_clock::now();
3612 auto result = large_arr.addArrays(broadcast_arr);
3613 auto end = std::chrono::high_resolution_clock::now();
3614
3615 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
3616 // std::cout << "Large array broadcasting took " << duration.count() << " microseconds" << std::endl;
3617
3618 // Verify result shape
3619 if (!((result.getShape() == std::vector<size_t>{100, 100}))) {
3620 std::string description = std::string("test_broadcasting_performance():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !((result.getShape() == std::vector<size_t>{100, 100}))";
3621 std::cout << std::string("[FAIL] ") + description << std::endl;
3622 throw std::runtime_error(description);
3623 }
3624 if (!(result.getElementAt({50, 50}) == 2.0)) {
3625 std::string description = std::string("test_broadcasting_performance():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(result.getElementAt({50, 50}) == 2.0)";
3626 std::cout << std::string("[FAIL] ") + description << std::endl;
data (np_test_1_all.cpp:2084)
2074 }
2075 if (!(derived_ptr->extra == 2)) {
2076 std::string description = std::string("testObjectHolderEdgeCases():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(derived_ptr->extra == 2)";
2077 std::cout << std::string("[FAIL] ") + description << std::endl;
2078 throw std::runtime_error(description);
2079 }
2080
2081 // Test 6: Large object handling
2082 struct LargeObject {
2083 std::vector<double> data;
2084 LargeObject() : data(10000, 3.14159) {} // Large object
2085 };
2086
2087 LargeObject large;
2088 object_ large_obj(large); // Should handle large objects
2089 if (!(!large_obj.is_null())) {
2090 std::string description = std::string("testObjectHolderEdgeCases():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(!large_obj.is_null())";
2091 std::cout << std::string("[FAIL] ") + description << std::endl;
2092 throw std::runtime_error(description);
2093 }
2094 if (!(large_obj.is_type<LargeObject>())) {
day (np_test_5_all.cpp:22185)
22175 << std::endl;
22176 errors++;
22177 }
22178
22179 numpy::Timedelta td3("45s");
22180 if (std::abs(td3.total_seconds() - 45.0) > 0.0001) {
22181 std::cout << "[FAIL] np_test_timedelta_edge_cases: '45s' expected 45 sec"
22182 << std::endl;
22183 errors++;
22184 }
22185
22186 numpy::Timedelta td4("NaT");
22187 if (!td4.isNaT()) {
22188 std::cout << "[FAIL] np_test_timedelta_edge_cases: 'NaT' should parse to NaT"
22189 << std::endl;
22190 errors++;
22191 }
22192 }
22193
22194 // Stream operator
22195 {
dayofweek (np_test_5_all.cpp:22547)
22537 throw std::runtime_error("strptime failed: American format parsing");
22538 }
22539
22540 // Test 4: 2-digit year
22541 numpy::Timestamp ts4 = numpy::Timestamp::strptime("03/15/24", "%m/%d/%y");
22542 if (ts4.year() != 2024) {
22543 throw std::runtime_error("strptime failed: 2-digit year parsing");
22544 }
22545
22546 // Test 5: With microseconds
22547 numpy::Timestamp ts5 = numpy::Timestamp::strptime("2024-03-15 14:30:45.123456", "%Y-%m-%d %H:%M:%S.%f");
22548 if (ts5.microsecond() != 123456) {
22549 throw std::runtime_error("strptime failed: microseconds parsing");
22550 }
22551
22552 // Test 6: 12-hour format with AM/PM
22553 numpy::Timestamp ts6 = numpy::Timestamp::strptime("03/15/2024 02:30:00 PM", "%m/%d/%Y %I:%M:%S %p");
22554 if (ts6.hour() != 14) {
22555 throw std::runtime_error("strptime failed: 12-hour format parsing");
22556 }
dayofyear (np_test_5_all.cpp:22549)
22539 // Test 4: 2-digit year
22540 numpy::Timestamp ts4 = numpy::Timestamp::strptime("03/15/24", "%m/%d/%y");
22541 if (ts4.year() != 2024) {
22542 throw std::runtime_error("strptime failed: 2-digit year parsing");
22543 }
22544
22545 // Test 5: With microseconds
22546 numpy::Timestamp ts5 = numpy::Timestamp::strptime("2024-03-15 14:30:45.123456", "%Y-%m-%d %H:%M:%S.%f");
22547 if (ts5.microsecond() != 123456) {
22548 throw std::runtime_error("strptime failed: microseconds parsing");
22549 }
22550
22551 // Test 6: 12-hour format with AM/PM
22552 numpy::Timestamp ts6 = numpy::Timestamp::strptime("03/15/2024 02:30:00 PM", "%m/%d/%Y %I:%M:%S %p");
22553 if (ts6.hour() != 14) {
22554 throw std::runtime_error("strptime failed: 12-hour format parsing");
22555 }
22556
22557 // Test 7: Day of year format
22558 numpy::Timestamp ts7 = numpy::Timestamp::strptime("2024-075", "%Y-%j");
dt (np_test_2_all.cpp:21934)
21924 {numpy::DateTimeUnit::Hour, "h"},
21925 {numpy::DateTimeUnit::Minute, "m"},
21926 {numpy::DateTimeUnit::Second, "s"},
21927 {numpy::DateTimeUnit::Millisecond, "ms"},
21928 {numpy::DateTimeUnit::Microsecond, "us"},
21929 {numpy::DateTimeUnit::Nanosecond, "ns"}
21930 };
21931
21932 // Test all datetime64 units
21933 for (const auto& test : tests) {
21934 numpy::datetime64 dt(1, test.unit);
21935 auto [unit_str, count] = numpy::datetime_utils::datetime_data(dt);
21936
21937 if (unit_str != test.expected_str || count != 1) {
21938 std::cout << " [FAIL] : in np_test_datetime_data_all_units() : datetime64 unit test failed for "
21939 << test.expected_str << ": got ('" << unit_str << "', " << count << ")" << std::endl;
21940 throw std::runtime_error("np_test_datetime_data_all_units failed: datetime64 unit mismatch");
21941 }
21942 }
21943
21944 std::cout << " -> tests passed" << std::endl;
dtype (np_test_3_all.cpp:7942)
7932 if (info.max != expected_max) {
7933 std::cerr << "[FAIL] IInfo<uint64_t>::max mismatch";
7934 throw std::runtime_error("IInfo uint64 max test failed");
7935 }
7936 // std::cout << "[OK] IInfo<uint64_t>::max = " << info.max << std::endl;
7937
7938 std::cout << " -> tests passed" << std::endl;
7939}
7940
7941// ============================================================================
7942// dtype() Tests - DType descriptor creation
7943// ============================================================================
7944
7945void np_test_dtype_from_string_integers() {
7946 std::cout << "========= np_test_dtype_from_string_integers =======================";
7947
7948 // Test integer type strings
7949 if (dtype("int8") != DType::INT8) {
7950 std::cerr << "[FAIL] dtype(\"int8\") should return INT8";
7951 throw std::runtime_error("dtype string test failed");
7952 }
hour (np_test_5_all.cpp:22186)
22176 errors++;
22177 }
22178
22179 numpy::Timedelta td3("45s");
22180 if (std::abs(td3.total_seconds() - 45.0) > 0.0001) {
22181 std::cout << "[FAIL] np_test_timedelta_edge_cases: '45s' expected 45 sec"
22182 << std::endl;
22183 errors++;
22184 }
22185
22186 numpy::Timedelta td4("NaT");
22187 if (!td4.isNaT()) {
22188 std::cout << "[FAIL] np_test_timedelta_edge_cases: 'NaT' should parse to NaT"
22189 << std::endl;
22190 errors++;
22191 }
22192 }
22193
22194 // Stream operator
22195 {
22196 numpy::Timedelta td(1, 2, 30);
mask (np_test_1_all.cpp:27691)
27681 void test_mask_rows_cols() {
27682 std::cout << "========= ma::mask_rows() and ma::mask_cols(): mask operations ===";
27683
27684 auto data = numpy::array({ {1.0, 2.0, 3.0}, {4.0, 5.0, 6.0} });
27685 auto mask = numpy::array({ {false, true, false}, {false, false, false} });
27686 auto ma = numpy::ma::masked_array(data, mask);
27687
27688 auto result_rows = numpy::ma::mask_rows(ma);
27689 auto result_cols = numpy::ma::mask_cols(ma);
27690
27691 // std::cout << " ma::mask_rows(): row 0 fully masked: " << (result_rows.mask().getElementAt({ 0, 0 }) ? "true" : "false") << std::endl;
27692 // std::cout << " ma::mask_cols(): column 1 fully masked: " << (result_cols.mask().getElementAt({ 1, 1 }) ? "true" : "false");
27693 std::cout << " -> tests passed";
27694 }
27695
27696 void test_compress_rowcols() {
27697 std::cout << "========= ma::compress_rowcols(): remove masked rows/columns ===";
27698
27699 auto data = numpy::array({ {1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0} });
27700 auto mask = numpy::array({ {false, false, false}, {false, true, false}, {false, false, false} });
27701 auto ma = numpy::ma::masked_array(data, mask);
month (np_test_5_all.cpp:22185)
22175 << std::endl;
22176 errors++;
22177 }
22178
22179 numpy::Timedelta td3("45s");
22180 if (std::abs(td3.total_seconds() - 45.0) > 0.0001) {
22181 std::cout << "[FAIL] np_test_timedelta_edge_cases: '45s' expected 45 sec"
22182 << std::endl;
22183 errors++;
22184 }
22185
22186 numpy::Timedelta td4("NaT");
22187 if (!td4.isNaT()) {
22188 std::cout << "[FAIL] np_test_timedelta_edge_cases: 'NaT' should parse to NaT"
22189 << std::endl;
22190 errors++;
22191 }
22192 }
22193
22194 // Stream operator
22195 {
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;
ndim (np_test_2_all.cpp:3526)
3516 void testArrayInfo() {
3517 std::cout << "Testing array information functions...\n";
3518
3519 // Test basic info functions
3520 auto arr = createFloat64Array({ 2, 3, 4 });
3521 for (size_t i = 0; i < arr.getSize(); ++i) {
3522 arr.setElementAt({ i / 12, (i / 4) % 3, i % 4 }, static_cast<double>(i));
3523 }
3524
3525 // Test ndim
3526 if (!(ndim(arr) == 3)) {
3527 std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(ndim(arr) == 3)";
3528 std::cout << std::string("[FAIL] ") + description << std::endl;
3529 throw std::runtime_error(description);
3530 }
3531
3532 // Test size
3533 if (!(size(arr) == 24)) {
3534 std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(size(arr) == 24)";
3535 std::cout << std::string("[FAIL] ") + description << std::endl;
3536 throw std::runtime_error(description);
quarter (np_test_5_all.cpp:22551)
22541 numpy::Timestamp ts4 = numpy::Timestamp::strptime("03/15/24", "%m/%d/%y");
22542 if (ts4.year() != 2024) {
22543 throw std::runtime_error("strptime failed: 2-digit year parsing");
22544 }
22545
22546 // Test 5: With microseconds
22547 numpy::Timestamp ts5 = numpy::Timestamp::strptime("2024-03-15 14:30:45.123456", "%Y-%m-%d %H:%M:%S.%f");
22548 if (ts5.microsecond() != 123456) {
22549 throw std::runtime_error("strptime failed: microseconds parsing");
22550 }
22551
22552 // Test 6: 12-hour format with AM/PM
22553 numpy::Timestamp ts6 = numpy::Timestamp::strptime("03/15/2024 02:30:00 PM", "%m/%d/%Y %I:%M:%S %p");
22554 if (ts6.hour() != 14) {
22555 throw std::runtime_error("strptime failed: 12-hour format parsing");
22556 }
22557
22558 // Test 7: Day of year format
22559 numpy::Timestamp ts7 = numpy::Timestamp::strptime("2024-075", "%Y-%j");
22560 if (ts7.month() != 3 || ts7.day() != 15) { // Day 75 of 2024 is March 15
22561 throw std::runtime_error("strptime failed: day of year parsing");
second (np_test_5_all.cpp:22186)
22176 errors++;
22177 }
22178
22179 numpy::Timedelta td3("45s");
22180 if (std::abs(td3.total_seconds() - 45.0) > 0.0001) {
22181 std::cout << "[FAIL] np_test_timedelta_edge_cases: '45s' expected 45 sec"
22182 << std::endl;
22183 errors++;
22184 }
22185
22186 numpy::Timedelta td4("NaT");
22187 if (!td4.isNaT()) {
22188 std::cout << "[FAIL] np_test_timedelta_edge_cases: 'NaT' should parse to NaT"
22189 << std::endl;
22190 errors++;
22191 }
22192 }
22193
22194 // Stream operator
22195 {
22196 numpy::Timedelta td(1, 2, 30);
shape (np_test_1_all.cpp:3751)
3741 }
3742
3743 for (size_t j = 0; j < 3; ++j) {
3744 arr3.setElementAt({0, j}, static_cast<double>((j + 1) * 100)); // [100, 200, 300]
3745 }
3746
3747 // Broadcast all arrays together
3748 std::vector<NDArray<double>> arrays = {arr1, arr2, arr3};
3749 auto broadcasted = broadcast_arrays(arrays);
3750
3751 // All should have shape (2, 3)
3752 for (const auto& arr : broadcasted) {
3753 if (!((arr.getShape() == std::vector<size_t>{2, 3}))) {
3754 std::string description = std::string("test_broadcast_arrays():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !((arr.getShape() == std::vector<size_t>{2, 3}))";
3755 std::cout << std::string("[FAIL] ") + description << std::endl;
3756 throw std::runtime_error(description);
3757 }
3758 }
3759
3760 // Check values
3761 if (!(broadcasted[0].getElementAt({0, 1}) == 2.0)) {
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);
tz (np_test_5_all.cpp:22214)
22204 }
22205 }
22206
22207 if (errors == 0) {
22208 std::cout << "np_test_timedelta_edge_cases -> tests passed" << std::endl;
22209 }
22210 return errors;
22211}
22212
22213} // namespace numpy_tests_timedelta
22214
22215// =============================================================================
22216// Main Test Runner
22217// =============================================================================
22218int np_test_timedelta_main() {
22219 int errors = 0;
22220
22221 errors += numpy_tests_timedelta::np_test_timedelta_constructors();
22222 errors += numpy_tests_timedelta::np_test_timedelta_static_factories();
22223 errors += numpy_tests_timedelta::np_test_timedelta_components();
22224 errors += numpy_tests_timedelta::np_test_timedelta_total_conversions();
tz_convert (np_test_5_all.cpp:22899)
22889 if (floored_h.hour() != 14 || floored_h.minute() != 0 || floored_h.second() != 0) {
22890 pass = false;
22891 fail_msg = "floor to hour failed";
22892 }
22893
22894 // ceil to hour
22895 numpy::Timestamp ceiled_h = ts.ceil("h");
22896 if (ceiled_h.hour() != 15 || ceiled_h.minute() != 0) {
22897 pass = false;
22898 fail_msg = "ceil to hour failed";
22899 }
22900
22901 // round to hour (37 minutes -> round up)
22902 numpy::Timestamp rounded_h = ts.round("h");
22903 if (rounded_h.hour() != 15) {
22904 pass = false;
22905 fail_msg = "round to hour should be 15 (37 > 30)";
22906 }
22907
22908 // normalize (floor to day)
22909 numpy::Timestamp normalized = ts.normalize();
tz_convert (np_test_5_all.cpp:22899)
22889 if (floored_h.hour() != 14 || floored_h.minute() != 0 || floored_h.second() != 0) {
22890 pass = false;
22891 fail_msg = "floor to hour failed";
22892 }
22893
22894 // ceil to hour
22895 numpy::Timestamp ceiled_h = ts.ceil("h");
22896 if (ceiled_h.hour() != 15 || ceiled_h.minute() != 0) {
22897 pass = false;
22898 fail_msg = "ceil to hour failed";
22899 }
22900
22901 // round to hour (37 minutes -> round up)
22902 numpy::Timestamp rounded_h = ts.round("h");
22903 if (rounded_h.hour() != 15) {
22904 pass = false;
22905 fail_msg = "round to hour should be 15 (37 > 30)";
22906 }
22907
22908 // normalize (floor to day)
22909 numpy::Timestamp normalized = ts.normalize();
tz_localize (np_test_5_all.cpp:22892)
22882 auto pass = true;
22883 std::string fail_msg;
22884
22885 numpy::Timestamp ts(2024, 6, 15, 14, 37, 45, 123456);
22886
22887 // floor to hour
22888 numpy::Timestamp floored_h = ts.floor("h");
22889 if (floored_h.hour() != 14 || floored_h.minute() != 0 || floored_h.second() != 0) {
22890 pass = false;
22891 fail_msg = "floor to hour failed";
22892 }
22893
22894 // ceil to hour
22895 numpy::Timestamp ceiled_h = ts.ceil("h");
22896 if (ceiled_h.hour() != 15 || ceiled_h.minute() != 0) {
22897 pass = false;
22898 fail_msg = "ceil to hour failed";
22899 }
22900
22901 // round to hour (37 minutes -> round up)
22902 numpy::Timestamp rounded_h = ts.round("h");
tz_localize (np_test_5_all.cpp:22892)
22882 auto pass = true;
22883 std::string fail_msg;
22884
22885 numpy::Timestamp ts(2024, 6, 15, 14, 37, 45, 123456);
22886
22887 // floor to hour
22888 numpy::Timestamp floored_h = ts.floor("h");
22889 if (floored_h.hour() != 14 || floored_h.minute() != 0 || floored_h.second() != 0) {
22890 pass = false;
22891 fail_msg = "floor to hour failed";
22892 }
22893
22894 // ceil to hour
22895 numpy::Timestamp ceiled_h = ts.ceil("h");
22896 if (ceiled_h.hour() != 15 || ceiled_h.minute() != 0) {
22897 pass = false;
22898 fail_msg = "ceil to hour failed";
22899 }
22900
22901 // round to hour (37 minutes -> round up)
22902 numpy::Timestamp rounded_h = ts.round("h");
year (np_test_5_all.cpp:22185)
22175 << std::endl;
22176 errors++;
22177 }
22178
22179 numpy::Timedelta td3("45s");
22180 if (std::abs(td3.total_seconds() - 45.0) > 0.0001) {
22181 std::cout << "[FAIL] np_test_timedelta_edge_cases: '45s' expected 45 sec"
22182 << std::endl;
22183 errors++;
22184 }
22185
22186 numpy::Timedelta td4("NaT");
22187 if (!td4.isNaT()) {
22188 std::cout << "[FAIL] np_test_timedelta_edge_cases: 'NaT' should parse to NaT"
22189 << std::endl;
22190 errors++;
22191 }
22192 }
22193
22194 // Stream operator
22195 {