Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
test_al_vector.cc
Go to the documentation of this file.
1
2/*
3 Aleph_w
4
5 Data structures & Algorithms
6 version 2.0.0b
7 https://github.com/lrleon/Aleph-w
8
9 This file is part of Aleph-w library
10
11 Copyright (c) 2002-2026 Leandro Rabindranath Leon
12
13 Permission is hereby granted, free of charge, to any person obtaining a copy
14 of this software and associated documentation files (the "Software"), to deal
15 in the Software without restriction, including without limitation the rights
16 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 copies of the Software, and to permit persons to whom the Software is
18 furnished to do so, subject to the following conditions:
19
20 The above copyright notice and this permission notice shall be included in all
21 copies or substantial portions of the Software.
22
23 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 SOFTWARE.
30*/
31
32
54#include <gtest/gtest.h>
55#include <al-vector.H>
56#include <al-domain.H>
57#include <ah-errors.H>
58#include <cmath>
59
60using namespace Aleph;
61using namespace testing;
62
63// ============================================================================
64// Test Fixture for Vector Tests
65// ============================================================================
66
67class VectorTest : public ::testing::Test {
68protected:
69 AlDomain<int> domain_5; // Domain with 5 elements {0,1,2,3,4}
70 AlDomain<int> domain_3; // Domain with 3 elements {0,1,2}
72
73 void SetUp() override {
74 // Set up integer domains
75 for (int i = 0; i < 5; ++i) {
76 domain_5.insert(i);
77 }
78
79 for (int i = 0; i < 3; ++i) {
80 domain_3.insert(i);
81 }
82
83 // Set up string domain
84 domain_str.insert("x");
85 domain_str.insert("y");
86 domain_str.insert("z");
87 }
88};
89
90// ============================================================================
91// Construction and Initialization Tests
92// ============================================================================
93
95 Vector<int, double> v(domain_5);
96
97 // All entries should be zero by default
98 for (int i = 0; i < 5; ++i) {
99 EXPECT_DOUBLE_EQ(v.get_entry(i), 0.0);
100 }
101}
102
108
110 DynList<double> values;
111 values.append(1.0);
112 values.append(2.0);
113 values.append(3.0);
114 values.append(4.0);
115 values.append(5.0);
116
117 Vector<int, double> v(domain_5, values);
118
119 for (int i = 0; i < 5; ++i) {
120 EXPECT_DOUBLE_EQ(v.get_entry(i), static_cast<double>(i + 1));
121 }
122}
123
125 DynList<double> values;
126 values.append(1.0);
127 values.append(2.0);
128
129 // Should throw because domain has 5 elements but list has 2
130 EXPECT_THROW((Vector<int, double>(domain_5, values)), std::exception);
131}
132
134 Vector<int, double> v1(domain_5);
135 v1.set_entry(0, 1.5);
136 v1.set_entry(2, 3.7);
137
138 Vector<int, double> v2(v1);
139
140 EXPECT_DOUBLE_EQ(v2.get_entry(0), 1.5);
141 EXPECT_DOUBLE_EQ(v2.get_entry(2), 3.7);
142 EXPECT_DOUBLE_EQ(v2.get_entry(1), 0.0);
143}
144
146 Vector<int, double> v1(domain_5);
147 v1.set_entry(0, 1.5);
148 v1.set_entry(2, 3.7);
149
150 Vector<int, double> v2(std::move(v1));
151
152 EXPECT_DOUBLE_EQ(v2.get_entry(0), 1.5);
153 EXPECT_DOUBLE_EQ(v2.get_entry(2), 3.7);
154}
155
157 Vector<int, double> v1(domain_5);
158 v1.set_entry(0, 1.5);
159
160 Vector<int, double> v2(domain_5);
161 v2 = v1;
162
163 EXPECT_DOUBLE_EQ(v2.get_entry(0), 1.5);
164}
165
167 Vector<int, double> v1(domain_5);
168 v1.set_entry(0, 1.5);
169
170 v1 = v1; // Self-assignment
171
172 EXPECT_DOUBLE_EQ(v1.get_entry(0), 1.5);
173}
174
176 Vector<int, double> v1(domain_5);
177 v1.set_entry(0, 1.5);
178
179 Vector<int, double> v2(domain_5);
180 v2 = std::move(v1);
181
182 EXPECT_DOUBLE_EQ(v2.get_entry(0), 1.5);
183}
184
185// ============================================================================
186// Entry Access and Modification Tests
187// ============================================================================
188
190 Vector<int, double> v(domain_5);
191
192 v.set_entry(0, 1.5);
193 v.set_entry(2, -3.2);
194 v.set_entry(4, 5.7);
195
196 EXPECT_DOUBLE_EQ(v.get_entry(0), 1.5);
197 EXPECT_DOUBLE_EQ(v.get_entry(1), 0.0);
198 EXPECT_DOUBLE_EQ(v.get_entry(2), -3.2);
199 EXPECT_DOUBLE_EQ(v.get_entry(3), 0.0);
200 EXPECT_DOUBLE_EQ(v.get_entry(4), 5.7);
201}
202
204 Vector<int, double> v(domain_5);
205
206 v.set_entry(2, 5.0);
207 EXPECT_DOUBLE_EQ(v.get_entry(2), 5.0);
208
209 v.set_entry(2, 0.0);
210 EXPECT_DOUBLE_EQ(v.get_entry(2), 0.0);
211
212 // Entry should be removed from internal storage
213 EXPECT_EQ(v.search_entry(2), nullptr);
214}
215
217 Vector<int, double> v(domain_5);
218
219 v.set_entries({0, 2, 4}, {1.0, 2.0, 3.0});
220
221 EXPECT_DOUBLE_EQ(v.get_entry(0), 1.0);
222 EXPECT_DOUBLE_EQ(v.get_entry(1), 0.0);
223 EXPECT_DOUBLE_EQ(v.get_entry(2), 2.0);
224 EXPECT_DOUBLE_EQ(v.get_entry(3), 0.0);
225 EXPECT_DOUBLE_EQ(v.get_entry(4), 3.0);
226}
227
229 Vector<int, double> v(domain_5);
230
231 EXPECT_THROW(v.set_entries({0, 1}, {1.0, 2.0, 3.0}), std::exception);
232}
233
235 Vector<int, double> v(domain_5);
236
237 v.set_entry(2, 3.14);
238
239 double * ptr = v.search_entry(2);
240 ASSERT_NE(ptr, nullptr);
241 EXPECT_DOUBLE_EQ(*ptr, 3.14);
242
243 double * null_ptr = v.search_entry(1);
244 EXPECT_EQ(null_ptr, nullptr);
245}
246
248 Vector<int, double> v(domain_5);
249 v.set_entry(2, 3.14);
250
251 const Vector<int, double>& cv = v;
252 EXPECT_DOUBLE_EQ(cv.get_entry(2), 3.14);
253 EXPECT_DOUBLE_EQ(cv.get_entry(1), 0.0);
254}
255
256// ============================================================================
257// Epsilon Tests
258// ============================================================================
259
264
266 Vector<int, double> v(domain_5);
267
268 v.set_epsilon(1e-10);
269 EXPECT_DOUBLE_EQ(v.get_epsilon(), 1e-10);
270}
271
273 Vector<int, double> v(domain_5, 1e-5);
274
275 v.set_entry(0, 1e-6); // Less than epsilon
276 EXPECT_DOUBLE_EQ(v.get_entry(0), 0.0); // Should be treated as zero
277
278 v.set_entry(1, 1e-4); // Greater than epsilon
279 EXPECT_DOUBLE_EQ(v.get_entry(1), 1e-4); // Should not be zero
280}
281
283 Vector<int, double> v(domain_5, 1e-5);
284
285 EXPECT_TRUE(v.are_equal(1.0000001, 1.0000002)); // Within epsilon
286 EXPECT_FALSE(v.are_equal(1.0, 1.0001)); // Beyond epsilon
287}
288
289// ============================================================================
290// Arithmetic Operations Tests
291// ============================================================================
292
294 Vector<int, double> v1(domain_5);
295 v1.set_entry(0, 1.0);
296 v1.set_entry(2, 3.0);
297
298 Vector<int, double> v2(domain_5);
299 v2.set_entry(1, 2.0);
300 v2.set_entry(2, 4.0);
301
302 Vector<int, double> v3 = v1 + v2;
303
304 EXPECT_DOUBLE_EQ(v3.get_entry(0), 1.0);
305 EXPECT_DOUBLE_EQ(v3.get_entry(1), 2.0);
306 EXPECT_DOUBLE_EQ(v3.get_entry(2), 7.0);
307 EXPECT_DOUBLE_EQ(v3.get_entry(3), 0.0);
308}
309
311 Vector<int, double> v1(domain_5);
312 v1.set_entry(0, 1.0);
313 v1.set_entry(2, 3.0);
314
315 Vector<int, double> v2(domain_5);
316 v2.set_entry(1, 2.0);
317 v2.set_entry(2, 4.0);
318
319 v1 += v2;
320
321 EXPECT_DOUBLE_EQ(v1.get_entry(0), 1.0);
322 EXPECT_DOUBLE_EQ(v1.get_entry(1), 2.0);
323 EXPECT_DOUBLE_EQ(v1.get_entry(2), 7.0);
324}
325
327 Vector<int, double> v1(domain_5);
328 v1.set_entry(0, 5.0);
329 v1.set_entry(2, 3.0);
330
331 Vector<int, double> v2(domain_5);
332 v2.set_entry(0, 2.0);
333 v2.set_entry(2, 1.0);
334
335 Vector<int, double> v3 = v1 - v2;
336
337 EXPECT_DOUBLE_EQ(v3.get_entry(0), 3.0);
338 EXPECT_DOUBLE_EQ(v3.get_entry(2), 2.0);
339}
340
342 Vector<int, double> v1(domain_5);
343 v1.set_entry(0, 5.0);
344 v1.set_entry(2, 3.0);
345
346 Vector<int, double> v2(domain_5);
347 v2.set_entry(0, 2.0);
348 v2.set_entry(2, 1.0);
349
350 v1 -= v2;
351
352 EXPECT_DOUBLE_EQ(v1.get_entry(0), 3.0);
353 EXPECT_DOUBLE_EQ(v1.get_entry(2), 2.0);
354}
355
357 Vector<int, double> v(domain_5);
358 v.set_entry(0, 2.0);
359 v.set_entry(2, 3.0);
360
361 Vector<int, double> v2 = v * 2.5;
362
363 EXPECT_DOUBLE_EQ(v2.get_entry(0), 5.0);
364 EXPECT_DOUBLE_EQ(v2.get_entry(2), 7.5);
365}
366
368 Vector<int, double> v(domain_5);
369 v.set_entry(0, 2.0);
370 v.set_entry(2, 3.0);
371
372 Vector<int, double> v2 = 2.5 * v;
373
374 EXPECT_DOUBLE_EQ(v2.get_entry(0), 5.0);
375 EXPECT_DOUBLE_EQ(v2.get_entry(2), 7.5);
376}
377
379 Vector<int, double> v(domain_5);
380 v.set_entry(0, 2.0);
381 v.set_entry(2, 3.0);
382
383 Vector<int, double> v2 = v * 0.0;
384
385 // All entries should be zero
386 for (int i = 0; i < 5; ++i) {
387 EXPECT_DOUBLE_EQ(v2.get_entry(i), 0.0);
388 }
389}
390
392 Vector<int, double> v(domain_5);
393 v.set_entry(0, 2.0);
394 v.set_entry(2, 3.0);
395
396 Vector<int, double> v2 = v * 1.0;
397
398 EXPECT_DOUBLE_EQ(v2.get_entry(0), 2.0);
399 EXPECT_DOUBLE_EQ(v2.get_entry(2), 3.0);
400}
401
403 Vector<int, double> v(domain_5);
404 v.set_entry(0, 10.0);
405 v.set_entry(2, 5.0);
406
407 Vector<int, double> v2 = v / 2.0;
408
409 EXPECT_DOUBLE_EQ(v2.get_entry(0), 5.0);
410 EXPECT_DOUBLE_EQ(v2.get_entry(2), 2.5);
411}
412
414 Vector<int, double> v(domain_5);
415 v.set_entry(0, 10.0);
416
417 EXPECT_THROW(v / 0.0, std::exception);
418}
419
421 Vector<int, double> v(domain_5);
422 v.set_entry(0, 2.0);
423 v.set_entry(2, 3.0);
424
425 Vector<int, double> v2 = v / 1.0;
426
427 EXPECT_DOUBLE_EQ(v2.get_entry(0), 2.0);
428 EXPECT_DOUBLE_EQ(v2.get_entry(2), 3.0);
429}
430
432 Vector<int, double> v(domain_5);
433 v.set_entry(0, 2.0);
434 v.set_entry(2, -3.0);
435
436 Vector<int, double> v2 = -v;
437
438 EXPECT_DOUBLE_EQ(v2.get_entry(0), -2.0);
439 EXPECT_DOUBLE_EQ(v2.get_entry(2), 3.0);
440}
441
442// ============================================================================
443// Scalar Product (Dot Product) Tests
444// ============================================================================
445
447 Vector<int, double> v1(domain_5);
448 v1.set_entry(0, 1.0);
449 v1.set_entry(1, 2.0);
450 v1.set_entry(2, 3.0);
451
452 Vector<int, double> v2(domain_5);
453 v2.set_entry(0, 4.0);
454 v2.set_entry(1, 5.0);
455 v2.set_entry(2, 6.0);
456
457 // 1*4 + 2*5 + 3*6 = 4 + 10 + 18 = 32
458 double result = v1.scalar_product(v2);
459
460 EXPECT_DOUBLE_EQ(result, 32.0);
461}
462
464 Vector<int, double> v1(domain_5);
465 v1.set_entry(0, 1.0);
466 v1.set_entry(1, 2.0);
467
468 Vector<int, double> v2(domain_5);
469 v2.set_entry(0, 3.0);
470 v2.set_entry(1, 4.0);
471
472 // 1*3 + 2*4 = 3 + 8 = 11
473 double result = v1 * v2;
474
475 EXPECT_DOUBLE_EQ(result, 11.0);
476}
477
479 Vector<int, double> v1(domain_5);
480 v1.set_entry(0, 1.0);
481 v1.set_entry(1, 0.0);
482
483 Vector<int, double> v2(domain_5);
484 v2.set_entry(0, 0.0);
485 v2.set_entry(1, 1.0);
486
487 double result = v1 * v2;
488
489 EXPECT_DOUBLE_EQ(result, 0.0);
490}
491
493 Vector<int, double> v1(domain_5);
494 v1.set_entry(0, 1.0);
495 v1.set_entry(1, 2.0);
496
497 Vector<int, double> v2(domain_5); // Zero vector
498
499 double result = v1 * v2;
500
501 EXPECT_DOUBLE_EQ(result, 0.0);
502}
503
504// ============================================================================
505// Comparison Tests
506// ============================================================================
507
509 Vector<int, double> v1(domain_5);
510 v1.set_entry(0, 1.0);
511 v1.set_entry(2, 3.0);
512
513 Vector<int, double> v2(domain_5);
514 v2.set_entry(0, 1.0);
515 v2.set_entry(2, 3.0);
516
517 EXPECT_TRUE(v1 == v2);
518}
519
521 Vector<int, double> v1(domain_5, 1e-5);
522 v1.set_entry(0, 1.0);
523
524 Vector<int, double> v2(domain_5, 1e-5);
525 v2.set_entry(0, 1.0 + 1e-6); // Within epsilon
526
527 EXPECT_TRUE(v1 == v2);
528}
529
531 Vector<int, double> v1(domain_5);
532 v1.set_entry(0, 1.0);
533
534 Vector<int, double> v2(domain_5);
535 v2.set_entry(0, 2.0);
536
537 EXPECT_TRUE(v1 != v2);
538}
539
541 Vector<int, double> v1(domain_5);
542 Vector<int, double> v2(domain_5);
543
544 EXPECT_TRUE(v1 == v2);
545}
546
547// ============================================================================
548// Proxy Access Tests
549// ============================================================================
550
552 Vector<int, double> v(domain_5);
553 v.set_entry(2, 3.14);
554
555 double val = v[2];
556 EXPECT_DOUBLE_EQ(val, 3.14);
557
558 double val_zero = v[1];
560}
561
563 Vector<int, double> v(domain_5);
564
565 v[2] = 3.14;
566
567 EXPECT_DOUBLE_EQ(v.get_entry(2), 3.14);
568}
569
571 Vector<int, double> v(domain_5);
572 v.set_entry(2, 5.0);
573
574 v[2] = 0.0;
575
576 EXPECT_DOUBLE_EQ(v.get_entry(2), 0.0);
577 EXPECT_EQ(v.search_entry(2), nullptr);
578}
579
581 Vector<int, double> v(domain_5);
582 v(2) = 3.14;
583
584 double val = v(2);
585 EXPECT_DOUBLE_EQ(val, 3.14);
586}
587
589 Vector<int, double> v(domain_5);
590 v[0] = 3.14;
591 v[1] = v[0];
592
593 EXPECT_DOUBLE_EQ(v.get_entry(1), 3.14);
594}
595
596// ============================================================================
597// Iterator Tests
598// ============================================================================
599
601 Vector<int, double> v(domain_5);
602 v.set_entry(0, 1.0);
603 v.set_entry(2, 3.0);
604 v.set_entry(4, 5.0);
605
606 auto it = v.get_it();
607
608 int count = 0;
609 while (it.has_curr()) {
610 (void)it.get_curr();
611 count++;
612 it.next();
613 }
614
615 EXPECT_EQ(count, 3); // Only 3 non-zero entries
616}
617
618// ============================================================================
619// Conversion and Output Tests
620// ============================================================================
621
623 Vector<int, double> v(domain_3);
624 v.set_entry(0, 1.0);
625 v.set_entry(1, 2.0);
626 v.set_entry(2, 3.0);
627
628 DynList<double> list = v.to_list();
629
630 EXPECT_EQ(list.size(), 3);
631}
632
634 Vector<int, double> v(domain_3);
635 v.set_entry(0, 1.0);
636 v.set_entry(1, 2.0);
637 v.set_entry(2, 3.0);
638
639 std::string str = v.to_str();
640
641 EXPECT_FALSE(str.empty());
642}
643
644// ============================================================================
645// String Domain Tests
646// ============================================================================
647
649 Vector<std::string, double> v(domain_str);
650
651 v.set_entry("x", 1.0);
652 v.set_entry("y", 2.0);
653 v.set_entry("z", 3.0);
654
655 EXPECT_DOUBLE_EQ(v.get_entry("x"), 1.0);
656 EXPECT_DOUBLE_EQ(v.get_entry("y"), 2.0);
657 EXPECT_DOUBLE_EQ(v.get_entry("z"), 3.0);
658}
659
661 Vector<std::string, double> v1(domain_str);
662 v1.set_entry("x", 1.0);
663 v1.set_entry("y", 2.0);
664
665 Vector<std::string, double> v2(domain_str);
666 v2.set_entry("x", 3.0);
667 v2.set_entry("z", 4.0);
668
670
671 EXPECT_DOUBLE_EQ(v3.get_entry("x"), 4.0);
672 EXPECT_DOUBLE_EQ(v3.get_entry("y"), 2.0);
673 EXPECT_DOUBLE_EQ(v3.get_entry("z"), 4.0);
674}
675
676// ============================================================================
677// Edge Cases and Stress Tests
678// ============================================================================
679
681 Vector<int, double> v(domain_5, 1e-15);
682
683 v.set_entry(0, 1e-14);
684 EXPECT_DOUBLE_EQ(v.get_entry(0), 1e-14);
685
686 v.set_entry(1, 1e-16);
687 EXPECT_DOUBLE_EQ(v.get_entry(1), 0.0); // Should be treated as zero
688}
689
691 Vector<int, double> v(domain_5);
692 v.set_entry(0, -1.5);
693 v.set_entry(2, -3.7);
694
695 EXPECT_DOUBLE_EQ(v.get_entry(0), -1.5);
696 EXPECT_DOUBLE_EQ(v.get_entry(2), -3.7);
697}
698
700 Vector<int, double> v(domain_5);
701 v.set_entry(0, 1e100);
702 v.set_entry(2, -1e100);
703
706}
707
709 Vector<int, double> v1(domain_5);
710 v1.set_entry(0, 10.0);
711 v1.set_entry(1, 20.0);
712
713 Vector<int, double> v2(domain_5);
714 v2.set_entry(0, 5.0);
715 v2.set_entry(2, 15.0);
716
717 // (v1 + v2) * 2 - v1
718 Vector<int, double> result = (v1 + v2) * 2.0 - v1;
719
720 EXPECT_DOUBLE_EQ(result.get_entry(0), 20.0); // (10+5)*2 - 10 = 30 - 10 = 20
721 EXPECT_DOUBLE_EQ(result.get_entry(1), 20.0); // (20+0)*2 - 20 = 40 - 20 = 20
722 EXPECT_DOUBLE_EQ(result.get_entry(2), 30.0); // (0+15)*2 - 0 = 30
723}
724
726 Vector<int, double> v(domain_5);
727 v.set_entry(0, 1.0);
728
729 Vector<int, double> v2(domain_5);
730 v2.set_entry(0, 2.0);
731
732 v += v2;
733 v = v * 2.0;
734 v -= v2;
735
736 EXPECT_DOUBLE_EQ(v.get_entry(0), 4.0); // (1+2)*2 - 2 = 4
737}
738
739// ============================================================================
740// Functional Methods Tests (if available)
741// ============================================================================
742
744 Vector<int, double> v(domain_5);
745 v.set_entry(0, 1.0);
746 v.set_entry(1, 2.0);
747 v.set_entry(2, 3.0);
748 v.set_entry(3, 4.0);
749 v.set_entry(4, 5.0);
750
751 // Test that we can iterate over non-zero entries
752 int count = 0;
753 auto it = v.get_it();
754 while (it.has_curr()) {
755 count++;
756 it.next();
757 }
758
759 EXPECT_EQ(count, 5);
760}
761
762// ============================================================================
763// Domain Tests
764// ============================================================================
765
767 Vector<int, double> v(domain_5);
768
769 const auto& d = v.get_domain();
770 EXPECT_EQ(d.size(), 5);
771}
772
773// ============================================================================
774// Float Type Tests
775// ============================================================================
776
778 AlDomain<int> domain;
779 domain.insert(0);
780 domain.insert(1);
781 domain.insert(2);
782
783 Vector<int, float> v(domain);
784 v.set_entry(0, 1.5f);
785 v.set_entry(1, 2.5f);
786
787 EXPECT_FLOAT_EQ(v.get_entry(0), 1.5f);
788 EXPECT_FLOAT_EQ(v.get_entry(1), 2.5f);
789}
790
792 AlDomain<int> domain;
793 domain.insert(0);
794 domain.insert(1);
795
796 Vector<int, float> v1(domain);
797 v1.set_entry(0, 1.5f);
798
799 Vector<int, float> v2(domain);
800 v2.set_entry(0, 2.5f);
801
802 Vector<int, float> v3 = v1 + v2;
803
804 EXPECT_FLOAT_EQ(v3.get_entry(0), 4.0f);
805}
806
807// ============================================================================
808// Comprehensive Integration Test
809// ============================================================================
810
812 // Create two vectors
813 Vector<int, double> v1(domain_5);
814 v1.set_entries({0, 1, 2}, {1.0, 2.0, 3.0});
815
816 Vector<int, double> v2(domain_5);
817 v2.set_entries({1, 2, 3}, {1.0, 1.0, 1.0});
818
819 // Test addition
820 Vector<int, double> sum = v1 + v2;
821 EXPECT_DOUBLE_EQ(sum.get_entry(0), 1.0);
822 EXPECT_DOUBLE_EQ(sum.get_entry(1), 3.0);
823 EXPECT_DOUBLE_EQ(sum.get_entry(2), 4.0);
824 EXPECT_DOUBLE_EQ(sum.get_entry(3), 1.0);
825
826 // Test scalar multiplication
828 EXPECT_DOUBLE_EQ(scaled.get_entry(0), 0.5);
829 EXPECT_DOUBLE_EQ(scaled.get_entry(1), 1.5);
830
831 // Test scalar product
832 double dot = v1 * v2;
833 EXPECT_DOUBLE_EQ(dot, 2.0 + 3.0); // 1*0 + 2*1 + 3*1 + 0*1 = 5
834
835 // Test equality
837 EXPECT_TRUE(copy == v1);
838
839 // Test modification
840 copy[0] = 10.0;
841 EXPECT_FALSE(copy == v1);
842 EXPECT_DOUBLE_EQ(copy.get_entry(0), 10.0);
843
844 // Test negation
846 EXPECT_DOUBLE_EQ(neg.get_entry(0), -1.0);
847 EXPECT_DOUBLE_EQ(neg.get_entry(1), -2.0);
848 EXPECT_DOUBLE_EQ(neg.get_entry(2), -3.0);
849}
850
851// ============================================================================
852// Main
853// ============================================================================
854
855int main(int argc, char **argv) {
856 ::testing::InitGoogleTest(&argc, argv);
857 return RUN_ALL_TESTS();
858}
Exception handling system with formatted messages for Aleph-w.
int main()
Integer domain classes for sparse data structures.
Sparse vector with named elements.
Generic domain class based on hash set.
Definition al-domain.H:85
Dynamic singly linked list with functional programming support.
Definition htlist.H:1423
T & append(const T &item)
Append a new item by copy.
Definition htlist.H:1562
size_t size() const noexcept
Count the number of elements of the list.
Definition htlist.H:1319
Sparse vector implementation with domain-based indexing.
Definition al-vector.H:87
const Domain & get_domain() const noexcept
Get the domain over which this vector is defined.
Definition al-vector.H:137
void set_entry(const T &i, const NumType &value)
Set a vector entry at given index.
Definition al-vector.H:268
const NumType & get_epsilon() const noexcept
Get the epsilon value used for zero comparisons.
Definition al-vector.H:119
Iterator get_it() const noexcept
Definition al-vector.H:700
NumType * search_entry(const T &i) const noexcept
Search for an entry and return pointer to its value.
Definition al-vector.H:378
bool are_equal(const NumType &n1, const NumType &n2) const noexcept
Check if two numeric values are equal within epsilon.
Definition al-vector.H:395
DynList< NumType > to_list() const
Definition al-vector.H:538
void set_epsilon(const NumType &e) noexcept
Set the epsilon value for zero comparisons.
Definition al-vector.H:126
NumType get_entry(const T &i)
Get vector entry at given index (non-const version)
Definition al-vector.H:340
void set_entries(std::initializer_list< T > ld, std::initializer_list< NumType > lr)
Set multiple entries using initializer lists.
Definition al-vector.H:293
std::string to_str() const
Definition al-vector.H:556
NumType scalar_product(const Vector &v) const
Definition al-vector.H:514
void SetUp() override
AlDomain< std::string > domain_str
AlDomain< int > domain_3
AlDomain< int > domain_5
#define TEST(name)
Main namespace for Aleph-w library functions.
Definition ah-arena.H:89
Itor2 copy(Itor1 sourceBeg, const Itor1 &sourceEnd, Itor2 destBeg)
Copy elements from one range to another.
Definition ahAlgo.H:584
DynList< T > maps(const C &c, Op op)
Classic map operation.
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Count elements equal to a value.
Definition ahAlgo.H:127
T sum(const Container &container, const T &init=T{})
Compute sum of all elements.
TEST_F(VectorTest, DefaultConstructor)