14namespace layer2_discreta {
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);
35 b.
m_i_i(delta_lambda);
42 if (lambda.
gt(lambda_max))
51 discreta_base a, b, a1, b1, g, rhs_a, rhs_b, delta_lambda, dl, a2, b2, gg;
57 cout <<
"calc_delta_lambda: v=" << v <<
" t=" << t <<
" k="
58 << k <<
" lambda=" << lambda << endl;
60 for (i = t; i >= 0; i--) {
64 delta_lambda.
m_i_i(1);
77 dl.
mult(delta_lambda, b1);
80 cout <<
"t'=" << i <<
" lambda'=" << a <<
"/" << b
81 <<
" delta_lambda=" << delta_lambda << endl;
88 return delta_lambda.
s_i_i();
90 cout <<
"calc_delta_lambda delta_lambda in longinteger" << endl;
116 for (i = 0; i <= t; i++) {
117 for (j = 0; j <= t - i; j++) {
134 for (h = 0; h <= j; h++) {
169 dl.
m_i_i(delta_lambda);
171 if (dl.
eq(lambda_max))
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)) {
223 int c, T, V, K, Delta_lambda;
225 if (
calc_redinv(t, v, k, delta_lambda, c, T, V, K, Delta_lambda) && c == 1) {
230 if (
calc_derinv(t, v, k, delta_lambda, c, T, V, K, Delta_lambda) && c == 1) {
235 if (
calc_resinv(t, v, k, delta_lambda, c, T, V, K, Delta_lambda) && c == 1) {
244 int &T,
int &V,
int &K,
int &Delta_lambda)
246 long int vt, kt, g, v1, k1, gg;
261 Delta_lambda = k1 * delta_lambda / gg;
266 int &T,
int &V,
int &K,
int &Delta_lambda)
272 c = Delta_lambda / delta_lambda;
277 int &T,
int &V,
int &K,
int &Delta_lambda)
288 a = Delta_lambda * (v + 1 - k);
289 b = delta_lambda * (k - t);
307 for (i = 0; i <= t; i++) {
308 for (j = i; j <= m; j++) {
321 for (i = 0; i <= t; i++) {
332 int verbose_level = 0;
346 int f_v = (verbose_level >= 1);
350 p.
id() = ++highest_id;
353 cout << p.
id() <<
" added: " << p
354 <<
" new highest_id=" << highest_id << endl;
365 B_tvkl.
ith(idx, &key, &data, verbose_level - 1);
368 for (
int i = 0; i < p.
source().
s_l(); i++) {
374 cout << p1.
id() <<
" changed: " << p1 << endl;
380 int highest_id_already_closed,
int minimal_t,
383 int f_v = (verbose_level >= 1);
384 int f_vv = (verbose_level >= 2);
387 cout <<
"design_parameter_database_closure "
388 "database not open" << endl;
391 int highest_id, old_highest_id, id;
392 int btree_idx_id = 0;
395 old_highest_id = highest_id;
397 cout <<
"design_parameter_database_closure "
398 "highest_id_already_closed=" << highest_id_already_closed
399 <<
" highest_id=" << highest_id << endl;
401 for (
id = highest_id_already_closed + 1;
id <= highest_id;
id++) {
406 cout <<
"closure of design #" <<
id <<
" : " << p << endl;
409 if (f_vv) cout <<
"reduced_t:" << endl;
413 highest_id, verbose_level - 2);
416 if (f_vv) cout <<
"derived:" << endl;
420 highest_id, verbose_level - 2);
423 if (f_vv) cout <<
"residual:" << endl;
427 highest_id, verbose_level - 2);
431 if (f_vv) cout <<
"trung_complementary:" << endl;
434 highest_id, verbose_level - 2);
439 if (f_vv) cout <<
"alltop:" << endl;
442 highest_id, verbose_level - 2);
446 if (p.
v() == 2 * p.
K() + 1) {
447 if (f_vv) cout <<
"complementary design:" << endl;
451 highest_id, verbose_level - 2);
456 if (f_vv) cout <<
"supplementary design:" << endl;
460 highest_id, verbose_level - 2);
464 if (f_vv) cout <<
"supplementary_reduced_t:" << endl;
468 highest_id, verbose_level - 2);
471 if (f_vv) cout <<
"supplementary_derived:" << endl;
475 highest_id, verbose_level - 2);
478 if (f_vv) cout <<
"supplementary_residual:" << endl;
482 highest_id, verbose_level - 2);
487 int t_new, v_new, k_new;
493 if (f_vv) cout <<
"trung_left_partner:" << endl;
511 highest_id, verbose_level - 2);
517 v_new, k_new, lambda_new) && lambda_new.
s_kind() ==
INTEGER) {
518 if (f_vv) cout <<
"trung_right_partner:" << endl;
536 highest_id, verbose_level - 2);
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;
554 char *path_db,
int f_form_closure,
int minimal_t,
int verbose_level)
559 int btree_idx_id = 0;
562 ifstream f(fname_design_txt);
564 cout <<
"error opening file " << fname_design_txt << endl;
571 D.
open(verbose_level - 1);
574 int highest_id_already_closed = -1;
579 f.getline(buf,
sizeof(buf));
589 strcpy(comment, p_buf);
593 p.
init(t, v, k, lambda);
594 if (strlen(comment)) {
615 cout <<
"already there, we are changing the dataset:" << endl;
620 highest_id, verbose_level - 2);
627 highest_id_already_closed, minimal_t,
631 id = highest_id_already_closed + 1;
634 D.
close(verbose_level - 1);
643 int verbose_level = 0;
644 int btree_idx_id = 0;
645 int btree_idx_tvkl = 2;
651 D.
open(verbose_level);
657 cout <<
"design_parameter_database_export_tex() db_path=" << path_db
658 <<
" highest_id = " << highest_id << endl;
662 int highest_page = highest_id / 100, i, page;
665 fname_page.
m_l(highest_page + 1);
666 for (i = 0; i <= highest_page; i++) {
669 h.
init(
"design_id_ge_");
672 fname_page.
s_i(i) = h;
679 ofstream f(
"designs.tex", ios::trunc);
683 "$t$-Designs",
"DISCRETA",
TRUE ,
692 f <<
"\n\\chapter{Designs by $t, v, k, \\lambda$}\n\n";
697 len = B.
length(verbose_level - 2);
698 D.
ith_object(0, btree_idx_tvkl, p, verbose_level - 2);
700 D.
ith_object(len - 1, btree_idx_tvkl, p, verbose_level - 2);
706 fname_dir.
init(
"designs.html");
707 ofstream fhtml_dir(fname_dir.
s());
710 h1.
init(
"t designs with small t");
711 h2.
init(
"t designs with small t");
716 fhtml_dir <<
"<ul>" << endl;
718 for (t = t_min; t <= t_max; t++) {
727 D, B, btree_idx_tvkl, t, first, len);
730 f <<
"\\newpage\n\n";
731 cout <<
"t=" << t <<
" number of designs: " << nb_restricted << endl;
733 f <<
"\n\\section{Designs with $t=" << t <<
"$}\n\n";
735 f <<
"There are alltogether " << nb_restricted <<
" parameter sets "
736 "of designs with $t=" << t <<
"$.\\\\" << endl;
738 fhtml_dir <<
"<li> t=" << t <<
" (" << nb_restricted <<
" parameter "
739 "sets of designs)" << endl;
741 D.
ith_object(first, btree_idx_tvkl, p, verbose_level - 2);
743 D.
ith_object(first + len - 1, btree_idx_tvkl, p, verbose_level - 2);
750 fhtml_dir <<
"<ul>" << endl;
751 for (v = v_min; v <= v_max; v++) {
761 f <<
"\n\\subsection{Designs with $t=" << t <<
"$, $v=" << v <<
"$}\n\n";
765 f <<
"There are alltogether " << nb_restricted <<
" parameter sets of designs with $t=" << t <<
"$ and $v=" << v <<
"$.\\\\" << endl;
768 fhtml_dir <<
"<li> <a href=\"design_t" << t <<
"_v" << v <<
".html\"> v=" << v <<
" (" << nb_restricted <<
" parameter sets of designs) </a>" << endl;
770 D.
ith_object(first, btree_idx_tvkl, p, verbose_level - 2);
772 D.
ith_object(first + len - 1, btree_idx_tvkl, p, verbose_level - 2);
777 fname.
init(
"design_t");
782 ofstream fhtml(fname.
s());
785 h1.
init(
"t designs with t=");
789 h2.
init(
"t designs with t=");
798 for (k = k_min; k <= k_max; k++) {
820 for (
int i = 0; i < len; i++) {
822 D.
ith_object(idx, btree_idx_tvkl, p, verbose_level - 2);
834 int id = v_id.
s_ii(0);
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;
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++) {
844 int id = v_id.
s_ii(ii);
847 f << v_lambda.
s_i(ii) <<
"_{\\#" << v_id.
s_ii(ii) <<
"}";
848 fhtml <<
" <a href=\"" << link.
s() <<
"\">" << v_lambda.
s_i(ii) <<
"</a>";
853 if ((ii % 10) == 0) {
858 f <<
"\\}$ (" << l <<
" parameter sets)" << endl;
859 fhtml <<
"} (" << l <<
" parameter sets)" << endl;
861 f <<
"$\\Delta \\lambda=" << delta_lambda <<
"$, $\\lambda_{max}=" << lambda_max <<
"$\\\\" << endl;
862 fhtml <<
"delta lambda = " << delta_lambda <<
", lambda_max=" << lambda_max <<
"<br>" << endl;
868 fhtml_dir <<
"</ul>" << endl;
871 fhtml_dir <<
"</ul>" << endl;
873 fhtml_dir <<
"<p><hr><p>" << endl;
875 fhtml_dir <<
"<a href=\"design_clans.html\"> design_clans </a>" << endl;
877 fhtml_dir <<
"<p><hr><p>" << endl;
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;
883 fhtml_dir <<
"</ul>" << endl;
888 f <<
"\n\\chapter{Designs by ID}\n\n";
889 for (
id = 0;
id <= highest_id;
id++) {
891 f <<
"\n\\section{ID $\\ge " <<
id <<
"$}\n\n";
892 cout <<
"ID >= " <<
id << endl;
901 f <<
"\\# " << p.
id() <<
": " << h.
s() << endl;
912 f <<
"\\begin{enumerate}\n";
914 f <<
"clan: " << ancestor.
t() <<
"-("
915 << ancestor.
v() <<
","
916 << ancestor.
K() <<
","
917 << ancestor.
lambda() <<
")";
919 f <<
", " << path.
s_ii(0) <<
" $\\times$ reduced $t$";
922 f <<
", " << path.
s_ii(1) <<
" $\\times$ derived";
925 f <<
", " << path.
s_ii(2) <<
" $\\times$ residual";
929 for (j = 0; j < l; j++) {
937 if (S.
prev() != -1) {
940 f <<
" " << h.
s() <<
" (\\# " << S.
prev() <<
")";
946 f <<
"\\end{enumerate}\n";
947 f <<
"\\smallskip" << endl;
952 for (page = 0; page <= highest_page; page++) {
953 cout <<
"ID >= " << page * 100 << endl;
954 ofstream fhtml(fname_page[page].as_hollerith().s());
957 h1.
init(
"t designs with small t, id ge ");
959 h2.
init(
"t designs with small t, id ge ");
964 for (
id = page * 100;
id <=
MINIMUM((page + 1) * 100 - 1, highest_id);
id++) {
970 fhtml <<
"<a name=\"design"<< p.
id() <<
"\"> # " << p.
id() <<
": " << h.
s() <<
"</a>" << endl;
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() <<
")";
991 fhtml <<
", " << path.
s_ii(0) <<
" times reduced t";
994 fhtml <<
", " << path.
s_ii(1) <<
" times derived";
997 fhtml <<
", " << path.
s_ii(2) <<
" times residual";
999 fhtml <<
"</a>" << endl;
1001 for (j = 0; j < l; j++) {
1009 if (S.
prev() != -1) {
1012 fhtml <<
" <a href=\"" << link.
s() <<
"\">";
1014 fhtml << h.
s() <<
" (# " << S.
prev() <<
") </a> ";
1016 fhtml << s2.
s() << endl;
1019 fhtml <<
"<p><hr><p>" << endl;
1024 D.
close(verbose_level);
1032 int btree_idx_tvkl,
int t,
int first,
int len)
1034 int verbose_level = 0;
1036 int v, v_min, v_max;
1037 int nb_restricted = 0;
1039 D.
ith_object(first, btree_idx_tvkl, p, verbose_level - 2);
1041 D.
ith_object(first + len - 1, btree_idx_tvkl, p, verbose_level - 2);
1044 for (v = v_min; v <= v_max; v++) {
1052 btree_idx_tvkl, t, v, first, len);
1055 return nb_restricted;
1059 int btree_idx_tvkl,
int t,
int v,
int first,
int len)
1061 int verbose_level = 0;
1063 int k, k_min, k_max;
1064 int nb_restricted = 0;
1066 D.
ith_object(first, btree_idx_tvkl, p, verbose_level - 2);
1068 D.
ith_object(first + len - 1, btree_idx_tvkl, p, verbose_level - 2);
1071 for (k = k_min; k <= k_max; k++) {
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);
1095 return nb_restricted;
1100 int verbose_level = 0;
1101 int btree_idx_id = 0;
1118 int page =
id / 100;
1119 link.
init(
"design_id_ge_");
1121 link.
append(
".html#design");
1129 int verbose_level = 0;
1130 int btree_idx_id = 0;
1135 Vector ancestor, clan_lambda, clan_member, clan_member_path;
1138 D.
open(verbose_level);
1140 int id, highest_id, idx1, idx2;
1147 clan_member_path.
m_l(0);
1148 for (
id = 0;
id <= highest_id;
id++) {
1169 if (ancestor.
search(g, &idx1)) {
1170 cout <<
"clan found at " << idx1 << endl;
1175 cout <<
"family found at " << idx2 << endl;
1182 cout <<
"new family within the clan, inserting at " << idx2 << endl;
1194 cout <<
"new clan, inserting at " << idx1 << endl;
1196 Vector gf, cm, CM, cmp, CMP;
1211 cout <<
"number of clans: " << ancestor.
s_l() << endl;
1215 int i, l, j, ll, h, lll;
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];
1226 cout <<
" delta_lambda = " << delta_lambda;
1230 cout <<
" lambda_max = " << lambda_max;
1231 cout <<
" lambda_max_half = " << lambda_max_half << endl;
1234 for (i = 0; i < l; i++) {
1235 cout << i <<
" & " << ancestor[i];
1242 cout <<
" & " << delta_lambda;
1246 cout <<
" & " << lambda_max;
1250 for (j = 0; j < ll; j++) {
1253 dl.
m_i_i(delta_lambda);
1260 cout <<
"\\\\" << endl;
1265 for (i = 0; i < l; i++) {
1266 cout <<
"clan no " << i <<
" : ancestor = " << ancestor[i];
1273 cout <<
" delta_lambda = " << delta_lambda;
1277 cout <<
" lambda_max = " << lambda_max;
1278 cout <<
" lambda_max_half = " << lambda_max_half << endl;
1283 cout <<
"containing " << ll <<
" families: " << endl;
1284 for (j = 0; j < ll; j++) {
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)
1297 D.
close(verbose_level);
1306 int verbose_level = 0;
1308 int btree_idx_tvkl = 2;
1310 cout <<
"design_parameter_database_family_report() t=" << t <<
" v=" << v <<
" k=" << k <<
" lambda=" << lambda << endl;
1317 D.
open(verbose_level);
1321 int h, i, j, idx, id;
1324 for (h = 0; h <= t; h++) {
1330 for (h = 0; h < t; h++) {
1331 if (t - h < minimal_t)
1335 for (i = 0; i <= h; i++) {
1336 for (j = 0; j <= h - i; j++) {
1339 prepare_entry(entry, i, j, h, t, v, k, lambda);
1344 entry.
s_ii(3), verbose_level);
1347 D.
ith_object(idx, btree_idx_tvkl, p, verbose_level - 2);
1352 M.
s_ij(i, j) = entry;
1357 D.
close(verbose_level);
1360 for (h = 0; h < t; h++) {
1361 if (t - h < minimal_t)
1364 cout <<
"h=" << h << endl;
1365 for (i = 0; i <= h; i++) {
1366 for (j = 0; j <= h; j++) {
1369 cout << entry[0] <<
"-(" << entry[1] <<
"," << entry[2] <<
"," << entry[3] <<
")";
1372 cout <<
"_{\\#" <<
id <<
"}";
1378 cout <<
"\\\\" << endl;
1383static void prepare_entry(Vector &entry,
int i,
int j,
int h,
int t,
int v,
int k,
int lambda)
1385 design_parameter p, q;
1387 int h1 = h - i - j, u;
1389 cout <<
"prepare_entry() h1 < 0" << endl;
1393 p.init(t, v, k, lambda);
1394 for (u = 0; u < i; u++) {
1398 for (u = 0; u < j; u++) {
1402 for (u = 0; u < h1; u++) {
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();
1418 int verbose_level = 0;
1426 D.
open(verbose_level);
1432 hollerith fname, fname_tex, fname_dir, h1, h2;
1434 fname_dir.
init(
"design_clans.html");
1435 ofstream fhtml_dir(fname_dir.
s());
1438 h1.
init(
"t designs with small t by clans");
1439 h2.
init(
"t designs with small t by clans");
1443 fhtml_dir <<
"in brackets: number of families / overall "
1444 "number of design parameter sets per clan<br>" << endl;
1446 fhtml_dir <<
"<ul>" << endl;
1447 int i, j, l, ll, s, lll;
1449 for (i = 0; i < l; i++) {
1457 dl.
m_i_i(delta_lambda);
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
1474 fhtml_dir <<
"</ul>" << endl;
1478 for (i = 0; i < l; i++) {
1484 fname.
init(
"design_clan_");
1491 fname_tex.
append(
".tex");
1494 ofstream fhtml(fname.
s());
1495 ofstream ftex(fname_tex.
s());
1498 h1.
init(
"design clan: ");
1504 h2.
init(
"design clan: ");
1517 dl.
m_i_i(delta_lambda);
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
1530 ftex <<
"\\subsection*{Clan " << i <<
": $" << t <<
"$-$(" << v
1532 <<
",m\\cdot " << delta_lambda <<
")$}\n";
1533 ftex <<
"The clan contains " << ll <<
" families:\\\\" << endl;
1540 fhtml <<
"the clan contains " << ll <<
" families: " << endl;
1541 fhtml <<
"<ul>" << endl;
1542 for (j = 0; j < ll; j++) {
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;
1556 for (h = 0; h < lll; h++) {
1558 int id = cm.
s_ii(h);
1561 fhtml <<
" <a href=\"" << link.
s() <<
"\">";
1563 fhtml << text1.
s() <<
" (#" <<
id <<
"), path=" << path <<
" </a>, ";
1564 if (((h + 1) % 10) == 0)
1565 fhtml <<
"<br>" << endl;
1569 Vector min_path, max_path;
1570 int max_depth, minimal_t;
1572 determine_minimal_and_maximal_path(cmp, min_path, max_path, max_depth);
1573 minimal_t = t - max_depth;
1575 fhtml <<
"<br>minpath=" << min_path <<
" minimal_t=" << minimal_t << endl;
1577 determine_dominating_ancestor(t, v, k, lambda, min_path, dominating_ancestor);
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);
1585 fhtml <<
"</ul>" << endl;
1592 D.
close(verbose_level);
1595static void determine_minimal_and_maximal_path(Vector &v,
1596 Vector & min_path, Vector & max_path,
int & max_depth)
1598 int i, l, j, ll, depth;
1602 cout <<
"determine_minimal_and_maximal_path "
1606 ll = v[0].as_vector().s_l();
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;
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);
1626static void determine_dominating_ancestor(
int t,
int v,
int k,
1627 discreta_base & lambda, Vector & path,
1628 design_parameter &dominating_ancestor)
1630 design_parameter p, q;
1633 p.init(t, v, k, lambda);
1634 for (u = 0; u < path.s_ii(0); u++) {
1638 for (u = 0; u < path.s_ii(1); u++) {
1642 for (u = 0; u < path.s_ii(2); u++) {
1646 dominating_ancestor = p;
1649static void reduce_path(Vector &cmp, Vector &min_path)
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);
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)
1666 int h, i, j, idx, idx1, id, nb_found = 0;
1670 cmp.sort_with_logging(per);
1673 for (h = 0; h <= t; h++) {
1674 Layers[h].change_to_matrix();
1675 Layers[h].as_matrix().m_mn(h + 1, h + 1);
1679 for (h = 0; h < t; h++) {
1680 if (t - h < minimal_t)
1683 discreta_matrix &M = Layers[h].as_matrix();
1684 for (i = 0; i <= h; i++) {
1685 for (j = 0; j <= h - i; j++) {
1689 path.m_ii(0, h - i - j);
1692 if (cmp.search(path, &idx)) {
1693 idx1 = per.s_i(idx);
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;
1710 fhtml <<
"<ul>" << endl;
1712 for (h = 0; h < t; h++) {
1713 if (t - h < minimal_t)
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);
1725 path.m_ii(0, h - i - j);
1729 determine_dominating_ancestor(t, v, k, lambda, path, p);
1731 hollerith link, text1;
1734 fhtml <<
" <a href=\"" << link.s() <<
"\">";
1736 fhtml << text1.s() <<
" (#" <<
id <<
")</a> ";
1737 ftex <<
"$\\underline{\\mbox{" << text1.s() <<
"}}$";
1740 fhtml << p.t() <<
"-(" << p.v() <<
"," << p.K()
1741 <<
"," << p.lambda() <<
") ";
1742 ftex <<
"$" << p.t() <<
"$-$(" << p.v() <<
","
1743 << p.K() <<
"," << p.lambda() <<
")$";
1750 ftex <<
"\\\\" << endl;
1752 fhtml <<
"<br>" << endl;
1754 fhtml <<
"<p>" << endl;
1755 ftex <<
"\\end{tabular}\\\\" << endl;
1757 fhtml <<
"</ul>" << endl;
1760static void f_m_j(
int m,
int j, discreta_base &a)
1772 discreta_base b, c, d, e, J, R, two;
1778 d.integral_division_exact(two, c);
1787static int max_m(
int i,
int j)
1790 discreta_base a, b, c, d, two;
1796 d.integral_division_exact(two, a);
1797 for (m = 0; ; m++) {
basic number theoretic functions
long int gcd_lint(long int m, long int n)
interface to create latex output files
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)
void foot(std::ostream &ost)
DISCRETA vector class for vectors of DISCRETA objects.
Vector & append(discreta_base &x)
int vector_of_vectors_overall_length()
Vector & append_integer(int a)
discreta_base & s_i(int i)
Vector & insert_element(int i, discreta_base &x)
bool search(discreta_base &x, int *idx)
DISCRETA class for a database.
void search_interval_int4_int4(int l0, int u0, int l1, int u1, int &first, int &len, int verbose_level)
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)
int length(int verbose_level)
int search_unique_int4_int4_int4_int4(int i0, int i1, int i2, int i3, int verbose_level)
void ith(int l, KEYTYPE *key, DATATYPE *data, int verbose_level)
void search_interval_int4(int i_min, int i_max, int &first, int &len, int verbose_level)
DISCRETA class for a database.
btree & btree_access_i(int i)
void get_object_by_unique_int4(int btree_idx, int id, Vector &the_object, int verbose_level)
void close(int verbose_level)
int get_highest_int4(int btree_idx)
void add_object(Vector &the_object, int verbose_level)
void open(int verbose_level)
void delete_object(Vector &the_object, uint_4 datref, int verbose_level)
void get_object(uint_4 datref, Vector &the_object, int verbose_level)
void ith_object(int i, int btree_idx, Vector &the_object, int verbose_level)
int get_object_by_unique_int4_if_there(int btree_idx, int id, Vector &the_object, int verbose_level)
DISCRETA class for the design parameters database.
void text012_extended(design_parameter &p, hollerith &s0, hollerith &s1, hollerith &s2)
DISCRETA class for design parameters.
void supplementary_reduced_t(design_parameter &p)
void init_database(database &D, char *path)
int trung_complementary(design_parameter &p)
void reduced_t(design_parameter &p)
void text_parameter(hollerith &h)
design_parameter_source & source_i(int i)
void supplementary_derived(design_parameter &p)
void residual(design_parameter &p)
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 derived(design_parameter &p)
void complementary(design_parameter &p)
void supplementary_residual(design_parameter &p)
void supplementary(design_parameter &p)
void ancestor(design_parameter &p, Vector &path, int f_v, int f_vv)
int alltop(design_parameter &p)
DISCRETA base class. All DISCRETA classes are derived from this class.
void integral_division_exact(discreta_base &x, discreta_base &q)
virtual void integral_division(discreta_base &x, discreta_base &q, discreta_base &r, int verbose_level)
discreta_matrix & change_to_matrix()
void integral_division_by_integer_exact(int x, discreta_base &q)
discreta_matrix & as_matrix()
void mult(discreta_base &x, discreta_base &y)
hollerith & as_hollerith()
discreta_base & divide_by_exact(discreta_base &x)
void extended_gcd(discreta_base &n, discreta_base &u, discreta_base &v, discreta_base &g, int verbose_level)
discreta_matrix & m_mn(int m, int n)
discreta_matrix & m_mn_n(int m, int n)
discreta_base & s_ij(int i, int j)
void append(const char *p)
DISCRETA class related to printing of objects.
int determine_restricted_number_of_designs_t(database &D, btree &B, int btree_idx_tvkl, int t, int first, int len)
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)
int calc_redinv(int t, int v, int k, int delta_lambda, int &c, int &T, int &V, int &K, int &Delta_lambda)
void html_foot(std::ostream &ost)
void design_lambda_max_half(int t, int v, int k, discreta_base &lambda_max_half)
int calc_delta_lambda(int v, int t, int k, int f_v)
void design_mendelsohn_rhs(int v, int t, int k, discreta_base &lambda, int m, int s, Vector &rhs)
void design_parameter_database_clan_report(char *path_db, Vector &ancestor, Vector &clan_lambda, Vector &clan_member, Vector &clan_member_path)
void prepare_design_parameters_from_id(database &D, int id, hollerith &h)
void Binomial(int n, int k, discreta_base &n_choose_k)
void design_lambda_ij(int t, int v, int k, discreta_base &lambda, int i, int j, discreta_base &lambda_ij)
int calc_resinv(int t, int v, int k, int delta_lambda, int &c, int &T, int &V, int &K, int &Delta_lambda)
int design_parameter_database_already_there(database &D, design_parameter &p, int &idx)
int is_ancestor(int t, int v, int k)
void prepare_link(hollerith &link, int id)
void design_parameter_database_family_report(char *path_db, int t, int v, int k, int lambda, int minimal_t)
void design_parameter_database_read_design_txt(char *fname_design_txt, char *path_db, int f_form_closure, int minimal_t, int verbose_level)
void design_lambda_ijs_matrix(int t, int v, int k, discreta_base &lambda, int s, discreta_matrix &M)
int design_parameters_admissible(int v, int t, int k, discreta_base &lambda)
void print_clan_tex_int(int t, int v, int k)
void design_parameter_database_closure(database &D, int highest_id_already_closed, int minimal_t, int verbose_level)
void N_choose_K(discreta_base &n, int k, discreta_base &res)
int determine_restricted_number_of_designs_t_v(database &D, btree &B, int btree_idx_tvkl, int t, int v, int first, int len)
void design_lambda_max(int t, int v, int k, discreta_base &lambda_max)
void design_parameter_database_export_tex(char *path_db)
void html_head(std::ostream &ost, char *title_long, char *title_short)
void factor_integer(int n, Vector &primes, Vector &exponents)
void design_mendelsohn_coefficient_matrix(int t, int m, discreta_matrix &M)
void design_parameter_database_clans(char *path_db, int f_html, int f_v, int f_vv)
int calc_derinv(int t, int v, int k, int delta_lambda, int &c, int &T, int &V, int &K, int &Delta_lambda)
void design_parameter_database_add_if_new(database &D, design_parameter &p, int &highest_id, int verbose_level)
int is_trivial_clan(int t, int v, int k)
void design_lambda_ijs(int t, int v, int k, discreta_base &lambda, int s, int i, int j, discreta_base &lambda_ijs)
the orbiter library for the classification of combinatorial objects
DISCRETA auxiliary class related to the class database.
DISCRETA auxiliary class related to the class database.