Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define MEDI_ENTRO_MAXQUANT 31
- #define EC_MAXIO 72
- #define EC_MAXDATA 1048576
- #define ENT_QUATYPE_NON 0
- #define ENT_QUATYPE_LIN 1
- #define ENT_QUATYPE_LOG 2
- #define ENT_QUATYPE_EXP 3
- #define ENT_QUATYPE_SIN 4
- #define ENT_QUATYPE_COS 5
- struct ent {unsigned int count[MEDI_ENTRO_MAXQUANT];
- unsigned int cross_table[MEDI_ENTRO_MAXQUANT][MEDI_ENTRO_MAXQUANT];
- unsigned int quant;
- unsigned int q_type;
- unsigned int data_len;
- double maxinfo;
- double entropy;
- double yield;
- double min;
- double max;
- unsigned char *qua;
- double *org;
- unsigned int op_ndx;
- }WENT,EC_Entropy[EC_MAXIO];
- unsigned int EC_ioNum;
- unsigned int EC_opNDX;
- unsigned int EC_DataNum;
- char EC_IOname [EC_MAXIO][64];
- double QUAwork_data [EC_MAXDATA];
- unsigned int QUAwork_ndx [EC_MAXDATA];
- unsigned char EC_QUAdata [EC_MAXIO][EC_MAXDATA];
- double EC_ORGdata [EC_MAXIO][EC_MAXDATA];
- double EcClassTol;
- //----------------------------------------------------------------------------------------------
- //----------------------------------------------------------------------------------------------
- void MediPrepareEntropy(unsigned int wich)
- {unsigned int i,j;
- i=0;while(i<MEDI_ENTRO_MAXQUANT)
- {WENT.count[i]=0;j=0;while(j<MEDI_ENTRO_MAXQUANT){WENT.cross_table[i][j]=0;j++;}i++;}
- i=0;while(i<EC_MAXDATA){QUAwork_data[i]=0.00;QUAwork_ndx[i]=0;i++;}
- WENT.quant=2;
- WENT.q_type=ENT_QUATYPE_LIN;
- WENT.data_len=EC_DataNum;
- WENT.maxinfo=0.00;
- WENT.entropy=0.00;
- WENT.yield=0.00;
- WENT.min=0.00;
- WENT.max=0.00;
- WENT.qua=&EC_QUAdata[wich][0];
- WENT.org=&EC_ORGdata[wich][0];
- WENT.op_ndx=EC_opNDX;
- }
- //----------------------------------------------------------------------------------------------
- //----------------------------------------------------------------------------------------------
- void EC_quantDCLASS(void)
- {unsigned int i,j,ndx,qval;
- qval=0;j=0;
- i=0;while(i<WENT.data_len)
- {j=0;while(j<WENT.count[qval])
- {ndx=QUAwork_ndx[i];
- WENT.qua[ndx]=qval;
- j++;i++;
- }
- qval++;
- }
- }
- //----------------------------------------------------------------------------------------------
- void ClassCounterLIN(void)
- {unsigned int i,j;
- double step;
- double delta;
- //printf(" LIN ");
- delta=(WENT.max-WENT.min);
- step=(delta)/(double)WENT.quant;
- EcClassTol=delta*0.000001;
- i=0;while(i<WENT.data_len)
- {j=0;while(j<WENT.quant)
- {if(WENT.org[i]<=(EcClassTol+WENT.min+((j+1)*step))){WENT.count[j]++;break;}j++;}
- i++;
- }
- }
- //..............................................................................................
- void EC_quantLIN(void){ClassCounterLIN();EC_quantDCLASS();}
- //----------------------------------------------------------------------------------------------
- void ClassCounterLOG(void)
- {unsigned int i,j;
- double step,add_step;
- unsigned int base;
- double delta;
- //printf(" LOG ");
- base=(1<<WENT.quant)-1;
- delta=(WENT.max-WENT.min);
- i=0;while(i<WENT.data_len)
- {add_step=((delta)/(double)base)*(1<<(WENT.quant-1));
- step=add_step;EcClassTol=delta*0.000001;
- j=0;while(j<WENT.quant)
- {if(WENT.org[i]<=(EcClassTol+WENT.min+step)){WENT.count[j]++;break;}
- add_step/=2.00;step+=add_step;j++;
- }
- i++;
- }
- }
- //..............................................................................................
- void EC_quantLOG(void){ClassCounterLOG();EC_quantDCLASS();}
- //----------------------------------------------------------------------------------------------
- void ClassCounterEXP(void)
- {unsigned int i,j;
- double step,add_step;
- unsigned int base;
- double delta;
- //printf(" EXP ");
- base=(1<<WENT.quant)-1;
- delta=(WENT.max-WENT.min);
- i=0;while(i<WENT.data_len)
- {add_step=delta/(double)base;
- step=add_step;EcClassTol=delta*0.000001;
- j=0;while(j<WENT.quant)
- {if(WENT.org[i]<=(EcClassTol+WENT.min+step)){WENT.count[j]++;break;}
- add_step*=2.00;step+=add_step;j++;
- }
- i++;
- }
- }
- //..............................................................................................
- void EC_quantEXP(void){ClassCounterEXP();EC_quantDCLASS();}
- //----------------------------------------------------------------------------------------------
- void ClassCounterSIN(void)
- {unsigned int i,j;
- double step,tmpd;
- double nfact_X,nfact_Y;
- double delta,fx;
- //printf(" SIN ");
- delta=(WENT.max-WENT.min);
- nfact_X=delta/M_PI;
- nfact_Y=delta/2.00;
- step=(delta/(double)WENT.quant)/nfact_X;EcClassTol=delta*0.000001;
- i=0;while(i<WENT.data_len)
- {
- j=0;while(j<WENT.quant)
- {tmpd=((step*(j+1))<=(M_PI/2.00))?sin(step*(j+1)):2.00-sin(step*(j+1));
- fx=EcClassTol+WENT.min+(tmpd*nfact_Y);
- if(WENT.org[i]<=(fx)){WENT.count[j]++;break;}
- j++;
- }
- i++;
- }
- }
- //..............................................................................................
- void EC_quantSIN(void){ClassCounterSIN();EC_quantDCLASS();}
- //----------------------------------------------------------------------------------------------
- void ClassCounterCOS(void)
- {unsigned int i,j;
- double step,tmpd;
- double nfact_X,nfact_Y;
- double delta,fx;
- //printf(" COS ");
- delta=(WENT.max-WENT.min);
- nfact_X=delta/M_PI;
- nfact_Y=delta;
- step=(delta/(double)WENT.quant)/nfact_X;EcClassTol=delta*0.000001;
- i=0;while(i<WENT.data_len)
- {
- j=0;while(j<WENT.quant)
- {tmpd=((cos(M_PI+step*(j+1))+1.00))/2.00;
- fx=EcClassTol+WENT.min+(tmpd*nfact_Y);
- if(WENT.org[i]<=(fx)){WENT.count[j]++;break;}
- j++;
- }
- i++;
- }
- }
- //..............................................................................................
- void EC_quantCOS(void){ClassCounterCOS();EC_quantDCLASS();}
- //..............................................................................................
- //----------------------------------------------------------------------------------------------
- //----------------------------------------------------------------------------------------------
- double MediMaxinfo(unsigned int qnum, unsigned int qtype, _Bool mima)
- {unsigned int i;
- double tmpd,maxi;
- // init
- WENT.quant = qnum;
- WENT.q_type = qtype;
- WENT.maxinfo = 0.00;
- i=0;while(i<WENT.data_len){QUAwork_data[i]=WENT.org[i];QUAwork_ndx[i]=i;i++;}
- SortDouble(&QUAwork_data[0], &QUAwork_ndx[0],WENT.data_len);
- i=0;while(i<MEDI_ENTRO_MAXQUANT){WENT.count[i]=0;i++;}
- if(mima) // compute min/max
- {
- i=0;WENT.min=WENT.max=WENT.org[0];
- i++;while(i<WENT.data_len)
- {
- if(WENT.min>WENT.org[i])WENT.min=WENT.org[i];
- if(WENT.max<WENT.org[i])WENT.max=WENT.org[i];
- i++;
- }
- }
- switch(qtype)
- {
- case ENT_QUATYPE_LIN : EC_quantLIN(); break;
- case ENT_QUATYPE_LOG : EC_quantLOG(); break;
- case ENT_QUATYPE_EXP : EC_quantEXP(); break;
- case ENT_QUATYPE_SIN : EC_quantSIN(); break;
- case ENT_QUATYPE_COS : EC_quantCOS(); break;
- case ENT_QUATYPE_NON :
- default : break;
- }
- i=0;while(i<WENT.quant)
- {if(WENT.count[i])
- {
- tmpd= ((double)WENT.count[i]/(double)WENT.data_len);
- maxi = tmpd * (log2(tmpd)/log2(WENT.quant));
- //maxi = tmpd*log2(tmpd);
- WENT.maxinfo-=maxi;
- }
- i++;
- }
- return(WENT.maxinfo);
- }
- //----------------------------------------------------------------------------------------------
- double MediEntropy(struct ent *op, struct ent *part)
- {unsigned int count;
- unsigned int i,j;
- unsigned int ndx_op,ndx_part;
- double part_info[MEDI_ENTRO_MAXQUANT];
- unsigned int part_cnum[MEDI_ENTRO_MAXQUANT];
- double maxi,tmpd;
- i=0;while(i<MEDI_ENTRO_MAXQUANT){j=0;while(j<MEDI_ENTRO_MAXQUANT){part->cross_table[i][j]=0;j++;}i++;}
- count=0;while(count<op->data_len)
- {
- ndx_op = op->qua[count];
- ndx_part = part->qua[count];
- part->cross_table[ndx_part][ndx_op]++;
- count++;
- }
- // count part_case_num
- i=0;while(i<part->quant)
- {part_cnum[i]=0;
- j=0;while(j<op->quant){part_cnum[i]+=part->cross_table[i][j];j++;}
- i++;
- }
- // compute part_info
- i=0;while(i<part->quant)
- {part_info[i]=0.00;
- j=0;while(j<op->quant)
- {
- if(part->cross_table[i][j])
- {
- tmpd = ((double)part->cross_table[i][j]/(double)part_cnum[i]);
- maxi = tmpd * (log2(tmpd)/log2(op->quant));
- //maxi = tmpd*log2(tmpd);
- part_info[i]-=maxi;
- }
- j++;
- }i++;
- }
- // compute entropy
- part->entropy=0.00;
- i=0;while(i<part->quant)
- {
- tmpd=((double)part_cnum[i]/(double)op->data_len)*part_info[i];
- part->entropy+=tmpd;
- i++;
- }
- part->yield=op->maxinfo-part->entropy;
- return(part->entropy);
- }
- //----------------------------------------------------------------------------------------------
- //----------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement