Initial commit of GNU Go v3.8.
[sgk-go] / patterns / dfa-mkpat.h
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* This is GNU Go, a Go program. Contact gnugo@gnu.org, or see *
* http://www.gnu.org/software/gnugo/ for more information. *
* *
* Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, *
* 2008 and 2009 by the Free Software Foundation. *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation - version 3 *
* or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License in file COPYING for more details. *
* *
* You should have received a copy of the GNU General Public *
* License along with this program; if not, write to the Free *
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02111, USA. *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef _DFA_MKPAT_H_
#define _DFA_MKPAT_H_
#include "dfa.h"
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
/********************************
* Parameters *
********************************/
#define DFA_RESIZE_STEP 20000
#define DFA_INIT_SIZE 250
/********************************
* Data types definition *
********************************/
/* Intersections. */
typedef unsigned short Intersection_t;
/* Attribute list. */
typedef struct attrib
{
int val;
int next;
} attrib_t;
/* DFA state. */
typedef struct state
{
int att;
int next[4];
} state_t;
/* DFA. */
typedef struct dfa
{
/* File header. */
char name[80];
/* Transition graph. */
state_t *states;
int max_states;
int last_state;
/* Attributes sets. */
attrib_t *indexes;
int max_indexes;
int last_index;
} dfa_t;
/********************************
* Functions declaration *
********************************/
void dfa_init(void); /* Every call to a DFA function must be done */
void dfa_end(void); /* between calls to these two functions. */
/* Basic DFA manipulation. */
void print_c_dfa(FILE *of, const char *name, dfa_t *pdfa);
void new_dfa(dfa_t *pdfa, const char *name);
void copy_dfa(dfa_t *p_to, dfa_t *p_from);
void kill_dfa(dfa_t *pdfa);
int dfa_size(dfa_t *pdfa); /* in kB */
void save_dfa(const char *f_name, dfa_t *pdfa);
dfa_t *load_dfa(const char *f_path, const char *f_name, dfa_t **ppdfa);
void dfa_finalize(dfa_t *pdfa);
void dfa_shuffle(dfa_t *pdfa);
int dfa_calculate_max_matched_patterns(dfa_t *pdfa);
int dfa_minmax_delta(dfa_t *pdfa, int next_index, int isMin);
void dump_dfa(FILE *f, dfa_t *pdfa);
struct pattern;
/* Conversion between a GNU Go pattern struct into a DFA string. */
void pattern_2_string(struct pattern *pat, struct patval_b *elements,
char *str, int ci, int cj);
void dfa_rotate_string(char *strrot, const char *str, int ll);
/* Add a string with attribute `att_val' into a DFA. */
float dfa_add_string(dfa_t *pdfa, const char *str, int pattern_index, int ll);
/********************************
* Global variables *
********************************/
extern int dfa_verbose; /* Verbiage level. */
/**************************************
* Experimental DFA builder *
**************************************/
#define DFA_ATTRIB_BLOCK_SIZE 150000
#define DFA_NODE_BLOCK_SIZE 50000
typedef struct _dfa_attrib dfa_attrib;
typedef struct _dfa_attrib_block dfa_attrib_block;
typedef struct _dfa_attrib_array dfa_attrib_array;
typedef struct _dfa_node dfa_node;
typedef struct _dfa_node_block dfa_node_block;
typedef struct _dfa_graph dfa_graph;
struct _dfa_attrib {
dfa_attrib *next;
int string_index;
};
struct _dfa_attrib_block {
dfa_attrib_block *previous;
dfa_attrib attrib[DFA_ATTRIB_BLOCK_SIZE];
};
struct _dfa_attrib_array {
dfa_attrib_block *last_block;
int allocated;
};
struct _dfa_node {
dfa_node *branch[4];
dfa_attrib *attributes;
dfa_attrib *passing_strings;
};
struct _dfa_node_block {
dfa_node_block *previous;
dfa_node node[DFA_NODE_BLOCK_SIZE];
};
struct _dfa_graph {
int num_nodes;
dfa_node *root;
dfa_node_block *last_block;
int allocated;
dfa_attrib_array attributes;
};
#define DFA_HASH_BLOCK_SIZE 10000
#define DFA_HASH_TABLE_SIZE 4096
#define DFA_HASH_VALUE_1 1
#define DFA_HASH_VALUE_2 79
#define DFA_HASH_VALUE_3 2971
typedef struct _dfa_hash_entry dfa_hash_entry;
typedef struct _dfa_hash_block dfa_hash_block;
struct _dfa_hash_entry {
dfa_hash_entry *next;
dfa_attrib *key;
dfa_node *value;
};
struct _dfa_hash_block {
dfa_hash_block *previous;
dfa_hash_entry entry[DFA_HASH_BLOCK_SIZE];
};
typedef struct _dfa_pattern dfa_pattern;
typedef struct _dfa_patterns dfa_patterns;
struct _dfa_pattern {
dfa_pattern *next;
int num_variations;
int current_variation;
char *variation[8];
};
struct _dfa_patterns {
int num_patterns;
dfa_pattern *patterns;
dfa_pattern *last_pattern;
dfa_graph graph;
};
void dfa_graph_reset(dfa_graph *graph);
void dfa_patterns_reset(dfa_patterns *patterns);
void dfa_patterns_clear(dfa_patterns *patterns);
void dfa_patterns_add_pattern(dfa_patterns *patterns,
const char *string, int index);
void dfa_patterns_set_last_pattern_variation(dfa_patterns *patterns,
int variation);
void dfa_patterns_select_shortest_variation(dfa_patterns *patterns);
void dfa_patterns_build_graph(dfa_patterns *patterns);
int *dfa_patterns_optimize_variations(dfa_patterns *patterns, int iterations);
#endif /* _DFA_MKPAT_H_ */
/*
* Local Variables:
* tab-width: 8
* c-basic-offset: 2
* End:
*/