?? prob_calc.cpp
字號:
/*
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright(c) 1999-2006 Intel Corporation. All Rights Reserved.
//
// Intel(R) Integrated Performance Primitives Gaussian Mixture Sample for Windows*
//
// By downloading and installing this sample, you hereby agree that the
// accompanying Materials are being provided to you under the terms and
// conditions of the End User License Agreement for the Intel(R) Integrated
// Performance Primitives product previously accepted by you. Please refer
// to the file ippEULA.rtf located in the root directory of your Intel(R) IPP
// product installation for more information.
//
//
// Gaussian Mixture Calculation Class
//
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ipps.h>
#include <ippsr.h>
#include "prob_calc.h"
#include "feat_calc.h"
struct Param_File_Header{
int vecSize; // feature vector size
unsigned short maxComp; // maximum component number in mixture
unsigned short fileType; // mixture parameter file type
int mixNum; // number of Gaussian mixtures
int wgtNum; // total number of weights
int gaussNum; // total number of Gaussians
int trpNum; // total number of transition values
};
struct File_Mixture{
int compNum; // component number
int wgtInd; // compInd of the first weight
int compInd; // compInd of the first component
};
/////////////////////////////////////////////////////////////
// //
// Mixture parameter file structure //
// //
// Param_File_Header header; //
// File_Mixture exstates[header.mixNum] //
// float weights[wgtNum] //
// float means[wgtNum*((vecSize+3)&(-3))] //
// float vars[wgtNum*((vecSize+3)&(-3))] //
// float dets[wgtNum] //
// float trpdets[trpNum] //
// //
/////////////////////////////////////////////////////////////
Prob_Calc::Prob_Calc(Calc_Hint hint) {
state_number = 0;
max_gauss = 0;
space_dim = 0;
gauss_num = 0;
max_len = 0;
min_len = 0;
space_dim4 = 0;
state_number4= 0;
gauss_num4 = 0;
curidx = 0;
lastidx = 0;
delta_delay = 0;
sen_end = false;
type = hint;
feat = NULL;
buffer = NULL;
features = NULL;
tmp_prob = NULL;
states = NULL;
weights = NULL;
dets = NULL;
means = NULL;
vars = NULL;
curfeat = NULL;
endfeat = NULL;
lastfeat = NULL;
flog = NULL;
ready = -2;
}
int Prob_Calc::Init_Arrays(void) {
int model_len=0;
if ((type!=calcNone)&&(type!=calcVect)&&(type!=calcVecM)&&(type!=calcMMix)&&(type!=calcMix))
return -1;
if (state_number<=0) return -1;
if (max_gauss<=0) return -1;
if (space_dim<=0) return -1;
if (max_len<=0) return -1;
if (min_len<=0) return -1;
if (max_len<100) max_len=100;
if (min_len<12) min_len=12;
if (min_len>(max_len>>3)) min_len=(max_len>>3);
space_dim4=(space_dim+3)&(~3);
state_number4=(state_number+3)&(~3);
gauss_num4=(gauss_num+3)&(~3);
model_len=sizeof(Mixture)*state_number4+sizeof(float)*(gauss_num4+gauss_num4+
gauss_num*space_dim4+gauss_num*space_dim4);
if (!(features = ippsMalloc_32f(space_dim4*max_len))) return -2;
int tmp_len=(max_gauss>max_len)?max_gauss:max_len;
if (!(tmp_prob = ippsMalloc_32f(tmp_len))) return -2;
if (!(buffer = (void*)ippsMalloc_8u(model_len))) return -2;
states = (Mixture*)buffer;
weights = (float*)(states+state_number4);
dets = weights+gauss_num4;
means = dets+gauss_num4;
vars = means+gauss_num*space_dim4;
return 0;
}
int Prob_Calc::Init_LogFile(char *feat_log) {
if (ready!=-1) return -10;
if (!feat_log) {
flog=NULL;
} else if (!feat_log[0]) {
flog=NULL;
} else {
if (!(flog=fopen(feat_log, "wb"))) return -3;
}
return 0;
}
int Prob_Calc::Init_Calc(int N, int G, int L, int F, int M) {
if (ready!=-2) return -10;
state_number = N;
max_gauss = G;
space_dim = L;
max_len = F;
min_len = M;
gauss_num = state_number*max_gauss;
int ret=Init_Arrays();
if (ret<0) return ret;
for (int i=0; i<state_number; i++) {
states[i].compInd=i*max_gauss;
states[i].compNum=max_gauss;
}
ippsSet_32f(1.0f/(float)max_gauss,weights,state_number);
ippsSet_32f((float)space_dim,dets,state_number);
ippsSet_32f(0.0f,means,state_number*space_dim4);
ippsSet_32f(1.0f,vars,state_number*space_dim4);
ippsOutProbPreCalc_32f_I(Weight(0),Det(0),gauss_num);
ready=-1;
return 0;
}
static FILE* create_param_file(char *file, int stateNum, int maxComp, int vecSize, int trpNum) {
Param_File_Header header;
FILE *fptr=NULL;
int i;
if (!(fptr=fopen(file, "wb"))) return fptr;
header.vecSize=vecSize;
header.maxComp=3;
header.fileType=0;
header.mixNum=stateNum;
header.wgtNum=stateNum*maxComp;
header.gaussNum=stateNum*maxComp;
header.trpNum=trpNum;
if (fwrite((void*)(&header), sizeof(Param_File_Header), 1, fptr)<1) {
fclose(fptr); return fptr;
}
File_Mixture *states=(File_Mixture*)calloc(sizeof(File_Mixture),header.mixNum);
if (!states) {
fclose(fptr); return fptr;
}
for (i=0; i<header.mixNum; i++) {
states[i].compNum=maxComp;
states[i].wgtInd=maxComp*i;
states[i].compInd=maxComp*i;
}
if (fwrite((void*)(states), sizeof(File_Mixture), header.mixNum, fptr)<1) {
fclose(fptr); return fptr;
}
free(states);
float *weights=(float*)calloc(sizeof(float),header.wgtNum);
for (i=0; i<header.mixNum; i++) {
// weights[i]=(float)log(1.0/maxComp);
weights[i]=-1.0f-((float)(rand())/(float)RAND_MAX); // -2.0 ... -1.0
}
if (fwrite((void*)(weights), sizeof(float)*header.wgtNum, 1, fptr)<1) {
fclose(fptr); return fptr;
}
free(weights);
float *means=(float*)calloc(sizeof(float),header.gaussNum*((header.vecSize+3)&(-3)));
for (i=0; i<stateNum*((header.vecSize+3)&(-3)); i++) {
// means[i]=0.0f;
means[i]=-4.0f+((float)(rand())*8.0f/(float)RAND_MAX); // -4.0 ... 4.0
}
if (fwrite((void*)(means), sizeof(float)*header.gaussNum*((header.vecSize+3)&(-3)), 1, fptr)<1) {
fclose(fptr); return fptr;
}
free(means);
float *vars=(float*)calloc(sizeof(float),header.gaussNum*((header.vecSize+3)&(-3)));
for (i=0; i<stateNum*((header.vecSize+3)&(-3)); i++) {
// vars[i]=1.0f;
vars[i]=0.1f+((float)(rand())*0.4f/(float)RAND_MAX); // 0.1 ... 0.5
}
if (fwrite((void*)(vars), sizeof(float)*header.gaussNum*((header.vecSize+3)&(-3)), 1, fptr)<1) {
fclose(fptr); return fptr;
}
free(vars);
float *dets=(float*)calloc(sizeof(float),header.gaussNum);
for (i=0; i<header.mixNum; i++) {
// dets[i]=10.0f;
dets[i]=90.0f+((float)(rand())*40.0f/(float)RAND_MAX); // 90.0 ... 130.0
}
if (fwrite((void*)(dets), sizeof(float)*header.gaussNum, 1, fptr)<1) {
fclose(fptr); return fptr;
}
free(dets);
float *trans=(float*)calloc(sizeof(float),header.trpNum);
for (i=0; i<header.trpNum; i++) {
trans[i]=0.1f;
}
if (fwrite((void*)(trans), sizeof(float), header.trpNum, fptr)<1) {
fclose(fptr); return fptr;
}
free(trans);
fclose(fptr);
fptr=fopen(file, "rb");
return fptr;
}
int Prob_Calc::Init_Calc(char* file, int F, int M) {
int i;
FILE *fptr;
Param_File_Header header;
File_Mixture *exstates=NULL;
if (ready!=-2) return -10;
if (!(fptr=fopen(file, "rb")))
if (!(fptr=create_param_file(file,6000,4,36,100))) return -3;
if (fread((void*)(&header), sizeof(Param_File_Header), 1, fptr)<1) {
fclose(fptr); return -3;
}
state_number = header.mixNum;
max_gauss = 1;
space_dim = header.vecSize;
max_len = F;
min_len = M;
gauss_num = header.wgtNum;
if (gauss_num<=0) {fclose(fptr); return -1;}
if (header.fileType&0x0111!=0) {fclose(fptr); return -1;}
int ret=Init_Arrays();
if (ret<0) {fclose(fptr); return ret;};
if (!(exstates = (File_Mixture*)malloc(sizeof(File_Mixture)*state_number)))
return -2;
if ((int)fread((void*)exstates, sizeof(File_Mixture), state_number, fptr)<state_number) {
fclose(fptr); free(exstates); return -3;
}
for (i=0; i<state_number; i++) {
if (max_gauss<exstates[i].compNum) max_gauss=exstates[i].compNum;
states[i].compInd=exstates[i].compInd;
states[i].compNum=exstates[i].compNum;
}
free(exstates);
if ((int)fread((void*)weights, sizeof(float), gauss_num, fptr)<gauss_num) {
fclose(fptr); return -3;
}
if ((int)fread((void*)means, sizeof(float)*space_dim4, gauss_num, fptr)<gauss_num) {
fclose(fptr); return -3;
}
if ((int)fread((void*)vars, sizeof(float)*space_dim4, gauss_num, fptr)<gauss_num) {
fclose(fptr); return -3;
}
if ((int)fread((void*)dets, sizeof(float), gauss_num, fptr)<gauss_num) {
fclose(fptr); return -3;
}
fclose(fptr);
ippsOutProbPreCalc_32f_I(Weight(0),Det(0),gauss_num);
ready=-1;
return 0;
}
Prob_Calc::~Prob_Calc(void) {
state_number = 0;
max_gauss = 0;
space_dim = 0;
gauss_num = 0;
max_len = 0;
min_len = 0;
space_dim4 = 0;
state_number4= 0;
gauss_num4 = 0;
curidx = 0;
lastidx = 0;
delta_delay = 0;
sen_end = false;
type = calcNone;
if (features) ippsFree(features);
if (tmp_prob) ippsFree(tmp_prob);
if (buffer) ippsFree(buffer);
if (flog) fclose(flog);
feat = NULL;
buffer = NULL;
features = NULL;
tmp_prob = NULL;
states = NULL;
weights = NULL;
dets = NULL;
means = NULL;
vars = NULL;
curfeat = NULL;
endfeat = NULL;
lastfeat = NULL;
flog = NULL;
ready = -2;
}
bool Prob_Calc::Attach_Feat(Feat_Calc *f) {
if (ready!=-1) return false;
feat=f;
if (!feat) return false;
if (!feat->Ready()) return false;
if (feat->Feature_Length()!=space_dim) return false;
sen_end = false;
curfeat = features;
endfeat = features;
lastfeat = features;
curidx = 0;
lastidx = 0;
delta_delay = feat->Delta_Delay();
if (flog)
feat->Write_LogHeader(flog);
ready = 0;
return true;
}
bool Prob_Calc::Detach_Feat(void) {
if (ready!=0) return false;
sen_end=true;
feat=NULL;
curfeat=NULL;
endfeat=NULL;
lastfeat=NULL;
curidx=0;
lastidx=0;
delta_delay=0;
ready=-1;
if (flog)
fclose(flog);
flog=NULL;
return true;
}
bool Prob_Calc::Step_Forward(void) {
if (ready!=0) return false;
curfeat+=space_dim4;
curidx++;
if ((sen_end)&&(lastidx==curidx)) {
return false;
} else if (curidx>=max_len-min_len-delta_delay) { // switch to buffer beginning
ippsCopy_32f(curfeat,features,lastfeat-curfeat+delta_delay*space_dim4);
lastfeat=features+(lastfeat-curfeat);
lastidx=lastidx-curidx;
curfeat=features;
curidx=0;
}
return true;
}
int Prob_Calc::Obv_Prob_Vec(int state, float *result, int len) {
int m,num;
if (ready!=0) return -1;
if (!sen_end) {
if (lastidx-curidx<min_len) {
num=feat->Get_Feature(lastfeat,max_len-lastidx,&sen_end);
if (flog)
for (m=0; m<num; m++)
fwrite((void*)(lastfeat+m*space_dim4), sizeof(float), space_dim, flog);
// here wait if num==0 if features are consumed faster
lastidx+=num;
lastfeat+=num*space_dim4;
}
}
num=lastidx-curidx;
if (len<num) num=len;
float *mean=Mean(state);
float *var=Var(state);
float *det=Det(state);
float *feat=curfeat;
switch (type) {
case calcVect:
ippsLogGauss_32f_D2(curfeat,space_dim4,mean,var,space_dim,result,num,det[0]);
for (m=1; m<states[state].compNum; m++) {
mean+=space_dim4;
var+=space_dim4;
ippsLogGaussAdd_32f_D2(curfeat,space_dim4,mean,var,space_dim,result,num,det[m]);
}
break;
case calcVecM:
ippsLogGauss_32f_D2(curfeat,space_dim4,mean,var,space_dim,result,num,det[0]);
for (m=1; m<states[state].compNum; m++) {
mean+=space_dim4;
var+=space_dim4;
ippsLogGaussMax_32f_D2(curfeat,space_dim4,mean,var,space_dim,result,num,det[m]);
}
break;
case calcMMix:
for (m=0; m<num; m++) {
ippsCopy_32f(det,tmp_prob,states[state].compNum);
ippsLogGaussMultiMix_32f_D2(mean,var,space_dim4,feat,space_dim,
tmp_prob,states[state].compNum);
ippsLogSum_32f(tmp_prob,result+m,states[state].compNum,ippAlgHintNone);
feat+=space_dim4;
}
break;
case calcMix:
for (m=0; m<num; m++) {
ippsLogGaussMixture_32f_D2(feat,mean,var,states[state].compNum,space_dim4,
space_dim,det,result+m);
feat+=space_dim4;
}
break;
case calcNone:
fake_sum=det[0];
for (m=0; m<space_dim4*states[state].compNum; m+=8)
fake_sum+=mean[m];
for (m=0; m<space_dim4*states[state].compNum; m+=8)
fake_sum+=var[m];
for (m=0; m<space_dim4*num; m+=8)
fake_sum+=curfeat[m];
break;
default:
return -1;
}
return num;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -