140 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /* PRINT-CODE.C - Print a Low Density Parity Check code's matrices. */ | ||
|  | 
 | ||
|  | /* 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 <stdio.h>
 | ||
|  | #include <stdlib.h>
 | ||
|  | #include <string.h>
 | ||
|  | #include <math.h>
 | ||
|  | 
 | ||
|  | #include "rand.h"
 | ||
|  | #include "alloc.h"
 | ||
|  | #include "open.h"
 | ||
|  | #include "mod2sparse.h"
 | ||
|  | #include "mod2dense.h"
 | ||
|  | #include "mod2convert.h"
 | ||
|  | #include "rcode.h"
 | ||
|  | 
 | ||
|  | void usage(void); | ||
|  | 
 | ||
|  | 
 | ||
|  | /* MAIN PROGRAM. */ | ||
|  | 
 | ||
|  | int main | ||
|  | ( int argc, | ||
|  |   char **argv | ||
|  | ) | ||
|  | { | ||
|  |   char *gen_file; | ||
|  |   int dprint; | ||
|  |   int i, j; | ||
|  | 
 | ||
|  |   dprint = 0; | ||
|  |   if (argc>1 && strcmp(argv[1],"-d")==0) | ||
|  |   { dprint = 1; | ||
|  |     argc -= 1; | ||
|  |     argv += 1; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (!(gen_file = argv[1]) || argv[2]) | ||
|  |   { usage(); | ||
|  |   } | ||
|  | 
 | ||
|  |   read_gen(gen_file,0,1); | ||
|  | 
 | ||
|  |   switch (type) | ||
|  |   { | ||
|  |     case 's':  | ||
|  |     {  | ||
|  |       printf("\nGenerator matrix in %s (sparse representation):\n\n",gen_file); | ||
|  | 
 | ||
|  |       printf("Column order (message bits at end):\n"); | ||
|  |       for (j = 0; j<N; j++)  | ||
|  |       { if (j%20==0) printf("\n"); | ||
|  |         printf(" %3d",cols[j]); | ||
|  |       } | ||
|  |       printf("\n\n"); | ||
|  | 
 | ||
|  |       printf("Row order:\n"); | ||
|  |       for (i = 0; i<M; i++)  | ||
|  |       { if (i%20==0) printf("\n"); | ||
|  |         printf(" %3d",rows[i]);  | ||
|  |       } | ||
|  |       printf("\n\n"); | ||
|  | 
 | ||
|  |       if (dprint) | ||
|  |       { mod2dense *Ld, *Ud; | ||
|  |         Ld = mod2dense_allocate(M,M); | ||
|  |         Ud = mod2dense_allocate(M,N); | ||
|  |         mod2sparse_to_dense(L,Ld); | ||
|  |         mod2sparse_to_dense(U,Ud); | ||
|  |         printf("L:\n\n"); | ||
|  |         mod2dense_print(stdout,Ld); | ||
|  |         printf("\n"); | ||
|  |         printf("U:\n\n"); | ||
|  |         mod2dense_print(stdout,Ud); | ||
|  |         printf("\n"); | ||
|  |       } | ||
|  |       else | ||
|  |       { printf("L:\n\n"); | ||
|  |         mod2sparse_print(stdout,L); | ||
|  |         printf("\n"); | ||
|  |         printf("U:\n\n"); | ||
|  |         mod2sparse_print(stdout,U); | ||
|  |         printf("\n"); | ||
|  |       } | ||
|  |       | ||
|  |       break; | ||
|  |     } | ||
|  | 
 | ||
|  |     case 'd': case 'm': | ||
|  |     { | ||
|  |       if (type=='d') | ||
|  |       { printf("\nGenerator matrix in %s (dense representation):\n\n",gen_file); | ||
|  |       } | ||
|  |       if (type=='m') | ||
|  |       { printf("\nGenerator matrix in %s (mixed representation):\n\n",gen_file); | ||
|  |       } | ||
|  | 
 | ||
|  |       printf("Column order (message bits at end):\n"); | ||
|  |       for (j = 0; j<N; j++)  | ||
|  |       { if (j%20==0) printf("\n"); | ||
|  |         printf(" %3d",cols[j]); | ||
|  |       } | ||
|  |       printf("\n\n"); | ||
|  | 
 | ||
|  |       printf (type=='d' ? "Inv(A) X B:\n\n" : "Inv(A):\n\n"); | ||
|  |       mod2dense_print(stdout,G); | ||
|  |       printf("\n"); | ||
|  | 
 | ||
|  |       break; | ||
|  |     } | ||
|  | 
 | ||
|  |     default:  | ||
|  |     { fprintf(stderr,"Unknown type of generator matrix file\n"); | ||
|  |       exit(1); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return 0; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | /* PRINT USAGE MESSAGE AND EXIT. */ | ||
|  | 
 | ||
|  | void usage(void) | ||
|  | { fprintf(stderr,"Usage: print-gen [ -d ] gen-file\n"); | ||
|  |   exit(1); | ||
|  | } |