178 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* CHECK.C - Compute parity checks and other stats on decodings. */
 | |
| 
 | |
| /* Copyright (c) 1995-2012 by Radford M. Neal.
 | |
|  *
 | |
|  * Permission is granted for anyone to copy, use, modify, and distribute
 | |
|  * these programs and accompanying documents for any purpose, provided
 | |
|  * this copyright notice is retained and prominently displayed, and note
 | |
|  * is made of any changes made to these programs.  These programs and
 | |
|  * documents are distributed without any warranty, express or implied.
 | |
|  * As the programs were written for research purposes only, they have not
 | |
|  * been tested to the degree that would be advisable in any important
 | |
|  * application.  All use of these programs is entirely at the user's own
 | |
|  * risk.
 | |
|  */
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <stdio.h>
 | |
| #include <math.h>
 | |
| 
 | |
| #include "mod2sparse.h"
 | |
| #include "check.h"
 | |
| 
 | |
| 
 | |
| 
 | |
| /* COMPUTE PARITY CHECKS.  Returns the number of parity checks violated by
 | |
|    dblk.  The results of all the parity checks are stored in pchk. */
 | |
| 
 | |
| int check
 | |
| ( mod2sparse *H,	/* Parity check matrix */
 | |
|   char *dblk,		/* Guess for codeword */
 | |
|   char *pchk		/* Place to store parity checks */
 | |
| )
 | |
| {
 | |
|   int M, i, c;
 | |
| 
 | |
|   M = mod2sparse_rows(H);
 | |
| 
 | |
|   mod2sparse_mulvec (H, dblk, pchk);
 | |
| 
 | |
|   c = 0;
 | |
|   for (i = 0; i<M; i++) 
 | |
|   { c += pchk[i];
 | |
|   }
 | |
| 
 | |
|   return c;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* COUNT HOW MANY BITS HAVED CHANGED FROM BIT INDICATED BY LIKELIHOOD.  The
 | |
|    simple decoding based on likelihood ratio is compared to the given decoding.
 | |
|    A bit for which the likelihood ratio is exactly one counts as half a 
 | |
|    change, which explains why the result is a double rather than an int.
 | |
|  */
 | |
| 
 | |
| double changed
 | |
| ( double *lratio,	/* Likelihood ratios for bits */
 | |
|   char *dblk,		/* Candidate decoding */
 | |
|   int N			/* Number of bits */
 | |
| )
 | |
| { 
 | |
|   double changed;
 | |
|   int j;
 | |
| 
 | |
|   changed = 0;
 | |
|   for (j = 0; j<N; j++)
 | |
|   { changed += lratio[j]==1 ? 0.5 : dblk[j] != (lratio[j]>1); 
 | |
|   }
 | |
| 
 | |
|   return changed;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* COMPUTE THE EXPECTED NUMBER OF PARITY CHECK ERRORS.   Computes the
 | |
|    expected number of parity check errors with respect to the distribution
 | |
|    given by the bit probabilities passed, with bits assumed to be independent. 
 | |
|  */
 | |
| 
 | |
| double expected_parity_errors
 | |
| ( mod2sparse *H,	/* Parity check matrix */
 | |
|   double *bpr		/* Bit probabilities */
 | |
| )
 | |
| { 
 | |
|   mod2entry *f;
 | |
|   double ee, p;
 | |
|   int M, i, j;
 | |
| 
 | |
|   M = mod2sparse_rows(H);
 | |
| 
 | |
|   ee = 0;
 | |
| 
 | |
|   for (i = 0; i<M; i++)
 | |
|   { p = 0;
 | |
|     for (f = mod2sparse_first_in_row(H,i);
 | |
|          !mod2sparse_at_end(f);
 | |
|          f = mod2sparse_next_in_row(f))
 | |
|     { j = mod2sparse_col(f);
 | |
|       p = p * (1-bpr[j]) + (1-p) * bpr[j];
 | |
|     }
 | |
|     ee += p;
 | |
|   }
 | |
| 
 | |
|   return ee;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* COMPUTE LOG LIKELIHOOD OF A DECODING. */
 | |
| 
 | |
| double loglikelihood 
 | |
| ( double *lratio,	/* Likelihood ratios for bits */
 | |
|   char *bits,		/* Bits in decoding */
 | |
|   int N			/* Length of codeword */
 | |
| )
 | |
| { 
 | |
|   double ll;
 | |
|   int j;
 | |
|   
 | |
|   ll = 0;
 | |
| 
 | |
|   for (j = 0; j<N; j++)
 | |
|   { ll -= bits[j] ? log(1+1/lratio[j]) : log(1+lratio[j]);
 | |
|   }
 | |
| 
 | |
|   return ll;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* COMPUTE THE EXPECTED LOG LIKELIHOOD BASED ON BIT PROBABILITIES.  Computes
 | |
|    the expected value of the log likelihood with respect to the distribution
 | |
|    given by the bit probabilities passed, with bits assumed to be independent. 
 | |
|  */
 | |
| 
 | |
| double expected_loglikelihood 
 | |
| ( double *lratio,	/* Likelihood ratios for bits */
 | |
|   double *bpr,		/* Bit probabilities */
 | |
|   int N			/* Length of codeword */
 | |
| )
 | |
| { 
 | |
|   double ll;
 | |
|   int j;
 | |
|   
 | |
|   ll = 0;
 | |
| 
 | |
|   for (j = 0; j<N; j++)
 | |
|   { if (bpr[j]>0) 
 | |
|     { ll -= bpr[j]*log(1+1/lratio[j]);
 | |
|     }
 | |
|     if (bpr[j]<1) 
 | |
|     { ll -= (1-bpr[j])*log(1+lratio[j]);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return ll;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* COMPUTE ENTROPY FROM BIT PROBABILITIES.  Computes the entropy of the
 | |
|    distribution given by the bit probabilities, on the assumption that
 | |
|    bits are independent.
 | |
|  */
 | |
| 
 | |
| double entropy 
 | |
| ( double *bpr,		/* Bit probabilities */
 | |
|   int N			/* Length of codeword */
 | |
| )
 | |
| {
 | |
|   double e;
 | |
|   int j;
 | |
| 
 | |
|   e = 0;
 | |
|   for (j = 0; j<N; j++)
 | |
|   { if (bpr[j]>0 && bpr[j]<1)
 | |
|     { e -= bpr[j]*log(bpr[j]) + (1-bpr[j])*log(1-bpr[j]);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return e/log(2.0);
 | |
| }
 | 
