36 std::cout <<
"== Deep dependency graph smoke test ==\n";
44 auto A = std::make_shared<Block>(); A->blockname =
"SRC_A";
45 auto B = std::make_shared<Block>();
B->blockname =
"SRC_B";
49 auto acc = std::make_shared<BlockAccessor>();
50 acc->emplace(
"SRC_A", A);
51 acc->emplace(
"SRC_B",
B);
53 auto depSUM = std::make_shared<DependentBlock>(
54 std::unordered_map<std::string, std::shared_ptr<Block>>{
58 [=](
const auto& blocks, std::shared_ptr<DependentBlock> self){
59 double v = blocks.get_val(
"SRC_A", ID_X) + blocks.get_val(
"SRC_B", ID_X);
60 if (!self->contains(ID_SUM)) {
63 self->assign(ID_SUM, v);
66 depSUM->blockname =
"SUM";
68 acc->emplace(
"SUM", depSUM);
70 auto DER = std::make_shared<Block>(); DER->blockname =
"DERIVED";
71 acc->emplace(
"DERIVED", DER);
75 std::unordered_map<ParamId, std::shared_ptr<Parameter>> srcs;
79 auto P1 = std::make_shared<DependentParameter>(
81 [=](
const ParamSrc& s, std::shared_ptr<DependentParameter> self){
83 self->set_expected(10.0 * a);
87 DER->store_or_assign(ID_P1, P1);
92 std::unordered_map<ParamId, std::shared_ptr<Parameter>> srcs;
98 auto P2 = std::make_shared<DependentParameter>(
100 [=](
const ParamSrc& s, std::shared_ptr<DependentParameter> self){
103 self->set_expected(sumv + p1v);
107 DER->store_or_assign(ID_P2, P2);
110 auto depPOST = std::make_shared<DependentBlock>(
111 std::unordered_map<std::string, std::shared_ptr<Block>>{
115 [=](
const auto& blocks, std::shared_ptr<DependentBlock> self){
116 double sumv = blocks.get_val(
"SUM", ID_SUM);
117 double p2v = blocks.get_val(
"DERIVED", ID_P2);
118 double v = 3.0 * sumv + p2v;
119 if (!self->contains(ID_POST)) {
122 self->assign(ID_POST, v);
125 depPOST->blockname =
"POST";
127 acc->emplace(
"POST", depPOST);
130 std::cout <<
"\n[1] Test lazy via contains() sur blocks dependants\n";
131 bool sum_has = acc->at(
"SUM")->contains(ID_SUM);
132 std::cout <<
"SUM contains(300) = " << sum_has <<
"\n";
133 assert(sum_has &&
"SUM should materialize on contains()");
135 bool post_has = acc->at(
"POST")->contains(ID_POST);
136 std::cout <<
"POST contains(400) = " << post_has <<
"\n";
137 assert(post_has &&
"POST should materialize on contains()");
139 std::cout <<
"\n[2] Lecture valeurs (force ensure_up_to_date en cascade)\n";
140 double sum0 = acc->getValue(
"SUM", ID_SUM);
141 double p1_0 = acc->getValue(
"DERIVED", ID_P1);
142 double p2_0 = acc->getValue(
"DERIVED", ID_P2);
143 double post0 = acc->getValue(
"POST", ID_POST);
145 std::cout <<
"SUM = " << sum0 <<
" (expected 1+2=3)\n";
146 std::cout <<
"P1 = " << p1_0 <<
" (expected 10*A=10)\n";
147 std::cout <<
"P2 = " << p2_0 <<
" (expected SUM+P1=13)\n";
148 std::cout <<
"POST = " << post0 <<
" (expected 3*SUM+P2=22)\n";
150 assert(std::abs(sum0 - 3.0) < 1e-12);
151 assert(std::abs(p1_0 - 10.0) < 1e-12);
152 assert(std::abs(p2_0 - 13.0) < 1e-12);
153 assert(std::abs(post0 - 22.0) < 1e-12);
155 std::cout <<
"\n[3] Mutation source: setValue(A=7) => cascade\n";
156 acc->setValue(
"SRC_A", ID_X, 7.0);
157 double sum1 = acc->getValue(
"SUM", ID_SUM);
158 double p1_1 = acc->getValue(
"DERIVED", ID_P1);
159 double p2_1 = acc->getValue(
"DERIVED", ID_P2);
160 double post1 = acc->getValue(
"POST", ID_POST);
162 std::cout <<
"SUM = " << sum1 <<
" (expected 9)\n";
163 std::cout <<
"P1 = " << p1_1 <<
" (expected 70)\n";
164 std::cout <<
"P2 = " << p2_1 <<
" (expected 79)\n";
165 std::cout <<
"POST = " << post1 <<
" (expected 106)\n";
167 assert(std::abs(sum1 - 9.0) < 1e-12);
168 assert(std::abs(p1_1 - 70.0) < 1e-12);
169 assert(std::abs(p2_1 - 79.0) < 1e-12);
170 assert(std::abs(post1 - 106.0) < 1e-12);
172 std::cout <<
"\n[4] Freeze: freeze POST, mutate B, POST doit rester stable\n";
173 acc->at(
"POST")->freeze();
174 acc->setValue(
"SRC_B", ID_X, 10.0);
176 double sum2 = acc->getValue(
"SUM", ID_SUM);
177 double post2 = acc->getValue(
"POST", ID_POST);
179 std::cout <<
"SUM = " << sum2 <<
" (expected 17)\n";
180 std::cout <<
"POST = " << post2 <<
" (expected STILL 106 because frozen)\n";
181 assert(std::abs(sum2 - 17.0) < 1e-12);
182 assert(std::abs(post2 - 106.0) < 1e-12);
184 std::cout <<
"\n[5] Unfreeze: POST doit se mettre à jour au prochain get\n";
185 acc->at(
"POST")->unfreeze();
186 double post3 = acc->getValue(
"POST", ID_POST);
188 std::cout <<
"POST = " << post3 <<
" (expected 138)\n";
189 assert(std::abs(post3 - 138.0) < 1e-12);
191 std::cout <<
"\n[6] Sanity: getAllIDs/getItems prints\n";
192 print_block(*acc,
"SRC_A");
193 print_block(*acc,
"SRC_B");
194 print_block(*acc,
"SUM");
195 print_block(*acc,
"DERIVED");
196 print_block(*acc,
"POST");
198 std::cout <<
"\n[7] Remove source parameter A[100] then check behavior\n";
200 acc->remove_item(
"SRC_A", ID_X);
202 bool threw = !acc->at(
"SUM")->contains(300);
206 threw = !acc->at(
"DERIVED")->contains(ID_P1);
209 std::cout <<
"\n Deep dependency graph smoke test passed.\n";