Orbiter 2022
Combinatorial Objects
design_parameter.cpp
Go to the documentation of this file.
1// design_parameter.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
17{
19}
20
22 // copy constructor: this := x
23{
24 cout << "design_parameter::copy constructor for object: "
25 << const_cast<discreta_base &>(x) << "\n";
26 const_cast<discreta_base &>(x).copyobject_to(*this);
27}
28
30 // copy assignment
31{
32 cout << "design_parameter::operator = (copy assignment)" << endl;
33 copyobject(const_cast<discreta_base &>(x));
34 return *this;
35}
36
38{
39 OBJECTSELF s;
40
41 s = self;
42 new(this) design_parameter;
43 self = s;
45}
46
48{
50}
51
53{
54 // cout << "group_selection::freeself_design_parameter()\n";
56}
57
59{
60 return DESIGN_PARAMETER;
61}
62
64{
65#ifdef COPY_VERBOSE
66 cout << "design_parameter::copyobject_to()\n";
67 print_as_vector(cout);
68#endif
71#ifdef COPY_VERBOSE
72 x.as_design_parameter().print_as_vector(cout);
73#endif
74}
75
76ostream& design_parameter::print(ostream& ost)
77{
78 hollerith h;
79
80 text(h);
81 ost << h.s();
82 return ost;
83}
84
86{
87 m_l_n(6);
89 id() = -1;
90 t() = 0;
91 v() = 0;
92 K() = 0;
93 lambda().m_i_i(0);
95 source().m_l(0);
96}
97
98void design_parameter::init(int t, int v, int k, int lambda)
99{
100 init();
103 K() = k;
105}
106
107void design_parameter::init(int t, int v, int k, discreta_base& lambda)
108{
109 init();
112 K() = k;
114}
115
117{
118 hollerith hh;
119
120 h.init("#");
121 h.append_i(id());
122 h.append(" ");
123
124 text_parameter(hh);
125 h.append(hh.s());
126 h.append(" ");
127
128 if (is_selfsupplementary()) {
129 h.append("(selfsupplementary) ");
130 }
131 else {
132 discreta_base ls;
134 ls.print_to_hollerith(hh);
135
136 h.append("(supplementary design has lambda=");
137 h.append(hh.s());
138 h.append(")");
139 }
140 for (int i = 0; i < source().s_l(); i++) {
141 hollerith hh;
142
143 source_i(i).text2(*this, hh);
144 h.append("; ");
145 h.append(hh.s());
146 }
147}
148
150{
151 hollerith hh;
152
153 h.init("");
154 h.append_i(t());
155 h.append("-(");
156 h.append_i(v());
157 h.append(",");
158 h.append_i(K());
159 h.append(",");
160
162 h.append(hh.s());
163
164 h.append(") ");
165}
166
168{
169 discreta_base lambda_new;
170 integer a, b;
172
173 // lambda_new = (lambda * (v - t + 1)) / (k - t + 1);
174 a.m_i(v() - t() + 1);
175 b.m_i(K() - t() + 1);
176 lambda_new.mult(lambda(), a);
177 lambda_new.divide_by_exact(b);
178
179 p.init();
180 p.v() = v();
181 p.t() = t() - 1;
182 p.K() = K();
183 p.lambda() = lambda_new;
184 S.init();
185 S.prev() = id();
186 S.rule() = rule_reduced_t;
187 p.source().append(S);
188}
189
191{
192 discreta_base lambda_new;
193 integer a, b, q, r;
194
195 // lambda_new = (lambda * (k - t)) / (v - t);
196 a.m_i(K() - t());
197 b.m_i(v() - t());
198 if (a.is_zero())
199 return FALSE;
200 if (b.is_zero())
201 return FALSE;
202 lambda_new.mult(lambda(), a);
203 lambda_new.integral_division(b, q, r, 0);
204 lambda_new.swap(q);
205 if (!r.is_zero())
206 return FALSE;
207 p.init();
208 p.v() = v();
209 p.t() = t() + 1;
210 p.K() = K();
211 p.lambda() = lambda_new;
212 return TRUE;
213}
214
216{
217 discreta_base lambda_new;
218 integer a, b;
221
222 supplementary(q);
223 // lambda_new = (lambda * (v - t + 1)) / (k - t + 1);
224 a.m_i(q.v() - q.t() + 1);
225 b.m_i(q.K() - q.t() + 1);
226 lambda_new.mult(q.lambda(), a);
227 lambda_new.divide_by_exact(b);
228
229 p.init();
230 p.v() = q.v();
231 p.t() = q.t() - 1;
232 p.K() = q.K();
233 p.lambda() = lambda_new;
234 S.init();
235 S.prev() = id();
237 p.source().append(S);
238}
239
241{
243
244 p.init();
245 p.v() = v() - 1;
246 p.t() = t() - 1;
247 p.K() = K() - 1;
248 p.lambda() = lambda();
249 S.init();
250 S.prev() = id();
251 S.rule() = rule_derived;
252 p.source().append(S);
253}
254
256{
258
259 p1.init();
260 p1.v() = v() + 1;
261 p1.t() = t() + 1;
262 p1.K() = K() + 1;
263 p1.lambda() = lambda();
264 if (!design_parameters_admissible(p1.v(), p1.t(), p1.K(), p1.lambda()))
265 return FALSE;
266 p1.swap(p);
267 return TRUE;
268}
269
271{
274
275 supplementary(q);
276 p.init();
277 p.v() = q.v() - 1;
278 p.t() = q.t() - 1;
279 p.K() = q.K() - 1;
280 p.lambda() = q.lambda();
281 S.init();
282 S.prev() = id();
284 p.source().append(S);
285}
286
288{
289 discreta_base lambda_new;
290 integer a, b, c;
292
293 // lambda_new = (lambda * (v - t + 1)) / (k - t + 1) - lambda;
294 a.m_i(v() - t() + 1);
295 b.m_i(K() - t() + 1);
296 c = lambda();
297 c.negate();
298 lambda_new.mult(lambda(), a);
299 lambda_new.divide_by_exact(b);
300 lambda_new += c;
301
302 p.init();
303 p.v() = v() - 1;
304 p.t() = t() - 1;
305 p.K() = K();
306 p.lambda() = lambda_new;
307 S.init();
308 S.prev() = id();
309 S.rule() = rule_residual;
310 p.source().append(S);
311}
312
314{
315 discreta_base a, a1, b, q, r;
317
318 p1.init();
319 p1.v() = v() + 1;
320 p1.t() = t() + 1;
321 p1.K() = K();
322
323 a1.m_i_i(K() - t());
324 a.mult(lambda(), a1);
325 b.m_i_i(v() + 1 - K());
326 a.integral_division(b, q, r, 0);
327 if (!r.is_zero())
328 return FALSE;
329 p1.lambda() = q;
330 if (!design_parameters_admissible(p1.v(), p1.t(), p1.K(), p1.lambda()))
331 return FALSE;
332 p1.swap(p);
333 return TRUE;
334}
335
337 int f_v, int f_vv)
338{
339 design_parameter s, q;
340 int f_special = FALSE;
342
343 path.m_l_n(3);
344 s = *this;
345 if (f_v) {
346 cout << "determining ancestor of " << s << endl;
347 }
348 if (s.lambda().is_one()) {
349 if (s.t() + 1 == s.K()) {
350 if (NT.is_prime(s.v() - s.t())) {
351 cout << "determining ancestor of steiner system "
352 << s.t() << "(" << s.v() << "," << s.K()
353 << "1) with v - t prime" << endl;
354 f_special = TRUE;
355 }
356 }
357 }
358 if (f_special) {
359 int v, t, k, n;
360
361 v = s.v();
362 t = s.t();
363 k = s.K();
364 n = v - 2 * t - 2;
365 s.swap(p);
366 p.t() = t + n;
367 p.v() = v + n;
368 p.K() = k + n;
369 path.m_ii(1, n);
370 }
371 else {
372 while (s.increased_t(q)) {
373 if (f_vv) {
374 cout << "ancestor, increasing t to " << q << endl;
375 }
376 s.swap(q);
377 path.s_ii(0)++;
378 }
379 while (s.derived_inverse(q)) {
380 if (f_vv) {
381 cout << "ancestor, derived_inverse gives " << q << endl;
382 }
383 s.swap(q);
384 path.s_ii(1)++;
385 }
386 while (s.residual_inverse(q)) {
387 if (f_vv) {
388 cout << "ancestor, residual_inverse gives " << q << endl;
389 }
390 s.swap(q);
391 path.s_ii(2)++;
392 }
393 s.swap(p);
394 }
395 if (f_v) {
396 cout << "ancestor of " << *this << endl << "is " << p << " "
397 << path.s_ii(0) << " times reduced t, "
398 << path.s_ii(1) << " times derived, "
399 << path.s_ii(2) << " times residual." << endl;
400 }
401}
402
404{
405 discreta_base lambda_new;
406 integer a, b, c;
409
410 supplementary(q);
411 // lambda_new = (lambda * (v - t + 1)) / (k - t + 1) - lambda;
412 a.m_i(q.v() - q.t() + 1);
413 b.m_i(q.K() - q.t() + 1);
414 c = q.lambda();
415 c.negate();
416 lambda_new.mult(q.lambda(), a);
417 lambda_new.divide_by_exact(b);
418 lambda_new += c;
419
420 p.init();
421 p.v() = q.v() - 1;
422 p.t() = q.t() - 1;
423 p.K() = q.K();
424 p.lambda() = lambda_new;
425 S.init();
426 S.prev() = id();
428 p.source().append(S);
429}
430
432{
433 discreta_base lambda_new;
434 integer a, b;
436
437 if (v() != 2 * K() + 1)
438 return FALSE;
439
440 // lambda_new = (lambda * (2 * k + 2 - t)) / (k + 1 - t);
441 a.m_i(2 * K() + 2 - t());
442 b.m_i(K() - t() + 1);
443 lambda_new.mult(lambda(), a);
444 lambda_new.divide_by_exact(b);
445
446 p.init();
447 p.v() = v() + 1;
448 p.t() = t();
449 p.K() = K() + 1;
450 p.lambda() = lambda_new;
451 S.init();
452 S.prev() = id();
454 p.source().append(S);
455 return TRUE;
456}
457
458int design_parameter::trung_left_partner(int& t1, int& v1, int& k1, discreta_base& lambda1,
459 int& t_new, int& v_new, int& k_new, discreta_base& lambda_new)
460{
461 discreta_base a, q, r;
462 integer b, c;
463
464 c.m_i(K() - t());
465 a.mult(lambda(), c);
466 b.m_i(v() - K() + 1);
467 if (b.is_zero())
468 return FALSE;
469 a.integral_division(b, q, r, 0);
470 if (!r.is_zero())
471 return FALSE;
472 t1 = t();
473 v1 = v();
474 k1 = K() - 1;
475 lambda1 = q;
476 t_new = t();
477 v_new = v() + 1;
478 k_new = K();
479 lambda_new.add(lambda(), lambda1);
480 return TRUE;
481}
482
483int design_parameter::trung_right_partner(int& t1, int& v1, int& k1, discreta_base& lambda1,
484 int& t_new, int& v_new, int& k_new, discreta_base& lambda_new)
485{
486 discreta_base a, q, r;
487 integer b, c;
488
489 c.m_i(v() - K());
490 a.mult(lambda(), c);
491 b.m_i(K() + 1 - t());
492 if (b.is_zero())
493 return FALSE;
494 a.integral_division(b, q, r, 0);
495 if (!r.is_zero())
496 return FALSE;
497 t1 = t();
498 v1 = v();
499 k1 = K() + 1;
500 lambda1 = q;
501 t_new = t();
502 v_new = v() + 1;
503 k_new = K() + 1;
504 lambda_new.add(lambda(), lambda1);
505 return TRUE;
506}
507
509// Alltop~\cite{Alltop75}.
510// returns TRUE iff alltop could be applied;
511// in this case, p contains the new design parameter set.
512{
514
515 if (v() == 2 * K() + 1 && EVEN(t())) {
516 p.init();
517 p.v() = v() + 1;
518 p.t() = t() + 1;
519 p.K() = K() + 1;
520 p.lambda() = lambda();
521 S.init();
522 S.prev() = id();
523 S.rule() = rule_alltop;
524 p.source().append(S);
525 return TRUE;
526 }
527 if (v() == 2 * K() + 1 && ODD(t())) {
528 discreta_base lmax, lmax_half, two, r;
529
530 design_lambda_max(t(), v(), K(), lmax);
531 two.m_i_i(2);
532 lmax.integral_division(two, lmax_half, r, 0);
533 r = lambda();
534 r.negate();
535 lmax_half += r;
536
537 if (lmax_half.is_zero()) {
538 p.init();
539 p.v() = v() + 1;
540 p.t() = t() + 1;
541 p.K() = K() + 1;
542 p.lambda() = lambda();
543 S.init();
544 S.prev() = id();
545 S.rule() = rule_alltop;
546 p.source().append(S);
547 return TRUE;
548 }
549 }
550 return FALSE;
551}
552
554{
555 discreta_base lambda_new;
557
558 design_lambda_ijs(t(), v(), K(), lambda(), 1 /* s */, 0 /* i */, t() /* j */, lambda_new);
559
560 p.init();
561 p.v() = v();
562 p.t() = t();
563 p.K() = v() - K();
564 p.lambda() = lambda_new;
565 S.init();
566 S.prev() = id();
568 p.source().append(S);
569}
570
572{
573 discreta_base lambda_new, a;
575 long int num, denom, n, d, g, i;
577
578 num = 1;
579 denom = 1;
580 n = v() - t();
581 d = K() - t();
582 for (i = 0; i < K() - t(); i++) {
583 num *= n;
584 denom *= d;
585 n--;
586 d--;
587 g = NT.gcd_lint(num, denom);
588 if (g != 1 && g != -1) {
589 num /= g;
590 denom /= g;
591 }
592 }
593 if (denom != 1) {
594 cout << "design_parameter::supplementary error: denom != 1" << endl;
595 exit(1);
596 }
597 lambda_new.m_i_i(num);
598
599 a = lambda();
600 a.negate();
601 lambda_new += a;
602
603 p.init();
604 p.v() = v();
605 p.t() = t();
606 p.K() = K();
607 p.lambda() = lambda_new;
608 S.init();
609 S.prev() = id();
611 p.source().append(S);
612}
613
615{
617 discreta_base a, b, c;
618
619 supplementary(q);
620 a = q.lambda();
621 b = lambda();
622 b.negate();
623 c.add(a, b);
624 if (c.is_zero())
625 return TRUE;
626 else
627 return FALSE;
628}
629
631{
633
634 supplementary(q);
635 lambda_supplementary = q.lambda();
636}
637
639// path including trailing slash
640/*
641 * btree #0: id, v, t, k, lambda
642 * btree #1: v, t, k, lambda, id
643 * btree #2: t, v, k, lambda, id
644 * btree #3: lambda, v, t, k, id
645 * btree #4: k, id
646 */
647{
648 btree B;
649 hollerith hh, h0, h1, h2, h3, h4;
650 int f_compress = TRUE;
651 int f_duplicatekeys = TRUE;
652
653 hh.init(path);
654 h0.init(path);
655 h1.init(path);
656 h2.init(path);
657 h3.init(path);
658 h4.init(path);
659 hh.append("design_parameters.db");
660 h0.append("design_parameters0.idx");
661 h1.append("design_parameters1.idx");
662 h2.append("design_parameters2.idx");
663 h3.append("design_parameters3.idx");
664 h4.append("design_parameters4.idx");
665
666 int idx_id = 0;
667 int idx_t = 1;
668 int idx_v = 2;
669 int idx_k = 3;
670 int idx_lambda = 4;
671
672
673 D.init(hh.s(), DESIGN_PARAMETER, f_compress);
674
675 B.init(h0.s(), f_duplicatekeys, 0 /* btree_idx */);
676 B.add_key_int4(idx_id, 0);
677 B.add_key_int4(idx_v, 0);
678 B.add_key_int4(idx_t, 0);
679 B.add_key_int4(idx_k, 0);
680 B.add_key_int4(idx_lambda, 0);
681 D.btree_access().append(B);
682
683 B.init(h1.s(), f_duplicatekeys, 1 /* btree_idx */);
684 B.add_key_int4(idx_v, 0);
685 B.add_key_int4(idx_t, 0);
686 B.add_key_int4(idx_k, 0);
687 B.add_key_int4(idx_lambda, 0);
688 B.add_key_int4(idx_id, 0);
689 D.btree_access().append(B);
690
691 B.init(h2.s(), f_duplicatekeys, 2 /* btree_idx */);
692 B.add_key_int4(idx_t, 0);
693 B.add_key_int4(idx_v, 0);
694 B.add_key_int4(idx_k, 0);
695 B.add_key_int4(idx_lambda, 0);
696 B.add_key_int4(idx_id, 0);
697 D.btree_access().append(B);
698
699 B.init(h3.s(), f_duplicatekeys, 3 /* btree_idx */);
700 B.add_key_int4(idx_lambda, 0);
701 B.add_key_int4(idx_v, 0);
702 B.add_key_int4(idx_t, 0);
703 B.add_key_int4(idx_k, 0);
704 B.add_key_int4(idx_id, 0);
705 D.btree_access().append(B);
706
707 B.init(h4.s(), f_duplicatekeys, 4 /* btree_idx */);
708 B.add_key_int4(idx_k, 0);
709 B.add_key_int4(idx_id, 0);
710 D.btree_access().append(B);
711}
712
713}}
DISCRETA vector class for vectors of DISCRETA objects.
Definition: discreta.h:797
Vector & append(discreta_base &x)
Definition: vector.cpp:400
discreta_base & s_i(int i)
Definition: vector.cpp:202
void m_ii(int i, int a)
Definition: discreta.h:824
void copyobject_to(discreta_base &x)
Definition: vector.cpp:72
DISCRETA class for a database.
Definition: discreta.h:1672
void add_key_int4(int field1, int field2)
Definition: btree.cpp:241
void init(const char *file_name, int f_duplicatekeys, int btree_idx)
Definition: btree.cpp:221
DISCRETA class for a database.
Definition: discreta.h:1525
void init(const char *filename, int objectkind, int f_compress)
Definition: database.cpp:84
DISCRETA class for the design parameters database.
Definition: discreta.h:1887
DISCRETA class for design parameters.
Definition: discreta.h:1958
void lambda_of_supplementary(discreta_base &lambda_supplementary)
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)
design_parameter & operator=(const discreta_base &x)
void supplementary_residual(design_parameter &p)
void ancestor(design_parameter &p, Vector &path, int f_v, int f_vv)
std::ostream & print(std::ostream &)
DISCRETA base class. All DISCRETA classes are derived from this class.
Definition: discreta.h:382
virtual void integral_division(discreta_base &x, discreta_base &q, discreta_base &r, int verbose_level)
Definition: base.cpp:892
void add(discreta_base &x, discreta_base &y)
Definition: base.cpp:674
void mult(discreta_base &x, discreta_base &y)
Definition: base.cpp:367
void swap(discreta_base &a)
Definition: base.cpp:179
discreta_base & divide_by_exact(discreta_base &x)
Definition: base.cpp:629
void copyobject(discreta_base &x)
Definition: base.cpp:194
void print_to_hollerith(hollerith &h)
Definition: base.cpp:231
design_parameter & as_design_parameter()
Definition: discreta.h:417
DISCRETA string class.
Definition: discreta.h:626
DISCRETA integer class.
Definition: discreta.h:667
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define EVEN(x)
Definition: foundations.h:221
#define ODD(x)
Definition: foundations.h:222
int design_parameters_admissible(int v, int t, int k, discreta_base &lambda)
Definition: design.cpp:30
@ DESIGN_PARAMETER
DESIGN_PARAMETER.
Definition: discreta.h:81
void design_lambda_max(int t, int v, int k, discreta_base &lambda_max)
Definition: design.cpp:95
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 internal class.
Definition: discreta.h:353