Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

177 lines
3.4 KiB

/****************************************************************
*
* NAME: confidence.c
*
*
* DESCRIPTION:
*
* Common code to run confidence. This is common for all languages.
* Some languages may not support confidences then we just set the default values
*
*
* HISTORY
*
* Introduced March 2002 (mrevow)
*
***************************************************************/
#include <common.h>
#include <limits.h>
#include <nfeature.h>
#include <engine.h>
#include <nnet.h>
#include <charmap.h>
#include <charcost.h>
#include <runNet.h>
#include <avalanche.h>
#include <avalanchep.h>
#include <confidence.h>
#include <resource.h>
static LOCAL_NET s_confidenceNet = {0};
static int s_cConfidenceNet = 0;
// Attempt to load for languages - It is not ann error if it fails
// Simply means that the language does not support confidence
BOOL LoadConfidenceNets (HINSTANCE hInst)
{
if ( FALSE == loadNet(hInst, RESID_AVAL_CONFIDENCE, &s_cConfidenceNet, &s_confidenceNet))
{
memset(&s_confidenceNet, 0, sizeof(s_confidenceNet));
s_cConfidenceNet = 0;
}
return TRUE;
}
// Unload Confidence nets
void UnLoadConfidenceNets()
{
}
//create a sort indedx array for the best order of the
// alt list outputs
static BOOL GetIndexes(int *pOutput,int cAlt,int *pOutIndex)
{
int *pSortOutput = NULL;
int c,temp1,temp2,j;
if (!(pSortOutput=(int *)ExternAlloc(sizeof(int)*cAlt)))
return 0;
//Initialize pOutIndex and pSortOutput
for (c=0;c<cAlt;++c)
{
pOutIndex[c]=c;
pSortOutput[c]=pOutput[c];
}
for (c=0;c<=cAlt-1;++c)
{
for (j=0;j<cAlt-1-c;j++)
{ if ( pSortOutput[j] < pSortOutput[j+1])
{
temp1=pSortOutput[j];
pSortOutput[j]=pSortOutput[j+1];
pSortOutput[j+1]=temp1;
temp2=pOutIndex[j];
pOutIndex[j]=pOutIndex[j+1];
pOutIndex[j+1]=temp2;
}
}
}
ExternFree(pSortOutput);
return 1;
}
// run the confidence nets if available
// Set default value if not available
BOOL ConfidenceLevel(XRC *pxrc, void *pAlt, ALTINFO *pAltInfo, RREAL *pOutput)
{
int cAlt;
int c, cOut, iWin;
PALTERNATES *pAvalAlt=(PALTERNATES *)pAlt;
int *pOutIndex = NULL;
RREAL *pConfFeat = NULL, *pFeat, *pOut;
int iRet = FALSE;
// Some languages will not have a confidence net
if (0 == s_cConfidenceNet)
{
return FALSE;
}
cAlt= min (pxrc->answer.cAlt, (unsigned int)pAltInfo->NumCand);
//Check the range of the number of candiudates
ASSERT(cAlt>=0);
ASSERT(cAlt<=TOT_CAND);
if (!(pOutIndex=(int *)ExternAlloc(sizeof(int)*cAlt)))
{
// Nothing allocated yet - just return
return 0 ;
}
if (!(pConfFeat=(RREAL *)ExternAlloc(sizeof(RREAL) * s_cConfidenceNet)))
{
goto fail;
}
if (!GetIndexes(pOutput, cAlt, pOutIndex))
{
goto fail;
}
pFeat = pConfFeat;
for (c = 0 ; c < cAlt ; c++)
{
*pFeat++ = pAltInfo->aCandInfo[pOutIndex[c]].Callig;
*pFeat++ = pAltInfo->aCandInfo[pOutIndex[c]].NN;
*pFeat++ = pAltInfo->aCandInfo[pOutIndex[c]].InfCharCost;
*pFeat++ = c;
}
for ( ; c < TOT_CAND; c++)
{
*pFeat++ = INT_MIN;
*pFeat++ = INT_MAX;
*pFeat++ = INT_MAX;
*pFeat++ = c;
}
ASSERT(pFeat - pConfFeat == s_confidenceNet.runNet.cUnitsPerLayer[0]);
pOut = runLocalConnectNet(&s_confidenceNet, pConfFeat, &iWin, &cOut);
if (*pOut > CONFIDENCE_NET_THRESHOLD)
{
pxrc->answer.iConfidence=RECOCONF_MEDIUMCONFIDENCE;
}
else
{
pxrc->answer.iConfidence=RECOCONF_LOWCONFIDENCE;
}
// Success
iRet = TRUE;
fail:
ExternFree(pOutIndex);
ExternFree(pConfFeat);
return iRet;
}