Generated on for Gecode by doxygen 1.15.0
fault.cpp
Go to the documentation of this file.
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2/*
3 * Main authors:
4 * Mikael Zayenz Lagerkvist <lagerkvist@gecode.dev>
5 *
6 * Copyright:
7 * Mikael Zayenz Lagerkvist, 2026
8 *
9 * This file is part of Gecode, the generic constraint
10 * development environment:
11 * http://www.gecode.dev
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining
14 * a copy of this software and associated documentation files (the
15 * "Software"), to deal in the Software without restriction, including
16 * without limitation the rights to use, copy, modify, merge, publish,
17 * distribute, sublicense, and/or sell copies of the Software, and to
18 * permit persons to whom the Software is furnished to do so, subject to
19 * the following conditions:
20 *
21 * The above copyright notice and this permission notice shall be
22 * included in all copies or substantial portions of the Software.
23 *
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 *
32 */
33
34#include <gecode/minimodel.hh>
35#include <gecode/search.hh>
36
37#include "test/test.hh"
38
39namespace Test { namespace Fault {
40
41 using namespace Gecode;
43
45
46 class FaultScope {
47 private:
48 Support::Lock lock;
49 public:
56 };
57
59 protected:
62 : Propagator(home,p) {
63 Support::FailPoint::check(Phase::PropagatorCopy);
64 }
65 public:
66 static void post(Home home) {
67 (void) new (home) ThrowingPropagator(home);
68 }
69 virtual Actor* copy(Space& home) {
70 return new (home) ThrowingPropagator(home,*this);
71 }
72 virtual PropCost cost(const Space&, const ModEventDelta&) const {
74 }
75 virtual void reschedule(Space&) {}
76 virtual ExecStatus propagate(Space& home, const ModEventDelta&) {
77 return home.ES_SUBSUMED(*this);
78 }
79 virtual size_t dispose(Space& home) {
80 (void) Propagator::dispose(home);
81 return sizeof(*this);
82 }
83 };
84
85 class AdvisorCopyPropagator;
86
87 class ThrowingAdvisor : public Advisor {
88 protected:
89 int id;
90 public:
92 Council<ThrowingAdvisor>& c, int id0)
93 : Advisor(home,p,c), id(id0) {}
95 : Advisor(home,a), id(a.id) {
96 Support::FailPoint::check(Phase::AdvisorCopy);
97 }
98 Propagator* owner(void) const {
99 return &propagator();
100 }
102 Advisor::dispose(home,c);
103 }
104 };
105
107 protected:
109 AdvisorCopyPropagator(Home home) : Propagator(home), c(home) {
110 (void) new (home) ThrowingAdvisor(home,*this,c,0);
111 (void) new (home) ThrowingAdvisor(home,*this,c,1);
112 }
114 : Propagator(home,p) {
115 c.update(home,p.c);
116 }
117 public:
119 return new (home) AdvisorCopyPropagator(home);
120 }
121 bool advisors_point_to_self(void) const {
123 int n = 0;
124 while (as()) {
125 if (as.advisor().owner() != this)
126 return false;
127 ++n; ++as;
128 }
129 return n == 2;
130 }
131 virtual Actor* copy(Space& home) {
132 return new (home) AdvisorCopyPropagator(home,*this);
133 }
134 virtual PropCost cost(const Space&, const ModEventDelta&) const {
136 }
137 virtual void reschedule(Space&) {}
139 return ES_FIX;
140 }
141 virtual size_t dispose(Space& home) {
142 c.dispose(home);
143 (void) Propagator::dispose(home);
144 return sizeof(*this);
145 }
146 };
147
148 class ThrowingChoice : public Choice {
149 public:
150 ThrowingChoice(const Brancher& b) : Choice(b,1) {}
151 virtual void archive(Archive& e) const {
153 }
154 };
155
156 class ThrowingBrancher : public Brancher {
157 protected:
158 bool done;
159 ThrowingBrancher(Home home) : Brancher(home), done(false) {}
161 : Brancher(home,b), done(b.done) {
162 Support::FailPoint::check(Phase::BrancherCopy);
163 }
164 public:
165 static void post(Home home) {
166 (void) new (home) ThrowingBrancher(home);
167 }
168 virtual bool status(const Space&) const {
169 return !done;
170 }
171 virtual const Choice* choice(Space&) {
172 return new ThrowingChoice(*this);
173 }
174 virtual const Choice* choice(const Space&, Archive&) {
175 return new ThrowingChoice(*this);
176 }
177 virtual ExecStatus commit(Space&, const Choice&, unsigned int) {
178 done = true;
179 return ES_OK;
180 }
181 virtual void print(const Space&, const Choice&,
182 unsigned int, std::ostream&) const {}
183 virtual Actor* copy(Space& home) {
184 return new (home) ThrowingBrancher(home,*this);
185 }
186 virtual size_t dispose(Space&) {
187 return sizeof(*this);
188 }
189 };
190
191 class CloneCopySpace : public Space {
192 public:
200 virtual Space* copy(void) {
201 return new CloneCopySpace(*this);
202 }
203 };
204
205 class DisposeSpace : public Space {
206 public:
208 DisposeSpace(void) : x(*this,3,0,2) {
210 }
212 x.update(*this,s.x);
213 }
214 virtual Space* copy(void) {
215 return new DisposeSpace(*this);
216 }
217 };
218
219 class NoticeDisposeActor : public Actor {
220 public:
221 static int disposed;
222
224 home.notice(*this,AP_DISPOSE);
225 }
226 static void post(Home home) {
227 (void) new (home) NoticeDisposeActor(home);
228 }
229 virtual Actor* copy(Space& home) {
230 return new (home) NoticeDisposeActor(home);
231 }
232 virtual size_t dispose(Space& home) {
233 home.ignore(*this,AP_DISPOSE);
234 disposed++;
235 return sizeof(*this);
236 }
237 };
238
240
241 class NoticeDisposeSpace : public Space {
242 public:
243 NoticeDisposeSpace(int registered = 0, bool fail_next = false) {
244 for (int i=0; i<registered; i++)
246 if (fail_next) {
247 Support::FailPoint::fail_after(Phase::SpaceDisposeNoticeArray,0);
249 } else if (registered == 0) {
251 }
252 }
254 virtual Space* copy(void) {
255 return new NoticeDisposeSpace(*this);
256 }
257 };
258
259 class MiniModelSpace : public Space {
260 public:
263 virtual Space* copy(void) {
264 return new MiniModelSpace(*this);
265 }
266 };
267
268 class DerivedCopySpace : public Space {
269 public:
271 DerivedCopySpace(void) : x(*this,2,0,1) {
274 }
276 Support::FailPoint::check(Phase::DerivedSpaceCopy);
277 x.update(*this,s.x);
278 }
279 virtual Space* copy(void) {
280 return new DerivedCopySpace(*this);
281 }
282 };
283
284 class DerivedUpdateSpace : public Space {
285 public:
287 DerivedUpdateSpace(void) : x(*this,2,0,1) {
288 rel(*this,x[0] != x[1]);
290 }
292 x.update(*this,s.x);
293 Support::FailPoint::check(Phase::DerivedSpaceCopy);
294 }
295 virtual Space* copy(void) {
296 return new DerivedUpdateSpace(*this);
297 }
298 };
299
301 public:
302 int value;
303 FaultLocalObject(Home home, int v) : LocalObject(home), value(v) {}
305 : LocalObject(home,o), value(o.value) {
306 Support::FailPoint::check(Phase::LocalObjectCopy);
307 }
308 virtual Actor* copy(Space& home) {
309 return new (home) FaultLocalObject(home,*this);
310 }
311 virtual size_t dispose(Space&) {
312 return sizeof(*this);
313 }
314 };
315
317 public:
320 void update(Space& home, FaultLocalHandle& h) {
321 LocalHandle::update(home,h);
322 }
323 int value(void) const {
324 return static_cast<FaultLocalObject*>(object())->value;
325 }
326 };
327
328 class LocalCopySpace : public Space {
329 public:
332 : h(new (*this) FaultLocalObject(*this,42)) {}
334 h.update(*this,s.h);
335 }
336 virtual Space* copy(void) {
337 return new LocalCopySpace(*this);
338 }
339 };
340
341 class AdvisorCopySpace : public Space {
342 public:
345 : p(AdvisorCopyPropagator::post(*this)) {}
347 virtual Space* copy(void) {
348 return new AdvisorCopySpace(*this);
349 }
350 bool advisors_point_to_source(void) const {
351 return (p != nullptr) && p->advisors_point_to_self();
352 }
353 };
354
355 class BranchPostSpace : public Space {
356 public:
358 BranchPostSpace(void) : x(*this,4,0,3) {
359 rel(*this,x[0] != x[1]);
360 }
362 x.update(*this,s.x);
363 }
364 virtual Space* copy(void) {
365 return new BranchPostSpace(*this);
366 }
370 void post_chb_branch(void) {
372 }
373 void post_plain_branch(void) {
375 }
376 };
377
378 bool clone_after_failed_copy(Phase p, unsigned long long n) {
379 FaultScope scope;
381 if (s.status() == SS_FAILED)
382 return false;
385 try {
386 Space* c = s.clone();
387 delete c;
389 return false;
390 } catch (const MemoryExhausted&) {
392 } catch (...) {
394 return false;
395 }
396 Space* c = s.clone();
397 delete c;
398 const Choice* ch = s.choice();
399 bool ok = ch != nullptr;
400 if (ch != nullptr) {
401 s.commit(*ch,0);
402 delete ch;
403 }
404 return ok && (s.status() != SS_FAILED);
405 }
406
407 bool expect_memory_exhausted(Phase p, unsigned long long n) {
408 FaultScope scope;
410 if (s.status() == SS_FAILED)
411 return false;
414 try {
415 Space* c = s.clone();
416 delete c;
417 } catch (const MemoryExhausted&) {
419 Space* c = s.clone();
420 delete c;
421 const Choice* ch = s.choice();
422 bool ok = ch != nullptr;
423 if (ch != nullptr) {
424 s.commit(*ch,0);
425 delete ch;
426 }
427 return ok && (s.status() != SS_FAILED);
428 } catch (...) {
430 return false;
431 }
433 return false;
434 }
435
437 FaultScope scope;
440 Support::FailPoint::fail_after(Phase::LocalObjectCopy,0);
441 try {
442 Space* c = s.clone();
443 delete c;
444 } catch (const MemoryExhausted&) {
446 if (s.h.value() != 42)
447 return false;
448 LocalCopySpace* c = static_cast<LocalCopySpace*>(s.clone());
449 bool ok = (c != nullptr) && (c->h.value() == 42);
450 delete c;
451 return ok;
452 } catch (...) {
454 return false;
455 }
457 return false;
458 }
459
461 FaultScope scope;
464 return false;
466 Support::FailPoint::fail_after(Phase::AdvisorCopy,1);
467 try {
468 Space* c = s.clone();
469 delete c;
471 return false;
472 } catch (const MemoryExhausted&) {
475 return false;
476 AdvisorCopySpace* c = static_cast<AdvisorCopySpace*>(s.clone());
477 bool ok = (c != nullptr);
478 delete c;
479 return ok && s.advisors_point_to_source();
480 } catch (...) {
482 return false;
483 }
484 }
485
487 FaultScope scope;
488 DisposeSpace s;
489 if (s.status() == SS_FAILED)
490 return false;
492 Support::FailPoint::fail_after(Phase::SpaceDisposalArray,0);
493 try {
494 Space* c = s.clone();
495 delete c;
497 return false;
498 } catch (const MemoryExhausted&) {
500 } catch (...) {
502 return false;
503 }
504 Space* c = s.clone();
505 delete c;
506 DisposeSpace* root = static_cast<DisposeSpace*>(s.clone());
507 DFS<DisposeSpace> e(root);
508 Space* sol = e.next();
509 bool ok = (sol != nullptr);
510 delete sol;
511 return ok;
512 }
513
515 Space* c = s.clone();
516 delete c;
517 DerivedUpdateSpace* root = static_cast<DerivedUpdateSpace*>(s.clone());
519 Space* sol = e.next();
520 bool ok = (sol != nullptr);
521 delete sol;
522 return ok;
523 }
524
526 FaultScope scope;
528 if (s.status() == SS_FAILED)
529 return false;
531 Support::FailPoint::fail_after(Phase::DerivedSpaceCopy,0);
532 try {
533 Space* c = s.clone();
534 delete c;
536 return false;
537 } catch (const MemoryExhausted&) {
539 } catch (...) {
541 return false;
542 }
544 }
545
547 FaultScope scope;
549 Support::FailPoint::fail_after(Phase::Heap,0);
550 try {
551 int* x = heap.alloc<int>(1);
552 heap.free<int>(x,1);
554 return false;
555 } catch (const MemoryExhausted&) {
557 return true;
558 } catch (...) {
560 return false;
561 }
562 }
563
565 FaultScope scope;
566 int* x = heap.alloc<int>(1);
568 Support::FailPoint::fail_after(Phase::Heap,0);
569 try {
570 int* y = heap.realloc<int>(x,1,2);
572 heap.free<int>(y,2);
573 return false;
574 } catch (const MemoryExhausted&) {
576 heap.free<int>(x,1);
577 return true;
578 } catch (...) {
580 heap.free<int>(x,1);
581 return false;
582 }
583 }
584
586 FaultScope scope;
588 if (s.status() == SS_FAILED)
589 return false;
590 bool saw_failure = false;
591 for (unsigned long long budget = 0; budget < 32; budget++) {
593 Support::FailPoint::fail_after(Phase::Heap,budget);
594 try {
595 Space* c = s.clone();
596 unsigned long long checks = Support::FailPoint::count();
598 delete c;
599 return saw_failure && (checks > 0) && derived_update_space_is_usable(s);
600 } catch (const MemoryExhausted&) {
602 saw_failure = true;
604 return false;
605 } catch (...) {
607 return false;
608 }
609 }
610 return false;
611 }
612
614 FaultScope scope;
615 bool saw_failure = false;
616 for (unsigned long long budget = 0; budget < 32; budget++) {
618 if (s.status() == SS_FAILED)
619 return false;
621 Support::FailPoint::fail_after(Phase::Heap,budget);
622 try {
623 if (chb)
624 s.post_chb_branch();
625 else
627 unsigned long long checks = Support::FailPoint::count();
629 BranchPostSpace* root = static_cast<BranchPostSpace*>(s.clone());
630 DFS<BranchPostSpace> e(root);
631 Space* sol = e.next();
632 bool ok = (sol != nullptr);
633 delete sol;
634 return saw_failure && (checks > 0) && ok;
635 } catch (const MemoryExhausted&) {
637 saw_failure = true;
639 BranchPostSpace* root = static_cast<BranchPostSpace*>(s.clone());
640 DFS<BranchPostSpace> e(root);
641 Space* sol = e.next();
642 bool ok = (sol != nullptr);
643 delete sol;
644 if (!ok)
645 return false;
646 } catch (...) {
648 return false;
649 }
650 }
651 return false;
652 }
653
655 FaultScope scope;
656 int ranges[3][2] = {{0, 0}, {2, 2}, {4, 4}};
657 bool saw_failure = false;
658 for (unsigned long long budget = 0; budget < 8; budget++) {
659 IntSet::fault_reset_allocations();
661 Support::FailPoint::fail_after(Phase::Heap,budget);
662 try {
663 unsigned long long checks;
664 {
665 IntSet s(ranges,3);
666 checks = Support::FailPoint::count();
667 }
669 return saw_failure && (checks > 0) &&
670 (IntSet::fault_live_allocations() == 0);
671 } catch (const MemoryExhausted&) {
673 saw_failure = true;
674 if (IntSet::fault_live_allocations() != 0)
675 return false;
676 } catch (...) {
678 return false;
679 }
680 }
681 return false;
682 }
683
685 FaultScope scope;
686 bool saw_failure = false;
687 for (unsigned long long budget = 0; budget < 32; budget++) {
688 LinIntExpr::fault_reset_allocations();
690 try {
691 MiniModelSpace home;
692 IntVarArgs x(home,4,0,3);
693 Support::FailPoint::fail_after(Phase::Heap,budget);
694 {
695 LinIntExpr e = min(x);
696 (void) e;
697 }
698 unsigned long long checks = Support::FailPoint::count();
700 return saw_failure && (checks > 0) &&
701 (LinIntExpr::fault_live_allocations() == 0);
702 } catch (const MemoryExhausted&) {
704 saw_failure = true;
705 if (LinIntExpr::fault_live_allocations() != 0)
706 return false;
707 } catch (...) {
709 return false;
710 }
711 }
712 return false;
713 }
714
716 FaultScope scope;
717 bool saw_failure = false;
718 for (unsigned long long budget = 0; budget < 8; budget++) {
719 LinIntExpr::fault_reset_allocations();
721 try {
722 MiniModelSpace home;
723 IntVarArgs x(home,4,0,3);
724 BoolVarArgs b(home,4,0,1);
725 IntArgs a({1,2,3,4});
726 Support::FailPoint::fail_after(Phase::Heap,budget);
727 switch (kind) {
728 case 0:
729 {
730 LinIntExpr e(x);
731 (void) e;
732 }
733 break;
734 case 1:
735 {
736 LinIntExpr e(a,x);
737 (void) e;
738 }
739 break;
740 case 2:
741 {
742 LinIntExpr e(b);
743 (void) e;
744 }
745 break;
746 case 3:
747 {
748 LinIntExpr e(a,b);
749 (void) e;
750 }
751 break;
752 default:
753 return false;
754 }
755 unsigned long long checks = Support::FailPoint::count();
757 return saw_failure && (checks > 0) &&
758 (LinIntExpr::fault_live_allocations() == 0);
759 } catch (const MemoryExhausted&) {
761 saw_failure = true;
762 if (LinIntExpr::fault_live_allocations() != 0)
763 return false;
764 } catch (...) {
766 return false;
767 }
768 }
769 return false;
770 }
771
773 for (int kind = 0; kind < 4; kind++)
775 return false;
776 return true;
777 }
778
779#ifdef GECODE_HAS_FLOAT_VARS
781 FaultScope scope;
782 bool saw_failure = false;
783 for (unsigned long long budget = 0; budget < 32; budget++) {
785 try {
786 MiniModelSpace home;
787 FloatVarArgs x(home,4,0.0,3.0);
788 Support::FailPoint::fail_after(Phase::Heap,budget);
789 {
790 LinFloatExpr e = min(x);
791 (void) e;
792 }
793 unsigned long long checks = Support::FailPoint::count();
795 return saw_failure && (checks > 0);
796 } catch (const MemoryExhausted&) {
798 saw_failure = true;
799 } catch (...) {
801 return false;
802 }
803 }
804 return false;
805 }
806#endif
807
808#ifdef GECODE_HAS_SET_VARS
810 FaultScope scope;
811 bool saw_failure = false;
812 for (unsigned long long budget = 0; budget < 32; budget++) {
814 try {
815 MiniModelSpace home;
816 SetVarArgs x(home,4,IntSet::empty,1,1);
817 Support::FailPoint::fail_after(Phase::Heap,budget);
818 {
819 SetExpr e = setunion(x);
820 (void) e;
821 }
822 unsigned long long checks = Support::FailPoint::count();
824 return saw_failure && (checks > 0);
825 } catch (const MemoryExhausted&) {
827 saw_failure = true;
828 } catch (...) {
830 return false;
831 }
832 }
833 return false;
834 }
835#endif
836
838 FaultScope scope;
841 Support::FailPoint::fail_after(Phase::SpaceDisposeNoticeArray,0);
842 try {
845 return false;
846 } catch (const MemoryExhausted&) {
849 } catch (...) {
851 return false;
852 }
853 }
854
856 FaultScope scope;
859 try {
860 NoticeDisposeSpace s(4,true);
862 return false;
863 } catch (const MemoryExhausted&) {
866 } catch (...) {
868 return false;
869 }
870 }
871
873 FaultScope scope;
874 int ranges[2][2] = {{0, 0}, {2, 2}};
875 IntSet::fault_reset_allocations();
877 Support::FailPoint::fail_after(Phase::IntSet,0);
878 try {
879 IntSet s(ranges,2);
881 return false;
882 } catch (const MemoryExhausted&) {
884 return IntSet::fault_live_allocations() == 0;
885 } catch (...) {
887 return false;
888 }
889 }
890
892 FaultScope scope;
893 LinIntExpr::fault_reset_allocations();
895 try {
896 MiniModelSpace home;
897 IntVarArgs x(home,2,0,1);
898 Support::FailPoint::fail_after(Phase::MiniModel,1);
899 LinIntExpr e = min(x);
900 (void) e;
902 return false;
903 } catch (const MemoryExhausted&) {
905 return LinIntExpr::fault_live_allocations() == 0;
906 } catch (...) {
908 return false;
909 }
910 }
911
913 public:
914 static int disposed;
915
917 virtual ~FaultBoolMisc(void) {
918 disposed++;
919 }
920 virtual void post(Home, BoolVar, bool, const IntPropLevels&) {}
921 };
922
924
926 FaultScope scope;
929 Support::FailPoint::fail_after(Phase::MiniModel,0);
930 try {
931 BoolExpr b(new FaultBoolMisc);
932 (void) b;
934 return false;
935 } catch (const MemoryExhausted&) {
937 return FaultBoolMisc::disposed == 1;
938 } catch (...) {
940 return false;
941 }
942 }
943
945 FaultScope scope;
949 Support::FailPoint::fail_after(Phase::Heap,0);
950 try {
951 BoolExpr b(m);
952 (void) b;
954 return false;
955 } catch (const MemoryExhausted&) {
957 return FaultBoolMisc::disposed == 1;
958 } catch (...) {
960 return false;
961 }
962 }
963
965 public:
967 : Base("Fault::MiniModel::DefaultNodes") {}
968 virtual bool run(void) {
970 }
971 };
972
973 class MiniModelBoolMisc : public Base {
974 public:
976 : Base("Fault::MiniModel::BoolMisc") {}
977 virtual bool run(void) {
979 }
980 };
981
982 class IntSetAllocation : public Base {
983 public:
985 : Base("Fault::IntSet::Allocation") {}
986 virtual bool run(void) {
988 }
989 };
990
991 class DisposeNoticeArray : public Base {
992 public:
994 : Base("Fault::Dispose::NoticeArray") {}
995 virtual bool run(void) {
997 }
998 };
999
1001 public:
1003 : Base("Fault::Dispose::NoticeArrayResize") {}
1007 };
1008
1009 class CloneDisposalArray : public Base {
1010 public:
1012 : Base("Fault::Clone::DisposalArray") {}
1013 virtual bool run(void) {
1015 }
1016 };
1017
1019 public:
1021 : Base("Fault::Clone::DerivedSpaceUpdate") {}
1022 virtual bool run(void) {
1024 }
1025 };
1026
1027 class HeapAllocation : public Base {
1028 public:
1030 : Base("Fault::Heap::Allocation") {}
1031 virtual bool run(void) {
1033 }
1034 };
1035
1036 class HeapReallocation : public Base {
1037 public:
1039 : Base("Fault::Heap::Reallocation") {}
1040 virtual bool run(void) {
1042 }
1043 };
1044
1045 class CloneHeapFailures : public Base {
1046 public:
1048 : Base("Fault::Clone::HeapFailures") {}
1049 virtual bool run(void) {
1051 }
1052 };
1053
1055 public:
1057 : Base("Fault::Branch::ActionHeapFailures") {}
1058 virtual bool run(void) {
1060 }
1061 };
1062
1064 public:
1066 : Base("Fault::Branch::ChbHeapFailures") {}
1067 virtual bool run(void) {
1069 }
1070 };
1071
1072 class IntSetHeapFailures : public Base {
1073 public:
1075 : Base("Fault::IntSet::HeapFailures") {}
1076 virtual bool run(void) {
1078 }
1079 };
1080
1082 public:
1084 : Base("Fault::MiniModel::HeapFailures") {}
1085 virtual bool run(void) {
1087 }
1088 };
1089
1091 public:
1093 : Base("Fault::MiniModel::LinearSumHeapFailures") {}
1094 virtual bool run(void) {
1096 }
1097 };
1098
1100 public:
1102 : Base("Fault::MiniModel::BoolMiscHeapFailure") {}
1103 virtual bool run(void) {
1105 }
1106 };
1107
1108#ifdef GECODE_HAS_FLOAT_VARS
1110 public:
1112 : Base("Fault::MiniModel::FloatHeapFailures") {}
1113 virtual bool run(void) {
1115 }
1116 };
1117#endif
1118
1119#ifdef GECODE_HAS_SET_VARS
1121 public:
1123 : Base("Fault::MiniModel::SetHeapFailures") {}
1124 virtual bool run(void) {
1126 }
1127 };
1128#endif
1129
1130 class ClonePropagatorCopy : public Base {
1131 public:
1133 : Base("Fault::Clone::PropagatorCopy") {}
1134 virtual bool run(void) {
1135 return clone_after_failed_copy(Phase::PropagatorCopy,0) &&
1136 clone_after_failed_copy(Phase::PropagatorCopy,1);
1137 }
1138 };
1139
1140 class CloneBrancherCopy : public Base {
1141 public:
1143 : Base("Fault::Clone::BrancherCopy") {}
1144 virtual bool run(void) {
1145 return clone_after_failed_copy(Phase::BrancherCopy,0) &&
1146 clone_after_failed_copy(Phase::BrancherCopy,1);
1147 }
1148 };
1149
1150 class CloneAdvisorCopy : public Base {
1151 public:
1153 : Base("Fault::Clone::AdvisorCopy") {}
1154 virtual bool run(void) {
1156 }
1157 };
1158
1160 public:
1162 : Base("Fault::Clone::DerivedSpaceCopy") {}
1163 virtual bool run(void) {
1164 return expect_memory_exhausted(Phase::DerivedSpaceCopy,0);
1165 }
1166 };
1167
1169 public:
1171 : Base("Fault::Clone::LocalObjectCopy") {}
1172 virtual bool run(void) {
1174 }
1175 };
1176
1192#ifdef GECODE_HAS_FLOAT_VARS
1194#endif
1195#ifdef GECODE_HAS_SET_VARS
1197#endif
1204
1205}}
1206
1207// STATISTICS: test-fault
Base-class for both propagators and branchers.
Definition core.hpp:635
friend class Space
Definition core.hpp:637
virtual size_t dispose(Space &home)
Delete actor and return its size.
Definition core.hpp:3358
Propagator & propagator(void) const
Return the advisor's propagator.
Definition core.hpp:3983
Advisor(Space &home, Propagator &p, Council< A > &c)
Constructor for creation.
Definition core.hpp:3952
void dispose(Space &home, Council< A > &c)
Dispose the advisor.
Definition core.hpp:3990
friend class Council
Definition core.hpp:1303
Class to iterate over advisors of a council.
Definition core.hpp:1275
A & advisor(void) const
Return advisor.
Definition core.hpp:4147
Archive representation
Definition archive.hpp:42
Miscealloneous Boolean expressions.
Boolean expressions.
Passing Boolean variables.
Definition int.hh:738
Boolean integer variables.
Definition int.hh:533
Base-class for branchers.
Definition core.hpp:1453
friend class Space
Definition core.hpp:1455
Brancher(Home home)
Constructor for creation.
Definition core.hpp:3714
friend class Choice
Definition core.hpp:1456
Choice for performing commit
Definition core.hpp:1423
Choice(const Brancher &b, const unsigned int a)
Initialize for particular brancher b and alternatives a.
Definition core.hpp:3887
virtual void archive(Archive &e) const
Archive into e.
Definition core.cpp:946
Depth-first search engine.
Definition search.hh:1080
Passing float variables.
Definition float.hh:982
Home class for posting propagators
Definition core.hpp:863
void notice(Actor &a, ActorProperty p, bool duplicate=false)
Notice actor property.
Definition core.hpp:3301
Passing integer arguments.
Definition int.hh:652
Class for specifying integer propagation levels used by minimodel.
Definition minimodel.hh:109
Integer sets.
Definition int.hh:178
static const IntSet empty
Empty set.
Definition int.hh:301
Passing integer variables.
Definition int.hh:680
Integer variable array.
Definition int.hh:791
Float expressions
Definition minimodel.hh:845
Linear expressions over integer variables.
Definition minimodel.hh:257
LocalHandle(void)
Create local handle pointing to nullptr object.
Definition core.hpp:3860
void update(Space &home, LocalHandle &lh)
Updating during cloning.
Definition core.hpp:3877
LocalObject * object(void) const
Access to the local object.
Definition core.hpp:3873
friend class Space
Definition core.hpp:1546
LocalObject(Home home)
Constructor for creation.
Definition core.hpp:3842
Exception: Memory exhausted
Definition exception.hpp:63
Propagation cost.
Definition core.hpp:493
static PropCost unary(PropCost::Mod m)
Single variable for modifier pcm.
Definition core.hpp:4989
Base-class for propagators.
Definition core.hpp:1073
friend class Space
Definition core.hpp:1075
friend class Council
Definition core.hpp:1078
Propagator(Home home)
Constructor for posting.
Definition core.hpp:3607
virtual T * next(void)
Return next solution (nullptr, if none exists or search has been stopped).
Definition base.hpp:46
Set expressions
Passing set variables.
Definition set.hh:491
Computation spaces.
Definition core.hpp:1775
A lock as a scoped frontend for a mutex.
Definition thread.hpp:114
A mutex for mutual exclausion among several threads.
Definition thread.hpp:78
Base(std::string s)
Create and register test with name s.
Definition test.cpp:60
bool advisors_point_to_self(void) const
Definition fault.cpp:121
virtual void reschedule(Space &)
Schedule function.
Definition fault.cpp:137
static AdvisorCopyPropagator * post(Home home)
Definition fault.cpp:118
virtual size_t dispose(Space &home)
Delete actor and return its size.
Definition fault.cpp:141
AdvisorCopyPropagator(Space &home, AdvisorCopyPropagator &p)
Definition fault.cpp:113
virtual PropCost cost(const Space &, const ModEventDelta &) const
Cost function.
Definition fault.cpp:134
virtual Actor * copy(Space &home)
Create copy.
Definition fault.cpp:131
Council< ThrowingAdvisor > c
Definition fault.cpp:108
virtual ExecStatus propagate(Space &, const ModEventDelta &)
Propagation function.
Definition fault.cpp:138
AdvisorCopyPropagator * p
Definition fault.cpp:343
AdvisorCopySpace(AdvisorCopySpace &s)
Definition fault.cpp:346
virtual Space * copy(void)
Copying member function.
Definition fault.cpp:347
bool advisors_point_to_source(void) const
Definition fault.cpp:350
virtual bool run(void)
Run test.
Definition fault.cpp:1058
virtual bool run(void)
Run test.
Definition fault.cpp:1067
BranchPostSpace(BranchPostSpace &s)
Definition fault.cpp:361
virtual Space * copy(void)
Copying member function.
Definition fault.cpp:364
virtual bool run(void)
Run test.
Definition fault.cpp:1154
virtual bool run(void)
Run test.
Definition fault.cpp:1144
CloneCopySpace(CloneCopySpace &s)
Definition fault.cpp:199
virtual Space * copy(void)
Copying member function.
Definition fault.cpp:200
virtual bool run(void)
Run test.
Definition fault.cpp:1163
virtual bool run(void)
Run test.
Definition fault.cpp:1022
virtual bool run(void)
Run test.
Definition fault.cpp:1013
virtual bool run(void)
Run test.
Definition fault.cpp:1049
virtual bool run(void)
Run test.
Definition fault.cpp:1172
virtual bool run(void)
Run test.
Definition fault.cpp:1134
virtual Space * copy(void)
Copying member function.
Definition fault.cpp:279
DerivedCopySpace(DerivedCopySpace &s)
Definition fault.cpp:275
virtual Space * copy(void)
Copying member function.
Definition fault.cpp:295
DerivedUpdateSpace(DerivedUpdateSpace &s)
Definition fault.cpp:291
virtual bool run(void)
Run test.
Definition fault.cpp:1004
virtual bool run(void)
Run test.
Definition fault.cpp:995
virtual Space * copy(void)
Copying member function.
Definition fault.cpp:214
DisposeSpace(DisposeSpace &s)
Definition fault.cpp:211
virtual void post(Home, BoolVar, bool, const IntPropLevels &)
Definition fault.cpp:920
virtual ~FaultBoolMisc(void)
Definition fault.cpp:917
FaultLocalHandle(FaultLocalObject *o)
Definition fault.cpp:319
void update(Space &home, FaultLocalHandle &h)
Definition fault.cpp:320
FaultLocalObject(Home home, int v)
Definition fault.cpp:303
virtual size_t dispose(Space &)
Delete actor and return its size.
Definition fault.cpp:311
FaultLocalObject(Space &home, FaultLocalObject &o)
Definition fault.cpp:304
virtual Actor * copy(Space &home)
Create copy.
Definition fault.cpp:308
virtual bool run(void)
Run test.
Definition fault.cpp:1031
virtual bool run(void)
Run test.
Definition fault.cpp:1040
virtual bool run(void)
Run test.
Definition fault.cpp:986
virtual bool run(void)
Run test.
Definition fault.cpp:1076
FaultLocalHandle h
Definition fault.cpp:330
virtual Space * copy(void)
Copying member function.
Definition fault.cpp:336
LocalCopySpace(LocalCopySpace &s)
Definition fault.cpp:333
virtual bool run(void)
Run test.
Definition fault.cpp:1103
virtual bool run(void)
Run test.
Definition fault.cpp:977
virtual bool run(void)
Run test.
Definition fault.cpp:968
virtual bool run(void)
Run test.
Definition fault.cpp:1113
virtual bool run(void)
Run test.
Definition fault.cpp:1085
virtual bool run(void)
Run test.
Definition fault.cpp:1094
virtual bool run(void)
Run test.
Definition fault.cpp:1124
MiniModelSpace(MiniModelSpace &s)
Definition fault.cpp:262
virtual Space * copy(void)
Copying member function.
Definition fault.cpp:263
static void post(Home home)
Definition fault.cpp:226
virtual Actor * copy(Space &home)
Create copy.
Definition fault.cpp:229
virtual size_t dispose(Space &home)
Delete actor and return its size.
Definition fault.cpp:232
NoticeDisposeSpace(int registered=0, bool fail_next=false)
Definition fault.cpp:243
virtual Space * copy(void)
Copying member function.
Definition fault.cpp:254
NoticeDisposeSpace(NoticeDisposeSpace &s)
Definition fault.cpp:253
void dispose(Space &home, Council< ThrowingAdvisor > &c)
Definition fault.cpp:101
ThrowingAdvisor(Space &home, ThrowingAdvisor &a)
Definition fault.cpp:94
Propagator * owner(void) const
Definition fault.cpp:98
ThrowingAdvisor(Space &home, Propagator &p, Council< ThrowingAdvisor > &c, int id0)
Definition fault.cpp:91
virtual bool status(const Space &) const
Check status of brancher, return true if alternatives left.
Definition fault.cpp:168
virtual ExecStatus commit(Space &, const Choice &, unsigned int)
Commit for choice c and alternative a.
Definition fault.cpp:177
virtual const Choice * choice(Space &)
Return choice.
Definition fault.cpp:171
virtual void print(const Space &, const Choice &, unsigned int, std::ostream &) const
Print branch for choice c and alternative a.
Definition fault.cpp:181
virtual Actor * copy(Space &home)
Create copy.
Definition fault.cpp:183
static void post(Home home)
Definition fault.cpp:165
ThrowingBrancher(Space &home, ThrowingBrancher &b)
Definition fault.cpp:160
virtual const Choice * choice(const Space &, Archive &)
Return choice from e.
Definition fault.cpp:174
virtual size_t dispose(Space &)
Delete actor and return its size.
Definition fault.cpp:186
ThrowingChoice(const Brancher &b)
Definition fault.cpp:150
virtual void archive(Archive &e) const
Archive into e.
Definition fault.cpp:151
virtual PropCost cost(const Space &, const ModEventDelta &) const
Cost function.
Definition fault.cpp:72
static void post(Home home)
Definition fault.cpp:66
ThrowingPropagator(Space &home, ThrowingPropagator &p)
Definition fault.cpp:61
virtual size_t dispose(Space &home)
Delete actor and return its size.
Definition fault.cpp:79
virtual Actor * copy(Space &home)
Create copy.
Definition fault.cpp:69
virtual ExecStatus propagate(Space &home, const ModEventDelta &)
Propagation function.
Definition fault.cpp:76
virtual void reschedule(Space &)
Schedule function.
Definition fault.cpp:75
Heap heap
The single global heap.
Definition heap.cpp:44
ExecStatus ES_SUBSUMED(Propagator &p)
Propagator p is subsumed
Definition core.hpp:3672
void ignore(Actor &a, ActorProperty p, bool duplicate=false)
Ignore actor property.
Definition core.hpp:4213
int ModEventDelta
Modification event deltas.
Definition core.hpp:94
@ AP_DISPOSE
Actor must always be disposed.
Definition core.hpp:569
void branch(Home home, const FloatVarArgs &x, FloatVarBranch vars, FloatValBranch vals, FloatBranchFilter bf=nullptr, FloatVarValPrint vvp=nullptr)
Branch over x with variable selection vars and value selection vals.
Definition branch.cpp:39
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
Definition rel.cpp:68
Space(void)
Default constructor.
Definition core.cpp:121
Space * clone(void) const
Clone space.
Definition core.hpp:3312
const Choice * choice(void)
Create new choice for current brancher.
Definition core.cpp:568
SpaceStatus status(StatusStatistics &stat)
Query space status.
Definition core.cpp:282
void commit(const Choice &c, unsigned int a)
Commit choice c for alternative a.
Definition core.hpp:3326
@ SS_FAILED
Space is failed
Definition core.hpp:1715
Phase
Named phase for deterministic test failure injection.
Definition failpoint.hpp:49
void reset(void)
Reset all failpoint state.
void check(Phase p)
Check failpoint for phase p.
unsigned long long count(void)
Number of checks observed for the configured phase.
void fail_after(Phase p, unsigned long long n)
Fail after n successful checks for phase p.
Gecode toplevel namespace
IntVarBranch INT_VAR_ACTION_SIZE_MAX(double d=1.0, BranchTbl tbl=nullptr)
Select variable with largest action divided by domain size with decay factor d.
Definition var.hpp:256
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
IntValBranch INT_VAL_MIN(void)
Select smallest value.
Definition val.hpp:55
SetExpr setunion(const SetVarArgs &)
Union of set variables.
Definition set-expr.cpp:705
ExecStatus
Definition core.hpp:479
@ ES_OK
Execution is okay.
Definition core.hpp:483
@ ES_FIX
Propagation has computed fixpoint.
Definition core.hpp:484
IntVarBranch INT_VAR_CHB_SIZE_MAX(IntCHB c, BranchTbl tbl=nullptr)
Select variable with largest CHB Q-score divided by domain size.
Definition var.hpp:276
IntVarBranch INT_VAR_SIZE_MIN(BranchTbl tbl=nullptr)
Select variable with smallest domain size.
Definition var.hpp:206
bool dispose_notice_resize_failure_does_not_dispose_unregistered_actor(void)
Definition fault.cpp:855
MiniModelBoolMisc minimodel_bool_misc
Definition fault.cpp:1189
bool minimodel_failure_releases_default_nodes(void)
Definition fault.cpp:891
bool clone_after_failed_disposal_array(void)
Definition fault.cpp:486
bool linear_sum_constructor_heap_failures_release_nodes(int kind)
Definition fault.cpp:715
bool clone_heap_failures_recover_source(void)
Definition fault.cpp:585
bool dispose_notice_initial_failure_does_not_dispose_actor(void)
Definition fault.cpp:837
bool int_set_failure_releases_object(void)
Definition fault.cpp:872
HeapReallocation heap_reallocation
Definition fault.cpp:1185
MiniModelSetHeapFailures minimodel_set_heap_failures
Definition fault.cpp:1196
bool clone_after_failed_derived_update(void)
Definition fault.cpp:525
DisposeNoticeArray dispose_notice_array
Definition fault.cpp:1182
HeapAllocation heap_allocation
Definition fault.cpp:1184
MiniModelDefaultNodes minimodel_default_nodes
Definition fault.cpp:1188
bool clone_after_failed_copy(Phase p, unsigned long long n)
Definition fault.cpp:378
CloneHeapFailures clone_heap_failures
Definition fault.cpp:1181
ClonePropagatorCopy clone_propagator_copy
Definition fault.cpp:1198
CloneDisposalArray clone_disposal_array
Definition fault.cpp:1179
bool minimodel_heap_failure_releases_bool_misc(void)
Definition fault.cpp:944
bool minimodel_float_heap_failures_are_recoverable(void)
Definition fault.cpp:780
CloneLocalObjectCopy clone_local_object_copy
Definition fault.cpp:1202
bool heap_reallocation_failpoint_throws(void)
Definition fault.cpp:564
IntSetAllocation int_set_allocation
Definition fault.cpp:1186
bool clone_after_failed_local_object_copy(void)
Definition fault.cpp:436
MiniModelFloatHeapFailures minimodel_float_heap_failures
Definition fault.cpp:1193
BranchActionHeapFailures branch_action_heap_failures
Definition fault.cpp:1177
bool expect_memory_exhausted(Phase p, unsigned long long n)
Definition fault.cpp:407
MiniModelLinearSumHeapFailures minimodel_linear_sum_heap_failures
Definition fault.cpp:1203
bool branch_post_heap_failures_are_recoverable(bool chb)
Definition fault.cpp:613
Support::Mutex fault_mutex
Definition fault.cpp:44
bool clone_after_failed_advisor_copy(void)
Definition fault.cpp:460
CloneDerivedSpaceUpdate clone_derived_space_update
Definition fault.cpp:1180
bool minimodel_set_heap_failures_are_recoverable(void)
Definition fault.cpp:809
IntSetHeapFailures int_set_heap_failures
Definition fault.cpp:1187
bool derived_update_space_is_usable(DerivedUpdateSpace &s)
Definition fault.cpp:514
bool minimodel_linear_sum_heap_failures_release_nodes(void)
Definition fault.cpp:772
bool int_set_heap_failures_release_object(void)
Definition fault.cpp:654
CloneDerivedSpaceCopy clone_derived_space_copy
Definition fault.cpp:1201
CloneBrancherCopy clone_brancher_copy
Definition fault.cpp:1199
BranchChbHeapFailures branch_chb_heap_failures
Definition fault.cpp:1178
CloneAdvisorCopy clone_advisor_copy
Definition fault.cpp:1200
bool minimodel_failure_releases_bool_misc(void)
Definition fault.cpp:925
MiniModelBoolMiscHeapFailure minimodel_bool_misc_heap_failure
Definition fault.cpp:1190
MiniModelHeapFailures minimodel_heap_failures
Definition fault.cpp:1191
DisposeNoticeArrayResize dispose_notice_array_resize
Definition fault.cpp:1183
bool heap_allocation_failpoint_throws(void)
Definition fault.cpp:546
bool minimodel_heap_failures_release_nodes(void)
Definition fault.cpp:684
General test support.
Definition afc.cpp:39