RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/patterns.texi,v
retrieving revision 1.19
diff -u -p -r1.19 patterns.texi
|
|
|
|
| 1397 | 1397 | @file{patterns.h}) by a standalone program @file{mkpat.c}, and the resulting |
| 1398 | 1398 | @file{.c} files are compiled and linked into the main GNU Go executable. |
| 1399 | 1399 | |
| | 1400 | IMPORTANT: After any change in patterns, which uses DFA pattern matching, one |
| | 1401 | should optimize pattern databases, in which the changes was made. This is done |
| | 1402 | by running a part of @file{optimize} script in @file{patterns} directory. Run |
| | 1403 | only parts of this script, which refers to desired databases, because it takes |
| | 1404 | a very long time to execute. |
| | 1405 | |
| 1400 | 1406 | Each pattern is compiled to a header, and a sequence of elements, |
| 1401 | 1407 | which are (notionally) checked sequentially at every position and |
| 1402 | 1408 | orientation of the board. These elements are relative to the pattern |
RCS file: /home/arend/Go/gnugo-rsync/gnugo/engine/matchpat.c,v
retrieving revision 1.75
diff -u -p -r1.75 matchpat.c
|
|
|
|
| 642 | 642 | static int |
| 643 | 643 | scan_for_patterns(dfa_rt_t *pdfa, int l, int *dfa_pos, int *pat_list) |
| 644 | 644 | { |
| 645 | | int delta; |
| 646 | 645 | int state = 1; /* initial state */ |
| 647 | 646 | int row = 0; /* initial row */ |
| 648 | 647 | int id = 0; /* position in id_list */ |
| … |
… |
|
| 657 | 656 | } |
| 658 | 657 | |
| 659 | 658 | /* go to next state */ |
| 660 | | delta = pdfa->states[state].next[dfa_pos[spiral[row][l]]]; |
| 661 | | state += delta; |
| | 659 | state = pdfa->states[state].next[dfa_pos[spiral[row][l]]]; |
| 662 | 660 | row++; |
| 663 | | } while (delta != 0); /* while not on error state */ |
| | 661 | } while (state != 0); /* while not on error state */ |
| 664 | 662 | |
| 665 | 663 | return id; |
| 666 | 664 | } |
RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/Makefile.am,v
retrieving revision 1.39
diff -u -p -r1.39 Makefile.am
|
|
|
|
| 3 | 3 | |
| 4 | 4 | DSP = dfa.dsp patterns.dsp joseki.dsp mkeyes.dsp mkpat.dsp fuseki.dsp |
| 5 | 5 | DTR = aa_attackpats.dtr owl_attackpats.dtr owl_defendpats.dtr \ |
| 6 | | owl_vital_apats.dtr |
| | 6 | owl_vital_apats.dtr attack.dtr defense.dtr conn.dtr \ |
| | 7 | barriers.dtr endgame.dtr handicap.dtr influence.dtr \ |
| | 8 | patterns.dtr |
| 7 | 9 | |
| 8 | 10 | EXTRA_DIST = $(DSP)\ |
| 9 | 11 | $(DTR)\ |
| … |
… |
|
| 121 | 123 | takamoku.db : $(srcdir)/takamoku.sgf joseki$(EXEEXT) |
| 122 | 124 | ./joseki JT $(srcdir)/takamoku.sgf >takamoku.db |
| 123 | 125 | |
| 124 | | patterns.c : $(srcdir)/patterns.db $(srcdir)/patterns2.db mkpat$(EXEEXT) |
| 125 | | ./mkpat -b pat -i $(srcdir)/patterns.db -i$(srcdir)/patterns2.db \ |
| 126 | | -o patterns.c |
| | 126 | patterns.c : $(srcdir)/patterns.db $(srcdir)/patterns2.db $(srcdir)/patterns.dtr mkpat$(EXEEXT) |
| | 127 | ./mkpat $(DFAFLAGS) -b -t $(srcdir)/patterns.dtr pat \ |
| | 128 | -i $(srcdir)/patterns.db -i$(srcdir)/patterns2.db -o patterns.c |
| 127 | 129 | |
| 128 | 130 | josekidb.c : $(DBBUILT) mkpat$(EXEEXT) |
| 129 | 131 | ./mkpat -C joseki $(DBBUILT_INPUT) -o josekidb.c |
| 130 | 132 | |
| 131 | | apatterns.c : $(srcdir)/attack.db mkpat$(EXEEXT) |
| 132 | | ./mkpat -X attpat -i $(srcdir)/attack.db -o apatterns.c |
| 133 | | |
| 134 | | dpatterns.c : $(srcdir)/defense.db mkpat$(EXEEXT) |
| 135 | | ./mkpat defpat -i $(srcdir)/defense.db -o dpatterns.c |
| 136 | | |
| 137 | | conn.c : $(srcdir)/conn.db mkpat$(EXEEXT) |
| 138 | | ./mkpat -c conn -i $(srcdir)/conn.db -o conn.c |
| 139 | | |
| 140 | | endgame.c : $(srcdir)/endgame.db mkpat$(EXEEXT) |
| 141 | | ./mkpat -b endpat -i $(srcdir)/endgame.db -o endgame.c |
| | 133 | apatterns.c : $(srcdir)/attack.db $(srcdir)/attack.dtr mkpat$(EXEEXT) |
| | 134 | ./mkpat $(DFAFLAGS) -X -t $(srcdir)/attack.dtr attpat \ |
| | 135 | -i $(srcdir)/attack.db -o apatterns.c |
| | 136 | |
| | 137 | dpatterns.c : $(srcdir)/defense.db $(srcdir)/defense.dtr mkpat$(EXEEXT) |
| | 138 | ./mkpat $(DFAFLAGS) -t $(srcdir)/defense.dtr defpat \ |
| | 139 | -i $(srcdir)/defense.db -o dpatterns.c |
| | 140 | |
| | 141 | conn.c : $(srcdir)/conn.db $(srcdir)/conn.dtr mkpat$(EXEEXT) |
| | 142 | ./mkpat $(DFAFLAGS) -c -t $(srcdir)/conn.dtr conn \ |
| | 143 | -i $(srcdir)/conn.db -o conn.c |
| | 144 | |
| | 145 | endgame.c : $(srcdir)/endgame.db $(srcdir)/endgame.dtr mkpat$(EXEEXT) |
| | 146 | ./mkpat $(DFAFLAGS) -b -t $(srcdir)/endgame.dtr endpat \ |
| | 147 | -i $(srcdir)/endgame.db -o endgame.c |
| 142 | 148 | |
| 143 | 149 | eyes.c: $(srcdir)/eyes.db mkeyes$(EXEEXT) |
| 144 | 150 | ./mkeyes < $(srcdir)/eyes.db >eyes.c |
| 145 | 151 | |
| 146 | | influence.c : $(srcdir)/influence.db mkpat$(EXEEXT) |
| 147 | | ./mkpat -c influencepat -i $(srcdir)/influence.db -o influence.c |
| 148 | | |
| 149 | | barriers.c : $(srcdir)/barriers.db mkpat$(EXEEXT) |
| 150 | | ./mkpat -c -b barrierspat -i $(srcdir)/barriers.db -o barriers.c |
| | 152 | influence.c : $(srcdir)/influence.db $(srcdir)/influence.dtr mkpat$(EXEEXT) |
| | 153 | ./mkpat $(DFAFLAGS) -c -t $(srcdir)/influence.dtr influencepat \ |
| | 154 | -i $(srcdir)/influence.db -o influence.c |
| | 155 | |
| | 156 | barriers.c : $(srcdir)/barriers.db $(srcdir)/barriers.dtr mkpat$(EXEEXT) |
| | 157 | ./mkpat $(DFAFLAGS) -c -b -t $(srcdir)/barriers.dtr barrierspat \ |
| | 158 | -i $(srcdir)/barriers.db -o barriers.c |
| 151 | 159 | |
| 152 | 160 | aa_attackpat.c : $(srcdir)/aa_attackpats.db $(srcdir)/aa_attackpats.dtr mkpat$(EXEEXT) |
| 153 | 161 | ./mkpat $(DFAFLAGS) -b -t $(srcdir)/aa_attackpats.dtr aa_attackpat \ |
| … |
… |
|
| 169 | 177 | -i $(srcdir)/owl_defendpats.db -o owl_defendpat.c |
| 170 | 178 | |
| 171 | 179 | fusekipat.c : $(srcdir)/fuseki.db mkpat$(EXEEXT) |
| 172 | | ./mkpat -b fusekipat -i $(srcdir)/fuseki.db -o fusekipat.c |
| | 180 | ./mkpat -b -m fusekipat -i $(srcdir)/fuseki.db -o fusekipat.c |
| 173 | 181 | |
| 174 | 182 | fuseki9.c : $(srcdir)/fuseki9.dbz uncompress_fuseki$(EXEEXT) |
| 175 | 183 | ./uncompress_fuseki 9 $(srcdir)/fuseki9.dbz c >fuseki9.c |
| … |
… |
|
| 180 | 188 | fuseki19.c : $(srcdir)/fuseki19.dbz uncompress_fuseki$(EXEEXT) |
| 181 | 189 | ./uncompress_fuseki 19 $(srcdir)/fuseki19.dbz c >fuseki19.c |
| 182 | 190 | |
| 183 | | handipat.c : $(srcdir)/handicap.db mkpat$(EXEEXT) |
| 184 | | ./mkpat -b handipat -i $(srcdir)/handicap.db -o handipat.c |
| | 191 | handipat.c : $(srcdir)/handicap.db $(srcdir)/handicap.dtr mkpat$(EXEEXT) |
| | 192 | ./mkpat $(DFAFLAGS) -b -t $(srcdir)/handicap.dtr handipat \ |
| | 193 | -i $(srcdir)/handicap.db -o handipat.c |
| 185 | 194 | |
| 186 | 195 | |
| 187 | 196 | ETAGS_ARGS = --language none --regex '/^Pattern[ \t]+[a-zA-Z0-9]+/' $(DB_TO_TAG)\ |
RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/Makefile.in,v
retrieving revision 1.60
diff -u -p -r1.60 Makefile.in
|
|
|
|
| 80 | 80 | |
| 81 | 81 | DSP = dfa.dsp patterns.dsp joseki.dsp mkeyes.dsp mkpat.dsp fuseki.dsp |
| 82 | 82 | DTR = aa_attackpats.dtr owl_attackpats.dtr owl_defendpats.dtr \ |
| 83 | | owl_vital_apats.dtr |
| | 83 | owl_vital_apats.dtr attack.dtr defense.dtr conn.dtr \ |
| | 84 | barriers.dtr endgame.dtr handicap.dtr influence.dtr \ |
| | 85 | patterns.dtr |
| 84 | 86 | |
| 85 | 87 | |
| 86 | 88 | EXTRA_DIST = $(DSP)\ |
| … |
… |
|
| 526 | 528 | takamoku.db : $(srcdir)/takamoku.sgf joseki$(EXEEXT) |
| 527 | 529 | ./joseki JT $(srcdir)/takamoku.sgf >takamoku.db |
| 528 | 530 | |
| 529 | | patterns.c : $(srcdir)/patterns.db $(srcdir)/patterns2.db mkpat$(EXEEXT) |
| 530 | | ./mkpat -b pat -i $(srcdir)/patterns.db -i$(srcdir)/patterns2.db \ |
| 531 | | -o patterns.c |
| | 531 | patterns.c : $(srcdir)/patterns.db $(srcdir)/patterns2.db $(srcdir)/patterns.dtr mkpat$(EXEEXT) |
| | 532 | ./mkpat $(DFAFLAGS) -b -t $(srcdir)/patterns.dtr pat \ |
| | 533 | -i $(srcdir)/patterns.db -i$(srcdir)/patterns2.db -o patterns.c |
| 532 | 534 | |
| 533 | 535 | josekidb.c : $(DBBUILT) mkpat$(EXEEXT) |
| 534 | 536 | ./mkpat -C joseki $(DBBUILT_INPUT) -o josekidb.c |
| 535 | 537 | |
| 536 | | apatterns.c : $(srcdir)/attack.db mkpat$(EXEEXT) |
| 537 | | ./mkpat -X attpat -i $(srcdir)/attack.db -o apatterns.c |
| 538 | | |
| 539 | | dpatterns.c : $(srcdir)/defense.db mkpat$(EXEEXT) |
| 540 | | ./mkpat defpat -i $(srcdir)/defense.db -o dpatterns.c |
| 541 | | |
| 542 | | conn.c : $(srcdir)/conn.db mkpat$(EXEEXT) |
| 543 | | ./mkpat -c conn -i $(srcdir)/conn.db -o conn.c |
| 544 | | |
| 545 | | endgame.c : $(srcdir)/endgame.db mkpat$(EXEEXT) |
| 546 | | ./mkpat -b endpat -i $(srcdir)/endgame.db -o endgame.c |
| | 538 | apatterns.c : $(srcdir)/attack.db $(srcdir)/attack.dtr mkpat$(EXEEXT) |
| | 539 | ./mkpat $(DFAFLAGS) -X -t $(srcdir)/attack.dtr attpat \ |
| | 540 | -i $(srcdir)/attack.db -o apatterns.c |
| | 541 | |
| | 542 | dpatterns.c : $(srcdir)/defense.db $(srcdir)/defense.dtr mkpat$(EXEEXT) |
| | 543 | ./mkpat $(DFAFLAGS) -t $(srcdir)/defense.dtr defpat \ |
| | 544 | -i $(srcdir)/defense.db -o dpatterns.c |
| | 545 | |
| | 546 | conn.c : $(srcdir)/conn.db $(srcdir)/conn.dtr mkpat$(EXEEXT) |
| | 547 | ./mkpat $(DFAFLAGS) -c -t $(srcdir)/conn.dtr conn \ |
| | 548 | -i $(srcdir)/conn.db -o conn.c |
| | 549 | |
| | 550 | endgame.c : $(srcdir)/endgame.db $(srcdir)/endgame.dtr mkpat$(EXEEXT) |
| | 551 | ./mkpat $(DFAFLAGS) -b -t $(srcdir)/endgame.dtr endpat \ |
| | 552 | -i $(srcdir)/endgame.db -o endgame.c |
| 547 | 553 | |
| 548 | 554 | eyes.c: $(srcdir)/eyes.db mkeyes$(EXEEXT) |
| 549 | 555 | ./mkeyes < $(srcdir)/eyes.db >eyes.c |
| 550 | 556 | |
| 551 | | influence.c : $(srcdir)/influence.db mkpat$(EXEEXT) |
| 552 | | ./mkpat -c influencepat -i $(srcdir)/influence.db -o influence.c |
| 553 | | |
| 554 | | barriers.c : $(srcdir)/barriers.db mkpat$(EXEEXT) |
| 555 | | ./mkpat -c -b barrierspat -i $(srcdir)/barriers.db -o barriers.c |
| | 557 | influence.c : $(srcdir)/influence.db $(srcdir)/influence.dtr mkpat$(EXEEXT) |
| | 558 | ./mkpat $(DFAFLAGS) -c -t $(srcdir)/influence.dtr influencepat \ |
| | 559 | -i $(srcdir)/influence.db -o influence.c |
| | 560 | |
| | 561 | barriers.c : $(srcdir)/barriers.db $(srcdir)/barriers.dtr mkpat$(EXEEXT) |
| | 562 | ./mkpat $(DFAFLAGS) -c -b -t $(srcdir)/barriers.dtr barrierspat \ |
| | 563 | -i $(srcdir)/barriers.db -o barriers.c |
| 556 | 564 | |
| 557 | 565 | aa_attackpat.c : $(srcdir)/aa_attackpats.db $(srcdir)/aa_attackpats.dtr mkpat$(EXEEXT) |
| 558 | 566 | ./mkpat $(DFAFLAGS) -b -t $(srcdir)/aa_attackpats.dtr aa_attackpat \ |
| … |
… |
|
| 574 | 582 | -i $(srcdir)/owl_defendpats.db -o owl_defendpat.c |
| 575 | 583 | |
| 576 | 584 | fusekipat.c : $(srcdir)/fuseki.db mkpat$(EXEEXT) |
| 577 | | ./mkpat -b fusekipat -i $(srcdir)/fuseki.db -o fusekipat.c |
| | 585 | ./mkpat -b -m fusekipat -i $(srcdir)/fuseki.db -o fusekipat.c |
| 578 | 586 | |
| 579 | 587 | fuseki9.c : $(srcdir)/fuseki9.dbz uncompress_fuseki$(EXEEXT) |
| 580 | 588 | ./uncompress_fuseki 9 $(srcdir)/fuseki9.dbz c >fuseki9.c |
| … |
… |
|
| 585 | 593 | fuseki19.c : $(srcdir)/fuseki19.dbz uncompress_fuseki$(EXEEXT) |
| 586 | 594 | ./uncompress_fuseki 19 $(srcdir)/fuseki19.dbz c >fuseki19.c |
| 587 | 595 | |
| 588 | | handipat.c : $(srcdir)/handicap.db mkpat$(EXEEXT) |
| 589 | | ./mkpat -b handipat -i $(srcdir)/handicap.db -o handipat.c |
| | 596 | handipat.c : $(srcdir)/handicap.db $(srcdir)/handicap.dtr mkpat$(EXEEXT) |
| | 597 | ./mkpat $(DFAFLAGS) -b -t $(srcdir)/handicap.dtr handipat \ |
| | 598 | -i $(srcdir)/handicap.db -o handipat.c |
| 590 | 599 | # Tell versions [3.59,3.63) of GNU make to not export all variables. |
| 591 | 600 | # Otherwise a system limit (for SysV at least) may be exceeded. |
| 592 | 601 | .NOEXPORT: |
RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/dfa.c,v
retrieving revision 1.42
diff -u -p -r1.42 dfa.c
|
|
|
|
| 416 | 416 | exit(EXIT_FAILURE); |
| 417 | 417 | } |
| 418 | 418 | |
| 419 | | assert(dfa_minmax_delta(pdfa, -1, 1) > -32768); |
| 420 | | if (dfa_minmax_delta(pdfa, -1, 0) > 32768) { |
| 421 | | fprintf(of, "#error too many states"); |
| 422 | | fprintf(stderr, "Error: The dfa states are too disperse. Can't fit delta into a short.\n"); |
| 423 | | exit(EXIT_FAILURE); |
| 424 | | } |
| 425 | | |
| 426 | 419 | if (pdfa->last_index + 1 > 65535) { |
| 427 | 420 | fprintf(of, "#error too many states"); |
| 428 | 421 | fprintf(stderr, "Error: Too many index entries. Can't fit delta into a short.\n"); |
| … |
… |
|
| 439 | 432 | fprintf(of, "{{"); |
| 440 | 433 | for (j = 0; j < 4; j++) { |
| 441 | 434 | int n = pdfa->states[i].next[j]; |
| 442 | | assert((n == 0) || (abs(n - i) < 32768)); |
| 443 | | fprintf(of, "%d", n ? n - i : 0); |
| | 435 | assert((n >= 0) && (n <= 65535)); |
| | 436 | fprintf(of, "%d", n); |
| 444 | 437 | if (j != 3) |
| 445 | 438 | fprintf(of, ","); |
| 446 | 439 | } |
| … |
… |
|
| 778 | 771 | } |
| 779 | 772 | |
| 780 | 773 | |
| 781 | | /* |
| 782 | | * Returns max or min jump distance from state to next[next_index] for |
| 783 | | * all states. If next_index < 0, then max/min for all for states. |
| 784 | | */ |
| 785 | | |
| 786 | | int |
| 787 | | dfa_minmax_delta(dfa_t *pdfa, int next_index, int isMin) |
| 788 | | { |
| 789 | | |
| 790 | | int ret, i, j; |
| 791 | | assert(next_index <= 3); |
| 792 | | |
| 793 | | if (isMin) |
| 794 | | ret = 99999; |
| 795 | | else |
| 796 | | ret = -1; |
| 797 | | |
| 798 | | for (i = 0; i <= pdfa->last_state; i++) { |
| 799 | | for (j = 0; j < 4; j++) { |
| 800 | | if (j == next_index || next_index < 0) { |
| 801 | | int next = pdfa->states[i].next[j]; |
| 802 | | if (!next) |
| 803 | | continue; |
| 804 | | if (isMin) { |
| 805 | | if (ret > next - i) |
| 806 | | ret = next - i; |
| 807 | | } |
| 808 | | else { |
| 809 | | if (ret < next - i) |
| 810 | | ret = next - i; |
| 811 | | } |
| 812 | | } |
| 813 | | } |
| 814 | | } |
| 815 | | |
| 816 | | return ret; |
| 817 | | } |
| 818 | | |
| 819 | 774 | #define DFA_ALIGN 2 |
| 820 | 775 | |
| 821 | 776 | /* |
| … |
… |
|
| 947 | 902 | dfa_finalize(dfa_t *pdfa) |
| 948 | 903 | { |
| 949 | 904 | int j; |
| 950 | | int next_bin = aux_count; |
| 951 | | int last_bin = aux_count + DFA_BINS - 1; |
| | 905 | int next_bin; |
| | 906 | int last_bin; |
| | 907 | aux_count += DFA_BINS; /* To avoid negative values of aux_count. */ |
| | 908 | next_bin = aux_count; |
| | 909 | last_bin = aux_count + DFA_BINS - 1; |
| 952 | 910 | while (next_bin + 1 != last_bin) { |
| 953 | 911 | for (j = aux_count + 1; j <= last_bin; j += 2) { |
| 954 | 912 | if (j+1 == next_bin) |
| … |
… |
|
| 1190 | 1148 | if (j == pat->minj) |
| 1191 | 1149 | borders &= ~WEST_EDGE; |
| 1192 | 1150 | |
| 1193 | | assert(m + i < DFA_MAX_BOARD * 3 && m + i < DFA_MAX_BOARD * 3); |
| | 1151 | assert(m + i < DFA_MAX_BOARD * 4 && n + j < DFA_MAX_BOARD * 4); |
| 1194 | 1152 | str[k] = work_space[m + i][n + j]; |
| 1195 | 1153 | assert(strchr("XOxo.,a!?$#|-+", str[k])); |
| 1196 | 1154 | |
RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/dfa.h,v
retrieving revision 1.32
diff -u -p -r1.32 dfa.h
|
|
|
|
| 65 | 65 | /* DFA state. */ |
| 66 | 66 | typedef struct state_rt |
| 67 | 67 | { |
| 68 | | short next[4]; |
| 69 | | short att; |
| | 68 | unsigned short next[4]; /* Next state to jump to. */ |
| | 69 | short att; /* An index in the attributes table. */ |
| 70 | 70 | } state_rt_t; |
| 71 | 71 | |
| 72 | 72 | typedef struct dfa_rt |
RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/mkpat.c,v
retrieving revision 1.158
diff -u -p -r1.158 mkpat.c
|
|
|
|
| 55 | 55 | -p = compile general pattern database (the default)\n\ |
| 56 | 56 | -c = compile connections database\n\ |
| 57 | 57 | -C = compile a corner pattern database\n\ |
| | 58 | Usage of DFA (cannot be used with a corner pattern database):\n\ |
| 58 | 59 | -D = compile a DFA database (allows fast matching)\n\ |
| 59 | 60 | -d <iterations> = don't generate database, but optimize a DFA\n\ |
| 60 | 61 | transformation file instead\n\ |
| … |
… |
|
| 91 | 92 | #define DB_GENERAL ((int) 'p') |
| 92 | 93 | #define DB_CONNECTIONS ((int) 'c') |
| 93 | 94 | #define DB_CORNER ((int) 'C') |
| 94 | | #define DB_DFA ((int) 'D') |
| | 95 | #define USE_DFA ((int) 'D') |
| 95 | 96 | #define OPTIMIZE_DFA ((int) 'd') |
| 96 | 97 | |
| 97 | 98 | /* code assumes that ATT_O and ATT_X are 1 and 2 (in either order) |
| … |
… |
|
| 150 | 151 | |
| 151 | 152 | static int ci = -1, cj = -1; /* position of origin (first piece element) |
| 152 | 153 | relative to top-left */ |
| | 154 | static int fixed_pat_anchor = 0; /* if anchor for checked pattern is fixed */ |
| 153 | 155 | static int patno; /* current pattern */ |
| 154 | 156 | static int discard_pattern = 0; /* Set to nonzero to discard a pattern (if e.g. |
| 155 | 157 | * it is too large or duplicated). */ |
| … |
… |
|
| 482 | 484 | |
| 483 | 485 | /* options */ |
| 484 | 486 | int verbose = 0; /* -v */ |
| 485 | | static int database_type = 0; /* -p (default), -c, -f, -C, -D or -T */ |
| | 487 | static int database_type = 0; /* -p (default), -c or -C */ |
| | 488 | static int use_dfa = 0; /* -D or -d */ |
| 486 | 489 | static int anchor = 0; /* Whether both O and/or X may be anchors. |
| 487 | 490 | * -b for both. -X for only X. |
| 488 | 491 | */ |
| … |
… |
|
| 536 | 539 | { |
| 537 | 540 | struct hint_data *hint; |
| 538 | 541 | |
| 539 | | if (database_type == DB_DFA || database_type == OPTIMIZE_DFA) { |
| | 542 | if (use_dfa) { |
| 540 | 543 | for (hint = first_hint; hint; hint = hint->next) { |
| 541 | 544 | if (!strcmp(hint->name, pattern_name)) |
| 542 | 545 | return hint->transformation_hint; |
| 543 | 546 | } |
| 544 | 547 | } |
| 545 | 548 | |
| 546 | | return database_type == OPTIMIZE_DFA ? -1 : 0; |
| | 549 | return use_dfa == OPTIMIZE_DFA ? -1 : 0; |
| 547 | 550 | } |
| 548 | 551 | |
| 549 | 552 | |
| … |
… |
|
| 695 | 698 | if (verbose) |
| 696 | 699 | fprintf(stderr, "Add :%s\n", pattern[index].name); |
| 697 | 700 | |
| 698 | | if (database_type == DB_DFA) { |
| | 701 | if (use_dfa == USE_DFA) { |
| 699 | 702 | float ratio; |
| 700 | 703 | |
| 701 | 704 | dfa_rotate_string(strrot, str, transformation_hint); |
| … |
… |
|
| 718 | 721 | int rot_start = 0; |
| 719 | 722 | int rot_stop = pattern[index].trfno; |
| 720 | 723 | |
| 721 | | assert(database_type == OPTIMIZE_DFA); |
| | 724 | assert(use_dfa == OPTIMIZE_DFA); |
| 722 | 725 | |
| 723 | 726 | if (rot_stop == 5) { |
| 724 | 727 | rot_start = 2; |
| … |
… |
|
| 889 | 892 | } |
| 890 | 893 | |
| 891 | 894 | if (off == ATT_Q) { |
| | 895 | fixed_pat_anchor = 1; |
| 892 | 896 | off = ATT_O; |
| 893 | 897 | ci = maxi; |
| 894 | 898 | cj = j; |
| … |
… |
|
| 897 | 901 | } |
| 898 | 902 | |
| 899 | 903 | if (off == ATT_Y) { |
| | 904 | fixed_pat_anchor = 1; |
| 900 | 905 | off = ATT_X; |
| 901 | 906 | ci = maxi; |
| 902 | 907 | cj = j; |
| … |
… |
|
| 1098 | 1103 | ci = 0; |
| 1099 | 1104 | cj = 0; |
| 1100 | 1105 | } |
| 1101 | | else if (choose_best_anchor && !discard_pattern) { |
| | 1106 | else if (choose_best_anchor && !discard_pattern |
| | 1107 | && (!fixed_pat_anchor || database_type != DB_CONNECTIONS)) { |
| 1102 | 1108 | |
| 1103 | 1109 | /* Try to find a better anchor if |
| 1104 | 1110 | * the -m option is set. |
| … |
… |
|
| 1775 | 1781 | int used_nodes = 0; |
| 1776 | 1782 | |
| 1777 | 1783 | assert(ci != -1 && cj != -1); |
| 1778 | | assert(database_type == DB_DFA || transformation_hint == 0); |
| | 1784 | assert(use_dfa == USE_DFA || transformation_hint == 0); |
| 1779 | 1785 | |
| 1780 | 1786 | /* sort the elements so that least-likely elements are tested first. */ |
| 1781 | 1787 | gg_sort(elements, el, sizeof(struct patval_b), compare_elements); |
| … |
… |
|
| 1816 | 1822 | * elements for all possible transformations). |
| 1817 | 1823 | */ |
| 1818 | 1824 | if ((database_type == DB_GENERAL || database_type == DB_CONNECTIONS) |
| 1819 | | && ci-1 <= x && x <= ci+1 && cj-1 <= y && y <= cj+1) |
| | 1825 | && !use_dfa && ci-1 <= x && x <= ci+1 && cj-1 <= y && y <= cj+1) |
| 1820 | 1826 | continue; |
| 1821 | 1827 | #endif /* GRID_OPT == 1 */ |
| 1822 | 1828 | |
| … |
… |
|
| 1824 | 1830 | * they might be needed for goal checking or by callback function, so |
| 1825 | 1831 | * we check it before discarding an element. |
| 1826 | 1832 | */ |
| 1827 | | if (database_type == DB_DFA) |
| | 1833 | if (use_dfa) |
| 1828 | 1834 | continue; |
| 1829 | 1835 | } /* If the element is discardable. */ |
| 1830 | 1836 | |
| … |
… |
|
| 2384 | 2390 | fprintf(outfile, " -1,\n"); /* fixed_for_size */ |
| 2385 | 2391 | fprintf(outfile, " %d,\n", fixed_anchor); |
| 2386 | 2392 | fprintf(outfile, " %s\n", prefix); |
| 2387 | | if (database_type == DB_DFA) |
| | 2393 | if (use_dfa) |
| 2388 | 2394 | fprintf(outfile, " ,& dfa_%s\n", prefix); /* pointer to the wired dfa */ |
| 2389 | 2395 | else |
| 2390 | 2396 | fprintf(outfile, " , NULL\n"); /* pointer to a possible dfa */ |
| … |
… |
|
| 2434 | 2440 | |
| 2435 | 2441 | case 'p': |
| 2436 | 2442 | case 'c': |
| 2437 | | case 'f': |
| 2438 | 2443 | case 'C': |
| 2439 | | case 'D': |
| 2440 | | case 'd': |
| 2441 | 2444 | if (database_type) { |
| 2442 | 2445 | fprintf(stderr, "Error : More than one database type specified (-%c and -%c)\n", |
| 2443 | 2446 | database_type, i); |
| 2444 | 2447 | return 1; |
| 2445 | 2448 | } |
| | 2449 | if (i == 'C' && use_dfa) { |
| | 2450 | fprintf(stderr, "Error : Cannot use DFA with a corner pattern database\n"); |
| | 2451 | return 1; |
| | 2452 | } |
| 2446 | 2453 | database_type = i; |
| | 2454 | break; |
| | 2455 | |
| | 2456 | case 'd': |
| | 2457 | case 'D': |
| | 2458 | use_dfa = i; |
| 2447 | 2459 | if (i == 'd') { |
| 2448 | 2460 | iterations = strtol(gg_optarg, NULL, 10); |
| 2449 | 2461 | if (iterations < 0) { |
| … |
… |
|
| 2451 | 2463 | return 1; |
| 2452 | 2464 | } |
| 2453 | 2465 | } |
| | 2466 | if (database_type == 'C') { |
| | 2467 | fprintf(stderr, "Error : Cannot use DFA with a corner pattern database\n"); |
| | 2468 | return 1; |
| | 2469 | } |
| 2454 | 2470 | break; |
| 2455 | 2471 | |
| 2456 | 2472 | case 'O': |
| … |
… |
|
| 2492 | 2508 | |
| 2493 | 2509 | if (!input_files) |
| 2494 | 2510 | input_file_names[input_files++] = stdin_name; |
| 2495 | | if (output_file_name && database_type != OPTIMIZE_DFA) { |
| | 2511 | if (output_file_name && use_dfa != OPTIMIZE_DFA) { |
| 2496 | 2512 | output_FILE = fopen(output_file_name, "wb"); |
| 2497 | 2513 | if (output_FILE == NULL) { |
| 2498 | 2514 | fprintf(stderr, "Error : Cannot write to file %s\n", output_file_name); |
| 2499 | 2515 | return 1; |
| 2500 | 2516 | } |
| 2501 | 2517 | } |
| 2502 | | if (transformations_file_name |
| 2503 | | && (database_type == DB_DFA || database_type == OPTIMIZE_DFA)) { |
| | 2518 | if (transformations_file_name && use_dfa) { |
| 2504 | 2519 | transformations_FILE = fopen(transformations_file_name, "r"); |
| 2505 | 2520 | if (transformations_FILE) { |
| 2506 | 2521 | parse_transformations_file(transformations_FILE); |
| 2507 | 2522 | fclose(transformations_FILE); |
| 2508 | 2523 | } |
| 2509 | | else if (database_type == DB_DFA) { |
| | 2524 | else if (use_dfa == USE_DFA) { |
| 2510 | 2525 | fprintf(stderr, "Error : Cannot read file %s\n", |
| 2511 | 2526 | transformations_file_name); |
| 2512 | 2527 | return 1; |
| … |
… |
|
| 2524 | 2539 | |
| 2525 | 2540 | prefix = argv[gg_optind]; |
| 2526 | 2541 | |
| 2527 | | if (database_type == DB_DFA) { |
| | 2542 | if (use_dfa == USE_DFA) { |
| 2528 | 2543 | dfa_init(); |
| 2529 | 2544 | new_dfa(&dfa, "mkpat's dfa"); |
| 2530 | 2545 | } |
| 2531 | 2546 | else if (database_type == DB_CORNER) |
| 2532 | 2547 | corner_init(); |
| 2533 | 2548 | |
| 2534 | | if (database_type == OPTIMIZE_DFA) { |
| | 2549 | if (use_dfa == OPTIMIZE_DFA) { |
| 2535 | 2550 | if (transformations_file_name == NULL) { |
| 2536 | 2551 | fprintf(stderr, "error : transformation file required (use -t option)\n"); |
| 2537 | 2552 | return 1; |
| … |
… |
|
| 2817 | 2832 | else if (line[0] == ':') { |
| 2818 | 2833 | if (state == 2 || state == 3) { |
| 2819 | 2834 | finish_pattern(line); |
| | 2835 | fixed_pat_anchor = 0; |
| 2820 | 2836 | |
| 2821 | 2837 | if (!discard_pattern) { |
| 2822 | | if (database_type == DB_DFA || database_type == OPTIMIZE_DFA) |
| | 2838 | if (use_dfa) |
| 2823 | 2839 | write_to_dfa(patno); |
| 2824 | 2840 | if (database_type == DB_CORNER) |
| 2825 | 2841 | corner_add_pattern(); |
| 2826 | | else if (database_type != OPTIMIZE_DFA) |
| | 2842 | else if (use_dfa != OPTIMIZE_DFA) |
| 2827 | 2843 | write_elements(output_FILE); |
| 2828 | 2844 | } |
| 2829 | 2845 | |
| … |
… |
|
| 2916 | 2932 | fprintf(stderr, "%d / %d patterns have edge-constraints\n", |
| 2917 | 2933 | pats_with_constraints, patno); |
| 2918 | 2934 | |
| 2919 | | if (database_type != OPTIMIZE_DFA) { |
| | 2935 | if (use_dfa != OPTIMIZE_DFA) { |
| 2920 | 2936 | /* Forward declaration, which autohelpers might need. */ |
| 2921 | 2937 | if (database_type != DB_CORNER) |
| 2922 | 2938 | fprintf(output_FILE, "static struct pattern %s[%d];\n\n", prefix, patno + 1); |
| … |
… |
|
| 2933 | 2949 | |
| 2934 | 2950 | write_patterns(output_FILE); |
| 2935 | 2951 | |
| 2936 | | if (database_type == DB_DFA) { |
| | 2952 | if (use_dfa) { |
| 2937 | 2953 | fprintf(stderr, "---------------------------\n"); |
| 2938 | 2954 | |
| 2939 | 2955 | dfa_finalize(&dfa); |
| … |
… |
|
| 2976 | 2992 | current_file); |
| 2977 | 2993 | } |
| 2978 | 2994 | } |
| 2979 | | else { /* database_type == OPTIMIZE_DFA */ |
| | 2995 | else { /* use_dfa == OPTIMIZE_DFA */ |
| 2980 | 2996 | int k; |
| 2981 | 2997 | int *optimized_variations; |
| 2982 | 2998 | |
| … |
… |
|
| 2989 | 3005 | optimized_variations = dfa_patterns_optimize_variations(&dfa_pats, |
| 2990 | 3006 | iterations); |
| 2991 | 3007 | for (k = 0; k < patno; k++) { |
| 2992 | | fprintf(transformations_FILE, "%s\t%d\n", pattern_names[k], |
| 2993 | | optimized_variations[k]); |
| | 3008 | int var = optimized_variations[k]; |
| | 3009 | if (pattern[k].trfno == 5) |
| | 3010 | var += 2; |
| | 3011 | fprintf(transformations_FILE, "%s\t%d\n", pattern_names[k], var); |
| 2994 | 3012 | } |
| 2995 | 3013 | |
| 2996 | 3014 | free(optimized_variations); |