|
|
1.1 root 1: /* Copyright (c) 1989, 1990 AT&T --- All Rights Reserved. */
2: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T. */
3: /* The copyright notice does not imply actual or intended publication. */
4: /* AUTHORS: */
5: /* H. S. Baird - ATT-BL MH - first versions */
6: /* stdocr.h -- conventional OCGR constants, typedefs, and file formats
7: NOTE: sensitive to prior:
8: `#define MAIN 1'
9: `#define CPU ?'
10: `#define OS ?' */
11:
12: extern int errno; /* UNIX system call error number */
13:
14: #ifndef MAIN
15: #define MAIN 0
16: #endif
17:
18: #define FWRI (T) /* use machine-independent format for dim-file writes */
19: #define FRDI (T) /* use machine-independent format for dim-file reads */
20:
21: #ifndef PI
22: #define PI 3.1415926535
23: #endif
24:
25: extern int Readvax; /* T. Thompson flag: see Coord.c */
26:
27: #include "limits.h" /* machine-dependent numeric extreme values */
28: #include "fioi.h" /* machine-independent types and binary I/O */
29: #include "boole.h" /* boolean type */
30: #include "Units.h" /* OCR-specific units */
31: #include "Coord.h" /* scanner coordinates & basic geometry */
32: #include "ric.h" /* ricoh scanner page & file formats */
33:
34: /* 5620 dimensions, in dots */
35: #define Width5620 800
36: #define Height5620 1024
37:
38: /* used (in clc.c) to compute absolute maximum value of natural
39: log values used in Bayesian binary weights */
40: #define LOG_ABS_MAX 3.0
41:
42: #define Merit float /* heuristic ``merit'' takes on values in [0,1] */
43: /* machine-independent I/O: range [0.0-1.0], precision .0000153 */
44: #define fwri_Merit(F,V) fwri_uint2((F),((V)*USHRT_MAX))
45: #define frdi_Merit(F) (frdi_uint2(F)/(Merit)USHRT_MAX)
46:
47: #define Prob float /* ``probability'' takes on values in [0,1] */
48: /* machine-independent I/O: range [0.0-1.0], precision .0000153 */
49: #define fwri_Prob(F,V) fwri_uint2((F),((V)*USHRT_MAX))
50: #define frdi_Prob(F) (frdi_uint2(F)/(Prob)USHRT_MAX)
51:
52: #define Pts float /* text-size units: ``points'' (1/72) inch */
53: /* machine-independent I/O: range [0,655.36], precision 0.01 ([0,9.1] inches) */
54: #define fwri_Pts(F,V) fwri_uint2((F),((V)*100.0))
55: #define frdi_Pts(F) (frdi_uint2(F)/100.0)
56:
57: #define Ems float /* em-space units */
58: /* machine-independent I/O: range [-32.768,32.767], precision 0.001 */
59: #define fwri_Ems(F,V) fwri_int2((F),((V)*1000.0))
60: #define frdi_Ems(F) (frdi_int2(F)/1000.0)
61:
62: /* class name - long enough to be a unix file name */
63: #define Cln_len (14) /* maximum no. chars (DIRSIZ in some UNIX's) */
64: #define Cln_lenp (Cln_len+1) /* maximum size of array */
65: typedef char Cln[Cln_lenp];
66: #define fwri_Cln(F,S) fwri_str((F),(S))
67: #define frdi_Cln(F,S) frdi_strn((F),(S),Cln_lenp)
68:
69: /* font name */
70: #define Fontn_len (Cln_len) /* maximum no. chars */
71: #define Fontn_lenp (Cln_lenp) /* maximum size of array */
72: typedef char Fontn[Fontn_lenp];
73: #define fwri_Fontn(F,S) fwri_str((F),(S))
74: #define frdi_Fontn(F,S) frdi_strn((F),(S),Fontn_lenp)
75:
76: typedef struct ClassId {
77: Fontn f; /* font name */
78: Pts s; /* size in points */
79: Cln c; /* printable symbol name (``class-name'') */
80: short v; /* symbol variant no. 0,1,... */
81: } ClassId;
82:
83: #define Init_ClassId {"",0.0,"",0}
84: #if MAIN
85: ClassId empty_ClassId = Init_ClassId;
86: #else
87: extern ClassId empty_ClassId;
88: #endif
89: char *classid_toa(); /* in chcln.c */
90: #define eq_classid(a,b) ((!strcmp((a).f,(b).f))&&((a).s==(b).s)&&(!strcmp((a).c,(b).c))&&((a).v==(b).v))
91:
92: #define fwri_ClassId(F,P) { \
93: fwri_Fontn((F),(P)->f); \
94: fwri_Pts((F),(P)->s); \
95: fwri_Cln((F),(P)->c); \
96: fwri_uint1((F),(P)->v); \
97: }
98: #define frdi_ClassId(F,P) ( feof(F)? 0: ( \
99: frdi_Fontn((F),(P)->f), \
100: (P)->s=frdi_Pts(F), \
101: frdi_Cln((F),(P)->c), \
102: (P)->v=frdi_uint1(F), \
103: (ferror(F)? -errno: 1) ) )
104:
105: /* Convert variant no. to ASCII character, and vice versa */
106: #define vtoc(V) (((V)<=9)?('0'+(V)):(((V)<=35)?('a'+((V)-10)):('A'+((V)-36))))
107: #define ctov(C) ((((C)>='0')&&((C)<='9'))?((C)-'0'):((((C)>='a')&&((C)<='z'))?(10+((C)-'a')):(36+((C)-'A'))))
108:
109: /* parametric values: */
110: #define Pval float
111: /* machine-independent I/O: precision 0.0001 & range [-838.8608,838.8607] */
112: #define fwri_Pval(F,V) fwri_int4((F),(V)*1000.0)
113: #define frdi_Pval(F) (frdi_int4(F)/1000.0)
114:
115: typedef struct { /* parametric point */
116: Pval x;
117: Pval y;
118: } Pp;
119:
120: #define Init_Zero_Pp {0.0,0.0}
121: #if MAIN
122: Pp zero_Pp = Init_Zero_Pp;
123: #else
124: extern Pp zero_Pp;
125: #endif
126:
127: #define fwri_Pp(F,P) { fwri_Pval((F),(P)->x); fwri_Pval((F),(P)->y); }
128: #define frdi_Pp(F,P) ( feof(F)? 0: ( \
129: (P)->x=frdi_Pval(F), \
130: (P)->y=frdi_Pval(F), \
131: (ferror(F)? -errno: 1) ) )
132:
133: /* metrics: ABSS, EUCL, MAXV */
134: #define ABSS 'a'
135: #define EUCL 'e'
136: #define MAXV 'm'
137: typedef short Metric;
138:
139: #define fwri_Metric(F,V) fwri_ch((F),(V))
140: #define frdi_Metric(F) (frdi_ch(F))
141:
142: /* a vectorized blob file is a sequence of blob-descriptions.
143: a blob-description is a sequence of "vector" records; there are two
144: types of blob descriptions:
145: DOT:
146: 'D'-vector (with bounding box)
147: CHAR:
148: 'C'-vector, followed by:
149: one 'B'-vector (bounding-box), and
150: any number of: 'S' (stroke),
151: 'G' (edge),
152: 'O' (hole),
153: 'A' (arc),
154: 'C' (corner),
155: 'P' (end-point), and
156: 'V' & 'W' (boundary angles - 1 each),
157: and terminated with one 'E' vector (giving classname)
158: */
159:
160: #define Vrec_len 5
161: typedef short Vrec[Vrec_len];
162:
163: /* subshape values */
164: /* #define U 0 uninitialized */
165: #define NA (SHRT_MAX) /* deliberately not-assigned (classifier failure) */
166:
167: #define Dim short /* specifies dimension 1,..,MaxDim */
168: #define MaxDim 4
169:
170: #define fwri_Dim(F,V) fwri_uint1((F),(V))
171: #define frdi_Dim(F) (frdi_uint1(F))
172:
173: #define Seq int /* sequence nos; indices into tables */
174: #define FISeq 0 /* first value */
175: #define NLSeq -1 /* conventional NULL value */
176: #define S1Seq 0200000000 /* special bit 1 of Seq */
177: #define S2Seq 0100000000 /* special bit 2 of Seq */
178: #define NSSeq 0077777777 /* non-special bits */
179:
180: #define fwri_Seq(F,V) fwri_int4((F),(V))
181: #define frdi_Seq(F) (frdi_int4(F))
182:
183: typedef short Liv; /* limit value: scaled and truncated from floating-pt */
184: #define Liv_MAX (SHRT_MAX)
185: #define Liv_MIN (SHRT_MIN)
186:
187: #define fwri_Liv(F,V) fwri_int2((F),(V))
188: #define frdi_Liv(F) (frdi_int2(F))
189:
190: typedef short Lit; /* limit type, two flavors: */
191: #define MN 0 /* min: MN < v */
192: #define MX 1 /* max: v <= MX */
193:
194: typedef Liv Ivl[2]; /* interval: ( Ivl[MN], Ivl[MX] ] */
195:
196: typedef Ivl Rec[MaxDim]; /* rectangular parallelopiped of limits in DIM-space */
197:
198: /* a normalized blob file is a sequence of:
199: Nb_h header, followed by Nb_h.ss of:
200: Nb_s contour shapes */
201: typedef struct {
202: ClassId ci; /* class name */
203: Bbx bb; /* bounding box */
204: Pval rsz; /* raw character size (Ems) */
205: Pval bht; /* height-above-baseline (Ems) */
206: Pval rwd; /* width (Ems) */
207: Pval rar; /* area (square-Ems) */
208: Pval rpe; /* perimiter (Ems) */
209: Pval asp; /* aspect ratio (h/w) */
210: Pval blk; /* fraction of Bbx area that is black */
211: Pval per; /* perimeter of blob as multiple of Bbx perim */
212: Pval gale; /* Gale's feature: incl. angle 'tween 2 longest sides */
213: short ss; /* no. of shapes to follow */
214: } Nb_h;
215:
216: #define MAX_SHAPES_EACH 1024 /* Max no. shapes per Blob/Char/item */
217:
218: /* Shape is tiny (below threshold, may be pruned): a flag ORed into shape type */
219: #define Sh_tiny (0x80)
220:
221: /* Shape types: */
222: #define U 0 /* uninitialized */
223: #define Sh_FI 1 /* first shape no. */
224: #define Sh_B 1 /* blob (connected black region) */
225: #define Sh_H 2 /* hole (connected white region) */
226: #define Sh_S 3 /* stroke (undirected line-segment) */
227: #define Sh_E 4 /* edge (directed line-segment along boundary) */
228: #define Sh_C 5 /* concavity (intrusion from convex hull): its `cover' edge */
229: #define Sh_D 6 /* direction and depth of concavity */
230: #define Sh_A 7 /* locally-maximal convex arc (encloses black) */
231: #define Sh_V 8 /* locally-maximal concave arc (encloses white) */
232: #define Sh_P 9 /* endpoint (0-junction) */
233: #define Sh_T 10 /* detail (left- and right-facing ticks) */
234: #define Sh_X 11 /* crossing (X) */
235: #define Sh_Y 12 /* global scalar variables, combined */
236: #define Sh_Z 13 /* more global scalar variables, combined */
237: #define Sh_LA 13 /* last of variable-no-of-occurences shape-types */
238: #define Sh_MNY (Sh_LA+1)
239: #define SHS_MNY (Sh_MNY)
240:
241: #if (MAIN)
242: /* shape-names, given shape-type */
243: char Sh_nam[SHS_MNY] =
244: {'U', 'B', 'H', 'S', 'E', 'C', 'D', 'A', 'V', 'P', 'T', 'X', 'Y', 'Z'};
245: /* "dimension" -- no parameters in normalized form */
246: short Sh_dim[SHS_MNY] =
247: { 0, 3, 3, 4, 4, 4, 4, 4, 4, 4, 3, 2, 3, 1};
248: /* absolute minimum parametric values possible -- must be >= -1.0
249: (see norm.c & fiodict.c) */
250: Pval Sh_MN[SHS_MNY][MaxDim]
251: = { { 0.0, 0.0, 0.0, 0.0}, /* U */
252: {-0.5, -0.5, -0.5/*see mkd*/}, /* B */
253: {-0.5, -0.5, -0.5/*see mkd*/}, /* H */
254: {-0.5, -0.5, -0.5, -0.5}, /* S */
255: {-0.5, -0.5, -0.5, -0.5}, /* E */
256: {-0.5, -0.5, -0.5, -0.5}, /* C */
257: {-0.5, -0.5, -0.5, -0.5}, /* D */
258: {-0.5, -0.5, -0.5, -0.5}, /* A */
259: {-0.5, -0.5, -0.5, -0.5}, /* V */
260: {-0.5, -0.5, -0.5, -0.5}, /* P */
261: {-0.5, -0.5, -0.5}, /* T */
262: {-0.5, -0.5}, /* X */
263: {-0.5, -0.5, -0.5}, /* Y */
264: {-0.5} /* Z */
265: };
266: /* absolute maximum parametric value possible -- must be <= 1.0
267: (see norm.c & fiodict.c) */
268: Pval Sh_MX[SHS_MNY][MaxDim]
269: = { { 0.0, 0.0, 0.0, 0.0}, /* U */
270: {0.5, 0.5, 1.0/*see mkd*/}, /* B */
271: {0.5, 0.5, 1.0/*see mkd*/}, /* H */
272: {0.5, 0.5, 0.5, 0.5}, /* S */
273: {0.5, 0.5, 0.5, 0.5}, /* E */
274: {0.5, 0.5, 0.5, 0.5}, /* C */
275: {0.5, 0.5, 0.5, 0.5}, /* D */
276: {0.5, 0.5, 0.5, 0.5}, /* A */
277: {0.5, 0.5, 0.5, 0.5}, /* V */
278: {0.5, 0.5, 0.5, 0.5}, /* P */
279: {0.5, 0.5, 0.5}, /* T */
280: {0.5, 0.5}, /* X */
281: {0.5, 0.5, 0.5}, /* Y */
282: {0.5} /* Z */
283: };
284: /* minimum magnitude of (r,i) part of certain shapes */
285: Pval A_ri_minmag = 0.25;
286: Pval P_ri_minmag = 0.25;
287: #else
288: extern char Sh_nam[];
289: extern short Sh_dim[];
290: extern Pval Sh_MN[][MaxDim];
291: extern Pval Sh_MX[][MaxDim];
292: extern Pval A_ri_minmag;
293: extern Pval P_ri_minmag;
294: #endif
295:
296: #define MIN_SD 0.001 /* minimum std-dev permitted */
297:
298: typedef Pval Spar[MaxDim]; /* shape parameters */
299:
300: typedef struct Nb_s {
301: short t; /* shape type: one of U S O A C etc, perhaps |Sh_tiny */
302: Spar p; /* parametric values */
303: } Nb_s;
304:
305: /* indices into parametric values */
306: /* blobs */
307: #define B_x 0 /* (x,y) location of dot wrt bounding-box */
308: #define B_y 1
309: #define B_r 2 /* size of dot */
310: /* holes */
311: #define H_x 0 /* (x,y) location of center wrt bounding-box */
312: #define H_y 1
313: #define H_r 2 /* size of hole */
314: /* strokes */
315: #define S_x 0 /* (x,y) location of stroke center wrt bounding box */
316: #define S_y 1
317: #define S_r 2 /* (r,i) real-imag parts of rotation-length vector; */
318: #define S_i 3 /* rotation angle *2 since strokes have only [0,PI] range */
319: /* edges */
320: #define E_x 0 /* (x,y) location of edge center wrt bounding box */
321: #define E_y 1
322: #define E_r 2 /* (r,i) real-imag parts of direction-length vector */
323: #define E_i 3
324: /* concavity hull edge */
325: #define C_x 0 /* (x,y) location of center of hull-bdy edge wrt bounding-box */
326: #define C_y 1
327: #define C_r 2 /* (r,i) real-imag parts of hull-bdy edge */
328: #define C_i 3
329: /* concavity depth & direction */
330: #define D_x 0 /* (x,y) location of center of depth & direction vector */
331: #define D_y 1
332: #define D_r 2 /* (r,i) real-imag parts of depth & direction vector */
333: #define D_i 3
334: /* locally-maximal convex arc */
335: #define A_x 0 /* (x,y) location of center of enclosed area */
336: #define A_y 1
337: #define A_r 2 /* (r,i) real-imag parts of `incompleteness' vector */
338: #define A_i 3
339: /* locally-maximal concave arc */
340: #define V_x 0 /* (x,y) location of center of enclosed area */
341: #define V_y 1
342: #define V_r 2 /* (r,i) real-imag parts of `incompleteness' vector */
343: #define V_i 3
344: /* endpoint */
345: #define P_x 0 /* (x,y) location of center of hull-bdy wrt bounding-box */
346: #define P_y 1
347: #define P_r 2 /* (r,i) real-imag parts of direction-depth vector */
348: #define P_i 3
349: /* ticks: left-, right-, top-, & bottom-facing extrema near ends */
350: #define T_x 0 /* signed distance from centroid along principal axis */
351: #define T_y 1 /* signed perpendicular distance from axis */
352: #define T_a 2 /* angle of principal axis, within worst-case range */
353: /* crossings */
354: #define X_x 0 /* (x,y) location of crossing wrt bounding-box */
355: #define X_y 1
356: /* global scalars, combined */
357: #define Y_a 0 /* log(aspect_ratio=hgt/wid) */
358: #define Y_b 1 /* ratio of area to bbx_area */
359: #define Y_p 2 /* ratio of perimeter to bbx_perimeter */
360: /* global scalars, combined (more) */
361: #define Z_g 0 /* Gale's feature: included angle between two longest bdy edges */
362:
363: /* scalar features field indices */
364: #define SF_RSZ 0 /* relative size (height in ems) */
365: #define SF_BHT 1 /* height above baseline (ems) */
366: #define SF_RWD 2 /* relative width (ems) */
367: #define SF_RAR 3 /* relative area (square-ems) */
368: #define SF_RPE 4 /* relative perimeter (ems) */
369: #define SF_ASP 5 /* aspect-ratio */
370: #define SF_BLK 6 /* fraction of Bbx that is black */
371: #define SF_PER 7 /* ratio of perimeter to BBx per */
372: #define SF_GALE 8 /* Gale's feature: incl. ang. between 2 longest edges */
373: #define SF_N 8 /* index of last var that's not an occurrence-count */
374: #define SF_MNY (SF_N+Sh_LA+1)
375:
376: #if MAIN
377: /* ``Is this feature available early enough to be used in fast scalar-
378: feature preclassifier?'' (Must not depend on shape analysis.) */
379: boolean SFfeature[SF_MNY] = {
380: F, F, F, F, F, T, T, T, F,
381: T, T, T, T, T, T, T, T, T, T, T, F, F };
382: /* ``Is this feature discrete (integer-valued)?'' (Affects construction
383: of scalar-decision tree preclassifier.) */
384: boolean SFdiscrete[SF_MNY] = {
385: F, F, F, F, F, F, F, F, F,
386: T, T, T, T, T, T, T, T, T, T, T, T, T };
387: #else
388: extern boolean SFfeature[];
389: extern boolean SFdiscrete[];
390: #endif
391:
392: typedef Pval SFv[SF_MNY];
393:
394: /* blob tracer (boundary angles) features field indices */
395: #define TR_MNY 8
396:
397: typedef Pval TRv[TR_MNY];
398:
399: /* tracer decision-tree header */
400: typedef struct TRtr {
401: struct SFdnode *TRd; /* array of decision-nodes */
402: struct Cl ***clist; /* list of (class-ptr)-lists */
403: } TRtr;
404:
405: /* Ss - sub-shape list-item */
406: typedef struct Ss {
407: Seq seq; /* globally unique sequence no */
408: Seq shs; /* shape-hdr seq no */
409: Seq cls; /* class sequence no */
410: short no; /* sub-shape number (0,1,2..., NA) */
411: float focc; /* fraction of training set w/ >=1 occurrence */
412: float fdup; /* fraction of training set w/ >=2 occurrence */
413: Spar me; /* mean parameters */
414: Spar sd; /* std-dev parameters */
415: Spar min; /* min limits (for fast checking) */
416: Spar max; /* max limits (for fast checking) */
417: Rec r; /* rectangular parallelopiped in Liv space */
418: Pval fr; /* fraction of training set covered */
419: short nuse; /* for current blob, no. uses */
420: float nocc; /* occurrences: no. blobs with >=1 of these */
421: float ndup; /* duplicates: no. blobs with >=2 of these */
422: float mind; /* minimum scaled distance from cluster among uses */
423: float merit; /* merit score resulting from 'nuse' matches to this */
424: struct Ss *ne; /* ptr to next in list */
425: } Ss;
426:
427: #define MAX_SS 8192 /* see 'kdt.h' for reasons */
428:
429: /* BMask: 1-d, variable-length packed bitstring (N = no. bits). The string
430: is stored in an array of (unsigned int). It is often accessed via a fast
431: ascending sequence of 'short' pointers (unsigned short *) or (unsigned char *):
432: in these cases, enough are used to completely cover all the (unsigned int)s,
433: even though that may be more than enough, to ensure that the result is
434: insensitive to machine-dependent short-order-in-ints and char-order-in-shorts.
435: BMask_ni(N) no. unsigned ints holding bit-data
436: BMask_si(N) no. unsigned shorts covering bit-data (exactly 2x _ni)
437: BMask_ci(N) no. unsigned chars covering bit-data (exactly 4x _ni)
438: BMask_size(N) total no. bytes in, or pointed to by BMask:
439: sizeof(n) + sizeof(mny) + sizeof(r) + sizeof(malloc space)
440: */
441: #define BMask_ni(N) (((N)+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))
442: #define BMask_si(N) (2*BMask_ni(N))
443: #define BMask_ci(N) (4*BMask_ni(N))
444: #define BMask_size(N) (3*sizeof(unsigned int)+(BMask_ci((N))))
445:
446: typedef struct BMask {
447: unsigned int n; /* no. of bits stored (==N above) */
448: unsigned int mny; /* no. bits set to 1 */
449: unsigned int r; /* represents `r' BMasks altogether */
450: union { /* packed bits: 0th bit is 01 */
451: unsigned int *i; /* malloc space: int [Bmask_ni] */
452: unsigned short *s; /* malloc space: short [Bmask_si] */
453: int ii; /* index into (unsigned int)[] array */
454: int si; /* index into (unsigned short)[] array */
455: } u;
456: } BMask;
457:
458: #define Init_BMask {0,0,0,}
459: #if MAIN
460: BMask empty_BMask = Init_BMask;
461: #else
462: extern BMask empty_BMask;
463: #endif
464:
465:
466: typedef struct BMasks {
467: unsigned short mny; /* no. BMasks */
468: unsigned short r; /* represents `r' BMasks altogether */
469: unsigned short shallow; /* 0 <= shallow <= mny */
470: unsigned short alloc; /* no. items allocated in .a[] */
471: union { BMask *a; /* array[mny] of BMasks */
472: int bi; /* index into (BMask)[] array */
473: } u;
474: } BMasks;
475:
476: #define Init_BMasks {0,0,0,0,}
477: #if MAIN
478: BMasks empty_BMasks = Init_BMasks;
479: #else
480: extern empty_BMasks;
481: #endif
482:
483: /* Sh - shape list-item */
484: typedef struct Sh {
485: Seq seq; /* unique sequence no. */
486: short t; /* shape type: S, H, X, etc */
487: short nss; /* no. sub-shapes in the list */
488: float mess; /* mean no. sub-shapes in training set */
489: float sdss; /* std-dev of sub-shapes in training set */
490: float NAocc; /* prob at least one shape not-assigned */
491: float NAdup; /* prob more than one not-assigned */
492: Ss NAss; /* "not-assigned" data */
493: Ss *fi; /* first sub-shape */
494: Ss *la; /* last sub-shape */
495: struct Sh *ne; /* next shape */
496: } Sh;
497:
498: /* Cl - class list-item */
499: typedef struct Cl {
500: Seq seq; /* unique sequence no. 0,1,... */
501: Cln c; /* class name */
502: float shNA; /* fraction of shapes unassigned */
503: float blDP; /* fraction of blobs w/ >=1 duplicate shape-match*/
504: float blAL; /* average extra alternate shape-matches / blob */
505: SFv sf_me; /* scalar-features: means, std-devs */
506: SFv sf_sd;
507: BMask bm; /* canonical BMask */
508: BMasks bms; /* additional representative BMask records */
509: Sh *sha[Sh_MNY]; /* table of pointers to shape-types */
510: Sh *fi; /* first owned shape */
511: Sh *la; /* last owned shape */
512: short unmat[Sh_MNY]; /* counts of unmatched shapes/shape-type */
513: struct Ssm *ssmfi; /* first sub-shape match for this class */
514: TRtr *tr; /* pointer to tracer decision tree (if any) */
515: TRv tr_me; /* tracer-features: means, std-devs */
516: TRv tr_sd;
517: float m_me; /* mean, std-err of merit (in training set) */
518: float m_sd;
519: float bayes; /* Bayesian merit: a posteriori log-probability */
520: Merit m01; /* Haming, etc. merit in range [0,1] */
521: Merit merit; /* sort and truncate based on this merit */
522: short pass; /* the last classification method this class passed */
523: int ch_mny; /* No. Chars of this class in a subset */
524: int ss_mny; /* No. Chars with given feature */
525: boolean force_reseg; /* forcibly resegment Chars of this Class */
526: struct Cl *ne; /* next class */
527: } Cl;
528:
529: /* MAX_CL (max no. of classes) is defined in CPU.h */
530: #define MAX_SH (MAX_CL*SH_MNY)
531:
532: typedef struct Classes {
533: int mny; /* number of items in array */
534: Cl **clpa; /* Cl *clpa[cl_mny+1]: NULL-term'd array of ptrs */
535: } Classes;
536: #define Init_Classes {0,NULL}
537: #if MAIN
538: Classes empty_Classes = Init_Classes;
539: #else
540: extern Classes empty_Classes;
541: #endif
542:
543: typedef struct Ssm { /* sub-shape match record */
544: Seq isn; /* input shape sequence no (w/in blob) */
545: Cl *clp; /* owning class, shape, sub-shape... */
546: Sh *shp;
547: Ss *ssp;
548: float mind; /* distance to closest assigned sub-shape */
549: boolean alt; /* T if this is an alternative (not the first) */
550: struct Ssm *ne; /* next, prior ptrs in list */
551: struct Ssm *pr;
552: } Ssm;
553:
554: /* return pathname of OCR directory; if environment variable OCRDIR
555: is set, it is used; otherwise #defined variable OCRDIR is used. */
556: #if MAIN
557: char *getenv();
558: char *ocrdir()
559: { char *ocrdir_ev;
560: if((ocrdir_ev=getenv("OCRDIR"))!=NULL) {
561: return(ocrdir_ev);
562: }
563: else return(OCRDIR);
564: }
565: #else
566: char *ocrdir();
567: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.