10 #include "patternsp.h"
11 #include "patternprob.h"
14 /* We try to avoid needlessly reloading probability dictionary
15 * since it may take rather long time. */
16 static struct pattern_pdict
*cached_dict
;
18 struct pattern_pdict
*
19 pattern_pdict_init(char *filename
, struct pattern_config
*pc
)
25 filename
= "patterns.prob";
26 FILE *f
= fopen(filename
, "r");
29 fprintf(stderr
, "No pattern probtable, will not use learned patterns.\n");
33 struct pattern_pdict
*dict
= calloc2(1, sizeof(*dict
));
35 dict
->table
= calloc2(pc
->spat_dict
->nspatials
+ 1, sizeof(*dict
->table
));
37 char *sphcachehit
= malloc(pc
->spat_dict
->nspatials
);
38 hash_t (*sphcache
)[PTH__ROTATIONS
] = malloc(pc
->spat_dict
->nspatials
* sizeof(sphcache
[0]));
42 while (fgets(sbuf
, sizeof(sbuf
), f
)) {
43 struct pattern_prob
*pb
= calloc2(1, sizeof(*pb
));
47 if (buf
[0] == '#') continue;
48 while (isspace(*buf
)) buf
++;
49 while (!isspace(*buf
)) buf
++; // we recompute the probability
50 while (isspace(*buf
)) buf
++;
51 c
= strtol(buf
, &buf
, 10);
52 while (isspace(*buf
)) buf
++;
53 o
= strtol(buf
, &buf
, 10);
54 pb
->prob
= (floating_t
) c
/ o
;
55 while (isspace(*buf
)) buf
++;
56 str2pattern(buf
, &pb
->p
);
58 uint32_t spi
= pattern2spatial(dict
, &pb
->p
);
59 pb
->next
= dict
->table
[spi
];
60 dict
->table
[spi
] = pb
;
62 /* We rehash spatials in the order of loaded patterns. This way
63 * we make sure that the most popular patterns will be hashed
64 * last and therefore take priority. */
65 if (!sphcachehit
[spi
]) {
67 for (int r
= 0; r
< PTH__ROTATIONS
; r
++)
68 sphcache
[spi
][r
] = spatial_hash(r
, &pc
->spat_dict
->spatials
[spi
]);
70 for (int r
= 0; r
< PTH__ROTATIONS
; r
++)
71 spatial_dict_addh(pc
->spat_dict
, sphcache
[spi
][r
], spi
);
79 spatial_dict_hashstats(pc
->spat_dict
);
83 fprintf(stderr
, "Loaded %d pattern-probability pairs.\n", i
);