Ticket #183: draqo-dfa.diff

File draqo-dfa.diff, 40.2 kB (added by arend, 15 months ago)

Supersedes dfa.patch in #148

  • doc/patterns.texi

    RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/patterns.texi,v
    retrieving revision 1.19
    diff -u -p -r1.19 patterns.texi
     
    13971397@file{patterns.h}) by a standalone program @file{mkpat.c}, and the resulting  
    13981398@file{.c} files are compiled and linked into the main GNU Go executable. 
    13991399 
     1400IMPORTANT: After any change in patterns, which uses DFA pattern matching, one 
     1401should optimize pattern databases, in which the changes was made. This is done 
     1402by running a part of @file{optimize} script in @file{patterns} directory. Run 
     1403only parts of this script, which refers to desired databases, because it takes 
     1404a very long time to execute. 
     1405 
    14001406Each pattern is compiled to a header, and a sequence of elements, 
    14011407which are (notionally) checked sequentially at every position and 
    14021408orientation of the board. These elements are relative to the pattern 
  • engine/matchpat.c

    RCS file: /home/arend/Go/gnugo-rsync/gnugo/engine/matchpat.c,v
    retrieving revision 1.75
    diff -u -p -r1.75 matchpat.c
     
    642642static int 
    643643scan_for_patterns(dfa_rt_t *pdfa, int l, int *dfa_pos, int *pat_list) 
    644644{ 
    645   int delta; 
    646645  int state = 1; /* initial state */ 
    647646  int row = 0; /* initial row */ 
    648647  int id = 0; /* position in id_list */ 
     
    657656    } 
    658657 
    659658    /* 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]]]; 
    662660    row++; 
    663   } while (delta != 0); /* while not on error state */ 
     661  } while (state != 0); /* while not on error state */ 
    664662 
    665663  return id; 
    666664} 
  • patterns/Makefile.am

    RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/Makefile.am,v
    retrieving revision 1.39
    diff -u -p -r1.39 Makefile.am
     
    33 
    44DSP = dfa.dsp patterns.dsp joseki.dsp mkeyes.dsp mkpat.dsp fuseki.dsp 
    55DTR = 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 
    79 
    810EXTRA_DIST = $(DSP)\ 
    911        $(DTR)\ 
     
    121123takamoku.db : $(srcdir)/takamoku.sgf joseki$(EXEEXT) 
    122124        ./joseki JT $(srcdir)/takamoku.sgf >takamoku.db 
    123125 
    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 
     126patterns.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 
    127129 
    128130josekidb.c : $(DBBUILT) mkpat$(EXEEXT) 
    129131        ./mkpat -C joseki $(DBBUILT_INPUT) -o josekidb.c 
    130132 
    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 
     133apatterns.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 
     137dpatterns.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 
     141conn.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 
     145endgame.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 
    142148 
    143149eyes.c: $(srcdir)/eyes.db mkeyes$(EXEEXT) 
    144150        ./mkeyes < $(srcdir)/eyes.db >eyes.c 
    145151 
    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 
     152influence.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 
     156barriers.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 
    151159 
    152160aa_attackpat.c : $(srcdir)/aa_attackpats.db $(srcdir)/aa_attackpats.dtr mkpat$(EXEEXT) 
    153161        ./mkpat $(DFAFLAGS) -b -t $(srcdir)/aa_attackpats.dtr aa_attackpat \ 
     
    169177               -i $(srcdir)/owl_defendpats.db -o owl_defendpat.c 
    170178 
    171179fusekipat.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 
    173181 
    174182fuseki9.c : $(srcdir)/fuseki9.dbz uncompress_fuseki$(EXEEXT) 
    175183        ./uncompress_fuseki 9 $(srcdir)/fuseki9.dbz c >fuseki9.c 
     
    180188fuseki19.c : $(srcdir)/fuseki19.dbz uncompress_fuseki$(EXEEXT) 
    181189        ./uncompress_fuseki 19 $(srcdir)/fuseki19.dbz c >fuseki19.c 
    182190 
    183 handipat.c : $(srcdir)/handicap.db mkpat$(EXEEXT) 
    184         ./mkpat -b handipat -i $(srcdir)/handicap.db -o handipat.c 
     191handipat.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 
    185194 
    186195 
    187196ETAGS_ARGS = --language none --regex '/^Pattern[ \t]+[a-zA-Z0-9]+/' $(DB_TO_TAG)\ 
  • patterns/Makefile.in

    RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/Makefile.in,v
    retrieving revision 1.60
    diff -u -p -r1.60 Makefile.in
     
    8080 
    8181DSP = dfa.dsp patterns.dsp joseki.dsp mkeyes.dsp mkpat.dsp fuseki.dsp 
    8282DTR = 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 
    8486 
    8587 
    8688EXTRA_DIST = $(DSP)\ 
     
    526528takamoku.db : $(srcdir)/takamoku.sgf joseki$(EXEEXT) 
    527529        ./joseki JT $(srcdir)/takamoku.sgf >takamoku.db 
    528530 
    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 
     531patterns.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 
    532534 
    533535josekidb.c : $(DBBUILT) mkpat$(EXEEXT) 
    534536        ./mkpat -C joseki $(DBBUILT_INPUT) -o josekidb.c 
    535537 
    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 
     538apatterns.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 
     542dpatterns.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 
     546conn.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 
     550endgame.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 
    547553 
    548554eyes.c: $(srcdir)/eyes.db mkeyes$(EXEEXT) 
    549555        ./mkeyes < $(srcdir)/eyes.db >eyes.c 
    550556 
    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 
     557influence.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 
     561barriers.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 
    556564 
    557565aa_attackpat.c : $(srcdir)/aa_attackpats.db $(srcdir)/aa_attackpats.dtr mkpat$(EXEEXT) 
    558566        ./mkpat $(DFAFLAGS) -b -t $(srcdir)/aa_attackpats.dtr aa_attackpat \ 
     
    574582               -i $(srcdir)/owl_defendpats.db -o owl_defendpat.c 
    575583 
    576584fusekipat.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 
    578586 
    579587fuseki9.c : $(srcdir)/fuseki9.dbz uncompress_fuseki$(EXEEXT) 
    580588        ./uncompress_fuseki 9 $(srcdir)/fuseki9.dbz c >fuseki9.c 
     
    585593fuseki19.c : $(srcdir)/fuseki19.dbz uncompress_fuseki$(EXEEXT) 
    586594        ./uncompress_fuseki 19 $(srcdir)/fuseki19.dbz c >fuseki19.c 
    587595 
    588 handipat.c : $(srcdir)/handicap.db mkpat$(EXEEXT) 
    589         ./mkpat -b handipat -i $(srcdir)/handicap.db -o handipat.c 
     596handipat.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 
    590599# Tell versions [3.59,3.63) of GNU make to not export all variables. 
    591600# Otherwise a system limit (for SysV at least) may be exceeded. 
    592601.NOEXPORT: 
  • patterns/dfa.c

    RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/dfa.c,v
    retrieving revision 1.42
    diff -u -p -r1.42 dfa.c
     
    416416    exit(EXIT_FAILURE); 
    417417  } 
    418418 
    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  
    426419  if (pdfa->last_index + 1 > 65535) { 
    427420    fprintf(of, "#error too many states"); 
    428421    fprintf(stderr, "Error: Too many index entries. Can't fit delta into a short.\n"); 
     
    439432    fprintf(of, "{{"); 
    440433    for (j = 0; j < 4; j++) { 
    441434      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); 
    444437      if (j != 3) 
    445438        fprintf(of, ","); 
    446439    } 
     
    778771} 
    779772 
    780773 
    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  
    819774#define DFA_ALIGN       2 
    820775 
    821776/* 
     
    947902dfa_finalize(dfa_t *pdfa)  
    948903{ 
    949904  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; 
    952910  while (next_bin + 1 != last_bin) { 
    953911    for (j = aux_count + 1; j <= last_bin; j += 2) { 
    954912      if (j+1 == next_bin) 
     
    11901148    if (j == pat->minj) 
    11911149      borders &= ~WEST_EDGE; 
    11921150     
    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); 
    11941152    str[k] = work_space[m + i][n + j]; 
    11951153    assert(strchr("XOxo.,a!?$#|-+", str[k])); 
    11961154     
  • patterns/dfa.h

    RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/dfa.h,v
    retrieving revision 1.32
    diff -u -p -r1.32 dfa.h
     
    6565/* DFA state. */ 
    6666typedef struct state_rt 
    6767{ 
    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. */ 
    7070} state_rt_t; 
    7171 
    7272typedef struct dfa_rt 
  • patterns/mkpat.c

    RCS file: /home/arend/Go/gnugo-rsync/gnugo/patterns/mkpat.c,v
    retrieving revision 1.158
    diff -u -p -r1.158 mkpat.c
     
    5555        -p = compile general pattern database (the default)\n\ 
    5656        -c = compile connections database\n\ 
    5757        -C = compile a corner pattern database\n\ 
     58  Usage of DFA (cannot be used with a corner pattern database):\n\ 
    5859        -D = compile a DFA database (allows fast matching)\n\ 
    5960        -d <iterations> = don't generate database, but optimize a DFA\n\ 
    6061                          transformation file instead\n\ 
     
    9192#define DB_GENERAL      ((int) 'p') 
    9293#define DB_CONNECTIONS  ((int) 'c') 
    9394#define DB_CORNER       ((int) 'C') 
    94 #define DB_DFA          ((int) 'D') 
     95#define USE_DFA         ((int) 'D') 
    9596#define OPTIMIZE_DFA    ((int) 'd') 
    9697 
    9798/* code assumes that ATT_O and ATT_X are 1 and 2 (in either order) 
     
    150151 
    151152static int ci = -1, cj = -1;    /* position of origin (first piece element) 
    152153                                   relative to top-left */ 
     154static int fixed_pat_anchor = 0; /* if anchor for checked pattern is fixed */ 
    153155static int patno;               /* current pattern */ 
    154156static int discard_pattern = 0; /* Set to nonzero to discard a pattern (if e.g. 
    155157                                 * it is too large or duplicated). */ 
     
    482484 
    483485/* options */ 
    484486int verbose = 0;               /* -v */ 
    485 static int database_type = 0;  /* -p (default), -c, -f, -C, -D or -T */ 
     487static int database_type = 0;  /* -p (default), -c or -C */ 
     488static int use_dfa = 0;        /* -D or -d */ 
    486489static int anchor = 0;         /* Whether both O and/or X may be anchors. 
    487490                                * -b for both. -X for only X. 
    488491                                */ 
     
    536539{ 
    537540  struct hint_data *hint; 
    538541 
    539   if (database_type == DB_DFA || database_type == OPTIMIZE_DFA) { 
     542  if (use_dfa) { 
    540543    for (hint = first_hint; hint; hint = hint->next) { 
    541544      if (!strcmp(hint->name, pattern_name)) 
    542545        return hint->transformation_hint; 
    543546    } 
    544547  } 
    545548 
    546   return database_type == OPTIMIZE_DFA ? -1 : 0; 
     549  return use_dfa == OPTIMIZE_DFA ? -1 : 0; 
    547550} 
    548551 
    549552 
     
    695698  if (verbose) 
    696699    fprintf(stderr, "Add   :%s\n", pattern[index].name); 
    697700 
    698   if (database_type == DB_DFA) { 
     701  if (use_dfa == USE_DFA) { 
    699702    float ratio; 
    700703 
    701704    dfa_rotate_string(strrot, str, transformation_hint); 
     
    718721    int rot_start = 0; 
    719722    int rot_stop = pattern[index].trfno; 
    720723 
    721     assert(database_type == OPTIMIZE_DFA); 
     724    assert(use_dfa == OPTIMIZE_DFA); 
    722725 
    723726    if (rot_stop == 5) { 
    724727      rot_start = 2; 
     
    889892    } 
    890893 
    891894    if (off == ATT_Q) { 
     895      fixed_pat_anchor = 1; 
    892896      off = ATT_O; 
    893897      ci = maxi; 
    894898      cj = j; 
     
    897901    } 
    898902 
    899903    if (off == ATT_Y) { 
     904      fixed_pat_anchor = 1; 
    900905      off = ATT_X; 
    901906      ci = maxi; 
    902907      cj = j; 
     
    10981103    ci = 0; 
    10991104    cj = 0; 
    11001105  } 
    1101   else if (choose_best_anchor && !discard_pattern) {  
     1106  else if (choose_best_anchor && !discard_pattern 
     1107           && (!fixed_pat_anchor || database_type != DB_CONNECTIONS)) { 
    11021108 
    11031109    /* Try to find a better anchor if 
    11041110     * the -m option is set. 
     
    17751781  int used_nodes = 0; 
    17761782 
    17771783  assert(ci != -1 && cj != -1); 
    1778   assert(database_type == DB_DFA || transformation_hint == 0); 
     1784  assert(use_dfa == USE_DFA || transformation_hint == 0); 
    17791785 
    17801786  /* sort the elements so that least-likely elements are tested first. */ 
    17811787  gg_sort(elements, el, sizeof(struct patval_b), compare_elements); 
     
    18161822       * elements for all possible transformations). 
    18171823       */ 
    18181824      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) 
    18201826        continue; 
    18211827#endif /* GRID_OPT == 1 */ 
    18221828 
     
    18241830       * they might be needed for goal checking or by callback function, so 
    18251831       * we check it before discarding an element. 
    18261832       */ 
    1827       if (database_type == DB_DFA) 
     1833      if (use_dfa) 
    18281834        continue; 
    18291835    } /* If the element is discardable. */ 
    18301836 
     
    23842390  fprintf(outfile, "  -1,\n");  /* fixed_for_size */ 
    23852391  fprintf(outfile, "  %d,\n", fixed_anchor); 
    23862392  fprintf(outfile, "  %s\n", prefix); 
    2387   if (database_type == DB_DFA) 
     2393  if (use_dfa) 
    23882394    fprintf(outfile, " ,& dfa_%s\n", prefix); /* pointer to the wired dfa */ 
    23892395  else 
    23902396    fprintf(outfile, " , NULL\n"); /* pointer to a possible dfa */ 
     
    24342440 
    24352441      case 'p': 
    24362442      case 'c': 
    2437       case 'f': 
    24382443      case 'C': 
    2439       case 'D': 
    2440       case 'd': 
    24412444        if (database_type) { 
    24422445          fprintf(stderr, "Error : More than one database type specified (-%c and -%c)\n", 
    24432446                  database_type, i); 
    24442447          return 1; 
    24452448        } 
     2449        if (i == 'C' && use_dfa) { 
     2450          fprintf(stderr, "Error : Cannot use DFA with a corner pattern database\n"); 
     2451          return 1; 
     2452        } 
    24462453        database_type = i; 
     2454        break; 
     2455 
     2456      case 'd': 
     2457      case 'D': 
     2458        use_dfa = i; 
    24472459        if (i == 'd') { 
    24482460          iterations = strtol(gg_optarg, NULL, 10); 
    24492461          if (iterations < 0) { 
     
    24512463            return 1; 
    24522464          } 
    24532465        } 
     2466        if (database_type == 'C') { 
     2467          fprintf(stderr, "Error : Cannot use DFA with a corner pattern database\n"); 
     2468          return 1; 
     2469        } 
    24542470        break; 
    24552471 
    24562472      case 'O': 
     
    24922508 
    24932509    if (!input_files) 
    24942510      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) { 
    24962512      output_FILE = fopen(output_file_name, "wb"); 
    24972513      if (output_FILE == NULL) { 
    24982514        fprintf(stderr, "Error : Cannot write to file %s\n", output_file_name); 
    24992515        return 1; 
    25002516      } 
    25012517    } 
    2502     if (transformations_file_name 
    2503         && (database_type == DB_DFA || database_type == OPTIMIZE_DFA)) { 
     2518    if (transformations_file_name && use_dfa) { 
    25042519      transformations_FILE = fopen(transformations_file_name, "r"); 
    25052520      if (transformations_FILE) { 
    25062521        parse_transformations_file(transformations_FILE); 
    25072522        fclose(transformations_FILE); 
    25082523      } 
    2509       else if (database_type == DB_DFA) { 
     2524      else if (use_dfa == USE_DFA) { 
    25102525        fprintf(stderr, "Error : Cannot read file %s\n", 
    25112526                transformations_file_name); 
    25122527        return 1; 
     
    25242539 
    25252540  prefix = argv[gg_optind]; 
    25262541 
    2527   if (database_type == DB_DFA) { 
     2542  if (use_dfa == USE_DFA) { 
    25282543    dfa_init(); 
    25292544    new_dfa(&dfa, "mkpat's dfa"); 
    25302545  } 
    25312546  else if (database_type == DB_CORNER) 
    25322547    corner_init(); 
    25332548 
    2534   if (database_type == OPTIMIZE_DFA) { 
     2549  if (use_dfa == OPTIMIZE_DFA) { 
    25352550    if (transformations_file_name == NULL) { 
    25362551      fprintf(stderr, "error : transformation file required (use -t option)\n"); 
    25372552      return 1; 
     
    28172832      else if (line[0] == ':') { 
    28182833        if (state == 2 || state == 3) { 
    28192834          finish_pattern(line); 
     2835          fixed_pat_anchor = 0; 
    28202836           
    28212837          if (!discard_pattern) { 
    2822             if (database_type == DB_DFA || database_type == OPTIMIZE_DFA) 
     2838            if (use_dfa) 
    28232839              write_to_dfa(patno); 
    28242840            if (database_type == DB_CORNER) 
    28252841              corner_add_pattern(); 
    2826             else if (database_type != OPTIMIZE_DFA) 
     2842            else if (use_dfa != OPTIMIZE_DFA) 
    28272843              write_elements(output_FILE); 
    28282844          } 
    28292845 
     
    29162932    fprintf(stderr, "%d / %d patterns have edge-constraints\n", 
    29172933            pats_with_constraints, patno); 
    29182934 
    2919   if (database_type != OPTIMIZE_DFA) { 
     2935  if (use_dfa != OPTIMIZE_DFA) { 
    29202936    /* Forward declaration, which autohelpers might need. */ 
    29212937    if (database_type != DB_CORNER) 
    29222938      fprintf(output_FILE, "static struct pattern %s[%d];\n\n", prefix, patno + 1); 
     
    29332949 
    29342950    write_patterns(output_FILE); 
    29352951 
    2936     if (database_type == DB_DFA) { 
     2952    if (use_dfa) { 
    29372953      fprintf(stderr, "---------------------------\n"); 
    29382954 
    29392955      dfa_finalize(&dfa); 
     
    29762992              current_file); 
    29772993    } 
    29782994  } 
    2979   else {        /* database_type == OPTIMIZE_DFA */ 
     2995  else {        /* use_dfa == OPTIMIZE_DFA */ 
    29802996    int k; 
    29812997    int *optimized_variations; 
    29822998 
     
    29893005    optimized_variations = dfa_patterns_optimize_variations(&dfa_pats, 
    29903006                                                            iterations); 
    29913007    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); 
    29943012    } 
    29953013 
    29963014    free(optimized_variations); 
  • (a) /dev/null vs. (b) patterns/attack.dtr

    a b  
     1Attack1 0 
     2Attack2 0 
     3Attack4 2 
     4Attack5 0 
     5Attack6 6 
     6Attack10        0 
     7Attack11        6 
     8Attack13        1 
     9Attack14        2 
     10Attack15        0 
     11Attack16        5 
     12Attack17        0 
     13Attack18        6 
     14Attack19        4 
  • (a) /dev/null vs. (b) patterns/barriers.dtr

    a b  
     1Barrier1        1 
     2Barrier1b       1 
     3Barrier2        1 
     4Barrier3        1 
     5Barrier4a       3 
     6Barrier4b       4 
     7Barrier5        0 
     8Barrier6        7 
     9Barrier6b       0 
     10Barrier7        0 
     11Barrier8        1 
     12Barrier9        1 
     13Barrier10       0 
     14Barrier11       0 
     15Barrier12       6 
     16Barrier13       0 
     17Barrier14       0 
     18Barrier15       6 
     19Barrier16       5 
     20Barrier16b      6 
     21Barrier17       6 
     22Barrier18       6 
     23Barrier19       0 
     24Barrier20       0 
     25Barrier21       1 
     26Barrier22       0 
     27Barrier22a      6 
     28Barrier22b      0 
     29Barrier23       5 
     30Barrier24       0 
     31Barrier25       6 
     32Barrier26       5 
     33Barrier27       0 
     34Barrier28       0 
     35Barrier29       7 
     36Barrier30       0 
     37Barrier31       0 
     38Barrier32       7 
     39Barrier33       0 
     40Barrier34       7 
     41Barrier34b      0 
     42Barrier35       0 
     43Barrier36       0 
     44Barrier37       7 
     45Barrier38       7 
     46Barrier39       6 
     47Barrier40       0 
     48Barrier41a      3 
     49Barrier41b      3 
     50Barrier42       7 
     51Barrier43       6 
     52Barrier44       0 
     53Barrier45       0 
     54Barrier46       6 
     55Barrier47       0 
     56Barrier48       0 
     57Barrier49       0 
     58Barrier50       0 
     59Barrier51       5 
     60Barrier52       7 
     61Barrier53       7 
     62Barrier54       0 
     63Barrier55       6 
     64Barrier56      &nb