|
|
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.