Orbiter 2022
Combinatorial Objects
design.cpp
Go to the documentation of this file.
1// design.cpp
2//
3// Anton Betten
4// 18.09.2000
5// moved from D2 to ORBI Nov 15, 2007
6
8#include "discreta.h"
9
10using namespace std;
11
12
13namespace orbiter {
14namespace layer2_discreta {
15
16
17static void prepare_entry(Vector &entry, int i, int j,
18 int h, int t, int v, int k, int lambda);
19static void determine_minimal_and_maximal_path(Vector &v,
20 Vector & min_path, Vector & max_path, int & max_depth);
21static void determine_dominating_ancestor(int t, int v, int k,
22 discreta_base & lambda, Vector & path,
23 design_parameter &dominating_ancestor);
24static void reduce_path(Vector &cmp, Vector &min_path);
25static void family_report(database & D, ostream& fhtml,
26 ostream &ftex, int t, int v, int k, discreta_base &lambda,
27 Vector & cm, Vector & cmp, int minimal_t);
28
29
30int design_parameters_admissible(int v, int t, int k, discreta_base & lambda)
31{
32 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
33 discreta_base b, q, r;
34
35 b.m_i_i(delta_lambda);
36 lambda.integral_division(b, q, r, 0);
37 if (!r.is_zero())
38 return FALSE;
39
40 discreta_base lambda_max;
41 design_lambda_max(t, v, k, lambda_max);
42 if (lambda.gt(lambda_max))
43 return FALSE;
44 return TRUE;
45}
46
47int calc_delta_lambda(int v, int t, int k, int f_v)
48{
49 discreta_base lambda;
50 int i;
51 discreta_base a, b, a1, b1, g, rhs_a, rhs_b, delta_lambda, dl, a2, b2, gg;
52
53 // f_v = TRUE;
54
55 lambda.m_i_i(1);
56 if (f_v) {
57 cout << "calc_delta_lambda: v=" << v << " t=" << t << " k="
58 << k << " lambda=" << lambda << endl;
59 }
60 for (i = t; i >= 0; i--) {
61 if (i == t) {
62 rhs_a = lambda;
63 rhs_b.m_i_i(1);
64 delta_lambda.m_i_i(1);
65 }
66 else {
67 a1.m_i_i(v - i);
68 b1.m_i_i(k - i);
69 a.mult(rhs_a, a1);
70 b.mult(rhs_b, b1);
71 a.extended_gcd(b, a2, b2, g, 0);
72 a.divide_by_exact(g);
73 b.divide_by_exact(g);
74 delta_lambda.extended_gcd(b, a2, b2, gg, 0);
75 b1 = b;
76 b1.divide_by_exact(gg);
77 dl.mult(delta_lambda, b1);
78 delta_lambda = dl;
79 if (f_v) {
80 cout << "t'=" << i << " lambda'=" << a << "/" << b
81 << " delta_lambda=" << delta_lambda << endl;
82 }
83 rhs_a = a;
84 rhs_b = b;
85 }
86 }
87 if (delta_lambda.s_kind() == INTEGER)
88 return delta_lambda.s_i_i();
89 else {
90 cout << "calc_delta_lambda delta_lambda in longinteger" << endl;
91 exit(1);
92 }
93}
94
95void design_lambda_max(int t, int v, int k, discreta_base & lambda_max)
96{
97 Binomial(v - t, k - t, lambda_max);
98}
99
100void design_lambda_max_half(int t, int v, int k,
101 discreta_base & lambda_max_half)
102{
103 discreta_base lambda_max, two, r;
104
105 design_lambda_max(t, v, k, lambda_max);
106 two.m_i_i(2);
107 lambda_max.integral_division(two, lambda_max_half, r, 0);
108}
109
110void design_lambda_ijs_matrix(int t, int v, int k,
111 discreta_base& lambda, int s, discreta_matrix & M)
112{
113 int i, j;
114
115 M.m_mn_n(t + 1, t + 1);
116 for (i = 0; i <= t; i++) {
117 for (j = 0; j <= t - i; j++) {
118 design_lambda_ijs(t, v, k, lambda, s, i, j, M[i][j]);
119 }
120 }
121}
122
123void design_lambda_ijs(int t, int v, int k,
124 discreta_base& lambda, int s, int i, int j,
125 discreta_base & lambda_ijs)
126//\lambda_{i,j}^{(s)} =
127// \sum_{h=0}^j (-1)^h {j \choose h} {\lambda_{i+h} \choose s}
128//cf. Wilson, Van Lint~\cite{VanLintWilson92}.
129{
130 discreta_base a, b, c;
131 int h;
132
133 lambda_ijs.m_i_i(0);
134 for (h = 0; h <= j; h++) {
135 Binomial(j, h, a);
136 if (ODD(h))
137 a.negate();
138 design_lambda_ij(t, v, k, lambda, i + h, 0, b);
139 N_choose_K(b, s, c);
140 a *= c;
141 lambda_ijs += a;
142 }
143}
144
145void design_lambda_ij(int t, int v, int k,
146 discreta_base& lambda, int i, int j,
147 discreta_base & lambda_ij)
148//\lambda_{i,j} = \lambda \frac{{v-i-j \choose k-i}}{{v-t \choose k-t}}
149//cf. Wilson, Van Lint~\cite{VanLintWilson92}.
150{
151 discreta_base a, b;
152
153 Binomial(v - i - j, k - i, a);
154 Binomial(v - t, k - t, b);
155 lambda_ij = lambda;
156 lambda_ij *= a;
157 // cout << "design_lambda_ij() t=" << t << " v=" << v << " k=" << k
158 //<< " lambda=" << lambda << " i=" << i << " j=" << j << endl;
159 // cout << "design_lambda_ij() a=" << a << endl;
160 // cout << "design_lambda_ij() b=" << b << endl;
161 lambda_ij.divide_by_exact(b);
162}
163
164int is_trivial_clan(int t, int v, int k)
165{
166 discreta_base dl, lambda_max;
167
168 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
169 dl.m_i_i(delta_lambda);
170 design_lambda_max(t, v, k, lambda_max);
171 if (dl.eq(lambda_max))
172 return TRUE;
173 else
174 return FALSE;
175}
176
177void print_clan_tex_int(int t, int v, int k)
178{
179 integer T(t), V(v), K(k);
180 discreta_base lambda_max, m_max;
181
182 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
183 design_lambda_max(t, v, k, lambda_max);
184 lambda_max.integral_division_by_integer_exact(delta_lambda, m_max);
185 print_clan_tex(T, V, K, delta_lambda, m_max);
186}
187
188void print_clan_tex_int(int t, int v, int k,
189 int delta_lambda, discreta_base &m_max)
190{
191 integer T(t), V(v), K(k);
192 print_clan_tex(T, V, K, delta_lambda, m_max);
193}
194
196 discreta_base &k, int delta_lambda, discreta_base &m_max)
197{
198 Vector vp, ve;
199
200 factor_integer(m_max.s_i_i(), vp, ve);
201 cout << t << "\\mbox{-}(" << v << "," << k << ", m \\cdot "
202 << delta_lambda << ")_{m \\le ";
203 if (vp.s_l() > 1 || (vp.s_l() > 0 && ve.s_ii(0) > 1)) {
204 {
206 discreta_print_factorization(vp, ve, cout);
207 }
208 }
209 else {
210 cout << m_max;
211 }
212 cout << "}";
213}
214
215int is_ancestor(int t, int v, int k)
216{
217 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
218 return is_ancestor(t, v, k, delta_lambda);
219}
220
221int is_ancestor(int t, int v, int k, int delta_lambda)
222{
223 int c, T, V, K, Delta_lambda;
224
225 if (calc_redinv(t, v, k, delta_lambda, c, T, V, K, Delta_lambda) && c == 1) {
226 // cout << "is_ancestor(): " << t << " " << v << " " << k
227 //<< " is not ancestor, red^-1 is possible for c=" << c << endl;
228 return FALSE;
229 }
230 if (calc_derinv(t, v, k, delta_lambda, c, T, V, K, Delta_lambda) && c == 1) {
231 // cout << "is_ancestor(): " << t << " " << v << " " << k
232 //<< " is not ancestor, der^-1 is possible for c=" << c << endl;
233 return FALSE;
234 }
235 if (calc_resinv(t, v, k, delta_lambda, c, T, V, K, Delta_lambda) && c == 1) {
236 // cout << "is_ancestor(): " << t << " " << v << " " << k
237 //<< " is not ancestor, res^-1 is possible for c=" << c << endl;
238 return FALSE;
239 }
240 return TRUE;
241}
242
243int calc_redinv(int t, int v, int k, int delta_lambda, int &c,
244 int &T, int &V, int &K, int &Delta_lambda)
245{
246 long int vt, kt, g, v1, k1, gg;
248
249 if (t == k)
250 return FALSE;
251 T = t + 1;
252 V = v;
253 K = k;
254 vt = v - t;
255 kt = k - t;
256 g = NT.gcd_lint(vt, kt);
257 v1 = vt / g;
258 k1 = kt / g;
259 gg = NT.gcd_lint(delta_lambda, v1);
260 c = v1 / gg;
261 Delta_lambda = k1 * delta_lambda / gg;
262 return TRUE;
263}
264
265int calc_derinv(int t, int v, int k, int delta_lambda, int &c,
266 int &T, int &V, int &K, int &Delta_lambda)
267{
268 T = t + 1;
269 V = v + 1;
270 K = k + 1;
271 Delta_lambda = calc_delta_lambda(V, T, K, FALSE);
272 c = Delta_lambda / delta_lambda;
273 return TRUE;
274}
275
276int calc_resinv(int t, int v, int k, int delta_lambda, int &c,
277 int &T, int &V, int &K, int &Delta_lambda)
278{
279 long int a, b, g;
281
282 if (t == k)
283 return FALSE;
284 T = t + 1;
285 V = v + 1;
286 K = k;
287 Delta_lambda = calc_delta_lambda(V, T, K, FALSE);
288 a = Delta_lambda * (v + 1 - k);
289 b = delta_lambda * (k - t);
290 g = NT.gcd_lint(a, b);
291 c = a / g;
292 return TRUE;
293}
294
296//The Mendelsohn equations for any $t$-$(v,k,\lambda)$ design $\cD = (\cV, \cB)$
297//and any $m$-subset $M \subseteq \cV$ are for $s \ge 1$:
298//\[
299//\sum_{j=i}^m {m \choose j} \alpha_j^{(s)}(M) =
300//{\lambda_i \choose s} {m \choose i} \quad \text{for} i=0,\ldots,t
301//\]
302//cf. Mendelsohn~\cite{Mendelsohn71}.
303{
304 int i, j;
305
306 M.m_mn_n(t + 1, m + 1);
307 for (i = 0; i <= t; i++) {
308 for (j = i; j <= m; j++) {
309 Binomial(j, i, M[i][j]);
310 }
311 }
312}
313
314void design_mendelsohn_rhs(int v, int t, int k,
315 discreta_base& lambda, int m, int s, Vector & rhs)
316{
317 int i;
318 discreta_base a, b, c;
319
320 rhs.m_l(t + 1);
321 for (i = 0; i <= t; i++) {
322 Binomial(m, i, a);
323 design_lambda_ij(t, v, k, lambda, i, 0, b);
324 N_choose_K(b, s, c);
325 rhs[i].mult(a, c);
326 }
327}
328
330 design_parameter &p, int& idx)
331{
332 int verbose_level = 0;
333 btree& B_tvkl = D.btree_access_i(2);
334
336 p.t(), p.v(), p.K(), p.lambda().s_i_i(), verbose_level);
337 if (idx == -1)
338 return FALSE;
339 else
340 return TRUE;
341}
342
344 design_parameter &p, int& highest_id, int verbose_level)
345{
346 int f_v = (verbose_level >= 1);
347 int idx;
348
350 p.id() = ++highest_id;
351 D.add_object(p, verbose_level - 2);
352 if (f_v) {
353 cout << p.id() << " added: " << p
354 << " new highest_id=" << highest_id << endl;
355 }
356 }
357 else {
358 int btree_idx = 2;
359 btree& B_tvkl = D.btree_access_i(btree_idx);
360
362 KEYTYPE key;
363 DATATYPE data;
364
365 B_tvkl.ith(idx, &key, &data, verbose_level - 1);
366 D.get_object(&data, p1, verbose_level - 2);
367 // D.ith_object(idx, btree_idx, p1, FALSE, FALSE);
368 for (int i = 0; i < p.source().s_l(); i++) {
369 p1.source().append(p.source_i(i));
370 }
371 D.delete_object(p1, data.datref, verbose_level - 2);
372 D.add_object(p1, verbose_level - 2);
373 if (f_v) {
374 cout << p1.id() << " changed: " << p1 << endl;
375 }
376 }
377}
378
380 int highest_id_already_closed, int minimal_t,
381 int verbose_level)
382{
383 int f_v = (verbose_level >= 1);
384 int f_vv = (verbose_level >= 2);
385
386 if (!D.f_open()) {
387 cout << "design_parameter_database_closure "
388 "database not open" << endl;
389 exit(1);
390 }
391 int highest_id, old_highest_id, id;
392 int btree_idx_id = 0;
393
394 highest_id = D.get_highest_int4(btree_idx_id);
395 old_highest_id = highest_id;
396 if (f_v) {
397 cout << "design_parameter_database_closure "
398 "highest_id_already_closed=" << highest_id_already_closed
399 << " highest_id=" << highest_id << endl;
400 }
401 for (id = highest_id_already_closed + 1; id <= highest_id; id++) {
402 design_parameter p, q;
403
404 D.get_object_by_unique_int4(btree_idx_id, id, p, verbose_level);
405 if (f_vv) {
406 cout << "closure of design #" << id << " : " << p << endl;
407 }
408
409 if (f_vv) cout << "reduced_t:" << endl;
410 p.reduced_t(q);
411 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
413 highest_id, verbose_level - 2);
414 }
415
416 if (f_vv) cout << "derived:" << endl;
417 p.derived(q);
418 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
420 highest_id, verbose_level - 2);
421 }
422
423 if (f_vv) cout << "residual:" << endl;
424 p.residual(q);
425 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
427 highest_id, verbose_level - 2);
428 }
429
430 if (p.trung_complementary(q)) {
431 if (f_vv) cout << "trung_complementary:" << endl;
432 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
434 highest_id, verbose_level - 2);
435 }
436 }
437
438 if (p.alltop(q)) {
439 if (f_vv) cout << "alltop:" << endl;
440 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
442 highest_id, verbose_level - 2);
443 }
444 }
445
446 if (p.v() == 2 * p.K() + 1) {
447 if (f_vv) cout << "complementary design:" << endl;
448 p.complementary(q);
449 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
451 highest_id, verbose_level - 2);
452 }
453 }
454
455#if 0
456 if (f_vv) cout << "supplementary design:" << endl;
457 p.supplementary(q);
458 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
460 highest_id, verbose_level - 2);
461 }
462#endif
463
464 if (f_vv) cout << "supplementary_reduced_t:" << endl;
466 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
468 highest_id, verbose_level - 2);
469 }
470
471 if (f_vv) cout << "supplementary_derived:" << endl;
473 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
475 highest_id, verbose_level - 2);
476 }
477
478 if (f_vv) cout << "supplementary_residual:" << endl;
480 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
482 highest_id, verbose_level - 2);
483 }
484
485 int t1, v1, k1;
486 discreta_base lambda1;
487 int t_new, v_new, k_new;
488 discreta_base lambda_new;
489 int idx;
490
491 if (p.trung_left_partner(t1, v1, k1, lambda1, t_new, v_new,
492 k_new, lambda_new) && lambda_new.s_kind() == INTEGER) {
493 if (f_vv) cout << "trung_left_partner:" << endl;
494 q.init();
495 q.t() = t1;
496 q.v() = v1;
497 q.K() = k1;
498 q.lambda() = lambda1;
500 q.t() = t_new;
501 q.v() = v_new;
502 q.K() = k_new;
503 q.lambda() = lambda_new;
505 S.init();
506 S.rule() = rule_trung_left;
507 S.prev() = p.id();
508 q.source().append(S);
509 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
511 highest_id, verbose_level - 2);
512 }
513 }
514 }
515
516 if (p.trung_right_partner(t1, v1, k1, lambda1, t_new,
517 v_new, k_new, lambda_new) && lambda_new.s_kind() == INTEGER) {
518 if (f_vv) cout << "trung_right_partner:" << endl;
519 q.init();
520 q.t() = t1;
521 q.v() = v1;
522 q.K() = k1;
523 q.lambda() = lambda1;
525 q.t() = t_new;
526 q.v() = v_new;
527 q.K() = k_new;
528 q.lambda() = lambda_new;
530 S.init();
532 S.prev() = p.id();
533 q.source().append(S);
534 if (q.t() >= minimal_t && q.lambda().s_kind() == INTEGER) {
536 highest_id, verbose_level - 2);
537 }
538 }
539 }
540
541
542 }
543 if (f_v) {
544 cout << "design_parameter_database_closure "
545 "highest_id=" << highest_id
546 << ", i.e. closuring yields=" << highest_id - old_highest_id
547 << " new parameter sets." << endl;
548 }
549}
550
551//#define BUFSIZE 50000
552
554 char *path_db, int f_form_closure, int minimal_t, int verbose_level)
555{
556 char buf[BUFSIZE], *p_buf;
557 char comment[BUFSIZE];
558 int t, v, k, lambda;
559 int btree_idx_id = 0;
561
562 ifstream f(fname_design_txt);
563 if (!f) {
564 cout << "error opening file " << fname_design_txt << endl;
565 exit(1);
566 }
568 database D;
569
570 p.init_database(D, path_db);
571 D.open(verbose_level - 1);
572
573 int id = 0;
574 int highest_id_already_closed = -1;
575 while (TRUE) {
576 if (f.eof()) {
577 break;
578 }
579 f.getline(buf, sizeof(buf));
580 p_buf = buf;
581 if (buf[0] == '#')
582 continue;
583 ST.s_scan_int(&p_buf, &t);
584 if (t == -1)
585 break;
586 ST.s_scan_int(&p_buf, &v);
587 ST.s_scan_int(&p_buf, &k);
588 ST.s_scan_int(&p_buf, &lambda);
589 strcpy(comment, p_buf);
590 // cout << "t=" << t << " v=" << v << " k=" << k
591 //<< " lambda=" << lambda << " comment=" << comment << endl;
592
593 p.init(t, v, k, lambda);
594 if (strlen(comment)) {
596
597 S.init();
598 S.comment().init(comment);
599 p.source().append(S);
600 }
601 p.id() = id;
602 cout << p << endl;
603
604
605 // we check if the parameter set is admissible:
606 {
607 integer lambda_object(lambda);
609
610 design_lambda_ijs_matrix(t, v, k, lambda_object, 1 /* s */, M);
611 }
612
613 int idx;
615 cout << "already there, we are changing the dataset:" << endl;
616 int highest_id = -1;
617 // highest_id is not used in the following routine
618 //as we know the dataset is already there:
620 highest_id, verbose_level - 2);
621 }
622 else {
623 D.add_object(p, verbose_level - 2);
624
625 if (f_form_closure)
627 highest_id_already_closed, minimal_t,
628 verbose_level - 2);
629
630 highest_id_already_closed = D.get_highest_int4(btree_idx_id);
631 id = highest_id_already_closed + 1;
632 }
633 }
634 D.close(verbose_level - 1);
635
636 // D.print(0, cout);
637
638
639}
640
642{
643 int verbose_level = 0;
644 int btree_idx_id = 0;
645 int btree_idx_tvkl = 2;
646
648 database D;
649
650 p.init_database(D, path_db);
651 D.open(verbose_level);
652
653 int id, highest_id;
654
655 highest_id = D.get_highest_int4(btree_idx_id);
656
657 cout << "design_parameter_database_export_tex() db_path=" << path_db
658 << " highest_id = " << highest_id << endl;
659
660
661
662 int highest_page = highest_id / 100, i, page;
663 Vector fname_page;
664
665 fname_page.m_l(highest_page + 1);
666 for (i = 0; i <= highest_page; i++) {
667 hollerith h;
668
669 h.init("design_id_ge_");
670 h.append_i(i * 100);
671 h.append(".html");
672 fname_page.s_i(i) = h;
673 }
674
675
676
677
678
679 ofstream f("designs.tex", ios::trunc);
681
682 L.head(f, TRUE /* f_book */, TRUE /* f_title */,
683 "$t$-Designs", "DISCRETA", TRUE /* f_toc */,
684 FALSE /* f_landscape */,
685 TRUE /* f_12pt */,
686 TRUE /* f_enlarged_page */,
687 TRUE /* f_pagenumbers */,
688 NULL /* extra_praeamble */);
690
691
692 f << "\n\\chapter{Designs by $t, v, k, \\lambda$}\n\n";
693 btree &B = D.btree_access_i(btree_idx_tvkl);
694 int idx, len;
695 int t_min, t_max, t;
696
697 len = B.length(verbose_level - 2);
698 D.ith_object(0, btree_idx_tvkl, p, verbose_level - 2);
699 t_min = p.t();
700 D.ith_object(len - 1, btree_idx_tvkl, p, verbose_level - 2);
701 t_max = p.t();
702
703
704 hollerith fname_dir, h1, h2;
705
706 fname_dir.init("designs.html");
707 ofstream fhtml_dir(fname_dir.s());
708
709
710 h1.init("t designs with small t");
711 h2.init("t designs with small t");
712
713 html_head(fhtml_dir, h1.s(), h2.s());
714
715
716 fhtml_dir << "<ul>" << endl;
717
718 for (t = t_min; t <= t_max; t++) {
719 int first, len;
720 int v, v_min, v_max;
721
722 B.search_interval_int4(t, t, first, len, verbose_level);
723 if (len == 0)
724 continue;
725
727 D, B, btree_idx_tvkl, t, first, len);
728
729
730 f << "\\newpage\n\n";
731 cout << "t=" << t << " number of designs: " << nb_restricted << endl;
732
733 f << "\n\\section{Designs with $t=" << t << "$}\n\n";
734
735 f << "There are alltogether " << nb_restricted << " parameter sets "
736 "of designs with $t=" << t << "$.\\\\" << endl;
737
738 fhtml_dir << "<li> t=" << t << " (" << nb_restricted << " parameter "
739 "sets of designs)" << endl;
740
741 D.ith_object(first, btree_idx_tvkl, p, verbose_level - 2);
742 v_min = p.v();
743 D.ith_object(first + len - 1, btree_idx_tvkl, p, verbose_level - 2);
744 v_max = p.v();
745
746
747
748
749
750 fhtml_dir << "<ul>" << endl;
751 for (v = v_min; v <= v_max; v++) {
752 int first, len;
753 int k, k_min, k_max;
754
755 B.search_interval_int4_int4(t, t, v, v, first, len,
756 verbose_level);
757 if (len == 0)
758 continue;
759
760
761 f << "\n\\subsection{Designs with $t=" << t << "$, $v=" << v << "$}\n\n";
762
763 int nb_restricted = determine_restricted_number_of_designs_t_v(D, B, btree_idx_tvkl, t, v, first, len);
764
765 f << "There are alltogether " << nb_restricted << " parameter sets of designs with $t=" << t << "$ and $v=" << v << "$.\\\\" << endl;
766
767
768 fhtml_dir << "<li> <a href=\"design_t" << t << "_v" << v << ".html\"> v=" << v << " (" << nb_restricted << " parameter sets of designs) </a>" << endl;
769
770 D.ith_object(first, btree_idx_tvkl, p, verbose_level - 2);
771 k_min = p.K();
772 D.ith_object(first + len - 1, btree_idx_tvkl, p, verbose_level - 2);
773 k_max = p.K();
774
775 hollerith fname, h1, h2;
776
777 fname.init("design_t");
778 fname.append_i(t);
779 fname.append("_v");
780 fname.append_i(v);
781 fname.append(".html");
782 ofstream fhtml(fname.s());
783
784
785 h1.init("t designs with t=");
786 h1.append_i(t);
787 h1.append(", v=");
788 h1.append_i(v);
789 h2.init("t designs with t=");
790 h2.append_i(t);
791 h2.append(", v=");
792 h2.append_i(v);
793
794 html_head(fhtml, h1.s(), h2.s());
795
796
797
798 for (k = k_min; k <= k_max; k++) {
799 int first, len;
800
801 B.search_interval_int4_int4_int4(t, t, v, v, k, k, first, len, verbose_level);
802 if (len == 0)
803 continue;
804
805 discreta_base lambda_max, lambda_max_half;
806 design_lambda_max(t, v, k, lambda_max);
807 design_lambda_max_half(t, v, k, lambda_max_half);
808 // cout << "t=" << t << " v=" << v << " k=" << k << " lambda_max=" << lambda_max << endl;
809 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
810
811
812
813
814
815 Vector v_lambda, v_id;
816 v_lambda.m_l(len);
817 v_id.m_l_n(len);
818
819 int l = 0;
820 for (int i = 0; i < len; i++) {
821 idx = first + i;
822 D.ith_object(idx, btree_idx_tvkl, p, verbose_level - 2);
823
824 if (p.lambda().s_i_i() > lambda_max_half.s_i_i())
825 continue;
826 v_lambda.s_i(l) = p.lambda();
827 v_id.m_ii(l, p.id());
828 l++;
829 } // next i
830
831 if (l) {
832 if (l == 1) {
833 hollerith link;
834 int id = v_id.s_ii(0);
835 prepare_link(link, id);
836 f << "$" << t << "$-$(" << v << "," << k << ", " << v_lambda.s_i(0) << "_{\\#" << v_id.s_ii(0) << "})$" << endl;
837 fhtml << "<a href=\"" << link.s() << "\">" << t << "-(" << v << "," << k << ", " << v_lambda.s_i(0) << ") </a><br>" << endl;
838 }
839 else {
840 f << t << "-(" << v << "," << k << ",$\\lambda$) for $\\lambda \\in \\{";
841 fhtml << t << "-(" << v << "," << k << ",lambda) for lambda in {";
842 for (int ii = 0; ii < l; ii++) {
843 hollerith link;
844 int id = v_id.s_ii(ii);
845 prepare_link(link, id);
846
847 f << v_lambda.s_i(ii) << "_{\\#" << v_id.s_ii(ii) << "}";
848 fhtml << " <a href=\"" << link.s() << "\">" << v_lambda.s_i(ii) << "</a>";
849 if (ii < l - 1) {
850 f << ",$ $";
851 fhtml << ",";
852 }
853 if ((ii % 10) == 0) {
854 f << endl;
855 fhtml << endl;
856 }
857 }
858 f << "\\}$ (" << l << " parameter sets)" << endl;
859 fhtml << "} (" << l << " parameter sets)" << endl;
860 }
861 f << "$\\Delta \\lambda=" << delta_lambda << "$, $\\lambda_{max}=" << lambda_max << "$\\\\" << endl;
862 fhtml << "delta lambda = " << delta_lambda << ", lambda_max=" << lambda_max << "<br>" << endl;
863 }
864 } // next k
865 html_foot(fhtml);
866
867 } // next v
868 fhtml_dir << "</ul>" << endl;
869
870 } // next t
871 fhtml_dir << "</ul>" << endl;
872
873 fhtml_dir << "<p><hr><p>" << endl;
874
875 fhtml_dir << "<a href=\"design_clans.html\"> design_clans </a>" << endl;
876
877 fhtml_dir << "<p><hr><p>" << endl;
878
879 fhtml_dir << "<ul>" << endl;
880 for (page = 0; page <= highest_page; page++) {
881 fhtml_dir << "<li> <a href=\"" << fname_page[page].as_hollerith().s() << "\"> id >= " << page * 100 << "</a>" << endl;
882 }
883 fhtml_dir << "</ul>" << endl;
884
885 html_foot(fhtml_dir);
886
887
888 f << "\n\\chapter{Designs by ID}\n\n";
889 for (id = 0; id <= highest_id; id++) {
890 if (id % 100 == 0) {
891 f << "\n\\section{ID $\\ge " << id << "$}\n\n";
892 cout << "ID >= " << id << endl;
893 }
894 if (!D.get_object_by_unique_int4_if_there(btree_idx_id, id, p, verbose_level))
895 continue;
896 // f << "\\subsection*{\\# " << id << "}\n";
897 // f << "\\label{designID" << id << "}\n";
898
899 hollerith h;
900 p.text_parameter(h);
901 f << "\\# " << p.id() << ": " << h.s() << endl;
902
903 int j, l;
904
905 design_parameter p1, ancestor;
906 Vector path;
907
908 p1 = p;
909 p1.ancestor(ancestor, path, FALSE, FALSE);
910 // cout << "ancestor=" << ancestor << endl;
911 l = p.source().s_l();
912 f << "\\begin{enumerate}\n";
913 f << "\\item\n";
914 f << "clan: " << ancestor.t() << "-("
915 << ancestor.v() << ","
916 << ancestor.K() << ","
917 << ancestor.lambda() << ")";
918 if (path.s_ii(0)) {
919 f << ", " << path.s_ii(0) << " $\\times$ reduced $t$";
920 }
921 if (path.s_ii(1)) {
922 f << ", " << path.s_ii(1) << " $\\times$ derived";
923 }
924 if (path.s_ii(2)) {
925 f << ", " << path.s_ii(2) << " $\\times$ residual";
926 }
927 f << endl;
928
929 for (j = 0; j < l; j++) {
930 f << "\\item\n";
931
932 hollerith s0, s1, s2;
933
935 S.text012_extended(p, s0, s1, s2);
936 f << s1.s();
937 if (S.prev() != -1) {
938 hollerith h;
940 f << " " << h.s() << " (\\# " << S.prev() << ")";
941 }
942 f << s2.s() << endl;
943 // S.text2(p, h);
944 // f << h.s() << endl;
945 }
946 f << "\\end{enumerate}\n";
947 f << "\\smallskip" << endl;
948 }
949
950 L.foot(f);
951
952 for (page = 0; page <= highest_page; page++) {
953 cout << "ID >= " << page * 100 << endl;
954 ofstream fhtml(fname_page[page].as_hollerith().s());
955 hollerith h1, h2;
956
957 h1.init("t designs with small t, id ge ");
958 h1.append_i(page * 100);
959 h2.init("t designs with small t, id ge ");
960 h2.append_i(page * 100);
961
962 html_head(fhtml, h1.s(), h2.s());
963
964 for (id = page * 100; id <= MINIMUM((page + 1) * 100 - 1, highest_id); id++) {
965 if (!D.get_object_by_unique_int4_if_there(btree_idx_id, id, p, verbose_level))
966 continue;
967
968 hollerith h;
969 p.text_parameter(h);
970 fhtml << "<a name=\"design"<< p.id() << "\"> # " << p.id() << ": " << h.s() << "</a>" << endl;
971
972 int j, l;
973
974 design_parameter ancestor, p1;
975 Vector path;
976
977 p1 = p;
978 p1.ancestor(ancestor, path, FALSE, FALSE);
979
980 l = p.source().s_l();
981 fhtml << "<ul>\n";
982 fhtml << "<li>clan: <a href=\"design_clan_"
983 << ancestor.t() << "_"
984 << ancestor.v() << "_"
985 << ancestor.K() << ".html\"> "
986 << ancestor.t() << "-("
987 << ancestor.v() << ","
988 << ancestor.K() << ","
989 << ancestor.lambda() << ")";
990 if (path.s_ii(0)) {
991 fhtml << ", " << path.s_ii(0) << " times reduced t";
992 }
993 if (path.s_ii(1)) {
994 fhtml << ", " << path.s_ii(1) << " times derived";
995 }
996 if (path.s_ii(2)) {
997 fhtml << ", " << path.s_ii(2) << " times residual";
998 }
999 fhtml << "</a>" << endl;
1000
1001 for (j = 0; j < l; j++) {
1002 fhtml << "<li>\n";
1003
1004 hollerith s0, s1, s2;
1005
1007 S.text012_extended(p, s0, s1, s2);
1008 fhtml << s1.s();
1009 if (S.prev() != -1) {
1010 hollerith link, h;
1011 prepare_link(link, S.prev());
1012 fhtml << " <a href=\"" << link.s() << "\">";
1014 fhtml << h.s() << " (# " << S.prev() << ") </a> ";
1015 }
1016 fhtml << s2.s() << endl;
1017 }
1018 fhtml << "</ul>\n";
1019 fhtml << "<p><hr><p>" << endl;
1020 }
1021
1022 html_foot(fhtml);
1023 }
1024 D.close(verbose_level);
1025
1026
1027
1028
1029}
1030
1032 int btree_idx_tvkl, int t, int first, int len)
1033{
1034 int verbose_level = 0;
1036 int v, v_min, v_max;
1037 int nb_restricted = 0;
1038
1039 D.ith_object(first, btree_idx_tvkl, p, verbose_level - 2);
1040 v_min = p.v();
1041 D.ith_object(first + len - 1, btree_idx_tvkl, p, verbose_level - 2);
1042 v_max = p.v();
1043
1044 for (v = v_min; v <= v_max; v++) {
1045 int first, len;
1046
1047 B.search_interval_int4_int4(t, t, v, v, first, len, verbose_level);
1048 if (len == 0)
1049 continue;
1050
1051 nb_restricted += determine_restricted_number_of_designs_t_v(D, B,
1052 btree_idx_tvkl, t, v, first, len);
1053 }
1054
1055 return nb_restricted;
1056}
1057
1059 int btree_idx_tvkl, int t, int v, int first, int len)
1060{
1061 int verbose_level = 0;
1063 int k, k_min, k_max;
1064 int nb_restricted = 0;
1065
1066 D.ith_object(first, btree_idx_tvkl, p, verbose_level - 2);
1067 k_min = p.K();
1068 D.ith_object(first + len - 1, btree_idx_tvkl, p, verbose_level - 2);
1069 k_max = p.K();
1070
1071 for (k = k_min; k <= k_max; k++) {
1072 int first, len;
1073
1074 B.search_interval_int4_int4_int4(t, t, v, v, k, k, first, len, verbose_level);
1075 if (len == 0)
1076 continue;
1077
1078 discreta_base lambda_max, lambda_max_half;
1079 design_lambda_max(t, v, k, lambda_max);
1080 design_lambda_max_half(t, v, k, lambda_max_half);
1081 // cout << "t=" << t << " v=" << v << " k=" << k << " lambda_max=" << lambda_max << endl;
1082 // int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
1083
1084 int l = 0;
1085 for (int i = 0; i < len; i++) {
1086 int idx = first + i;
1087 D.ith_object(idx, btree_idx_tvkl, p, verbose_level - 2);
1088
1089 if (p.lambda().s_i_i() > lambda_max_half.s_i_i())
1090 continue;
1091 l++;
1092 } // next i
1093 nb_restricted += l;
1094 }
1095 return nb_restricted;
1096}
1097
1099{
1100 int verbose_level = 0;
1101 int btree_idx_id = 0;
1103
1104 D.get_object_by_unique_int4(btree_idx_id, id, p, verbose_level);
1105 h.init("");
1106 h.append_i(p.t());
1107 h.append("-(");
1108 h.append_i(p.v());
1109 h.append(",");
1110 h.append_i(p.K());
1111 h.append(",");
1112 h.append_i(p.lambda().s_i_i());
1113 h.append(")");
1114}
1115
1116void prepare_link(hollerith& link, int id)
1117{
1118 int page = id / 100;
1119 link.init("design_id_ge_");
1120 link.append_i(page * 100);
1121 link.append(".html#design");
1122 link.append_i(id);
1123}
1124
1125#include <stdio.h>
1126
1127void design_parameter_database_clans(char *path_db, int f_html, int f_v, int f_vv)
1128{
1129 int verbose_level = 0;
1130 int btree_idx_id = 0;
1131 //int btree_idx_tvkl = 2;
1132
1133 design_parameter p, q;
1134 database D;
1135 Vector ancestor, clan_lambda, clan_member, clan_member_path;
1136
1137 p.init_database(D, path_db);
1138 D.open(verbose_level);
1139
1140 int id, highest_id, idx1, idx2;
1141
1142 highest_id = D.get_highest_int4(btree_idx_id);
1143
1144 ancestor.m_l(0);
1145 clan_lambda.m_l(0);
1146 clan_member.m_l(0);
1147 clan_member_path.m_l(0);
1148 for (id = 0; id <= highest_id; id++) {
1149
1150 if (!D.get_object_by_unique_int4_if_there(btree_idx_id, id, p, verbose_level))
1151 continue;
1152
1153
1154 discreta_base lambda_max_half;
1155 design_lambda_max_half(p.t(), p.v(), p.K(), lambda_max_half);
1156 if (p.lambda().s_i_i() > lambda_max_half.s_i_i())
1157 continue;
1158
1159
1160 Vector g, path;
1161 p.ancestor(q, path, f_v, f_vv);
1162
1163 g.m_l_n(3);
1164 g[0].m_i_i(q.t());
1165 g[1].m_i_i(q.v());
1166 g[2].m_i_i(q.K());
1167 //g[3] = q.lambda();
1168
1169 if (ancestor.search(g, &idx1)) {
1170 cout << "clan found at " << idx1 << endl;
1171 Vector &CL = clan_lambda[idx1].as_vector();
1172 Vector &CM = clan_member[idx1].as_vector();
1173 Vector &CMP = clan_member_path[idx1].as_vector();
1174 if (CL.search(q.lambda(), &idx2)) {
1175 cout << "family found at " << idx2 << endl;
1176 Vector &cm = CM[idx2].as_vector();
1177 cm.append_integer(id);
1178 Vector &cmp = CMP[idx2].as_vector();
1179 cmp.append(path);
1180 }
1181 else {
1182 cout << "new family within the clan, inserting at " << idx2 << endl;
1183 CL.insert_element(idx2, q.lambda());
1184 Vector cm, cmp;
1185 cm.m_l(1);
1186 cm.m_ii(0, id);
1187 cmp.m_l(1);
1188 cmp[0] = path;
1189 CM.insert_element(idx2, cm);
1190 CMP.insert_element(idx2, cmp);
1191 }
1192 }
1193 else {
1194 cout << "new clan, inserting at " << idx1 << endl;
1195 ancestor.insert_element(idx1, g);
1196 Vector gf, cm, CM, cmp, CMP;
1197 gf.m_l(1);
1198 gf[0] = q.lambda();
1199 clan_lambda.insert_element(idx1, gf);
1200 cm.m_l(1);
1201 cm.m_ii(0, id);
1202 CM.m_l(0);
1203 CM.insert_element(0, cm);
1204 clan_member.insert_element(idx1, CM);
1205 cmp.m_l(1);
1206 cmp[0] = path;
1207 CMP.m_l(0);
1208 CMP.insert_element(0, cmp);
1209 clan_member_path.insert_element(idx1, CMP);
1210 }
1211 cout << "number of clans: " << ancestor.s_l() << endl;
1212 // cout << "clan = " << ancestor << endl;
1213 }
1214
1215 int i, l, j, ll, h, lll;
1216 l = ancestor.s_l();
1217 cout << "there are " << l << " clans of design parameter sets:" << endl;
1218 for (i = 0; i < l; i++) {
1219 cout << "clan no " << i << " : ancestor = " << ancestor[i];
1220 Vector &g = ancestor[i].as_vector();
1221 int t = g.s_ii(0);
1222 int v = g.s_ii(1);
1223 int k = g.s_ii(2);
1224
1225 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
1226 cout << " delta_lambda = " << delta_lambda;
1227 discreta_base lambda_max, lambda_max_half;
1228 design_lambda_max(t, v, k, lambda_max);
1229 design_lambda_max_half(t, v, k, lambda_max_half);
1230 cout << " lambda_max = " << lambda_max;
1231 cout << " lambda_max_half = " << lambda_max_half << endl;
1232 }
1233 cout << endl;
1234 for (i = 0; i < l; i++) {
1235 cout << i << " & " << ancestor[i];
1236 Vector &g = ancestor[i].as_vector();
1237 int t = g.s_ii(0);
1238 int v = g.s_ii(1);
1239 int k = g.s_ii(2);
1240
1241 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
1242 cout << " & " << delta_lambda;
1243 discreta_base lambda_max, lambda_max_half;
1244 design_lambda_max(t, v, k, lambda_max);
1245 design_lambda_max_half(t, v, k, lambda_max_half);
1246 cout << " & " << lambda_max;
1247 Vector &CL = clan_lambda[i].as_vector();
1248 ll = CL.s_l();
1249 cout << " & $\\{ ";
1250 for (j = 0; j < ll; j++) {
1251 discreta_base dl, q;
1252
1253 dl.m_i_i(delta_lambda);
1254 CL[j].integral_division_exact(dl, q);
1255 cout << q;
1256 if (j < ll - 1)
1257 cout << "$, $";
1258 }
1259 cout << " \\} $ ";
1260 cout << "\\\\" << endl;
1261 }
1262 cout << endl;
1263
1264
1265 for (i = 0; i < l; i++) {
1266 cout << "clan no " << i << " : ancestor = " << ancestor[i];
1267 Vector &g = ancestor[i].as_vector();
1268 int t = g.s_ii(0);
1269 int v = g.s_ii(1);
1270 int k = g.s_ii(2);
1271
1272 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
1273 cout << " delta_lambda = " << delta_lambda;
1274 discreta_base lambda_max, lambda_max_half;
1275 design_lambda_max(t, v, k, lambda_max);
1276 design_lambda_max_half(t, v, k, lambda_max_half);
1277 cout << " lambda_max = " << lambda_max;
1278 cout << " lambda_max_half = " << lambda_max_half << endl;
1279
1280 Vector &CL = clan_lambda[i].as_vector();
1281 Vector &CM = clan_member[i].as_vector();
1282 ll = CL.s_l();
1283 cout << "containing " << ll << " families: " << endl;
1284 for (j = 0; j < ll; j++) {
1285 Vector &f = CM[j].as_vector();
1286 discreta_base &lambda = CL[j];
1287 lll = f.s_l();
1288 cout << "family " << j << ", lambda = " << lambda << " containing " << lll << " designs:" << endl;
1289 for (h = 0; h < lll; h++) {
1290 cout << "#" << f.s_ii(h) << " ";
1291 if (((h + 1) % 10) == 0)
1292 cout << endl;
1293 }
1294 cout << endl;
1295 }
1296 }
1297 D.close(verbose_level);
1298
1299 if (f_html) {
1300 design_parameter_database_clan_report(path_db, ancestor, clan_lambda, clan_member, clan_member_path);
1301 }
1302}
1303
1304void design_parameter_database_family_report(char *path_db, int t, int v, int k, int lambda, int minimal_t)
1305{
1306 int verbose_level = 0;
1307 // int btree_idx_id = 0;
1308 int btree_idx_tvkl = 2;
1309
1310 cout << "design_parameter_database_family_report() t=" << t << " v=" << v << " k=" << k << " lambda=" << lambda << endl;
1312 Vector Layers;
1313
1314 database D;
1315
1316 p.init_database(D, path_db);
1317 D.open(verbose_level);
1318
1319 btree& B_tvkl = D.btree_access_i(btree_idx_tvkl);
1320
1321 int h, i, j, idx, id;
1322
1323 Layers.m_l(t + 1);
1324 for (h = 0; h <= t; h++) {
1325 Layers[h].change_to_matrix();
1326 Layers[h].as_matrix().m_mn(h + 1, h + 1);
1327 }
1328
1329
1330 for (h = 0; h < t; h++) {
1331 if (t - h < minimal_t)
1332 continue;
1333 // cout << "h=" << h << endl;
1334 discreta_matrix &M = Layers[h].as_matrix();
1335 for (i = 0; i <= h; i++) {
1336 for (j = 0; j <= h - i; j++) {
1337 Vector entry;
1338
1339 prepare_entry(entry, i, j, h, t, v, k, lambda);
1340 id = -1;
1341 if (entry.s_i(3).s_kind() == INTEGER) {
1343 entry.s_ii(0), entry.s_ii(1), entry.s_ii(2),
1344 entry.s_ii(3), verbose_level);
1345 // idx is -1 if the dataset has not been found.
1346 if (idx != -1) {
1347 D.ith_object(idx, btree_idx_tvkl, p, verbose_level - 2);
1348 id = p.id();
1349 }
1350 }
1351 entry.m_ii(4, id);
1352 M.s_ij(i, j) = entry;
1353 } // next j
1354 } // next i
1355 } // next h
1356
1357 D.close(verbose_level);
1358
1359
1360 for (h = 0; h < t; h++) {
1361 if (t - h < minimal_t)
1362 continue;
1363 discreta_matrix &M = Layers[h].as_matrix();
1364 cout << "h=" << h << endl;
1365 for (i = 0; i <= h; i++) {
1366 for (j = 0; j <= h; j++) {
1367 if (j <= h - i) {
1368 Vector &entry = M.s_ij(i, j).as_vector();
1369 cout << entry[0] << "-(" << entry[1] << "," << entry[2] << "," << entry[3] << ")";
1370 id = entry.s_ii(4);
1371 if (id != -1) {
1372 cout << "_{\\#" << id << "}";
1373 }
1374 }
1375 if (j < h)
1376 cout << " & ";
1377 } // next j
1378 cout << "\\\\" << endl;
1379 } // next i
1380 } // next h
1381}
1382
1383static void prepare_entry(Vector &entry, int i, int j, int h, int t, int v, int k, int lambda)
1384{
1385 design_parameter p, q;
1386
1387 int h1 = h - i - j, u;
1388 if (h1 < 0) {
1389 cout << "prepare_entry() h1 < 0" << endl;
1390 exit(1);
1391 }
1392
1393 p.init(t, v, k, lambda);
1394 for (u = 0; u < i; u++) {
1395 p.derived(q);
1396 p.swap(q);
1397 }
1398 for (u = 0; u < j; u++) {
1399 p.residual(q);
1400 p.swap(q);
1401 }
1402 for (u = 0; u < h1; u++) {
1403 p.reduced_t(q);
1404 p.swap(q);
1405 }
1406 entry.m_l(5);
1407 entry.m_ii(0, p.t());
1408 entry.m_ii(1, p.v());
1409 entry.m_ii(2, p.K());
1410 entry[3] = p.lambda();
1411 entry.m_ii(4, -1);
1412}
1413
1415 Vector &ancestor, Vector &clan_lambda,
1416 Vector & clan_member, Vector & clan_member_path)
1417{
1418 int verbose_level = 0;
1419 //int btree_idx_id = 0;
1420 //int btree_idx_tvkl = 2;
1421
1422 design_parameter p, q;
1423 database D;
1424
1425 p.init_database(D, path_db);
1426 D.open(verbose_level);
1427
1428 //int highest_id;
1429
1430 //highest_id = D.get_highest_int4(btree_idx_id);
1431
1432 hollerith fname, fname_tex, fname_dir, h1, h2;
1433
1434 fname_dir.init("design_clans.html");
1435 ofstream fhtml_dir(fname_dir.s());
1436
1437
1438 h1.init("t designs with small t by clans");
1439 h2.init("t designs with small t by clans");
1440
1441 html_head(fhtml_dir, h1.s(), h2.s());
1442
1443 fhtml_dir << "in brackets: number of families / overall "
1444 "number of design parameter sets per clan<br>" << endl;
1445
1446 fhtml_dir << "<ul>" << endl;
1447 int i, j, l, ll, s, lll;
1448 l = ancestor.s_l();
1449 for (i = 0; i < l; i++) {
1450 Vector &a = ancestor[i].as_vector();
1451 int t = a.s_ii(0);
1452 int v = a.s_ii(1);
1453 int k = a.s_ii(2);
1454 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
1455 //cout << " delta_lambda = " << delta_lambda;
1456 discreta_base lambda_max, lambda_max_half, m_max, dl, r;
1457 dl.m_i_i(delta_lambda);
1458 design_lambda_max(t, v, k, lambda_max);
1459 design_lambda_max_half(t, v, k, lambda_max_half);
1460 // cout << " lambda_max = " << lambda_max;
1461 //cout << " lambda_max_half = " << lambda_max_half << endl;
1462 lambda_max_half.integral_division(dl, m_max, r, 0);
1463 ll = clan_lambda[i].as_vector().s_l();
1464 s = clan_member[i].as_vector().vector_of_vectors_overall_length();
1465
1466 fhtml_dir << "<a href=\"design_clan_" << t << "_" << v
1467 << "_" << k << ".html\">";
1468 fhtml_dir << t << "-(" << v << "," << k << "," << "m*"
1469 << delta_lambda << ")</a>, 1 <= m <= " << m_max
1470 << "; (" << ll << "/" << s << ") lambda_max=" << lambda_max
1471 << ", lambda_max_half=" << lambda_max_half
1472 << "<br>" << endl;
1473 }
1474 fhtml_dir << "</ul>" << endl;
1475 html_foot(fhtml_dir);
1476
1477
1478 for (i = 0; i < l; i++) {
1479
1480 Vector &a = ancestor[i].as_vector();
1481 int t = a.s_ii(0);
1482 int v = a.s_ii(1);
1483 int k = a.s_ii(2);
1484 fname.init("design_clan_");
1485 fname.append_i(t);
1486 fname.append("_");
1487 fname.append_i(v);
1488 fname.append("_");
1489 fname.append_i(k);
1490 fname_tex = fname;
1491 fname_tex.append(".tex");
1492 fname.append(".html");
1493
1494 ofstream fhtml(fname.s());
1495 ofstream ftex(fname_tex.s());
1496
1497
1498 h1.init("design clan: ");
1499 h1.append_i(t);
1500 h1.append("_");
1501 h1.append_i(v);
1502 h1.append("_");
1503 h1.append_i(k);
1504 h2.init("design clan: ");
1505 h2.append_i(t);
1506 h2.append("_");
1507 h2.append_i(v);
1508 h2.append("_");
1509 h2.append_i(k);
1510
1511 html_head(fhtml, h1.s(), h2.s());
1512
1513
1514 int delta_lambda = calc_delta_lambda(v, t, k, FALSE);
1515 //cout << " delta_lambda = " << delta_lambda;
1516 discreta_base lambda_max, lambda_max_half, m_max, dl, r;
1517 dl.m_i_i(delta_lambda);
1518 design_lambda_max(t, v, k, lambda_max);
1519 design_lambda_max_half(t, v, k, lambda_max_half);
1520 // cout << " lambda_max = " << lambda_max;
1521 //cout << " lambda_max_half = " << lambda_max_half << endl;
1522 lambda_max_half.integral_division(dl, m_max, r, 0);
1523 ll = clan_lambda[i].as_vector().s_l();
1524 s = clan_member[i].as_vector().vector_of_vectors_overall_length();
1525 fhtml << t << "-(" << v << "," << k << "," << "m*"
1526 << delta_lambda << "), 1 <= m <= " << m_max
1527 << "; (" << ll << "/" << s << ") lambda_max=" << lambda_max
1528 << ", lambda_max_half=" << lambda_max_half
1529 << "<br>" << endl;
1530 ftex << "\\subsection*{Clan " << i << ": $" << t << "$-$(" << v
1531 << "," << k
1532 << ",m\\cdot " << delta_lambda << ")$}\n";
1533 ftex << "The clan contains " << ll << " families:\\\\" << endl;
1534
1535
1536 Vector &CL = clan_lambda[i].as_vector();
1537 Vector &CM = clan_member[i].as_vector();
1538 Vector &CMP = clan_member_path[i].as_vector();
1539 ll = CL.s_l();
1540 fhtml << "the clan contains " << ll << " families: " << endl;
1541 fhtml << "<ul>" << endl;
1542 for (j = 0; j < ll; j++) {
1543 Vector &cm = CM[j].as_vector();
1544 Vector &cmp = CMP[j].as_vector();
1545 discreta_base &lambda = CL[j];
1546 lll = cm.s_l();
1547 fhtml << "<li>family " << j << ", lambda = " << lambda
1548 << " containing " << lll << " designs:" << endl;
1549 fhtml << "<br>" << endl;
1550 ftex << "\\subsubsection*{Family with $\\lambda="
1551 << lambda << "$}" << endl;
1552 ftex << "The family contains " << lll
1553 << " design parameter sets:\\\\" << endl;
1554#if 0
1555 int h;
1556 for (h = 0; h < lll; h++) {
1557 hollerith link, text1;
1558 int id = cm.s_ii(h);
1559 Vector &path = cmp.s_i(h).as_vector();
1560 prepare_link(link, id);
1561 fhtml << " <a href=\"" << link.s() << "\">";
1563 fhtml << text1.s() << " (#" << id << "), path=" << path << " </a>, ";
1564 if (((h + 1) % 10) == 0)
1565 fhtml << "<br>" << endl;
1566 }
1567 fhtml << endl;
1568#endif
1569 Vector min_path, max_path;
1570 int max_depth, minimal_t;
1571
1572 determine_minimal_and_maximal_path(cmp, min_path, max_path, max_depth);
1573 minimal_t = t - max_depth;
1574
1575 fhtml << "<br>minpath=" << min_path << " minimal_t=" << minimal_t << endl;
1576 design_parameter dominating_ancestor;
1577 determine_dominating_ancestor(t, v, k, lambda, min_path, dominating_ancestor);
1578 // fhtml << "<br>dominating_ancestor: " << dominating_ancestor
1579 //<< " (path=" << min_path << ")" << endl;
1580 reduce_path(cmp, min_path);
1581 family_report(D, fhtml, ftex, dominating_ancestor.t(),
1582 dominating_ancestor.v(), dominating_ancestor.K(),
1583 dominating_ancestor.lambda(), cm, cmp, minimal_t);
1584 }
1585 fhtml << "</ul>" << endl;
1586
1587 html_foot(fhtml);
1588 }
1589
1590
1591
1592 D.close(verbose_level);
1593}
1594
1595static void determine_minimal_and_maximal_path(Vector &v,
1596 Vector & min_path, Vector & max_path, int & max_depth)
1597{
1598 int i, l, j, ll, depth;
1599
1600 l = v.s_l();
1601 if (l == 0) {
1602 cout << "determine_minimal_and_maximal_path "
1603 "l == 0" << endl;
1604 exit(1);
1605 }
1606 ll = v[0].as_vector().s_l();
1607 min_path = v[0];
1608 max_path = v[0];
1609 max_depth = 0;
1610 for (i = 0; i < l; i++) {
1611 Vector & p = v[i].as_vector();
1612 if (p.s_l() != ll) {
1613 cout << "determine_minimal_and_maximal_path "
1614 "different lengths!" << endl;
1615 exit(1);
1616 }
1617 depth = p.s_ii(0) + p.s_ii(1) + p.s_ii(2);
1618 for (j = 0; j < ll; j++) {
1619 min_path.s_ii(j) = MINIMUM(min_path.s_ii(j), p.s_ii(j));
1620 max_path.s_ii(j) = MAXIMUM(max_path.s_ii(j), p.s_ii(j));
1621 max_depth = MAXIMUM(max_depth, depth);
1622 }
1623 }
1624}
1625
1626static void determine_dominating_ancestor(int t, int v, int k,
1627 discreta_base & lambda, Vector & path,
1628 design_parameter &dominating_ancestor)
1629{
1630 design_parameter p, q;
1631 int u;
1632
1633 p.init(t, v, k, lambda);
1634 for (u = 0; u < path.s_ii(0); u++) {
1635 p.reduced_t(q);
1636 p.swap(q);
1637 }
1638 for (u = 0; u < path.s_ii(1); u++) {
1639 p.derived(q);
1640 p.swap(q);
1641 }
1642 for (u = 0; u < path.s_ii(2); u++) {
1643 p.residual(q);
1644 p.swap(q);
1645 }
1646 dominating_ancestor = p;
1647}
1648
1649static void reduce_path(Vector &cmp, Vector &min_path)
1650{
1651 int i, l, j;
1652
1653 l = cmp.s_l();
1654 for (i = 0; i < l; i++) {
1655 Vector &path = cmp[i].as_vector();
1656 for (j = 0; j < 3; j++) {
1657 path.s_ii(j) -= min_path.s_ii(j);
1658 }
1659 }
1660}
1661
1662static void family_report(database & D, ostream& fhtml, ostream &ftex,
1663 int t, int v, int k, discreta_base &lambda, Vector & cm,
1664 Vector & cmp, int minimal_t)
1665{
1666 int h, i, j, idx, idx1, id, nb_found = 0;
1667 Vector Layers;
1668
1669 permutation per;
1670 cmp.sort_with_logging(per);
1671
1672 Layers.m_l(t + 1);
1673 for (h = 0; h <= t; h++) {
1674 Layers[h].change_to_matrix();
1675 Layers[h].as_matrix().m_mn(h + 1, h + 1);
1676 }
1677
1678
1679 for (h = 0; h < t; h++) {
1680 if (t - h < minimal_t)
1681 continue;
1682 // cout << "h=" << h << endl;
1683 discreta_matrix &M = Layers[h].as_matrix();
1684 for (i = 0; i <= h; i++) {
1685 for (j = 0; j <= h - i; j++) {
1686 Vector path;
1687
1688 path.m_l_n(3);
1689 path.m_ii(0, h - i - j);
1690 path.m_ii(1, i);
1691 path.m_ii(2, j);
1692 if (cmp.search(path, &idx)) {
1693 idx1 = per.s_i(idx);
1694 id = cm.s_ii(idx1);
1695 M.m_iji(i, j, id);
1696 nb_found++;
1697 }
1698 else {
1699 M.m_iji(i, j, -1);
1700 }
1701 } // next j
1702 } // next i
1703 } // next h
1704 if (nb_found != cm.s_l()) {
1705 cout << "family_report() nb_found != cm.s_l()" << endl;
1706 cout << "nb_found = " << nb_found << endl;
1707 cout << "nb of designs in the family = " << cm.s_l() << endl;
1708 exit(1);
1709 }
1710 fhtml << "<ul>" << endl;
1711
1712 for (h = 0; h < t; h++) {
1713 if (t - h < minimal_t)
1714 continue;
1715 // cout << "h=" << h << endl;
1716 fhtml << "<li>" << endl;
1717 ftex << "\\begin{tabular}{*{" << h + 1 << "}{l}}" << endl;
1718 discreta_matrix &M = Layers[h].as_matrix();
1719 for (i = 0; i <= h; i++) {
1720 for (j = 0; j <= h - i; j++) {
1721 int id = M.s_iji(i, j);
1722 Vector path;
1723
1724 path.m_l_n(3);
1725 path.m_ii(0, h - i - j);
1726 path.m_ii(1, i);
1727 path.m_ii(2, j);
1728 design_parameter p;
1729 determine_dominating_ancestor(t, v, k, lambda, path, p);
1730 if (id >= 0) {
1731 hollerith link, text1;
1732
1733 prepare_link(link, id);
1734 fhtml << " <a href=\"" << link.s() << "\">";
1736 fhtml << text1.s() << " (#" << id << ")</a> ";
1737 ftex << "$\\underline{\\mbox{" << text1.s() << "}}$";
1738 }
1739 else {
1740 fhtml << p.t() << "-(" << p.v() << "," << p.K()
1741 << "," << p.lambda() << ") ";
1742 ftex << "$" << p.t() << "$-$(" << p.v() << ","
1743 << p.K() << "," << p.lambda() << ")$";
1744 }
1745 if (j < h)
1746 ftex << " & ";
1747 } // next j
1748 for (; j < h; j++)
1749 ftex << " & ";
1750 ftex << "\\\\" << endl;
1751
1752 fhtml << "<br>" << endl;
1753 } // next i
1754 fhtml << "<p>" << endl;
1755 ftex << "\\end{tabular}\\\\" << endl;
1756 }
1757 fhtml << "</ul>" << endl;
1758}
1759
1760static void f_m_j(int m, int j, discreta_base &a)
1761{
1762 int q = m / j;
1763 int r = m % j;
1764 if (q == 0) {
1765 a.m_i_i(0);
1766 return;
1767 }
1768 if (q == 1) {
1769 a.m_i_i(r);
1770 return;
1771 }
1772 discreta_base b, c, d, e, J, R, two;
1773
1774 two.m_i_i(2);
1775 b.m_i_i(q);
1776 c.m_i_i(q - 1);
1777 d.mult(b, c);
1778 d.integral_division_exact(two, c);
1779 J.m_i_i(j);
1780 c *= J;
1781 R.m_i_i(r);
1782 R *= b;
1783 c += R;
1784 a = c;
1785}
1786
1787static int max_m(int i, int j)
1788{
1789 int m;
1790 discreta_base a, b, c, d, two;
1791
1792 two.m_i_i(2);
1793 b.m_i_i(i);
1794 c.m_i_i(i - 1);
1795 d.mult(b, c);
1796 d.integral_division_exact(two, a);
1797 for (m = 0; ; m++) {
1798 f_m_j(m, j, b);
1799 if (b.gt(a)) {
1800 break;
1801 }
1802 }
1803 return m - 1;
1804}
1805
1806int Maxfit(int i, int j)
1807{
1808 int a, b, c;
1809
1810 a = max_m(i, j);
1811 b = max_m(j, i);
1812 c = MINIMUM(a, b);
1813 return c;
1814}
1815
1816
1817
1818
1819}}
functions related to strings and character arrays
void head(std::ostream &ost, int f_book, int f_title, const char *title, const char *author, int f_toc, int f_landscape, int f_12pt, int f_enlarged_page, int f_pagenumbers, const char *extras_for_preamble)
DISCRETA vector class for vectors of DISCRETA objects.
Definition: discreta.h:797
Vector & append(discreta_base &x)
Definition: vector.cpp:400
Vector & append_integer(int a)
Definition: vector.cpp:390
discreta_base & s_i(int i)
Definition: vector.cpp:202
void m_ii(int i, int a)
Definition: discreta.h:824
Vector & insert_element(int i, discreta_base &x)
Definition: vector.cpp:410
bool search(discreta_base &x, int *idx)
Definition: vector.cpp:477
DISCRETA class for a database.
Definition: discreta.h:1672
void search_interval_int4_int4(int l0, int u0, int l1, int u1, int &first, int &len, int verbose_level)
Definition: btree.cpp:666
void search_interval_int4_int4_int4(int l0, int u0, int l1, int u1, int l2, int u2, int &first, int &len, int verbose_level)
Definition: btree.cpp:702
int length(int verbose_level)
Definition: btree.cpp:1165
int search_unique_int4_int4_int4_int4(int i0, int i1, int i2, int i3, int verbose_level)
Definition: btree.cpp:826
void ith(int l, KEYTYPE *key, DATATYPE *data, int verbose_level)
Definition: btree.cpp:1209
void search_interval_int4(int i_min, int i_max, int &first, int &len, int verbose_level)
Definition: btree.cpp:637
DISCRETA class for a database.
Definition: discreta.h:1525
void get_object_by_unique_int4(int btree_idx, int id, Vector &the_object, int verbose_level)
Definition: database.cpp:498
void close(int verbose_level)
Definition: database.cpp:142
int get_highest_int4(int btree_idx)
Definition: database.cpp:540
void add_object(Vector &the_object, int verbose_level)
Definition: database.cpp:325
void open(int verbose_level)
Definition: database.cpp:128
void delete_object(Vector &the_object, uint_4 datref, int verbose_level)
Definition: database.cpp:339
void get_object(uint_4 datref, Vector &the_object, int verbose_level)
Definition: database.cpp:374
void ith_object(int i, int btree_idx, Vector &the_object, int verbose_level)
Definition: database.cpp:547
int get_object_by_unique_int4_if_there(int btree_idx, int id, Vector &the_object, int verbose_level)
Definition: database.cpp:516
DISCRETA class for the design parameters database.
Definition: discreta.h:1887
void text012_extended(design_parameter &p, hollerith &s0, hollerith &s1, hollerith &s2)
DISCRETA class for design parameters.
Definition: discreta.h:1958
void supplementary_reduced_t(design_parameter &p)
void init_database(database &D, char *path)
design_parameter_source & source_i(int i)
Definition: discreta.h:1980
int trung_left_partner(int &t1, int &v1, int &k1, discreta_base &lambda1, int &t_new, int &v_new, int &k_new, discreta_base &lambda_new)
int trung_right_partner(int &t1, int &v1, int &k1, discreta_base &lambda1, int &t_new, int &v_new, int &k_new, discreta_base &lambda_new)
void supplementary_residual(design_parameter &p)
void ancestor(design_parameter &p, Vector &path, int f_v, int f_vv)
DISCRETA base class. All DISCRETA classes are derived from this class.
Definition: discreta.h:382
void integral_division_exact(discreta_base &x, discreta_base &q)
Definition: base.cpp:907
virtual void integral_division(discreta_base &x, discreta_base &q, discreta_base &r, int verbose_level)
Definition: base.cpp:892
discreta_matrix & change_to_matrix()
Definition: discreta.h:424
void integral_division_by_integer_exact(int x, discreta_base &q)
Definition: base.cpp:935
void mult(discreta_base &x, discreta_base &y)
Definition: base.cpp:367
discreta_base & divide_by_exact(discreta_base &x)
Definition: base.cpp:629
void extended_gcd(discreta_base &n, discreta_base &u, discreta_base &v, discreta_base &g, int verbose_level)
Definition: base.cpp:972
discreta_matrix & m_mn(int m, int n)
discreta_matrix & m_mn_n(int m, int n)
DISCRETA string class.
Definition: discreta.h:626
DISCRETA integer class.
Definition: discreta.h:667
DISCRETA class related to printing of objects.
Definition: discreta.h:1426
#define MINIMUM(x, y)
Definition: foundations.h:216
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define ODD(x)
Definition: foundations.h:222
#define BUFSIZE
Definition: foundations.h:212
#define MAXIMUM(x, y)
Definition: foundations.h:217
int determine_restricted_number_of_designs_t(database &D, btree &B, int btree_idx_tvkl, int t, int first, int len)
Definition: design.cpp:1031
void discreta_print_factorization(Vector &primes, Vector &exponents, std::ostream &o)
void print_clan_tex(discreta_base &t, discreta_base &v, discreta_base &k, int delta_lambda, discreta_base &m_max)
Definition: design.cpp:195
int calc_redinv(int t, int v, int k, int delta_lambda, int &c, int &T, int &V, int &K, int &Delta_lambda)
Definition: design.cpp:243
void html_foot(std::ostream &ost)
void design_lambda_max_half(int t, int v, int k, discreta_base &lambda_max_half)
Definition: design.cpp:100
int calc_delta_lambda(int v, int t, int k, int f_v)
Definition: design.cpp:47
void design_mendelsohn_rhs(int v, int t, int k, discreta_base &lambda, int m, int s, Vector &rhs)
Definition: design.cpp:314
void design_parameter_database_clan_report(char *path_db, Vector &ancestor, Vector &clan_lambda, Vector &clan_member, Vector &clan_member_path)
Definition: design.cpp:1414
void prepare_design_parameters_from_id(database &D, int id, hollerith &h)
Definition: design.cpp:1098
void Binomial(int n, int k, discreta_base &n_choose_k)
Definition: global.cpp:1203
void design_lambda_ij(int t, int v, int k, discreta_base &lambda, int i, int j, discreta_base &lambda_ij)
Definition: design.cpp:145
int calc_resinv(int t, int v, int k, int delta_lambda, int &c, int &T, int &V, int &K, int &Delta_lambda)
Definition: design.cpp:276
int design_parameter_database_already_there(database &D, design_parameter &p, int &idx)
Definition: design.cpp:329
int is_ancestor(int t, int v, int k)
Definition: design.cpp:215
void prepare_link(hollerith &link, int id)
Definition: design.cpp:1116
void design_parameter_database_family_report(char *path_db, int t, int v, int k, int lambda, int minimal_t)
Definition: design.cpp:1304
void design_parameter_database_read_design_txt(char *fname_design_txt, char *path_db, int f_form_closure, int minimal_t, int verbose_level)
Definition: design.cpp:553
void design_lambda_ijs_matrix(int t, int v, int k, discreta_base &lambda, int s, discreta_matrix &M)
Definition: design.cpp:110
int design_parameters_admissible(int v, int t, int k, discreta_base &lambda)
Definition: design.cpp:30
int Maxfit(int i, int j)
Definition: design.cpp:1806
void print_clan_tex_int(int t, int v, int k)
Definition: design.cpp:177
void design_parameter_database_closure(database &D, int highest_id_already_closed, int minimal_t, int verbose_level)
Definition: design.cpp:379
void N_choose_K(discreta_base &n, int k, discreta_base &res)
Definition: global.cpp:1165
int determine_restricted_number_of_designs_t_v(database &D, btree &B, int btree_idx_tvkl, int t, int v, int first, int len)
Definition: design.cpp:1058
void design_lambda_max(int t, int v, int k, discreta_base &lambda_max)
Definition: design.cpp:95
void design_parameter_database_export_tex(char *path_db)
Definition: design.cpp:641
void html_head(std::ostream &ost, char *title_long, char *title_short)
void factor_integer(int n, Vector &primes, Vector &exponents)
Definition: global.cpp:330
void design_mendelsohn_coefficient_matrix(int t, int m, discreta_matrix &M)
Definition: design.cpp:295
void design_parameter_database_clans(char *path_db, int f_html, int f_v, int f_vv)
Definition: design.cpp:1127
int calc_derinv(int t, int v, int k, int delta_lambda, int &c, int &T, int &V, int &K, int &Delta_lambda)
Definition: design.cpp:265
void design_parameter_database_add_if_new(database &D, design_parameter &p, int &highest_id, int verbose_level)
Definition: design.cpp:343
int is_trivial_clan(int t, int v, int k)
Definition: design.cpp:164
void design_lambda_ijs(int t, int v, int k, discreta_base &lambda, int s, int i, int j, discreta_base &lambda_ijs)
Definition: design.cpp:123
the orbiter library for the classification of combinatorial objects
DISCRETA auxiliary class related to the class database.
Definition: discreta.h:1507
DISCRETA auxiliary class related to the class database.
Definition: discreta.h:1498