Advertisement
meditor

Entropy with modified Shannon

Jun 23rd, 2019
525
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.86 KB | None | 0 0
  1. #define     MEDI_ENTRO_MAXQUANT 31
  2. #define     EC_MAXIO            72
  3. #define     EC_MAXDATA          1048576
  4.  
  5. #define     ENT_QUATYPE_NON      0
  6. #define     ENT_QUATYPE_LIN      1
  7. #define     ENT_QUATYPE_LOG      2
  8. #define     ENT_QUATYPE_EXP      3
  9. #define     ENT_QUATYPE_SIN      4
  10. #define     ENT_QUATYPE_COS      5
  11.  
  12.  
  13. struct ent  {unsigned int   count[MEDI_ENTRO_MAXQUANT];
  14.             unsigned int    cross_table[MEDI_ENTRO_MAXQUANT][MEDI_ENTRO_MAXQUANT];
  15.             unsigned int    quant;
  16.             unsigned int    q_type;
  17.             unsigned int    data_len;
  18.             double          maxinfo;
  19.             double          entropy;
  20.             double          yield;
  21.  
  22.             double          min;
  23.             double          max;
  24.             unsigned char   *qua;
  25.             double          *org;
  26.             unsigned int    op_ndx;
  27.            }WENT,EC_Entropy[EC_MAXIO];
  28.  
  29. unsigned int    EC_ioNum;
  30. unsigned int    EC_opNDX;
  31. unsigned int    EC_DataNum;
  32. char            EC_IOname   [EC_MAXIO][64];
  33.  
  34. double          QUAwork_data    [EC_MAXDATA];
  35. unsigned int    QUAwork_ndx     [EC_MAXDATA];
  36.  
  37. unsigned char   EC_QUAdata  [EC_MAXIO][EC_MAXDATA];
  38. double          EC_ORGdata  [EC_MAXIO][EC_MAXDATA];
  39. double          EcClassTol;
  40.  
  41. //----------------------------------------------------------------------------------------------
  42. //----------------------------------------------------------------------------------------------
  43.  
  44. void    MediPrepareEntropy(unsigned int wich)
  45.     {unsigned int   i,j;
  46.    
  47.      i=0;while(i<MEDI_ENTRO_MAXQUANT)
  48.      {WENT.count[i]=0;j=0;while(j<MEDI_ENTRO_MAXQUANT){WENT.cross_table[i][j]=0;j++;}i++;}
  49.      i=0;while(i<EC_MAXDATA){QUAwork_data[i]=0.00;QUAwork_ndx[i]=0;i++;}
  50.  
  51.      WENT.quant=2;
  52.      WENT.q_type=ENT_QUATYPE_LIN;
  53.  
  54.      WENT.data_len=EC_DataNum;
  55.      WENT.maxinfo=0.00;
  56.      WENT.entropy=0.00;
  57.      WENT.yield=0.00;
  58.      
  59.      WENT.min=0.00;
  60.      WENT.max=0.00;
  61.      WENT.qua=&EC_QUAdata[wich][0];
  62.      WENT.org=&EC_ORGdata[wich][0];
  63.      WENT.op_ndx=EC_opNDX;
  64.     }
  65.  
  66. //----------------------------------------------------------------------------------------------
  67. //----------------------------------------------------------------------------------------------
  68.  
  69. void EC_quantDCLASS(void)
  70.     {unsigned int   i,j,ndx,qval;
  71.  
  72.      qval=0;j=0;
  73.      i=0;while(i<WENT.data_len)
  74.      {j=0;while(j<WENT.count[qval])
  75.       {ndx=QUAwork_ndx[i];
  76.        WENT.qua[ndx]=qval;
  77.        j++;i++;
  78.       }
  79.       qval++;
  80.      }
  81.     }
  82.  
  83. //----------------------------------------------------------------------------------------------
  84.  
  85. void ClassCounterLIN(void)
  86.     {unsigned int   i,j;
  87.      double     step;
  88.      double     delta;
  89.  
  90.      //printf(" LIN ");
  91.      delta=(WENT.max-WENT.min);
  92.      step=(delta)/(double)WENT.quant;
  93.      EcClassTol=delta*0.000001;
  94.  
  95.      i=0;while(i<WENT.data_len)
  96.      {j=0;while(j<WENT.quant)
  97.       {if(WENT.org[i]<=(EcClassTol+WENT.min+((j+1)*step))){WENT.count[j]++;break;}j++;}
  98.       i++;
  99.      }
  100.     }
  101. //..............................................................................................
  102. void EC_quantLIN(void){ClassCounterLIN();EC_quantDCLASS();}
  103. //----------------------------------------------------------------------------------------------
  104.  
  105. void ClassCounterLOG(void)
  106.     {unsigned int   i,j;
  107.      double     step,add_step;
  108.      unsigned int   base;
  109.      double     delta;
  110.  
  111.      //printf(" LOG ");
  112.      base=(1<<WENT.quant)-1;
  113.      delta=(WENT.max-WENT.min);
  114.  
  115.      i=0;while(i<WENT.data_len)
  116.      {add_step=((delta)/(double)base)*(1<<(WENT.quant-1));
  117.       step=add_step;EcClassTol=delta*0.000001;
  118.       j=0;while(j<WENT.quant)
  119.       {if(WENT.org[i]<=(EcClassTol+WENT.min+step)){WENT.count[j]++;break;}
  120.        add_step/=2.00;step+=add_step;j++;
  121.       }
  122.       i++;
  123.      }
  124.     }
  125. //..............................................................................................
  126. void EC_quantLOG(void){ClassCounterLOG();EC_quantDCLASS();}
  127. //----------------------------------------------------------------------------------------------
  128.  
  129. void ClassCounterEXP(void)
  130.     {unsigned int   i,j;
  131.      double     step,add_step;
  132.      unsigned int   base;
  133.      double     delta;
  134.  
  135.      //printf(" EXP ");
  136.      base=(1<<WENT.quant)-1;
  137.      delta=(WENT.max-WENT.min);
  138.  
  139.      i=0;while(i<WENT.data_len)
  140.      {add_step=delta/(double)base;
  141.       step=add_step;EcClassTol=delta*0.000001;
  142.       j=0;while(j<WENT.quant)
  143.       {if(WENT.org[i]<=(EcClassTol+WENT.min+step)){WENT.count[j]++;break;}
  144.        add_step*=2.00;step+=add_step;j++;
  145.       }
  146.       i++;
  147.      }
  148.     }
  149.  
  150. //..............................................................................................
  151. void EC_quantEXP(void){ClassCounterEXP();EC_quantDCLASS();}
  152. //----------------------------------------------------------------------------------------------
  153.  
  154. void ClassCounterSIN(void)
  155.     {unsigned int   i,j;
  156.      double     step,tmpd;
  157.  
  158.      double     nfact_X,nfact_Y;
  159.      double     delta,fx;
  160.  
  161.      //printf(" SIN ");
  162.      delta=(WENT.max-WENT.min);
  163.      nfact_X=delta/M_PI;
  164.      nfact_Y=delta/2.00;
  165.  
  166.      step=(delta/(double)WENT.quant)/nfact_X;EcClassTol=delta*0.000001;
  167.  
  168.      i=0;while(i<WENT.data_len)
  169.      {
  170.       j=0;while(j<WENT.quant)
  171.       {tmpd=((step*(j+1))<=(M_PI/2.00))?sin(step*(j+1)):2.00-sin(step*(j+1));
  172.        fx=EcClassTol+WENT.min+(tmpd*nfact_Y);
  173.  
  174.        if(WENT.org[i]<=(fx)){WENT.count[j]++;break;}
  175.        j++;
  176.       }
  177.       i++;
  178.      }
  179.     }
  180. //..............................................................................................
  181. void EC_quantSIN(void){ClassCounterSIN();EC_quantDCLASS();}
  182. //----------------------------------------------------------------------------------------------
  183.  
  184. void ClassCounterCOS(void)
  185.     {unsigned int   i,j;
  186.      double     step,tmpd;
  187.  
  188.      double     nfact_X,nfact_Y;
  189.      double     delta,fx;
  190.  
  191.      //printf(" COS ");
  192.      delta=(WENT.max-WENT.min);
  193.      nfact_X=delta/M_PI;
  194.      nfact_Y=delta;
  195.  
  196.      step=(delta/(double)WENT.quant)/nfact_X;EcClassTol=delta*0.000001;
  197.  
  198.      i=0;while(i<WENT.data_len)
  199.      {
  200.       j=0;while(j<WENT.quant)
  201.       {tmpd=((cos(M_PI+step*(j+1))+1.00))/2.00;
  202.        fx=EcClassTol+WENT.min+(tmpd*nfact_Y);
  203.  
  204.        if(WENT.org[i]<=(fx)){WENT.count[j]++;break;}
  205.        j++;
  206.       }
  207.       i++;
  208.      }
  209.     }
  210. //..............................................................................................
  211. void EC_quantCOS(void){ClassCounterCOS();EC_quantDCLASS();}
  212. //..............................................................................................
  213.  
  214. //----------------------------------------------------------------------------------------------
  215. //----------------------------------------------------------------------------------------------
  216.  
  217. double MediMaxinfo(unsigned int qnum, unsigned int qtype, _Bool mima)
  218.     {unsigned int   i;
  219.      double     tmpd,maxi;
  220.  
  221.      // init
  222.      WENT.quant =   qnum;
  223.      WENT.q_type    =   qtype;
  224.      WENT.maxinfo   =   0.00;
  225.  
  226.      i=0;while(i<WENT.data_len){QUAwork_data[i]=WENT.org[i];QUAwork_ndx[i]=i;i++;}
  227.      SortDouble(&QUAwork_data[0], &QUAwork_ndx[0],WENT.data_len);
  228.      i=0;while(i<MEDI_ENTRO_MAXQUANT){WENT.count[i]=0;i++;}
  229.  
  230.      if(mima)               // compute min/max
  231.      {
  232.       i=0;WENT.min=WENT.max=WENT.org[0];
  233.       i++;while(i<WENT.data_len)
  234.       {
  235.        if(WENT.min>WENT.org[i])WENT.min=WENT.org[i];
  236.        if(WENT.max<WENT.org[i])WENT.max=WENT.org[i];
  237.        i++;
  238.       }
  239.      }
  240.  
  241.      switch(qtype)
  242.      {
  243.       case ENT_QUATYPE_LIN      :   EC_quantLIN();      break;
  244.       case ENT_QUATYPE_LOG      :   EC_quantLOG();      break;
  245.       case ENT_QUATYPE_EXP      :   EC_quantEXP();      break;
  246.       case ENT_QUATYPE_SIN      :   EC_quantSIN();      break;
  247.       case ENT_QUATYPE_COS      :   EC_quantCOS();      break;
  248.  
  249.       case ENT_QUATYPE_NON  :
  250.       default       :                   break;
  251.      }
  252.  
  253.      i=0;while(i<WENT.quant)
  254.      {if(WENT.count[i])
  255.       {
  256.        tmpd=    ((double)WENT.count[i]/(double)WENT.data_len);
  257.        maxi =   tmpd    *   (log2(tmpd)/log2(WENT.quant));
  258.        //maxi   =   tmpd*log2(tmpd);
  259.        WENT.maxinfo-=maxi;
  260.       }
  261.       i++;
  262.      }
  263.  
  264.      return(WENT.maxinfo);
  265.     }
  266.  
  267. //----------------------------------------------------------------------------------------------
  268.  
  269. double MediEntropy(struct ent *op, struct ent *part)
  270.     {unsigned int   count;
  271.      unsigned int   i,j;
  272.      unsigned int   ndx_op,ndx_part;
  273.      
  274.      double     part_info[MEDI_ENTRO_MAXQUANT];
  275.      unsigned int   part_cnum[MEDI_ENTRO_MAXQUANT];
  276.      double     maxi,tmpd;
  277.  
  278.      i=0;while(i<MEDI_ENTRO_MAXQUANT){j=0;while(j<MEDI_ENTRO_MAXQUANT){part->cross_table[i][j]=0;j++;}i++;}
  279.  
  280.      count=0;while(count<op->data_len)
  281.      {
  282.       ndx_op    =   op->qua[count];
  283.       ndx_part  =   part->qua[count];
  284.       part->cross_table[ndx_part][ndx_op]++;
  285.       count++;
  286.      }
  287.  
  288.      // count part_case_num
  289.      i=0;while(i<part->quant)
  290.      {part_cnum[i]=0;
  291.       j=0;while(j<op->quant){part_cnum[i]+=part->cross_table[i][j];j++;}
  292.       i++;
  293.      }
  294.  
  295.      // compute part_info
  296.      i=0;while(i<part->quant)
  297.      {part_info[i]=0.00;
  298.       j=0;while(j<op->quant)
  299.       {
  300.        if(part->cross_table[i][j])
  301.        {
  302.         tmpd     =  ((double)part->cross_table[i][j]/(double)part_cnum[i]);
  303.         maxi     =  tmpd    *   (log2(tmpd)/log2(op->quant));
  304.         //maxi   =  tmpd*log2(tmpd);
  305.         part_info[i]-=maxi;
  306.        }
  307.  
  308.        j++;
  309.       }i++;
  310.      }
  311.  
  312.      // compute entropy
  313.      part->entropy=0.00;
  314.      i=0;while(i<part->quant)
  315.      {
  316.       tmpd=((double)part_cnum[i]/(double)op->data_len)*part_info[i];
  317.       part->entropy+=tmpd;
  318.       i++;
  319.      }
  320.  
  321.      part->yield=op->maxinfo-part->entropy;
  322.      return(part->entropy);
  323.     }
  324.  
  325. //----------------------------------------------------------------------------------------------
  326. //----------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement