|
|
/**************************************************************************\
* FILE: zillatool.h * * Lists functions Zilla exports to its tools but nothing else. \**************************************************************************/
#ifndef ZILLATOOL_H
#define ZILLATOOL_H
#include "runnet.h"
#ifdef __cplusplus
extern "C" { #endif
// Version of primitive with x and y values stored in bytes, not nibbles.
#pragma pack(1)
typedef struct tagBIGPRIM { BYTE code; /* 0-15 stroke fpendown, 4 unused bits. */ BYTE x1; BYTE x2; BYTE y1; BYTE y2; } BIGPRIM, *PBIGPRIM; #pragma pack()
#ifdef ZTRAIN
typedef struct tagTRAININFO { WORD wclass; BYTE rgfInfo; BYTE cstrokes; int chits; // How many times this guy appeared in the top10 correctly
int cmishits; // How many times this guy appeared incorrectly top1
int cattempts; // How many times this guy appeared in the top10 list
float eHits; // How many times this guy appeared in the top10 correctly
float eMishits; // How many times this guy appeared incorrectly top1
float eAttempts; // How many times this guy appeared in the top10 list before the correct answer
} TRAININFO; #endif
typedef struct tagGEOMETRIC { BYTE x1:4; /* start x-coord */ BYTE x2:4; /* end x */ BYTE y1:4; /* start y-coord */ BYTE y2:4; /* end y */ } GEOMETRIC;
#pragma pack(1)
typedef struct tagPRIMITIVE { BYTE code;
union { struct { BYTE x1:4; /* start x-coord */ BYTE x2:4; /* end x */ BYTE y1:4; /* start y-coord */ BYTE y2:4; /* end y */ };
char rgch[2]; }; } PRIMITIVE, *PPRIMITIVE; #pragma pack()
typedef struct tagPROTOHEADER { DWORD cprotoRom; WORD *rgdbcRom; BYTE *rgfeatRom; GEOMETRIC *rggeomRom; #ifdef ZTRAIN
DWORD cprotoDynamic; WORD *rgdbcDynamic; PRIMITIVE *rgprimDynamic;
TRAININFO **rgptraininfo; #endif // ZTRAIN
} PROTOHEADER;
typedef struct tagMATCH { SYM sym; WORD dist; #ifdef ZTRAIN
TRAININFO *ptraininfo; #endif // ZTRAIN
} MATCH;
typedef struct tagPROTOTYPE { WORD dbc; GEOMETRIC *rggeom; BYTE *rgfeat; BOOL nybble; RECMASK recmask;
#ifdef ZTRAIN
PRIMITIVE *rgprim; TRAININFO *ptraininfo; #endif // ZTRAIN
} PROTOTYPE;
typedef struct tagBIGPROTOTYPE { WORD dbc; PBIGPRIM rgprim; ALC recmask;
#ifdef ZTRAIN
TRAININFO *ptraininfo; #endif // ZTRAIN
} BIGPROTOTYPE;
// Internal constants needed by the tools.
#define CMATCHMAX 20
#define CPRIM_DIFF 18 // number of different primitives
#define CPRIMMAX 30 // max primitives per character.
#define GEOM_DIST_MAX 900 // maximum geometric distance for 1 prim
// Internal declerations needed by tools.
typedef BYTE **COST_TABLE;
// Featurize ink
int ZillaFeaturize(GLYPH **glyph, BIGPRIM *rgprim, BYTE *pHoundFeat);
// Globals to hold pointers to loaded data.
extern PROTOHEADER mpcfeatproto[CPRIMMAX];
extern int g_iCostTableSize; extern COST_TABLE g_ppCostTable; extern BYTE *pGeomCost;
// Magic key the identifies the NN bin file
#define ZILLA_HOUND_FILE_TYPE 0x31142253
// Version information for file.
#define ZILLA_HOUND_MIN_FILE_VERSION 0 // First version of code that can read this file
#define ZILLA_HOUND_OLD_FILE_VERSION 0 // Oldest file version this code can read.
#define ZILLA_HOUND_CUR_FILE_VERSION 0 // Current version of code.
// Load info for Zilla-Hound
typedef struct tagZILLA_HOUND_LOAD_INFO { LOAD_INFO info; LOCAL_NET net; int iNetSize; } ZILLA_HOUND_LOAD_INFO;
// Feature count information for Zilla/Hound combiner net
#define NUM_ZILLA_HOUND_ALTERNATES 4
#define NUM_ZILLA_HOUND_FEATURES 9
// Load the Zilla-Hound combining net.
BOOL ZillaHoundLoadFile(wchar_t *wszPath);
// Unload the Zilla-Hound combining net.
BOOL ZillaHoundUnloadFile();
// Load from a resource.
BOOL ZillaHoundLoadRes(HINSTANCE hInst, int nResID, int nType);
// Given Zilla results run Hound and combine the results.
void ZillaHoundMatch(MATCH *pMatch, int cPrim, BYTE *pSampleVector, LOCRUN_INFO *pLocRunInfo);
// Generate features used by Zilla/Hound combiner net.
RREAL *ZillaHoundFeat( MATCH *pMatch, int cPrim, BYTE *pSampleVector, RREAL *pZillaHoundNetMemory, LOCRUN_INFO *pLocRunInfo );
// Train time only stuff
#ifdef ZTRAIN
// Flags set per prototype during training.
#define MASK_INFO_IN 0x01 // Prototype has been added to database
#define MASK_INFO_NOISY 0x04 // Don't match against this prototype
#define IsInsertedLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo & MASK_INFO_IN)
#define MarkInsertedLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo |= MASK_INFO_IN)
#define MarkNoisyLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo |= MASK_INFO_NOISY)
#define MarkNotNoisyLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo &= ~MASK_INFO_NOISY)
#define IsNoisyLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo & MASK_INFO_NOISY)
#define ProtoheaderFromMpcfeatproto(cprim) &(mpcfeatproto[cprim])
#define GetCprotoDynamicPROTOHEADER(pprotohdr) \
((pprotohdr)->cprotoDynamic) #define SetCprotoDynamicPROTOHEADER(pprotohdr, cproto) \
((pprotohdr)->cprotoDynamic = (cproto))
#define PrototypeFromPROTOHEADER(pprotohdr, cprim, iproto, proto) { \
if ((iproto) < (pprotohdr)->cprotoRom) { \ ASSERT(0); \ } else { \ UINT iprotoD = (iproto) - (pprotohdr)->cprotoRom; \ ASSERT(iprotoD < (pprotohdr)->cprotoDynamic); \ (proto).dbc = (pprotohdr)->rgdbcDynamic[iprotoD]; \ (proto).rgprim = &((pprotohdr)->rgprimDynamic[(cprim) * (iprotoD)]);\ } \ (proto).recmask = LocRun2ALC(&g_locRunInfo, (proto).dbc); \ SetTraininfoPROTO(proto, (pprotohdr), iproto); \ }
#define SetTraininfoPROTO(proto, pphdr, iproto) \
(proto).ptraininfo = (pphdr)->rgptraininfo[iproto]
// Write out the cost calc table.
BOOL CostCalcWriteFile(COST_TABLE ppCostTable, int iCostTableSize, FILE *pFile, wchar_t *pLocale);
// Write out the geostats table.
BOOL GeoStatWriteFile(BYTE *pGeomCost, FILE *pFile, wchar_t *pLocale);
// Match primitives with extra stuff for training.
extern VOID MatchPrimitivesTrain( const BIGPRIM * const pprim, // Featurized Query
const UINT cprim, // Number of features in query (aka feature space)
MATCH * const rgmatch, // Output: ranked list of characters and distances
const UINT cmatchmax, // size of rgmatch array
const CHARSET * const cs, // Allowed character set
const FLOAT zillaGeo // How important geometrics are vs. features.
);
BOOL AddPrototypeToDatabase(BIGPRIM *pprim, int cprim, WORD wTrain, VOID *pti); BOOL TrimDatabase(VOID); BOOL WriteTextDatabase(FILE *fpText, FILE *fpLog); BOOL WriteZillaDat(LOCRUN_INFO *pLocRunInfo, FILE *cp, wchar_t *pLocale, BOOL bNibbleFeat); VOID FreeDynamicMpcfeatproto(VOID); int ComputeZillaSize(void); void GetDynamicProto(PROTOHEADER *pphdr, UINT cprim, UINT iproto, BIGPROTOTYPE *proto); int CountPrototypes(void);
#endif
#ifdef __cplusplus
}; #endif
#endif // ZILLATOOL_H
|