131 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								% ----------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								% The Computer Language Benchmarks Game
							 | 
						||
| 
								 | 
							
								% http://shootout.alioth.debian.org/
							 | 
						||
| 
								 | 
							
								% Contributed by Anthony Borla
							 | 
						||
| 
								 | 
							
								% Modified to run with YAP by Glendon Holst
							 | 
						||
| 
								 | 
							
								% ----------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- yap_flag(unknown,error).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- initialization(main).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								main :-
							 | 
						||
| 
								 | 
							
								  unix( argv([H|_]) ), number_atom(N,H),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  init_fasta(ALU, IUB, HOMOSAPIENS, RAND0),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  N1 is N * 2,
							 | 
						||
| 
								 | 
							
								  N2 is N * 3,
							 | 
						||
| 
								 | 
							
								  N3 is N * 5,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  repeat_fasta('ONE', 'Homo sapiens alu', N1, ALU),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  make_cumulative(IUB, CVIUB),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  random_fasta('TWO', 'IUB ambiguity codes', N2, CVIUB, RAND0, RAND1),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  make_cumulative(HOMOSAPIENS, CVHOMOSAPIENS),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  random_fasta('THREE', 'Homo sapiens frequency', N3, CVHOMOSAPIENS, RAND1, RAND),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  statistics,
							 | 
						||
| 
								 | 
							
								  statistics_jit.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								init_fasta(ALU, IUB, HOMOSAP, RAND) :-
							 | 
						||
| 
								 | 
							
								  ALU = 'GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA',
							 | 
						||
| 
								 | 
							
								  IUB = [a:0.27, c:0.12, g:0.12, t:0.27,
							 | 
						||
| 
								 | 
							
										'B':0.02, 'D':0.02, 'H':0.02, 'K':0.02, 'M':0.02,
							 | 
						||
| 
								 | 
							
										'N':0.02, 'R':0.02, 'S':0.02, 'V':0.02, 'W':0.02, 'Y':0.02],
							 | 
						||
| 
								 | 
							
								  HOMOSAP = [a:0.3029549426680, c:0.1979883004921,
							 | 
						||
| 
								 | 
							
											g:0.1975473066391, t:0.3015094502008],
							 | 
						||
| 
								 | 
							
								  init_gen_random(42, RAND).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								repeat_fasta(Id, Desc, N, ALU) :-
							 | 
						||
| 
								 | 
							
								  LineLength = 60,
							 | 
						||
| 
								 | 
							
								  atom_length(ALU, ALULength),
							 | 
						||
| 
								 | 
							
								  write('>'), write(Id), tab(1), write(Desc), nl,
							 | 
						||
| 
								 | 
							
								  repeat_fasta_(N, 0, LineLength, ALU, ALULength).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								repeat_fasta_(N, _, _, _, _) :- N =< 0, !.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								repeat_fasta_(N, Q, L, ALU, ALULength) :-
							 | 
						||
| 
								 | 
							
								  (N < L -> L1 = N ; L1 = L),
							 | 
						||
| 
								 | 
							
								  (L1 + Q < ALULength ->
							 | 
						||
| 
								 | 
							
								    sub_atom(ALU, Q, L1, Lineout), Q1 is L1 + Q,
							 | 
						||
| 
								 | 
							
								    write(Lineout), nl
							 | 
						||
| 
								 | 
							
								  ;
							 | 
						||
| 
								 | 
							
								    Rest is ALULength - Q, sub_atom(ALU, Q, Rest, Prefix),
							 | 
						||
| 
								 | 
							
								    atom_length(Prefix, PrefixLength), Q1 is L1 - PrefixLength,
							 | 
						||
| 
								 | 
							
								    sub_atom(ALU, 0, Q1, Segment),
							 | 
						||
| 
								 | 
							
									write(Prefix), write(Segment), nl),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  N1 is N - L1, !, repeat_fasta_(N1, Q1, L1, ALU, ALULength).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								random_fasta(Id, Desc, N, CumTbl, RAND0, RAND) :-
							 | 
						||
| 
								 | 
							
								  LineLength = 60,
							 | 
						||
| 
								 | 
							
								  write('>'), write(Id), tab(1), write(Desc), nl,
							 | 
						||
| 
								 | 
							
								  random_fasta_(N, LineLength, CumTbl, RAND0, RAND).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								random_fasta_(N, _, _, RAND, RAND) :- N =< 0, !.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								random_fasta_(N, L, CumTbl, RAND0, RAND) :-
							 | 
						||
| 
								 | 
							
								  (N < L -> L1 = N ; L1 = L),
							 | 
						||
| 
								 | 
							
								  gen_line(L1, CumTbl, Codesout, RAND0, RAND1),
							 | 
						||
| 
								 | 
							
								  atom_chars(Lineout, Codesout), write(Lineout), nl,
							 | 
						||
| 
								 | 
							
								  N1 is N - L1, !, random_fasta_(N1, L1, CumTbl, RAND1, RAND).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gen_line(0, _, [], RAND, RAND).
							 | 
						||
| 
								 | 
							
								gen_line(N, CumTbl, K, RAND0, RAND) :-
							 | 
						||
| 
								 | 
							
								  select_random(CumTbl, C, RAND0, RAND1),
							 | 
						||
| 
								 | 
							
								  char_code(C, C1), K = [C1|T1], N1 is N - 1, !,
							 | 
						||
| 
								 | 
							
								  gen_line(N1, CumTbl, T1, RAND1, RAND).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								make_cumulative(L, RL) :- make_cumulative_(L, RL, 0).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								make_cumulative_([], [], _) :- !.
							 | 
						||
| 
								 | 
							
								make_cumulative_([K:V|T], L, CV) :-
							 | 
						||
| 
								 | 
							
									CV1 is CV + V, L = [K:CV1|T1], !, make_cumulative_(T, T1, CV1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select_random(L, RK, RAND0, RAND) :-
							 | 
						||
| 
								 | 
							
									gen_random(1.0, R, RAND0, RAND),
							 | 
						||
| 
								 | 
							
									select_random_(L, R, RK).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select_random_([], _, _) :- !.
							 | 
						||
| 
								 | 
							
								select_random_([K:V|T], R, RK) :-
							 | 
						||
| 
								 | 
							
									(R < V -> RK = K ; !, select_random_(T, R, RK)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								init_gen_random(Seed, [3877, 29573, 139968, Seed]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gen_random(UB, R, RAND0, RAND) :-
							 | 
						||
| 
								 | 
							
								  RAND0 = [IA, IC, IM, LAST],
							 | 
						||
| 
								 | 
							
								  LAST1 is (LAST * IA + IC) mod IM,
							 | 
						||
| 
								 | 
							
								  RAND = [IA, IC, IM, LAST1],
							 | 
						||
| 
								 | 
							
								  R is UB * LAST1 / IM.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 | 
						||
| 
								 | 
							
								% BUG FIX - sub_atom/5 errors out if Size = 0.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub_atom(_,_,0,'') :- !.
							 | 
						||
| 
								 | 
							
								sub_atom(A,Bef,Size,Aout) :- sub_atom(A,Bef,Size,_,Aout).
							 | 
						||
| 
								 | 
							
								
							 |