annotate IMSAME/src/alignmentFunctions.c @ 5:353e5673bcb8 draft default tip

Uploaded
author bitlab
date Mon, 17 Dec 2018 12:20:41 -0500
parents 762009a91895
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
762009a91895 Uploaded
bitlab
parents:
diff changeset
1 #include <stdio.h>
762009a91895 Uploaded
bitlab
parents:
diff changeset
2 #include <stdlib.h>
762009a91895 Uploaded
bitlab
parents:
diff changeset
3 #include <string.h>
762009a91895 Uploaded
bitlab
parents:
diff changeset
4 #include <ctype.h>
762009a91895 Uploaded
bitlab
parents:
diff changeset
5 #include <pthread.h>
762009a91895 Uploaded
bitlab
parents:
diff changeset
6 #include <inttypes.h>
762009a91895 Uploaded
bitlab
parents:
diff changeset
7 #include <math.h>
762009a91895 Uploaded
bitlab
parents:
diff changeset
8 #include <float.h>
762009a91895 Uploaded
bitlab
parents:
diff changeset
9 #include "structs.h"
762009a91895 Uploaded
bitlab
parents:
diff changeset
10 #include "alignmentFunctions.h"
762009a91895 Uploaded
bitlab
parents:
diff changeset
11 #include "commonFunctions.h"
762009a91895 Uploaded
bitlab
parents:
diff changeset
12 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
762009a91895 Uploaded
bitlab
parents:
diff changeset
13 #define MIN(x, y) (((x) <= (y)) ? (x) : (y))
762009a91895 Uploaded
bitlab
parents:
diff changeset
14
762009a91895 Uploaded
bitlab
parents:
diff changeset
15 int64_t compare_letters(unsigned char a, unsigned char b){
762009a91895 Uploaded
bitlab
parents:
diff changeset
16 if(a != (unsigned char) 'N' && a != (unsigned char) '>') return (a == b) ? POINT : -POINT;
762009a91895 Uploaded
bitlab
parents:
diff changeset
17 return -POINT;
762009a91895 Uploaded
bitlab
parents:
diff changeset
18 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
19
762009a91895 Uploaded
bitlab
parents:
diff changeset
20 llpos * getNewLocationllpos(Mempool_l * mp, uint64_t * n_pools_used){
762009a91895 Uploaded
bitlab
parents:
diff changeset
21
762009a91895 Uploaded
bitlab
parents:
diff changeset
22 if(mp[*n_pools_used].current == POOL_SIZE){
762009a91895 Uploaded
bitlab
parents:
diff changeset
23 *n_pools_used += 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
24 if(*n_pools_used == MAX_MEM_POOLS) terror("Reached max pools");
762009a91895 Uploaded
bitlab
parents:
diff changeset
25 init_mem_pool_llpos(&mp[*n_pools_used]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
26
762009a91895 Uploaded
bitlab
parents:
diff changeset
27 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
28
762009a91895 Uploaded
bitlab
parents:
diff changeset
29 llpos * new_pos = mp[*n_pools_used].base + mp[*n_pools_used].current;
762009a91895 Uploaded
bitlab
parents:
diff changeset
30 mp[*n_pools_used].current++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
31
762009a91895 Uploaded
bitlab
parents:
diff changeset
32
762009a91895 Uploaded
bitlab
parents:
diff changeset
33 return new_pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
34 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
35
762009a91895 Uploaded
bitlab
parents:
diff changeset
36 void init_mem_pool_llpos(Mempool_l * mp){
762009a91895 Uploaded
bitlab
parents:
diff changeset
37 mp->base = (llpos *) calloc(POOL_SIZE, sizeof(llpos));
762009a91895 Uploaded
bitlab
parents:
diff changeset
38 if(mp->base == NULL) terror("Could not request memory pool");
762009a91895 Uploaded
bitlab
parents:
diff changeset
39 mp->current = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
40 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
41
762009a91895 Uploaded
bitlab
parents:
diff changeset
42
762009a91895 Uploaded
bitlab
parents:
diff changeset
43 void * load_input(void * a){
762009a91895 Uploaded
bitlab
parents:
diff changeset
44
762009a91895 Uploaded
bitlab
parents:
diff changeset
45 LoadingDBArgs * ldbargs = (LoadingDBArgs *) a;
762009a91895 Uploaded
bitlab
parents:
diff changeset
46
762009a91895 Uploaded
bitlab
parents:
diff changeset
47 // Requires
762009a91895 Uploaded
bitlab
parents:
diff changeset
48 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
49 char * temp_seq_buffer;
762009a91895 Uploaded
bitlab
parents:
diff changeset
50 SeqInfo * data_database; 1 per thread
762009a91895 Uploaded
bitlab
parents:
diff changeset
51 uint64_t t_len;
762009a91895 Uploaded
bitlab
parents:
diff changeset
52 uint64_t word_size;
762009a91895 Uploaded
bitlab
parents:
diff changeset
53 uint64_t read_from;
762009a91895 Uploaded
bitlab
parents:
diff changeset
54 uint64_t read_to;
762009a91895 Uploaded
bitlab
parents:
diff changeset
55 char thread_id;
762009a91895 Uploaded
bitlab
parents:
diff changeset
56 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
57
762009a91895 Uploaded
bitlab
parents:
diff changeset
58 uint64_t c_pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
59
762009a91895 Uploaded
bitlab
parents:
diff changeset
60 unsigned char curr_kmer[custom_kmer];
762009a91895 Uploaded
bitlab
parents:
diff changeset
61 unsigned char aux_kmer[custom_kmer+1];
762009a91895 Uploaded
bitlab
parents:
diff changeset
62 curr_kmer[0] = '\0';
762009a91895 Uploaded
bitlab
parents:
diff changeset
63 uint64_t word_size = 0, pos_in_database = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
64 unsigned char char_converter[91];
762009a91895 Uploaded
bitlab
parents:
diff changeset
65 uint64_t curr_seq = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
66 char_converter[(unsigned char)'A'] = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
67 char_converter[(unsigned char)'C'] = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
68 char_converter[(unsigned char)'G'] = 2;
762009a91895 Uploaded
bitlab
parents:
diff changeset
69 char_converter[(unsigned char)'T'] = 3;
762009a91895 Uploaded
bitlab
parents:
diff changeset
70 //llpos * aux;
762009a91895 Uploaded
bitlab
parents:
diff changeset
71 AVLTree * pointer;
762009a91895 Uploaded
bitlab
parents:
diff changeset
72
762009a91895 Uploaded
bitlab
parents:
diff changeset
73 char c;
762009a91895 Uploaded
bitlab
parents:
diff changeset
74
762009a91895 Uploaded
bitlab
parents:
diff changeset
75 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
76 if(ldbargs->thread_id == 'A'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
77 printf("read to is: %"PRIu64"\n", ldbargs->read_to);
762009a91895 Uploaded
bitlab
parents:
diff changeset
78 printf("make sure: %c %c %c\n", ldbargs->temp_seq_buffer[ldbargs->read_to-1], ldbargs->temp_seq_buffer[ldbargs->read_to], ldbargs->temp_seq_buffer[ldbargs->read_to+1]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
79
762009a91895 Uploaded
bitlab
parents:
diff changeset
80 uint64_t z = ldbargs->read_to-1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
81 while(ldbargs->temp_seq_buffer[z] != '>'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
82 printf("%c", ldbargs->temp_seq_buffer[z]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
83 z--;
762009a91895 Uploaded
bitlab
parents:
diff changeset
84 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
85 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
86 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
87 if(ldbargs->thread_id == 'C'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
88 printf("HELLOOOOOOO im going from %"PRIu64"\n", ldbargs->read_from);
762009a91895 Uploaded
bitlab
parents:
diff changeset
89 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
90 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
91
762009a91895 Uploaded
bitlab
parents:
diff changeset
92 c_pos = ldbargs->read_from;
762009a91895 Uploaded
bitlab
parents:
diff changeset
93 while(ldbargs->temp_seq_buffer[c_pos] != '>') ++c_pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
94 ldbargs->read_from = c_pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
95 c_pos = ldbargs->read_to;
762009a91895 Uploaded
bitlab
parents:
diff changeset
96 while(c_pos < ldbargs->t_len && ldbargs->temp_seq_buffer[c_pos] != '>') ++c_pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
97 ldbargs->read_to = c_pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
98
762009a91895 Uploaded
bitlab
parents:
diff changeset
99 c_pos = ldbargs->read_from;
762009a91895 Uploaded
bitlab
parents:
diff changeset
100 c = ldbargs->temp_seq_buffer[c_pos];
762009a91895 Uploaded
bitlab
parents:
diff changeset
101
762009a91895 Uploaded
bitlab
parents:
diff changeset
102
762009a91895 Uploaded
bitlab
parents:
diff changeset
103 //printf("thread going from %"PRIu64" to %"PRIu64"\n", ldbargs->read_from, ldbargs->read_to);
762009a91895 Uploaded
bitlab
parents:
diff changeset
104
762009a91895 Uploaded
bitlab
parents:
diff changeset
105
762009a91895 Uploaded
bitlab
parents:
diff changeset
106 while(c_pos < ldbargs->read_to){
762009a91895 Uploaded
bitlab
parents:
diff changeset
107
762009a91895 Uploaded
bitlab
parents:
diff changeset
108
762009a91895 Uploaded
bitlab
parents:
diff changeset
109 if(c == '>'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
110
762009a91895 Uploaded
bitlab
parents:
diff changeset
111 //if(ldbargs->thread_id == 'G') printf("putting in %"PRIu64" @ %"PRIu64"\n", curr_seq, c_pos);
762009a91895 Uploaded
bitlab
parents:
diff changeset
112 ldbargs->data_database->start_pos[curr_seq] = pos_in_database; ++curr_seq;
762009a91895 Uploaded
bitlab
parents:
diff changeset
113
762009a91895 Uploaded
bitlab
parents:
diff changeset
114 // REalloc sequences and sequence index
762009a91895 Uploaded
bitlab
parents:
diff changeset
115 if(pos_in_database == READBUF*ldbargs->n_allocs){
762009a91895 Uploaded
bitlab
parents:
diff changeset
116 ldbargs->n_allocs++; ldbargs->data_database->sequences = (unsigned char *) realloc(ldbargs->data_database->sequences, READBUF*ldbargs->n_allocs*sizeof(unsigned char));
762009a91895 Uploaded
bitlab
parents:
diff changeset
117 if(ldbargs->data_database->sequences == NULL) terror("Could not reallocate temporary database");
762009a91895 Uploaded
bitlab
parents:
diff changeset
118 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
119
762009a91895 Uploaded
bitlab
parents:
diff changeset
120 if(curr_seq == INITSEQS*ldbargs->n_allocs){
762009a91895 Uploaded
bitlab
parents:
diff changeset
121 ldbargs->n_allocs++; ldbargs->data_database->start_pos = (uint64_t *) realloc(ldbargs->data_database->start_pos, INITSEQS*ldbargs->n_allocs*sizeof(uint64_t));
762009a91895 Uploaded
bitlab
parents:
diff changeset
122 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
123
762009a91895 Uploaded
bitlab
parents:
diff changeset
124
762009a91895 Uploaded
bitlab
parents:
diff changeset
125
762009a91895 Uploaded
bitlab
parents:
diff changeset
126 while(c != '\n'){ c = ldbargs->temp_seq_buffer[c_pos]; ++c_pos; } //Skip ID
762009a91895 Uploaded
bitlab
parents:
diff changeset
127
762009a91895 Uploaded
bitlab
parents:
diff changeset
128 while(c != '>' && c_pos < ldbargs->read_to){ //Until next id
762009a91895 Uploaded
bitlab
parents:
diff changeset
129
762009a91895 Uploaded
bitlab
parents:
diff changeset
130 //if(ldbargs->thread_id == 'A') printf("!!!!!!%"PRIu64" from:%"PRIu64", to %"PRIu64"\n", c_pos, ldbargs->read_from, ldbargs->read_to);
762009a91895 Uploaded
bitlab
parents:
diff changeset
131 c = ldbargs->temp_seq_buffer[c_pos]; ++c_pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
132 c = toupper(c);
762009a91895 Uploaded
bitlab
parents:
diff changeset
133 if(c == 'A' || c == 'C' || c == 'G' || c == 'T'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
134 curr_kmer[word_size] = (unsigned char) c;
762009a91895 Uploaded
bitlab
parents:
diff changeset
135 if(word_size < custom_kmer) ++word_size;
762009a91895 Uploaded
bitlab
parents:
diff changeset
136
762009a91895 Uploaded
bitlab
parents:
diff changeset
137 ldbargs->data_database->sequences[pos_in_database] = (unsigned char) c; ++pos_in_database;
762009a91895 Uploaded
bitlab
parents:
diff changeset
138 // REalloc sequences and sequence index
762009a91895 Uploaded
bitlab
parents:
diff changeset
139 if(pos_in_database == READBUF*ldbargs->n_allocs){
762009a91895 Uploaded
bitlab
parents:
diff changeset
140 ldbargs->n_allocs++; ldbargs->data_database->sequences = (unsigned char *) realloc(ldbargs->data_database->sequences, READBUF*ldbargs->n_allocs*sizeof(unsigned char));
762009a91895 Uploaded
bitlab
parents:
diff changeset
141 if(ldbargs->data_database->sequences == NULL) terror("Could not reallocate temporary database");
762009a91895 Uploaded
bitlab
parents:
diff changeset
142 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
143
762009a91895 Uploaded
bitlab
parents:
diff changeset
144 if(curr_seq == INITSEQS*ldbargs->n_allocs){
762009a91895 Uploaded
bitlab
parents:
diff changeset
145 ldbargs->n_allocs++; ldbargs->data_database->start_pos = (uint64_t *) realloc(ldbargs->data_database->start_pos, INITSEQS*ldbargs->n_allocs*sizeof(uint64_t));
762009a91895 Uploaded
bitlab
parents:
diff changeset
146 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
147 }else{ //It can be anything (including N, Y, X ...)
762009a91895 Uploaded
bitlab
parents:
diff changeset
148
762009a91895 Uploaded
bitlab
parents:
diff changeset
149 if(c != '\n' && c != '\r' && c != '>'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
150 word_size = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
151 ldbargs->data_database->sequences[pos_in_database] = (unsigned char) 'N'; ++pos_in_database; //Convert to N
762009a91895 Uploaded
bitlab
parents:
diff changeset
152 // REalloc sequences and sequence index
762009a91895 Uploaded
bitlab
parents:
diff changeset
153 if(pos_in_database == READBUF*ldbargs->n_allocs){
762009a91895 Uploaded
bitlab
parents:
diff changeset
154 ldbargs->n_allocs++; ldbargs->data_database->sequences = (unsigned char *) realloc(ldbargs->data_database->sequences, READBUF*ldbargs->n_allocs*sizeof(unsigned char));
762009a91895 Uploaded
bitlab
parents:
diff changeset
155 if(ldbargs->data_database->sequences == NULL) terror("Could not reallocate temporary database");
762009a91895 Uploaded
bitlab
parents:
diff changeset
156 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
157
762009a91895 Uploaded
bitlab
parents:
diff changeset
158 if(curr_seq == INITSEQS*ldbargs->n_allocs){
762009a91895 Uploaded
bitlab
parents:
diff changeset
159 ldbargs->n_allocs++; ldbargs->data_database->start_pos = (uint64_t *) realloc(ldbargs->data_database->start_pos, INITSEQS*ldbargs->n_allocs*sizeof(uint64_t));
762009a91895 Uploaded
bitlab
parents:
diff changeset
160 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
161 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
162 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
163 if(word_size == custom_kmer){
762009a91895 Uploaded
bitlab
parents:
diff changeset
164 //write to hash table
762009a91895 Uploaded
bitlab
parents:
diff changeset
165
762009a91895 Uploaded
bitlab
parents:
diff changeset
166
762009a91895 Uploaded
bitlab
parents:
diff changeset
167 pointer = &ldbargs->ct->root[char_converter[curr_kmer[1]]][char_converter[curr_kmer[2]]][char_converter[curr_kmer[3]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
168 [char_converter[curr_kmer[4]]][char_converter[curr_kmer[5]]][char_converter[curr_kmer[6]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
169 [char_converter[curr_kmer[7]]][char_converter[curr_kmer[8]]][char_converter[curr_kmer[9]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
170 [char_converter[curr_kmer[10]]][char_converter[curr_kmer[11]]];
762009a91895 Uploaded
bitlab
parents:
diff changeset
171
762009a91895 Uploaded
bitlab
parents:
diff changeset
172
762009a91895 Uploaded
bitlab
parents:
diff changeset
173 pointer = insert_AVLTree(pointer, hashOfWord(&curr_kmer[FIXED_K], custom_kmer-FIXED_K), ldbargs->mp_AVL, &ldbargs->n_pools_used_AVL, pos_in_database, ldbargs->mp, &ldbargs->n_pools_used, curr_seq-1);
762009a91895 Uploaded
bitlab
parents:
diff changeset
174
762009a91895 Uploaded
bitlab
parents:
diff changeset
175
762009a91895 Uploaded
bitlab
parents:
diff changeset
176
762009a91895 Uploaded
bitlab
parents:
diff changeset
177 // CURRENTLY USING OVERLAPPING
762009a91895 Uploaded
bitlab
parents:
diff changeset
178
762009a91895 Uploaded
bitlab
parents:
diff changeset
179 memcpy(aux_kmer, &curr_kmer[1], custom_kmer-1);
762009a91895 Uploaded
bitlab
parents:
diff changeset
180 memcpy(curr_kmer, aux_kmer, custom_kmer-1);
762009a91895 Uploaded
bitlab
parents:
diff changeset
181 word_size--;
762009a91895 Uploaded
bitlab
parents:
diff changeset
182
762009a91895 Uploaded
bitlab
parents:
diff changeset
183 // For NON OVERLAPPING ENABLE THIS
762009a91895 Uploaded
bitlab
parents:
diff changeset
184 //word_size = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
185 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
186
762009a91895 Uploaded
bitlab
parents:
diff changeset
187 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
188 word_size = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
189 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
190 c = ldbargs->temp_seq_buffer[c_pos]; ++c_pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
191 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
192
762009a91895 Uploaded
bitlab
parents:
diff changeset
193 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
194 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
195 if(ldbargs->thread_id == 'T'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
196 uint64_t j;
762009a91895 Uploaded
bitlab
parents:
diff changeset
197 for(j=0; j < curr_seq-1; j++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
198 printf("%"PRIu64" - %"PRIu64"\n", ldbargs->data_database->start_pos[j], ldbargs->data_database->start_pos[j+1]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
199 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
200 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
201 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
202 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
203 if(ldbargs->thread_id == 'A'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
204 printf("\nAT %"PRIu64", and pos_database = %"PRIu64"\n", ldbargs->data_database->start_pos[curr_seq-1], pos_in_database);
762009a91895 Uploaded
bitlab
parents:
diff changeset
205 uint64_t z = pos_in_database;
762009a91895 Uploaded
bitlab
parents:
diff changeset
206 while(z > ldbargs->data_database->start_pos[curr_seq-1]){
762009a91895 Uploaded
bitlab
parents:
diff changeset
207 printf("%c", ldbargs->data_database->sequences[z]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
208 z--;
762009a91895 Uploaded
bitlab
parents:
diff changeset
209 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
210
762009a91895 Uploaded
bitlab
parents:
diff changeset
211 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
212 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
213 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
214
762009a91895 Uploaded
bitlab
parents:
diff changeset
215 ldbargs->data_database->start_pos[curr_seq] = pos_in_database;
762009a91895 Uploaded
bitlab
parents:
diff changeset
216 ldbargs->data_database->total_len = pos_in_database;
762009a91895 Uploaded
bitlab
parents:
diff changeset
217 ldbargs->contained_reads = curr_seq;
762009a91895 Uploaded
bitlab
parents:
diff changeset
218 ldbargs->data_database->n_seqs = curr_seq;
762009a91895 Uploaded
bitlab
parents:
diff changeset
219 ldbargs->base_coordinates = pos_in_database;
762009a91895 Uploaded
bitlab
parents:
diff changeset
220 return NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
221 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
222
762009a91895 Uploaded
bitlab
parents:
diff changeset
223
762009a91895 Uploaded
bitlab
parents:
diff changeset
224 void * computeAlignmentsByThread(void * a){
762009a91895 Uploaded
bitlab
parents:
diff changeset
225
762009a91895 Uploaded
bitlab
parents:
diff changeset
226 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
227 typedef struct {
762009a91895 Uploaded
bitlab
parents:
diff changeset
228 SeqInfo * database; //Database sequence and lengths
762009a91895 Uploaded
bitlab
parents:
diff changeset
229 SeqInfo * query; //Query sequence and lengths
762009a91895 Uploaded
bitlab
parents:
diff changeset
230 uint64_t from; //Starting READ to compute alignments from
762009a91895 Uploaded
bitlab
parents:
diff changeset
231 uint64_t to; //End READ to compute alignments from
762009a91895 Uploaded
bitlab
parents:
diff changeset
232 Container * container; //Container to hold the multidimensional array
762009a91895 Uploaded
bitlab
parents:
diff changeset
233 uint64_t accepted_query_reads; //Number of reads that have a fragment with evalue less than specified
762009a91895 Uploaded
bitlab
parents:
diff changeset
234 long double min_e_value; //Minimum evalue to accept read
762009a91895 Uploaded
bitlab
parents:
diff changeset
235 } HashTableArgs;
762009a91895 Uploaded
bitlab
parents:
diff changeset
236 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
237
762009a91895 Uploaded
bitlab
parents:
diff changeset
238 HashTableArgs * hta = (HashTableArgs *) a;
762009a91895 Uploaded
bitlab
parents:
diff changeset
239 Queue * my_current_task = NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
240
762009a91895 Uploaded
bitlab
parents:
diff changeset
241 unsigned char char_converter[91];
762009a91895 Uploaded
bitlab
parents:
diff changeset
242 char_converter[(unsigned char)'A'] = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
243 char_converter[(unsigned char)'C'] = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
244 char_converter[(unsigned char)'G'] = 2;
762009a91895 Uploaded
bitlab
parents:
diff changeset
245 char_converter[(unsigned char)'T'] = 3;
762009a91895 Uploaded
bitlab
parents:
diff changeset
246 Quickfrag qf;
762009a91895 Uploaded
bitlab
parents:
diff changeset
247 int64_t * cell_path_y = (int64_t *) malloc(MAX_READ_SIZE*sizeof(int64_t));
762009a91895 Uploaded
bitlab
parents:
diff changeset
248 if(cell_path_y == NULL) terror("Could not allocate cell paths");
762009a91895 Uploaded
bitlab
parents:
diff changeset
249
762009a91895 Uploaded
bitlab
parents:
diff changeset
250
762009a91895 Uploaded
bitlab
parents:
diff changeset
251 Point p0, p1, p2, p3; //Points for NW anchored
762009a91895 Uploaded
bitlab
parents:
diff changeset
252 p0.x = 0; p0.y = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
253
762009a91895 Uploaded
bitlab
parents:
diff changeset
254 AVLContainer * ptr_table_redirect[4];
762009a91895 Uploaded
bitlab
parents:
diff changeset
255 ptr_table_redirect[0] = hta->container_a;
762009a91895 Uploaded
bitlab
parents:
diff changeset
256 ptr_table_redirect[1] = hta->container_b;
762009a91895 Uploaded
bitlab
parents:
diff changeset
257 ptr_table_redirect[2] = hta->container_c;
762009a91895 Uploaded
bitlab
parents:
diff changeset
258 ptr_table_redirect[3] = hta->container_d;
762009a91895 Uploaded
bitlab
parents:
diff changeset
259 unsigned char current_table = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
260
762009a91895 Uploaded
bitlab
parents:
diff changeset
261
762009a91895 Uploaded
bitlab
parents:
diff changeset
262
762009a91895 Uploaded
bitlab
parents:
diff changeset
263 //To keep track of which reads are we reading
762009a91895 Uploaded
bitlab
parents:
diff changeset
264 uint64_t curr_read, curr_db_seq, xlen, ylen;
762009a91895 Uploaded
bitlab
parents:
diff changeset
265 uint64_t crrSeqL, pos_of_hit = 0xFFFFFFFFFFFFFFFF;
762009a91895 Uploaded
bitlab
parents:
diff changeset
266
762009a91895 Uploaded
bitlab
parents:
diff changeset
267 //Reading from buffer
762009a91895 Uploaded
bitlab
parents:
diff changeset
268 char c;
762009a91895 Uploaded
bitlab
parents:
diff changeset
269 unsigned char curr_kmer[custom_kmer], b_aux[custom_kmer];
762009a91895 Uploaded
bitlab
parents:
diff changeset
270 llpos * aux;
762009a91895 Uploaded
bitlab
parents:
diff changeset
271 AVLTree * pointer;
762009a91895 Uploaded
bitlab
parents:
diff changeset
272
762009a91895 Uploaded
bitlab
parents:
diff changeset
273 // For NW-alignment
762009a91895 Uploaded
bitlab
parents:
diff changeset
274 int NWaligned;
762009a91895 Uploaded
bitlab
parents:
diff changeset
275 uint64_t n_hits, alignments_tried;
762009a91895 Uploaded
bitlab
parents:
diff changeset
276
762009a91895 Uploaded
bitlab
parents:
diff changeset
277 BasicAlignment ba; //The resulting alignment from the NW
762009a91895 Uploaded
bitlab
parents:
diff changeset
278 uint64_t curr_pos = 0; //Reading-head position
762009a91895 Uploaded
bitlab
parents:
diff changeset
279 uint64_t up_to = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
280
762009a91895 Uploaded
bitlab
parents:
diff changeset
281 int64_t last_diagonal = INT64_MIN; // Diagonal to skip repeated hits
762009a91895 Uploaded
bitlab
parents:
diff changeset
282 unsigned char already_aligned = FALSE; // To not count more times the same read
762009a91895 Uploaded
bitlab
parents:
diff changeset
283
762009a91895 Uploaded
bitlab
parents:
diff changeset
284
762009a91895 Uploaded
bitlab
parents:
diff changeset
285
762009a91895 Uploaded
bitlab
parents:
diff changeset
286
762009a91895 Uploaded
bitlab
parents:
diff changeset
287 //Get next operation in queue
762009a91895 Uploaded
bitlab
parents:
diff changeset
288 while(NULL != ( my_current_task = get_task_from_queue(hta->queue_head, hta->lock))){
762009a91895 Uploaded
bitlab
parents:
diff changeset
289 //Initialize all variables
762009a91895 Uploaded
bitlab
parents:
diff changeset
290
762009a91895 Uploaded
bitlab
parents:
diff changeset
291 qf.x_start = qf.y_start = qf.t_len = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
292 qf.e_value = LDBL_MAX;
762009a91895 Uploaded
bitlab
parents:
diff changeset
293 last_diagonal = INT64_MIN;
762009a91895 Uploaded
bitlab
parents:
diff changeset
294
762009a91895 Uploaded
bitlab
parents:
diff changeset
295 //Starting from
762009a91895 Uploaded
bitlab
parents:
diff changeset
296 curr_read = my_current_task->r1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
297 crrSeqL = 0; pos_of_hit = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
298
762009a91895 Uploaded
bitlab
parents:
diff changeset
299 curr_kmer[0] = '\0'; b_aux[0] = '\0';
762009a91895 Uploaded
bitlab
parents:
diff changeset
300 aux = NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
301 pointer = NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
302
762009a91895 Uploaded
bitlab
parents:
diff changeset
303 NWaligned = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
304 n_hits = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
305 alignments_tried = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
306
762009a91895 Uploaded
bitlab
parents:
diff changeset
307 ba.identities = 0; ba.length = 0; ba.igaps = 0xFFFFFFFFFFFFFFFF; ba.egaps = 0xFFFFFFFFFFFFFFFF;
762009a91895 Uploaded
bitlab
parents:
diff changeset
308 memset(&hta->markers[0], 0, hta->database->n_seqs); // Reset used tags
762009a91895 Uploaded
bitlab
parents:
diff changeset
309 already_aligned = FALSE;
762009a91895 Uploaded
bitlab
parents:
diff changeset
310
762009a91895 Uploaded
bitlab
parents:
diff changeset
311 //Set current header position at the position of the read start (the ">")
762009a91895 Uploaded
bitlab
parents:
diff changeset
312 curr_pos = hta->query->start_pos[curr_read]; //Skip the ">"
762009a91895 Uploaded
bitlab
parents:
diff changeset
313 c = (char) hta->query->sequences[curr_pos];
762009a91895 Uploaded
bitlab
parents:
diff changeset
314
762009a91895 Uploaded
bitlab
parents:
diff changeset
315 //printf("Im doing from %"PRIu64" to %"PRIu64", nseqs=%"PRIu64"\n", my_current_task->r1, my_current_task->r2, hta->query->n_seqs);
762009a91895 Uploaded
bitlab
parents:
diff changeset
316 //getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
317
762009a91895 Uploaded
bitlab
parents:
diff changeset
318 while(curr_read < my_current_task->r2 && curr_pos < hta->query->total_len){
762009a91895 Uploaded
bitlab
parents:
diff changeset
319
762009a91895 Uploaded
bitlab
parents:
diff changeset
320
762009a91895 Uploaded
bitlab
parents:
diff changeset
321
762009a91895 Uploaded
bitlab
parents:
diff changeset
322 if(curr_read != hta->query->n_seqs) up_to = hta->query->start_pos[curr_read+1]-1; else up_to = hta->query->total_len;
762009a91895 Uploaded
bitlab
parents:
diff changeset
323 //printf("Currrpos: %"PRIu64" up to: %"PRIu64" on read: %"PRIu64"\n", curr_pos, up_to, curr_read);
762009a91895 Uploaded
bitlab
parents:
diff changeset
324
762009a91895 Uploaded
bitlab
parents:
diff changeset
325 if (curr_pos == up_to) { // Comment, empty or quality (+) line
762009a91895 Uploaded
bitlab
parents:
diff changeset
326 crrSeqL = 0; // Reset buffered sequence length
762009a91895 Uploaded
bitlab
parents:
diff changeset
327 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
328 printf("Read: %"PRIu64" yielded (%d)\n", curr_read, NWaligned);
762009a91895 Uploaded
bitlab
parents:
diff changeset
329 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
330 //if(NWaligned == 0){ printf("Read: %"PRIu64" yielded (%d)\n", curr_read, NWaligned);}
762009a91895 Uploaded
bitlab
parents:
diff changeset
331 //printf("Read: %"PRIu64" yielded (%d)\n", curr_read, NWaligned); if(NWaligned == 0) getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
332 NWaligned = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
333 //fprintf(stdout, "Seq %"PRIu64" has %"PRIu64" hits and tried to align %"PRIu64" times\n", curr_read, n_hits, alignments_tried);
762009a91895 Uploaded
bitlab
parents:
diff changeset
334 //fflush(stdout);
762009a91895 Uploaded
bitlab
parents:
diff changeset
335 n_hits = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
336 already_aligned = FALSE;
762009a91895 Uploaded
bitlab
parents:
diff changeset
337 alignments_tried = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
338 last_diagonal = INT64_MIN; // This is not perfect but if the diagonal reaches the value then we have an overflow anyway
762009a91895 Uploaded
bitlab
parents:
diff changeset
339 qf.x_start = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
340 qf.t_len = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
341
762009a91895 Uploaded
bitlab
parents:
diff changeset
342 //if(hta->full_comp == TRUE) memset(&hta->markers[my_current_task->r1], 0, my_current_task->r2 - my_current_task->r1 + 1); // Reset used tags
762009a91895 Uploaded
bitlab
parents:
diff changeset
343 memset(&hta->markers[0], FALSE, hta->database->n_seqs); // Reset used tags
762009a91895 Uploaded
bitlab
parents:
diff changeset
344
762009a91895 Uploaded
bitlab
parents:
diff changeset
345 curr_read++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
346 //printf("On current read %"PRIu64"\n", curr_read);
762009a91895 Uploaded
bitlab
parents:
diff changeset
347 continue;
762009a91895 Uploaded
bitlab
parents:
diff changeset
348 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
349
762009a91895 Uploaded
bitlab
parents:
diff changeset
350 if(c == 'A' || c == 'C' || c == 'T' || c == 'G'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
351 curr_kmer[crrSeqL] = (unsigned char) c;
762009a91895 Uploaded
bitlab
parents:
diff changeset
352 crrSeqL++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
353 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
354 crrSeqL = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
355 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
356
762009a91895 Uploaded
bitlab
parents:
diff changeset
357 if (crrSeqL >= custom_kmer) { // Full well formed sequence
762009a91895 Uploaded
bitlab
parents:
diff changeset
358
762009a91895 Uploaded
bitlab
parents:
diff changeset
359
762009a91895 Uploaded
bitlab
parents:
diff changeset
360 //printf("comparing hit: %.11s\n", (char *)&curr_kmer[0]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
361 //getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
362
762009a91895 Uploaded
bitlab
parents:
diff changeset
363 // Choose table
762009a91895 Uploaded
bitlab
parents:
diff changeset
364 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
365 if(curr_kmer[0] == (unsigned char) 'A'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
366 ptr_table_redirect = hta->container_A;
762009a91895 Uploaded
bitlab
parents:
diff changeset
367 }else if(curr_kmer[0] == (unsigned char) 'C'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
368 ptr_table_redirect = hta->container_C;
762009a91895 Uploaded
bitlab
parents:
diff changeset
369 }else if(curr_kmer[0] == (unsigned char) 'G'){
762009a91895 Uploaded
bitlab
parents:
diff changeset
370 ptr_table_redirect = hta->container_G;
762009a91895 Uploaded
bitlab
parents:
diff changeset
371 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
372 ptr_table_redirect = hta->container_T;
762009a91895 Uploaded
bitlab
parents:
diff changeset
373 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
374 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
375
762009a91895 Uploaded
bitlab
parents:
diff changeset
376 //fprintf(stdout, "%s\n", curr_kmer);
762009a91895 Uploaded
bitlab
parents:
diff changeset
377 //fflush(stdout);
762009a91895 Uploaded
bitlab
parents:
diff changeset
378 current_table = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
379 pointer = &ptr_table_redirect[current_table]->root[char_converter[curr_kmer[1]]][char_converter[curr_kmer[2]]][char_converter[curr_kmer[3]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
380 [char_converter[curr_kmer[4]]][char_converter[curr_kmer[5]]][char_converter[curr_kmer[6]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
381 [char_converter[curr_kmer[7]]][char_converter[curr_kmer[8]]][char_converter[curr_kmer[9]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
382 [char_converter[curr_kmer[10]]][char_converter[curr_kmer[11]]];
762009a91895 Uploaded
bitlab
parents:
diff changeset
383
762009a91895 Uploaded
bitlab
parents:
diff changeset
384 if(pointer == NULL){
762009a91895 Uploaded
bitlab
parents:
diff changeset
385 ++current_table;
762009a91895 Uploaded
bitlab
parents:
diff changeset
386 pointer = &ptr_table_redirect[current_table]->root[char_converter[curr_kmer[1]]][char_converter[curr_kmer[2]]][char_converter[curr_kmer[3]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
387 [char_converter[curr_kmer[4]]][char_converter[curr_kmer[5]]][char_converter[curr_kmer[6]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
388 [char_converter[curr_kmer[7]]][char_converter[curr_kmer[8]]][char_converter[curr_kmer[9]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
389 [char_converter[curr_kmer[10]]][char_converter[curr_kmer[11]]];
762009a91895 Uploaded
bitlab
parents:
diff changeset
390 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
391 if(pointer == NULL){
762009a91895 Uploaded
bitlab
parents:
diff changeset
392 ++current_table;
762009a91895 Uploaded
bitlab
parents:
diff changeset
393 pointer = &ptr_table_redirect[current_table]->root[char_converter[curr_kmer[1]]][char_converter[curr_kmer[2]]][char_converter[curr_kmer[3]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
394 [char_converter[curr_kmer[4]]][char_converter[curr_kmer[5]]][char_converter[curr_kmer[6]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
395 [char_converter[curr_kmer[7]]][char_converter[curr_kmer[8]]][char_converter[curr_kmer[9]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
396 [char_converter[curr_kmer[10]]][char_converter[curr_kmer[11]]];
762009a91895 Uploaded
bitlab
parents:
diff changeset
397 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
398 if(pointer == NULL){
762009a91895 Uploaded
bitlab
parents:
diff changeset
399 ++current_table;
762009a91895 Uploaded
bitlab
parents:
diff changeset
400 pointer = &ptr_table_redirect[current_table]->root[char_converter[curr_kmer[1]]][char_converter[curr_kmer[2]]][char_converter[curr_kmer[3]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
401 [char_converter[curr_kmer[4]]][char_converter[curr_kmer[5]]][char_converter[curr_kmer[6]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
402 [char_converter[curr_kmer[7]]][char_converter[curr_kmer[8]]][char_converter[curr_kmer[9]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
403 [char_converter[curr_kmer[10]]][char_converter[curr_kmer[11]]];
762009a91895 Uploaded
bitlab
parents:
diff changeset
404 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
405
762009a91895 Uploaded
bitlab
parents:
diff changeset
406 //While there are hits
762009a91895 Uploaded
bitlab
parents:
diff changeset
407 //fprintf(stdout, "%p\n", aux);
762009a91895 Uploaded
bitlab
parents:
diff changeset
408 //fflush(stdout);
762009a91895 Uploaded
bitlab
parents:
diff changeset
409
762009a91895 Uploaded
bitlab
parents:
diff changeset
410 uint64_t hash_forward = hashOfWord(&curr_kmer[FIXED_K], custom_kmer - FIXED_K);
762009a91895 Uploaded
bitlab
parents:
diff changeset
411 AVLTree * search = find_AVLTree(pointer, hash_forward);
762009a91895 Uploaded
bitlab
parents:
diff changeset
412 if(search != NULL) aux = search->next; else aux = NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
413
762009a91895 Uploaded
bitlab
parents:
diff changeset
414
762009a91895 Uploaded
bitlab
parents:
diff changeset
415 while(aux != NULL && ((hta->full_comp == FALSE && NWaligned == 0 && hta->markers[aux->s_id+ hta->contained_reads[current_table]] == 0) || (hta->full_comp && hta->markers[aux->s_id+ hta->contained_reads[current_table]] == 0))){
762009a91895 Uploaded
bitlab
parents:
diff changeset
416
762009a91895 Uploaded
bitlab
parents:
diff changeset
417 n_hits++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
418 //fprintf(stdout, "%p\n", aux);
762009a91895 Uploaded
bitlab
parents:
diff changeset
419 //fflush(stdout);
762009a91895 Uploaded
bitlab
parents:
diff changeset
420 // ADD OFFSET CUCOOOOOOOOOOOOOOOOOOOOOO!!!!!!!!!!!!!!!
762009a91895 Uploaded
bitlab
parents:
diff changeset
421 //printf("my current table is %u\n", current_table);
762009a91895 Uploaded
bitlab
parents:
diff changeset
422 //printf("check this woop: %"PRIu64" - %"PRIu64" - %"PRIu64" - %"PRIu64"\n", aux->s_id, hta->contained_reads[current_table], aux->pos, hta->base_coordinates[current_table]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
423 curr_db_seq = aux->s_id + hta->contained_reads[current_table];
762009a91895 Uploaded
bitlab
parents:
diff changeset
424 pos_of_hit = aux->pos + hta->base_coordinates[current_table];
762009a91895 Uploaded
bitlab
parents:
diff changeset
425 //printf("Pos of hit db: %"PRIu64", seq num %"PRIu64", contained reads: %"PRIu64", contained coord %"PRIu64"\n", pos_of_hit, curr_db_seq, hta->contained_reads[current_table], hta->base_coordinates[current_table]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
426 if(hta->hits != NULL){
762009a91895 Uploaded
bitlab
parents:
diff changeset
427 hta->hits[curr_db_seq]++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
428 goto only_hits; // Count only hits and skip the rest
762009a91895 Uploaded
bitlab
parents:
diff changeset
429 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
430
762009a91895 Uploaded
bitlab
parents:
diff changeset
431 //fprintf(stdout, "Launching curr_read: %"PRIu64" @ %"PRIu64", vs curr_db_read: %"PRIu64" @ %"PRIu64": ", curr_read, curr_pos+1, curr_db_seq, pos_of_hit);
762009a91895 Uploaded
bitlab
parents:
diff changeset
432 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
433 if(curr_read == 534) fprintf(stdout, "Launching %"PRIu64" @ %"PRIu64", vs %"PRIu64" @ %"PRIu64": ", curr_read, curr_pos+1, curr_db_seq, pos_of_hit);
762009a91895 Uploaded
bitlab
parents:
diff changeset
434 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
435 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
436 fprintf(stdout, "Launching %"PRIu64" @ %"PRIu64", vs %"PRIu64" @ %"PRIu64": ", curr_read, curr_pos+1, curr_db_seq, pos_of_hit);
762009a91895 Uploaded
bitlab
parents:
diff changeset
437 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
438 int64_t curr_diagonal = (int64_t)(curr_pos+1) - (int64_t) pos_of_hit;
762009a91895 Uploaded
bitlab
parents:
diff changeset
439
762009a91895 Uploaded
bitlab
parents:
diff changeset
440
762009a91895 Uploaded
bitlab
parents:
diff changeset
441
762009a91895 Uploaded
bitlab
parents:
diff changeset
442 if( (last_diagonal != curr_diagonal && !(qf.x_start <= (pos_of_hit + custom_kmer) && pos_of_hit <= (qf.x_start + qf.t_len)))){
762009a91895 Uploaded
bitlab
parents:
diff changeset
443
762009a91895 Uploaded
bitlab
parents:
diff changeset
444 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
445 if(curr_db_seq == hta->database->n_seqs-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
446 xlen = hta->database->total_len - hta->database->start_pos[curr_db_seq];
762009a91895 Uploaded
bitlab
parents:
diff changeset
447 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
448 xlen = hta->database->start_pos[curr_db_seq+1] - hta->database->start_pos[curr_db_seq];
762009a91895 Uploaded
bitlab
parents:
diff changeset
449 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
450 if(curr_read == hta->query->n_seqs-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
451 ylen = hta->query->total_len - hta->query->start_pos[curr_read];
762009a91895 Uploaded
bitlab
parents:
diff changeset
452 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
453 ylen = hta->query->start_pos[curr_read+1] - hta->query->start_pos[curr_read];
762009a91895 Uploaded
bitlab
parents:
diff changeset
454 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
455 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
456
762009a91895 Uploaded
bitlab
parents:
diff changeset
457 /*if(curr_read == 35){
762009a91895 Uploaded
bitlab
parents:
diff changeset
458 fprintf(stdout, "Launching %"PRIu64" @ %"PRIu64", vs %"PRIu64" @ %"PRIu64": \n", curr_read, curr_pos+1, curr_db_seq, pos_of_hit);
762009a91895 Uploaded
bitlab
parents:
diff changeset
459 printf("what do you think will happen: %"PRIu64"\n", hta->database->start_pos[curr_db_seq]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
460 //fprintf(stdout, "lengths: x: %"PRIu64", y: %"PRIu64"\n", xlen, ylen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
461 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
462 }*/
762009a91895 Uploaded
bitlab
parents:
diff changeset
463
762009a91895 Uploaded
bitlab
parents:
diff changeset
464
762009a91895 Uploaded
bitlab
parents:
diff changeset
465 //printf("accepted because: \n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
466 /*if(curr_read % 100 == 0){
762009a91895 Uploaded
bitlab
parents:
diff changeset
467 fprintf(stdout, "Launching %"PRIu64" @ %"PRIu64", vs %"PRIu64" @ %"PRIu64": \n", curr_read, curr_pos+1, curr_db_seq, pos_of_hit);
762009a91895 Uploaded
bitlab
parents:
diff changeset
468 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
469 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
470 //printf("prev_diag: %"PRId64"- currdiag: %"PRId64"\n", last_diagonal, curr_diagonal);
762009a91895 Uploaded
bitlab
parents:
diff changeset
471 //printf("\t covers to [%"PRIu64"+%"PRIu64"=%"PRIu64"] [%"PRIu64"] \n", qf.x_start, qf.t_len, qf.x_start+qf.t_len, pos_of_hit); getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
472 if(hta->markers[curr_db_seq] == FALSE){
762009a91895 Uploaded
bitlab
parents:
diff changeset
473
762009a91895 Uploaded
bitlab
parents:
diff changeset
474 //if(current_table > 0) getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
475 alignmentFromQuickHits(hta->database, hta->query, pos_of_hit, curr_pos+1, curr_read, curr_db_seq, &qf, hta->contained_reads[current_table], hta->base_coordinates[current_table]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
476 last_diagonal = curr_diagonal;
762009a91895 Uploaded
bitlab
parents:
diff changeset
477 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
478 qf.e_value = 100000000;
762009a91895 Uploaded
bitlab
parents:
diff changeset
479 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
480
762009a91895 Uploaded
bitlab
parents:
diff changeset
481 //if(curr_read == 35) printf(" evalue: %Le from %"PRIu64", %"PRIu64" with l: %"PRIu64"\n", qf.e_value, qf.x_start, qf.y_start, qf.t_len);
762009a91895 Uploaded
bitlab
parents:
diff changeset
482 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
483
762009a91895 Uploaded
bitlab
parents:
diff changeset
484 /*if(curr_read == 35){
762009a91895 Uploaded
bitlab
parents:
diff changeset
485 printf("rejected because: \n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
486 fprintf(stdout, "UNLaunching %"PRIu64" @ %"PRIu64", vs %"PRIu64" @ %"PRIu64": \n", curr_read, curr_pos+1, curr_db_seq, pos_of_hit);
762009a91895 Uploaded
bitlab
parents:
diff changeset
487 printf("prev_diag: %"PRId64"- currdiag: %"PRId64"\n", last_diagonal, curr_diagonal);
762009a91895 Uploaded
bitlab
parents:
diff changeset
488 printf("\t covers to [%"PRIu64"+%"PRIu64"=%"PRIu64"] [%"PRIu64"] \n", qf.x_start, qf.t_len, qf.x_start+qf.t_len, pos_of_hit); getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
489 }*/
762009a91895 Uploaded
bitlab
parents:
diff changeset
490
762009a91895 Uploaded
bitlab
parents:
diff changeset
491 qf.e_value = 100000000;
762009a91895 Uploaded
bitlab
parents:
diff changeset
492 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
493
762009a91895 Uploaded
bitlab
parents:
diff changeset
494 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
495 printf(" evalue: %Le %"PRIu64"\n", qf.e_value, qf.t_len);
762009a91895 Uploaded
bitlab
parents:
diff changeset
496 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
497 //getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
498
762009a91895 Uploaded
bitlab
parents:
diff changeset
499
762009a91895 Uploaded
bitlab
parents:
diff changeset
500
762009a91895 Uploaded
bitlab
parents:
diff changeset
501
762009a91895 Uploaded
bitlab
parents:
diff changeset
502
762009a91895 Uploaded
bitlab
parents:
diff changeset
503 //If e-value of current frag is good, then we compute a good gapped alignment
762009a91895 Uploaded
bitlab
parents:
diff changeset
504 if(qf.e_value < hta->min_e_value /*&& xlen == 799 && ylen == 2497*/){
762009a91895 Uploaded
bitlab
parents:
diff changeset
505 alignments_tried++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
506 ba.identities = ba.length = ba.igaps = ba.egaps = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
507 //Compute lengths of reads
762009a91895 Uploaded
bitlab
parents:
diff changeset
508 if(curr_db_seq == hta->database->n_seqs-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
509 xlen = hta->database->total_len - hta->database->start_pos[curr_db_seq];
762009a91895 Uploaded
bitlab
parents:
diff changeset
510 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
511 xlen = hta->database->start_pos[curr_db_seq+1] - hta->database->start_pos[curr_db_seq];
762009a91895 Uploaded
bitlab
parents:
diff changeset
512 //printf("!!!\n%"PRIu64", %"PRIu64" :: %"PRIu64"; its db->start_pos[curr_db_seq] db->start_pos[curr_db_seq+1] curr_db_seq\n", hta->database->start_pos[curr_db_seq], hta->database->start_pos[curr_db_seq+1], curr_db_seq);
762009a91895 Uploaded
bitlab
parents:
diff changeset
513 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
514 if(curr_read == hta->query->n_seqs-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
515 ylen = hta->query->total_len - hta->query->start_pos[curr_read];
762009a91895 Uploaded
bitlab
parents:
diff changeset
516 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
517 ylen = hta->query->start_pos[curr_read+1] - hta->query->start_pos[curr_read];
762009a91895 Uploaded
bitlab
parents:
diff changeset
518 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
519 //fprintf(stdout, "lengths: x: %"PRIu64", y: %"PRIu64"\n", xlen, ylen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
520 //Perform alignment plus backtracking
762009a91895 Uploaded
bitlab
parents:
diff changeset
521 //void build_alignment(char * reconstruct_X, char * reconstruct_Y, uint64_t curr_db_seq, uint64_t curr_read, HashTableArgs * hta, char * my_x, char * my_y, struct cell ** table, struct cell * mc, char * writing_buffer_alignment, BasicAlignment * ba, uint64_t xlen, uint64_t ylen)
762009a91895 Uploaded
bitlab
parents:
diff changeset
522 if(xlen > MAX_READ_SIZE || ylen > MAX_READ_SIZE){ printf("(%"PRIu64",%"PRIu64")\n", xlen, ylen); terror("Read size reached for gapped alignment."); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
523 //fprintf(stdout, "R0 %"PRIu64", %"PRIu64"\n", curr_db_seq, curr_read);
762009a91895 Uploaded
bitlab
parents:
diff changeset
524
762009a91895 Uploaded
bitlab
parents:
diff changeset
525
762009a91895 Uploaded
bitlab
parents:
diff changeset
526 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
527 fprintf(stdout, "qfxs %"PRIu64", dbs %"PRIu64", qfys %"PRIu64" qys %"PRIu64"\n", qf.x_start, hta->database->start_pos[curr_db_seq], qf.y_start, hta->query->start_pos[curr_read]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
528 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
529
762009a91895 Uploaded
bitlab
parents:
diff changeset
530 //fprintf(stdout, "dbFragxs %"PRIu64", dbs %"PRIu64", rFragys %"PRIu64" rys %"PRIu64"\n", qf.x_start, hta->database->start_pos[curr_db_seq], qf.y_start, hta->query->start_pos[curr_read]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
531 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
532 printf("at table: %u\n", current_table);
762009a91895 Uploaded
bitlab
parents:
diff changeset
533 fprintf(stdout, "Launching curr_read: %"PRIu64" @ %"PRIu64", vs curr_db_read: %"PRIu64" @ %"PRIu64": ", curr_read, curr_pos+1, curr_db_seq, pos_of_hit);
762009a91895 Uploaded
bitlab
parents:
diff changeset
534 fprintf(stdout, "Launching NW %"PRIu64" @ %"PRIu64", vs %"PRIu64" @ %"PRIu64": \n", curr_read, curr_pos+1, curr_db_seq, pos_of_hit);
762009a91895 Uploaded
bitlab
parents:
diff changeset
535 printf("have len: %"PRIu64", %"PRIu64"\n", xlen, ylen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
536 printf("Quickfrag (xs, ys): qf::%"PRIu64", %"PRIu64", tlen:%"PRIu64"\n", qf.x_start, qf.y_start, qf.t_len);
762009a91895 Uploaded
bitlab
parents:
diff changeset
537 printf("Yea, but start and end of read in db is: %"PRIu64" - %"PRIu64"\n", hta->database->start_pos[curr_db_seq], hta->database->start_pos[curr_db_seq+1]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
538 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
539
762009a91895 Uploaded
bitlab
parents:
diff changeset
540 p1.x = qf.x_start - hta->database->start_pos[curr_db_seq];
762009a91895 Uploaded
bitlab
parents:
diff changeset
541 //p1.y = qf.y_start - hta->query->start_pos[curr_read];
762009a91895 Uploaded
bitlab
parents:
diff changeset
542 p1.y = qf.y_start - (hta->query->start_pos[curr_read] -1);
762009a91895 Uploaded
bitlab
parents:
diff changeset
543 p2.x = p1.x + qf.t_len;
762009a91895 Uploaded
bitlab
parents:
diff changeset
544 p2.y = p1.y + qf.t_len;
762009a91895 Uploaded
bitlab
parents:
diff changeset
545 p3.x = xlen;
762009a91895 Uploaded
bitlab
parents:
diff changeset
546 p3.y = ylen;
762009a91895 Uploaded
bitlab
parents:
diff changeset
547
762009a91895 Uploaded
bitlab
parents:
diff changeset
548 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
549 fprintf(stdout, "p0 (%"PRIu64", %"PRIu64") p1 (%"PRIu64", %"PRIu64") p2 (%"PRIu64", %"PRIu64") p3 (%"PRIu64", %"PRIu64")\n", p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
550 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
551 //fprintf(stdout, "p0 (%"PRIu64", %"PRIu64") p1 (%"PRIu64", %"PRIu64") p2 (%"PRIu64", %"PRIu64") p3 (%"PRIu64", %"PRIu64")\n", p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
552
762009a91895 Uploaded
bitlab
parents:
diff changeset
553 calculate_y_cell_path(p0, p1, p2, p3, cell_path_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
554
762009a91895 Uploaded
bitlab
parents:
diff changeset
555 // REMOVE
762009a91895 Uploaded
bitlab
parents:
diff changeset
556 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
557 uint64_t r1,r2;
762009a91895 Uploaded
bitlab
parents:
diff changeset
558 for(r1=0;r1<MAX_WINDOW_SIZE;r1++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
559 for(r2=0;r2<MAX_WINDOW_SIZE;r2++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
560 hta->table[r1][r2].score = INT64_MIN;
762009a91895 Uploaded
bitlab
parents:
diff changeset
561 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
562 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
563 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
564
762009a91895 Uploaded
bitlab
parents:
diff changeset
565 build_alignment(hta->reconstruct_X, hta->reconstruct_Y, curr_db_seq, curr_read, hta, hta->my_x, hta->my_y, hta->table, hta->mc, hta->writing_buffer_alignment, &ba, xlen, ylen, cell_path_y, &hta->window);
762009a91895 Uploaded
bitlab
parents:
diff changeset
566
762009a91895 Uploaded
bitlab
parents:
diff changeset
567 // Set the read to already aligned so that it does not repeat
762009a91895 Uploaded
bitlab
parents:
diff changeset
568 hta->markers[curr_db_seq] = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
569
762009a91895 Uploaded
bitlab
parents:
diff changeset
570 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
571 printf("len 1 %"PRIu64", len 2 %"PRIu64"\n", ba.length, ylen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
572 printf("ident %"PRIu64"\n", ba.identities);
762009a91895 Uploaded
bitlab
parents:
diff changeset
573 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
574
762009a91895 Uploaded
bitlab
parents:
diff changeset
575 //If is good
762009a91895 Uploaded
bitlab
parents:
diff changeset
576 if(((long double)(ba.length-(ba.igaps+ba.egaps))/ylen) >= hta->min_coverage && ((long double)ba.identities/(ba.length-(ba.igaps+ba.egaps))) >= hta->min_identity){
762009a91895 Uploaded
bitlab
parents:
diff changeset
577 if(already_aligned == FALSE){
762009a91895 Uploaded
bitlab
parents:
diff changeset
578 hta->accepted_query_reads++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
579 already_aligned = TRUE;
762009a91895 Uploaded
bitlab
parents:
diff changeset
580 //printf("accepted: %"PRIu64"\n", hta->accepted_query_reads);
762009a91895 Uploaded
bitlab
parents:
diff changeset
581 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
582
762009a91895 Uploaded
bitlab
parents:
diff changeset
583 hta->markers[curr_db_seq] = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
584 if(hta->out != NULL){
762009a91895 Uploaded
bitlab
parents:
diff changeset
585 //printf("Last was: (%"PRIu64", %"PRIu64")\n", curr_read, curr_db_seq);
762009a91895 Uploaded
bitlab
parents:
diff changeset
586 fprintf(hta->out, "(%"PRIu64", %"PRIu64") : %d%% %d%% %"PRIu64"\n $$$$$$$ \n", curr_read, curr_db_seq, MIN(100,(int)(100*(ba.length-(ba.igaps+ba.egaps))/ylen)), MIN(100,(int)((long double)100*ba.identities/(ba.length-(ba.igaps+ba.egaps)))), ylen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
587 fprintf(hta->out, "%s", hta->writing_buffer_alignment);
762009a91895 Uploaded
bitlab
parents:
diff changeset
588 //fprintf(stdout, "(%"PRIu64", %"PRIu64") : %d%% %d%% %"PRIu64"\n $$$$$$$ \n", curr_read, curr_db_seq, MIN(100,(int)(100*ba.identities/ba.length)), MIN(100,(int)(100*ba.length/ylen)), ylen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
589 //fprintf(stdout, "%s", hta->writing_buffer_alignment);
762009a91895 Uploaded
bitlab
parents:
diff changeset
590 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
591 NWaligned = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
592 }/*else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
593 printf("what: ");
762009a91895 Uploaded
bitlab
parents:
diff changeset
594 printf("len x %"PRIu64", len y %"PRIu64"\n", xlen, ylen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
595 printf("ident %"PRIu64" len %"PRIu64"\n", ba.identities, ba.length); getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
596 }*/
762009a91895 Uploaded
bitlab
parents:
diff changeset
597
762009a91895 Uploaded
bitlab
parents:
diff changeset
598 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
599
762009a91895 Uploaded
bitlab
parents:
diff changeset
600 //strncpy(get_from_db, &hta->database->sequences[qf.x_start], qf.t_len);
762009a91895 Uploaded
bitlab
parents:
diff changeset
601 //strncpy(get_from_query, &hta->query->sequences[qf.y_start], qf.t_len);
762009a91895 Uploaded
bitlab
parents:
diff changeset
602 //fprintf(hta->out, "%s\n%s\n%Le\t%d\n-------------------\n", get_from_db, get_from_query, qf.e_value, (int)(100*qf.coverage));
762009a91895 Uploaded
bitlab
parents:
diff changeset
603 //fprintf(hta->out, "%"PRIu64", %"PRIu64", %"PRIu64"\n", qf.x_start, qf.y_start, qf.t_len);
762009a91895 Uploaded
bitlab
parents:
diff changeset
604
762009a91895 Uploaded
bitlab
parents:
diff changeset
605 //printf("Hit comes from %"PRIu64", %"PRIu64"\n", pos_of_hit, curr_pos);
762009a91895 Uploaded
bitlab
parents:
diff changeset
606 only_hits:
762009a91895 Uploaded
bitlab
parents:
diff changeset
607 aux = aux->next;
762009a91895 Uploaded
bitlab
parents:
diff changeset
608 while(aux == NULL && current_table < FIXED_LOADING_THREADS-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
609 ++current_table;
762009a91895 Uploaded
bitlab
parents:
diff changeset
610 pointer = &ptr_table_redirect[current_table]->root[char_converter[curr_kmer[1]]][char_converter[curr_kmer[2]]][char_converter[curr_kmer[3]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
611 [char_converter[curr_kmer[4]]][char_converter[curr_kmer[5]]][char_converter[curr_kmer[6]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
612 [char_converter[curr_kmer[7]]][char_converter[curr_kmer[8]]][char_converter[curr_kmer[9]]]
762009a91895 Uploaded
bitlab
parents:
diff changeset
613 [char_converter[curr_kmer[10]]][char_converter[curr_kmer[11]]];
762009a91895 Uploaded
bitlab
parents:
diff changeset
614 hash_forward = hashOfWord(&curr_kmer[FIXED_K], custom_kmer - FIXED_K);
762009a91895 Uploaded
bitlab
parents:
diff changeset
615 search = find_AVLTree(pointer, hash_forward);
762009a91895 Uploaded
bitlab
parents:
diff changeset
616 if(search != NULL) aux = search->next; else aux = NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
617 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
618 //fprintf(stdout, "%p\n", aux);
762009a91895 Uploaded
bitlab
parents:
diff changeset
619 //fflush(stdout);
762009a91895 Uploaded
bitlab
parents:
diff changeset
620 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
621 //printf("SWITCHED\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
622
762009a91895 Uploaded
bitlab
parents:
diff changeset
623 if(NWaligned == 1 && hta->full_comp == FALSE){
762009a91895 Uploaded
bitlab
parents:
diff changeset
624 if(curr_read < hta->query->n_seqs) curr_pos = hta->query->start_pos[curr_read+1]-2;
762009a91895 Uploaded
bitlab
parents:
diff changeset
625 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
626 memcpy(b_aux, curr_kmer, custom_kmer);
762009a91895 Uploaded
bitlab
parents:
diff changeset
627 memcpy(curr_kmer, &b_aux[1], custom_kmer-1);
762009a91895 Uploaded
bitlab
parents:
diff changeset
628 crrSeqL -= 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
629 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
630 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
631 //printf("current pos: %"PRIu64"\n", curr_pos);
762009a91895 Uploaded
bitlab
parents:
diff changeset
632 curr_pos++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
633 if(curr_pos < hta->query->total_len) c = (char) hta->query->sequences[curr_pos];
762009a91895 Uploaded
bitlab
parents:
diff changeset
634
762009a91895 Uploaded
bitlab
parents:
diff changeset
635
762009a91895 Uploaded
bitlab
parents:
diff changeset
636
762009a91895 Uploaded
bitlab
parents:
diff changeset
637 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
638
762009a91895 Uploaded
bitlab
parents:
diff changeset
639
762009a91895 Uploaded
bitlab
parents:
diff changeset
640
762009a91895 Uploaded
bitlab
parents:
diff changeset
641
762009a91895 Uploaded
bitlab
parents:
diff changeset
642
762009a91895 Uploaded
bitlab
parents:
diff changeset
643 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
644
762009a91895 Uploaded
bitlab
parents:
diff changeset
645
762009a91895 Uploaded
bitlab
parents:
diff changeset
646
762009a91895 Uploaded
bitlab
parents:
diff changeset
647
762009a91895 Uploaded
bitlab
parents:
diff changeset
648
762009a91895 Uploaded
bitlab
parents:
diff changeset
649 //fprintf(stdout, "Going from %"PRIu64" to %"PRIu64"\n", hta->from, hta->to);
762009a91895 Uploaded
bitlab
parents:
diff changeset
650 //fflush(stdout);
762009a91895 Uploaded
bitlab
parents:
diff changeset
651
762009a91895 Uploaded
bitlab
parents:
diff changeset
652 free(cell_path_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
653
762009a91895 Uploaded
bitlab
parents:
diff changeset
654 return NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
655
762009a91895 Uploaded
bitlab
parents:
diff changeset
656 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
657
762009a91895 Uploaded
bitlab
parents:
diff changeset
658 void build_alignment(char * reconstruct_X, char * reconstruct_Y, uint64_t curr_db_seq, uint64_t curr_read, HashTableArgs * hta, unsigned char * my_x, unsigned char * my_y, struct cell ** table, struct positioned_cell * mc, char * writing_buffer_alignment, BasicAlignment * ba, uint64_t xlen, uint64_t ylen, int64_t * cell_path_y, long double * window){
762009a91895 Uploaded
bitlab
parents:
diff changeset
659
762009a91895 Uploaded
bitlab
parents:
diff changeset
660
762009a91895 Uploaded
bitlab
parents:
diff changeset
661 //Do some printing of alignments here
762009a91895 Uploaded
bitlab
parents:
diff changeset
662 uint64_t maximum_len, i, j, curr_pos_buffer, curr_window_size;
762009a91895 Uploaded
bitlab
parents:
diff changeset
663
762009a91895 Uploaded
bitlab
parents:
diff changeset
664 maximum_len = 2*MAX(xlen,ylen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
665 memcpy(my_x, &hta->database->sequences[hta->database->start_pos[curr_db_seq]], xlen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
666 memcpy(my_y, &hta->query->sequences[hta->query->start_pos[curr_read]], ylen);
762009a91895 Uploaded
bitlab
parents:
diff changeset
667
762009a91895 Uploaded
bitlab
parents:
diff changeset
668 struct best_cell bc = NW(my_x, 0, xlen, my_y, 0, ylen, (int64_t) hta->igap, (int64_t) hta->egap, table, mc, 0, cell_path_y, window, &curr_window_size);
762009a91895 Uploaded
bitlab
parents:
diff changeset
669 backtrackingNW(my_x, 0, xlen, my_y, 0, ylen, table, reconstruct_X, reconstruct_Y, &bc, &i, &j, ba, cell_path_y, curr_window_size);
762009a91895 Uploaded
bitlab
parents:
diff changeset
670 uint64_t offset = 0, before_i = 0, before_j = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
671 i++; j++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
672
762009a91895 Uploaded
bitlab
parents:
diff changeset
673 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
674 uint64_t z=0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
675 for(z=0;z<maximum_len;z++) printf("%c", reconstruct_X[z]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
676 printf("\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
677 for(z=0;z<maximum_len;z++) printf("%c", reconstruct_Y[z]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
678 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
679
762009a91895 Uploaded
bitlab
parents:
diff changeset
680 curr_pos_buffer = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
681 while(i <= maximum_len && j <= maximum_len){
762009a91895 Uploaded
bitlab
parents:
diff changeset
682 offset = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
683 before_i = i;
762009a91895 Uploaded
bitlab
parents:
diff changeset
684 writing_buffer_alignment[curr_pos_buffer++] = 'D';
762009a91895 Uploaded
bitlab
parents:
diff changeset
685 writing_buffer_alignment[curr_pos_buffer++] = '\t';
762009a91895 Uploaded
bitlab
parents:
diff changeset
686 while(offset < ALIGN_LEN && i <= maximum_len){
762009a91895 Uploaded
bitlab
parents:
diff changeset
687 //fprintf(stdout, "%c", reconstruct_X[i]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
688 writing_buffer_alignment[curr_pos_buffer++] = (char) reconstruct_X[i];
762009a91895 Uploaded
bitlab
parents:
diff changeset
689 i++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
690 offset++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
691 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
692 //fprintf(out, "\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
693
762009a91895 Uploaded
bitlab
parents:
diff changeset
694 writing_buffer_alignment[curr_pos_buffer++] = '\n';
762009a91895 Uploaded
bitlab
parents:
diff changeset
695 offset = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
696 before_j = j;
762009a91895 Uploaded
bitlab
parents:
diff changeset
697
762009a91895 Uploaded
bitlab
parents:
diff changeset
698 //fprintf(stdout, "\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
699
762009a91895 Uploaded
bitlab
parents:
diff changeset
700 writing_buffer_alignment[curr_pos_buffer++] = 'Q';
762009a91895 Uploaded
bitlab
parents:
diff changeset
701 writing_buffer_alignment[curr_pos_buffer++] = '\t';
762009a91895 Uploaded
bitlab
parents:
diff changeset
702
762009a91895 Uploaded
bitlab
parents:
diff changeset
703 while(offset < ALIGN_LEN && j <= maximum_len){
762009a91895 Uploaded
bitlab
parents:
diff changeset
704 //fprintf(stdout, "%c", reconstruct_Y[j]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
705 writing_buffer_alignment[curr_pos_buffer++] = (char) reconstruct_Y[j];
762009a91895 Uploaded
bitlab
parents:
diff changeset
706 j++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
707 offset++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
708 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
709 //fprintf(out, "\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
710 writing_buffer_alignment[curr_pos_buffer++] = '\n';
762009a91895 Uploaded
bitlab
parents:
diff changeset
711 writing_buffer_alignment[curr_pos_buffer++] = ' ';
762009a91895 Uploaded
bitlab
parents:
diff changeset
712 writing_buffer_alignment[curr_pos_buffer++] = '\t';
762009a91895 Uploaded
bitlab
parents:
diff changeset
713 while(before_i < i){
762009a91895 Uploaded
bitlab
parents:
diff changeset
714 if(reconstruct_X[before_i] != '-' && reconstruct_Y[before_j] != '-' && reconstruct_X[before_i] == reconstruct_Y[before_j]){
762009a91895 Uploaded
bitlab
parents:
diff changeset
715 //fprintf(out, "*");
762009a91895 Uploaded
bitlab
parents:
diff changeset
716 writing_buffer_alignment[curr_pos_buffer++] = '*';
762009a91895 Uploaded
bitlab
parents:
diff changeset
717 ba->identities++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
718 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
719 //fprintf(out, " ");
762009a91895 Uploaded
bitlab
parents:
diff changeset
720 writing_buffer_alignment[curr_pos_buffer++] = ' ';
762009a91895 Uploaded
bitlab
parents:
diff changeset
721 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
722 before_j++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
723 before_i++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
724 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
725 writing_buffer_alignment[curr_pos_buffer++] = '\n';
762009a91895 Uploaded
bitlab
parents:
diff changeset
726
762009a91895 Uploaded
bitlab
parents:
diff changeset
727 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
728 //fprintf(out, "\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
729 writing_buffer_alignment[curr_pos_buffer++] = '\n';
762009a91895 Uploaded
bitlab
parents:
diff changeset
730 writing_buffer_alignment[curr_pos_buffer++] = '\0';
762009a91895 Uploaded
bitlab
parents:
diff changeset
731
762009a91895 Uploaded
bitlab
parents:
diff changeset
732
762009a91895 Uploaded
bitlab
parents:
diff changeset
733 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
734
762009a91895 Uploaded
bitlab
parents:
diff changeset
735 void alignmentFromQuickHits(SeqInfo * database, SeqInfo * query, uint64_t pos_database, uint64_t pos_query, uint64_t curr_read, uint64_t curr_db_seq, Quickfrag * qf, uint64_t offset_db_reads, uint64_t offset_db_coordinates){
762009a91895 Uploaded
bitlab
parents:
diff changeset
736
762009a91895 Uploaded
bitlab
parents:
diff changeset
737 int64_t read_x_start, read_x_end, read_y_start, read_y_end;
762009a91895 Uploaded
bitlab
parents:
diff changeset
738
762009a91895 Uploaded
bitlab
parents:
diff changeset
739 if(curr_db_seq == database->n_seqs-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
740 read_x_start = database->start_pos[curr_db_seq];
762009a91895 Uploaded
bitlab
parents:
diff changeset
741 read_x_end = database->total_len;
762009a91895 Uploaded
bitlab
parents:
diff changeset
742 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
743 read_x_start = database->start_pos[curr_db_seq];
762009a91895 Uploaded
bitlab
parents:
diff changeset
744 read_x_end = database->start_pos[curr_db_seq+1] - 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
745 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
746
762009a91895 Uploaded
bitlab
parents:
diff changeset
747 //printf("read x start -> %"PRId64", end -> %"PRId64" btw: %"PRIu64"\n", read_x_start, read_x_end, database->n_seqs);
762009a91895 Uploaded
bitlab
parents:
diff changeset
748
762009a91895 Uploaded
bitlab
parents:
diff changeset
749 if(curr_read == query->n_seqs-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
750 read_y_start = query->start_pos[curr_read];
762009a91895 Uploaded
bitlab
parents:
diff changeset
751 read_y_end = query->total_len;
762009a91895 Uploaded
bitlab
parents:
diff changeset
752 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
753 read_y_start = query->start_pos[curr_read];
762009a91895 Uploaded
bitlab
parents:
diff changeset
754 read_y_end = query->start_pos[curr_read+1] - 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
755 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
756
762009a91895 Uploaded
bitlab
parents:
diff changeset
757 //printf("db_end %"PRId64" query_end %"PRId64"\n", read_x_end, read_y_end);
762009a91895 Uploaded
bitlab
parents:
diff changeset
758 //printf("pos database: %"PRIu64"\n", pos_database);
762009a91895 Uploaded
bitlab
parents:
diff changeset
759 int64_t curr_pos_db = (int64_t) pos_database;
762009a91895 Uploaded
bitlab
parents:
diff changeset
760 int64_t curr_pos_qy = (int64_t) pos_query;
762009a91895 Uploaded
bitlab
parents:
diff changeset
761 int64_t final_end_x = (int64_t) pos_database - 1, final_start_x = final_end_x - custom_kmer + 1, final_start_y = pos_query - custom_kmer;
762009a91895 Uploaded
bitlab
parents:
diff changeset
762 int64_t score_right = custom_kmer * POINT;
762009a91895 Uploaded
bitlab
parents:
diff changeset
763 int64_t score_left = score_right;
762009a91895 Uploaded
bitlab
parents:
diff changeset
764 int64_t high_left = score_left, high_right = score_right;
762009a91895 Uploaded
bitlab
parents:
diff changeset
765 qf->t_len = custom_kmer;
762009a91895 Uploaded
bitlab
parents:
diff changeset
766 uint64_t idents = custom_kmer;
762009a91895 Uploaded
bitlab
parents:
diff changeset
767
762009a91895 Uploaded
bitlab
parents:
diff changeset
768 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
769 char le_hit[1000];
762009a91895 Uploaded
bitlab
parents:
diff changeset
770 memcpy(le_hit, &database->sequences[final_start_x], FIXED_K);
762009a91895 Uploaded
bitlab
parents:
diff changeset
771
762009a91895 Uploaded
bitlab
parents:
diff changeset
772 fprintf(stdout, "HIT: %s\n", le_hit);
762009a91895 Uploaded
bitlab
parents:
diff changeset
773 fflush(stdout);
762009a91895 Uploaded
bitlab
parents:
diff changeset
774 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
775 //printf("final start x: %"PRId64"\n", final_start_x);
762009a91895 Uploaded
bitlab
parents:
diff changeset
776 int keep_going = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
777
762009a91895 Uploaded
bitlab
parents:
diff changeset
778 //Forward search
762009a91895 Uploaded
bitlab
parents:
diff changeset
779 while(keep_going == 1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
780
762009a91895 Uploaded
bitlab
parents:
diff changeset
781
762009a91895 Uploaded
bitlab
parents:
diff changeset
782 if(score_right > 0 && curr_pos_db < database->total_len && curr_pos_qy < query->total_len){
762009a91895 Uploaded
bitlab
parents:
diff changeset
783 if(curr_pos_db > read_x_end || curr_pos_qy > read_y_end) break;
762009a91895 Uploaded
bitlab
parents:
diff changeset
784 //if(database->sequences[curr_pos_db] == query->sequences[curr_pos_qy]){ score_right+=POINT; idents++; }else{ score_right-=POINT;}
762009a91895 Uploaded
bitlab
parents:
diff changeset
785 if(compare_letters(database->sequences[curr_pos_db], query->sequences[curr_pos_qy]) == POINT){ score_right+=POINT; idents++; }else{ score_right-=POINT;}
762009a91895 Uploaded
bitlab
parents:
diff changeset
786 if(high_right <= score_right){
762009a91895 Uploaded
bitlab
parents:
diff changeset
787 final_end_x = curr_pos_db;
762009a91895 Uploaded
bitlab
parents:
diff changeset
788 high_right = score_right;
762009a91895 Uploaded
bitlab
parents:
diff changeset
789 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
790 curr_pos_db++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
791 curr_pos_qy++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
792 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
793 keep_going = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
794 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
795 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
796
762009a91895 Uploaded
bitlab
parents:
diff changeset
797 //printf("pos here %"PRIu64" curr_pos_db, curr_pos_query %"PRIu64"\n", curr_pos_db, curr_pos_qy);
762009a91895 Uploaded
bitlab
parents:
diff changeset
798 //printf("final start x: %"PRId64"\n", final_start_x);
762009a91895 Uploaded
bitlab
parents:
diff changeset
799 keep_going = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
800 curr_pos_db = pos_database - custom_kmer - 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
801 curr_pos_qy = pos_query - custom_kmer - 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
802
762009a91895 Uploaded
bitlab
parents:
diff changeset
803 score_left = high_right;
762009a91895 Uploaded
bitlab
parents:
diff changeset
804
762009a91895 Uploaded
bitlab
parents:
diff changeset
805 //Backward search
762009a91895 Uploaded
bitlab
parents:
diff changeset
806 while(keep_going == 1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
807
762009a91895 Uploaded
bitlab
parents:
diff changeset
808 if(score_left > 0 && curr_pos_db >= 0 && curr_pos_qy >= 0){
762009a91895 Uploaded
bitlab
parents:
diff changeset
809 if(curr_pos_db < read_x_start || curr_pos_qy < read_y_start ) break;
762009a91895 Uploaded
bitlab
parents:
diff changeset
810 //if(database->sequences[curr_pos_db] == query->sequences[curr_pos_qy]){ score_left+=POINT; idents++; }else{ score_left-=POINT;}
762009a91895 Uploaded
bitlab
parents:
diff changeset
811 if(compare_letters(database->sequences[curr_pos_db], query->sequences[curr_pos_qy]) == POINT){ score_left+=POINT; idents++; }else{ score_left-=POINT;}
762009a91895 Uploaded
bitlab
parents:
diff changeset
812 if(high_left <= score_left){
762009a91895 Uploaded
bitlab
parents:
diff changeset
813 final_start_x = curr_pos_db;
762009a91895 Uploaded
bitlab
parents:
diff changeset
814 final_start_y = curr_pos_qy;
762009a91895 Uploaded
bitlab
parents:
diff changeset
815 //printf("got %"PRIu64" when min is %"PRIu64"\n", final_start_y, read_y_start);
762009a91895 Uploaded
bitlab
parents:
diff changeset
816 high_left = score_left;
762009a91895 Uploaded
bitlab
parents:
diff changeset
817 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
818 curr_pos_db--;
762009a91895 Uploaded
bitlab
parents:
diff changeset
819 curr_pos_qy--;
762009a91895 Uploaded
bitlab
parents:
diff changeset
820 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
821 keep_going = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
822 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
823 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
824
762009a91895 Uploaded
bitlab
parents:
diff changeset
825 qf->t_len = final_end_x - final_start_x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
826
762009a91895 Uploaded
bitlab
parents:
diff changeset
827 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
828 char s1[1000];
762009a91895 Uploaded
bitlab
parents:
diff changeset
829 char s2[1000];
762009a91895 Uploaded
bitlab
parents:
diff changeset
830
762009a91895 Uploaded
bitlab
parents:
diff changeset
831 memcpy(s1, &database->sequences[final_start_x], qf->t_len);
762009a91895 Uploaded
bitlab
parents:
diff changeset
832 memcpy(s2, &query->sequences[final_start_y], qf->t_len);
762009a91895 Uploaded
bitlab
parents:
diff changeset
833 s1[qf->t_len] = '\0';
762009a91895 Uploaded
bitlab
parents:
diff changeset
834 s2[qf->t_len] = '\0';
762009a91895 Uploaded
bitlab
parents:
diff changeset
835
762009a91895 Uploaded
bitlab
parents:
diff changeset
836 fprintf(stdout, "%s\n%s\n------\n", s1, s2);
762009a91895 Uploaded
bitlab
parents:
diff changeset
837 fflush(stdout);
762009a91895 Uploaded
bitlab
parents:
diff changeset
838
762009a91895 Uploaded
bitlab
parents:
diff changeset
839 printf("the real hit was:\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
840 memcpy(s1, &database->sequences[pos_database-12+1], 12);
762009a91895 Uploaded
bitlab
parents:
diff changeset
841 memcpy(s2, &query->sequences[pos_query-12+1], 12);
762009a91895 Uploaded
bitlab
parents:
diff changeset
842 s1[12] = '\0';
762009a91895 Uploaded
bitlab
parents:
diff changeset
843 s2[12] = '\0';
762009a91895 Uploaded
bitlab
parents:
diff changeset
844
762009a91895 Uploaded
bitlab
parents:
diff changeset
845 fprintf(stdout, "%s\n%s\n------\n", s1, s2);
762009a91895 Uploaded
bitlab
parents:
diff changeset
846 fflush(stdout);
762009a91895 Uploaded
bitlab
parents:
diff changeset
847 //getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
848 printf("%"PRIu64"\n", idents);
762009a91895 Uploaded
bitlab
parents:
diff changeset
849 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
850
762009a91895 Uploaded
bitlab
parents:
diff changeset
851 long double rawscore = (idents*POINT) - (qf->t_len - idents)*(POINT);
762009a91895 Uploaded
bitlab
parents:
diff changeset
852
762009a91895 Uploaded
bitlab
parents:
diff changeset
853 long double t_len;
762009a91895 Uploaded
bitlab
parents:
diff changeset
854 if(curr_read == query->n_seqs-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
855 t_len = (long double) query->total_len - query->start_pos[curr_read];
762009a91895 Uploaded
bitlab
parents:
diff changeset
856 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
857 t_len = (long double) query->start_pos[curr_read+1] - query->start_pos[curr_read];
762009a91895 Uploaded
bitlab
parents:
diff changeset
858 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
859 //printf("final start x: %"PRId64"\n", final_start_x);
762009a91895 Uploaded
bitlab
parents:
diff changeset
860 qf->x_start = final_start_x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
861 qf->y_start = final_start_y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
862 qf->e_value = (long double) QF_KARLIN*t_len*database->total_len*expl(-QF_LAMBDA * rawscore);
762009a91895 Uploaded
bitlab
parents:
diff changeset
863 qf->coverage = qf->t_len / t_len;
762009a91895 Uploaded
bitlab
parents:
diff changeset
864
762009a91895 Uploaded
bitlab
parents:
diff changeset
865 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
866
762009a91895 Uploaded
bitlab
parents:
diff changeset
867 void calculate_y_cell_path(Point p0, Point p1, Point p2, Point p3, int64_t * y_points){
762009a91895 Uploaded
bitlab
parents:
diff changeset
868
762009a91895 Uploaded
bitlab
parents:
diff changeset
869 //Calculate lines between points
762009a91895 Uploaded
bitlab
parents:
diff changeset
870 uint64_t i;
762009a91895 Uploaded
bitlab
parents:
diff changeset
871
762009a91895 Uploaded
bitlab
parents:
diff changeset
872 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
873 printf("Built on\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
874 printf("(%"PRIu64", %"PRIu64")\n", p0.x, p0.y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
875 printf("(%"PRIu64", %"PRIu64")\n", p1.x, p1.y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
876 printf("(%"PRIu64", %"PRIu64")\n", p2.x, p2.y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
877 printf("(%"PRIu64", %"PRIu64")\n", p3.x, p3.y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
878 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
879
762009a91895 Uploaded
bitlab
parents:
diff changeset
880
762009a91895 Uploaded
bitlab
parents:
diff changeset
881
762009a91895 Uploaded
bitlab
parents:
diff changeset
882 if(p0.x > MAX_READ_SIZE){ fprintf(stdout, "LEN error %"PRIu64"\n", p0.x); terror("Reached max length in read for anchoring procedure (1)"); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
883 if(p1.x > MAX_READ_SIZE){ fprintf(stdout, "LEN error %"PRIu64"\n", p1.x); terror("Reached max length in read for anchoring procedure (2)"); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
884 if(p2.x > MAX_READ_SIZE){ fprintf(stdout, "LEN error %"PRIu64"\n", p2.x); terror("Reached max length in read for anchoring procedure (3)"); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
885 if(p3.x > MAX_READ_SIZE){ fprintf(stdout, "LEN error %"PRIu64"\n", p3.x); terror("Reached max length in read for anchoring procedure (4)"); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
886
762009a91895 Uploaded
bitlab
parents:
diff changeset
887 long double deltax, deltay, deltaerr, error;
762009a91895 Uploaded
bitlab
parents:
diff changeset
888 uint64_t y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
889
762009a91895 Uploaded
bitlab
parents:
diff changeset
890 //P0 to P1
762009a91895 Uploaded
bitlab
parents:
diff changeset
891 deltax = p1.x - p0.x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
892 deltay = p1.y - p0.y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
893 if(deltax != 0) deltaerr = fabsl(deltay/deltax); else deltaerr = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
894 //printf("Deltas x: %Le y: %Le Error: %Le\n", deltax, deltay, deltaerr);
762009a91895 Uploaded
bitlab
parents:
diff changeset
895 error = deltaerr - 0.5;
762009a91895 Uploaded
bitlab
parents:
diff changeset
896 y = p0.y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
897
762009a91895 Uploaded
bitlab
parents:
diff changeset
898 for(i=p0.x;i<p1.x;i++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
899 y_points[i] = (int64_t) y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
900 error = error + deltaerr;
762009a91895 Uploaded
bitlab
parents:
diff changeset
901 if(error >= 0.5){
762009a91895 Uploaded
bitlab
parents:
diff changeset
902 y++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
903 error = error - 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
904 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
905 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
906
762009a91895 Uploaded
bitlab
parents:
diff changeset
907 //P1 to P2
762009a91895 Uploaded
bitlab
parents:
diff changeset
908
762009a91895 Uploaded
bitlab
parents:
diff changeset
909 deltax = p2.x - p1.x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
910 deltay = p2.y - p1.y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
911 if(deltax != 0) deltaerr = fabsl(deltay/deltax); else deltaerr = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
912 //printf("Deltas x: %Le y: %Le Error: %Le\n", deltax, deltay, deltaerr);
762009a91895 Uploaded
bitlab
parents:
diff changeset
913 error = deltaerr - 0.5;
762009a91895 Uploaded
bitlab
parents:
diff changeset
914 y = p1.y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
915
762009a91895 Uploaded
bitlab
parents:
diff changeset
916 for(i=p1.x;i<p2.x;i++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
917 y_points[i] = (int64_t) y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
918 error = error + deltaerr;
762009a91895 Uploaded
bitlab
parents:
diff changeset
919 if(error >= 0.5){
762009a91895 Uploaded
bitlab
parents:
diff changeset
920 y++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
921 error = error - 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
922 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
923 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
924
762009a91895 Uploaded
bitlab
parents:
diff changeset
925 //P2 to P3
762009a91895 Uploaded
bitlab
parents:
diff changeset
926
762009a91895 Uploaded
bitlab
parents:
diff changeset
927 deltax = p3.x - p2.x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
928 deltay = p3.y - p2.y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
929 if(deltax != 0) deltaerr = fabsl(deltay/deltax); else deltaerr = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
930 //printf("Deltas x: %Le y: %Le Error: %Le\n", deltax, deltay, deltaerr);
762009a91895 Uploaded
bitlab
parents:
diff changeset
931 error = deltaerr - 0.5;
762009a91895 Uploaded
bitlab
parents:
diff changeset
932 y = p2.y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
933
762009a91895 Uploaded
bitlab
parents:
diff changeset
934 for(i=p2.x;i<p3.x;i++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
935 y_points[i] = (int64_t) y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
936 error = error + deltaerr;
762009a91895 Uploaded
bitlab
parents:
diff changeset
937 if(error >= 0.5){
762009a91895 Uploaded
bitlab
parents:
diff changeset
938 y++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
939 error = error - 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
940 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
941 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
942
762009a91895 Uploaded
bitlab
parents:
diff changeset
943 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
944 if(p3.x == 799 && p3.y == 2497){
762009a91895 Uploaded
bitlab
parents:
diff changeset
945 for(i=0;i<p3.x;i++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
946 printf("%"PRIu64": %"PRIu64"\n", i, y_points[i]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
947 if(i % 50 == 0) getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
948 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
949 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
950 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
951
762009a91895 Uploaded
bitlab
parents:
diff changeset
952 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
953 for(i=0;i<p3.x;i++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
954 printf("%"PRIu64" -> ", y_points[i]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
955 if(i % 50 == 0) getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
956 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
957
762009a91895 Uploaded
bitlab
parents:
diff changeset
958 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
959
762009a91895 Uploaded
bitlab
parents:
diff changeset
960
762009a91895 Uploaded
bitlab
parents:
diff changeset
961
762009a91895 Uploaded
bitlab
parents:
diff changeset
962 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
963
762009a91895 Uploaded
bitlab
parents:
diff changeset
964 struct best_cell NW(unsigned char * X, uint64_t Xstart, uint64_t Xend, unsigned char * Y, uint64_t Ystart, uint64_t Yend, int64_t iGap, int64_t eGap, struct cell ** table, struct positioned_cell * mc, int show, int64_t * cell_path_y, long double * window, uint64_t * current_window_size){
762009a91895 Uploaded
bitlab
parents:
diff changeset
965
762009a91895 Uploaded
bitlab
parents:
diff changeset
966
762009a91895 Uploaded
bitlab
parents:
diff changeset
967 uint64_t i, j, j_prime;
762009a91895 Uploaded
bitlab
parents:
diff changeset
968 int64_t scoreDiagonal = INT64_MIN, scoreLeft = INT64_MIN, scoreRight = INT64_MIN, score = INT64_MIN, delta_dif_1_0, delta_dif_2_1, limit_left, limit_right, j_right_prime = 1, j_left_prime = 1, j_diag_prime = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
969
762009a91895 Uploaded
bitlab
parents:
diff changeset
970 struct best_cell bc;
762009a91895 Uploaded
bitlab
parents:
diff changeset
971 bc.c.score = INT64_MIN;
762009a91895 Uploaded
bitlab
parents:
diff changeset
972 bc.c.xpos = 0; bc.c.ypos = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
973
762009a91895 Uploaded
bitlab
parents:
diff changeset
974 //The window size will be a +-15% of the square root of the product of lengths
762009a91895 Uploaded
bitlab
parents:
diff changeset
975 int64_t window_size = MIN(MAX_WINDOW_SIZE/2, (uint64_t) (*window * sqrtl((long double) Xend * (long double) Yend)));
762009a91895 Uploaded
bitlab
parents:
diff changeset
976 //printf("xlen: %"PRIu64", ylen: %"PRIu64" w-size: %"PRId64"\n", Xend, Yend, window_size);
762009a91895 Uploaded
bitlab
parents:
diff changeset
977 *current_window_size = (uint64_t) window_size;
762009a91895 Uploaded
bitlab
parents:
diff changeset
978
762009a91895 Uploaded
bitlab
parents:
diff changeset
979 //The limits to the window
762009a91895 Uploaded
bitlab
parents:
diff changeset
980 limit_left = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
981 limit_right = 2*window_size + 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
982 if(limit_right > MAX_WINDOW_SIZE) limit_right = MAX_WINDOW_SIZE;
762009a91895 Uploaded
bitlab
parents:
diff changeset
983
762009a91895 Uploaded
bitlab
parents:
diff changeset
984 struct positioned_cell mf;
762009a91895 Uploaded
bitlab
parents:
diff changeset
985 mf.score = INT64_MIN;
762009a91895 Uploaded
bitlab
parents:
diff changeset
986
762009a91895 Uploaded
bitlab
parents:
diff changeset
987
762009a91895 Uploaded
bitlab
parents:
diff changeset
988 //First row. iCounter serves as counter from zero
762009a91895 Uploaded
bitlab
parents:
diff changeset
989 //printf("..0%%");
762009a91895 Uploaded
bitlab
parents:
diff changeset
990 //Zero will always be
762009a91895 Uploaded
bitlab
parents:
diff changeset
991 table[0][0].score = compare_letters(X[0], Y[0]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
992 mc[0].score = table[0][0].score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
993 mc[0].xpos = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
994 mc[0].ypos = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
995
762009a91895 Uploaded
bitlab
parents:
diff changeset
996 //if(Xend == 799 && Yend == 2497) printf("I am %p The count is real %.5s %.5s %p %p \n", &table[0][0], X, Y, X, Y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
997
762009a91895 Uploaded
bitlab
parents:
diff changeset
998
762009a91895 Uploaded
bitlab
parents:
diff changeset
999 for(i=1;i<Yend;i++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1000 //table[0][i].score = (X[0] == Y[i]) ? POINT : -POINT;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1001 if(i < MAX_WINDOW_SIZE) table[0][i].score = compare_letters(X[0], Y[i]) + iGap + (i-1)*eGap;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1002 //table[Xstart][i].xfrom = Xstart;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1003 //table[Xstart][i].yfrom = i;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1004 //Set every column max
762009a91895 Uploaded
bitlab
parents:
diff changeset
1005 mc[i].score = compare_letters(X[0], Y[i]) + iGap + (i-1)*eGap;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1006 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1007 printf("%02"PRId64" ", mc[i].score);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1008 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1009 mc[i].xpos = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1010 mc[i].ypos = i;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1011
762009a91895 Uploaded
bitlab
parents:
diff changeset
1012 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1013 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1014 printf("\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1015 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1016 //Set row max
762009a91895 Uploaded
bitlab
parents:
diff changeset
1017 mf.score = table[0][0].score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1018 mf.xpos = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1019 mf.ypos = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1020 //Init j
762009a91895 Uploaded
bitlab
parents:
diff changeset
1021 j = MAX(1,(cell_path_y[1] - window_size));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1022
762009a91895 Uploaded
bitlab
parents:
diff changeset
1023 //Go through full matrix
762009a91895 Uploaded
bitlab
parents:
diff changeset
1024 for(i=1;i<Xend;i++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1025 //Fill first rowcell
762009a91895 Uploaded
bitlab
parents:
diff changeset
1026 if(cell_path_y[i-1]+window_size < cell_path_y[i]) return bc; //terror("Sequence proportions make window shift too large");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1027 //Conversion for the j-coordinate
762009a91895 Uploaded
bitlab
parents:
diff changeset
1028 j_prime = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1029
762009a91895 Uploaded
bitlab
parents:
diff changeset
1030 //table[i][0].score = (X[i] == Y[0]) ? POINT : -POINT;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1031 if(cell_path_y[i] - window_size <= 0){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1032 table[i][0].score = compare_letters(X[i], Y[0]) + iGap + (i-1)*eGap;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1033 mf.score = table[i][0].score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1034 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1035 mf.score = compare_letters(X[i], Y[0]) + iGap + (i-1)*eGap;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1036 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1037
762009a91895 Uploaded
bitlab
parents:
diff changeset
1038 mf.xpos = i-1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1039 mf.ypos = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1040
762009a91895 Uploaded
bitlab
parents:
diff changeset
1041 delta_dif_1_0 = MAX(1, (cell_path_y[i] - window_size)) - MAX(1,(cell_path_y[i-1] - window_size)); //j-1
762009a91895 Uploaded
bitlab
parents:
diff changeset
1042 if(i>1) delta_dif_2_1 = MAX(1, (cell_path_y[i-1] - window_size)) - MAX(1, (cell_path_y[i-2] - window_size)); //j-2
762009a91895 Uploaded
bitlab
parents:
diff changeset
1043
762009a91895 Uploaded
bitlab
parents:
diff changeset
1044 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1045 printf("D1_0: %"PRId64" D2_1: %"PRId64"\n", delta_dif_1_0, delta_dif_2_1);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1046 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1047
762009a91895 Uploaded
bitlab
parents:
diff changeset
1048 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1049 printf("%02"PRId64" ", mf.score);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1050 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1051 //printf("Check on i: (%"PRIu64") from - to (%"PRIu64", %"PRIu64")\n", i, 0L, Xend);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1052 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
1053 if(1||i==262){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1054 printf("I will go from %"PRIu64" to %"PRIu64" and I am %"PRIu64", %"PRIu64"\n", (uint64_t) MAX(1,(cell_path_y[i] - (int64_t)window_size)), (uint64_t) MIN((int64_t)Yend,(cell_path_y[i] + (int64_t)window_size)), i, j);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1055 //printf("lengs: %"PRIu64", %"PRIu64"\n", Xend, Yend);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1056 //printf("cp[i]: %"PRId64", cp[i-1] %"PRId64"\n", cell_path_y[i], cell_path_y[i-1]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1057 //printf("min(%"PRId64", %"PRId64" + %"PRId64")-------------------\n", Yend, cell_path_y[i] ,(int64_t)window_size);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1058
762009a91895 Uploaded
bitlab
parents:
diff changeset
1059 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1060 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1061 //getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1062
762009a91895 Uploaded
bitlab
parents:
diff changeset
1063 //printf("@%"PRIu64"[%"PRId64"] -> (%"PRIu64", %"PRIu64") jp %"PRIu64", lright %"PRIu64"\n", i, cell_path_y[i], MAX(1,(cell_path_y[i] - window_size)), MIN(Yend,(cell_path_y[i] + window_size)), j_prime, limit_right);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1064 //printf("M:@%"PRIu64"-> %"PRIu64"\n", i, MIN(Yend,(cell_path_y[i] + window_size)));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1065 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1066 int64_t r;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1067 for(r=0;r<MAX(0,(cell_path_y[i] - window_size)); r++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1068 printf(" ");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1069 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1070 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1071
762009a91895 Uploaded
bitlab
parents:
diff changeset
1072 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
1073 if(Xend == 799 && Yend == 2497 && i >= 145 && i <= 155){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1074 printf("them limits @i %"PRIu64"::: %"PRIu64", %"PRIu64"\n", i, MAX(1,(cell_path_y[i] - window_size)), MIN(Yend,(cell_path_y[i] + window_size)));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1075 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1076 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1077 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1078
762009a91895 Uploaded
bitlab
parents:
diff changeset
1079
762009a91895 Uploaded
bitlab
parents:
diff changeset
1080 for(j=MAX(1,(cell_path_y[i] - window_size));j<MIN(Yend,(cell_path_y[i] + window_size)) && j_prime < limit_right;j++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1081 //if(i == 8302){ printf("Doing on : (%"PRIu64",%"PRIu64" and jprime=%"PRIu64"\n", i,j,j_prime); getchar(); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1082 //Check if max in row has changed
762009a91895 Uploaded
bitlab
parents:
diff changeset
1083 //if(j > MAX(1, cell_path_y[i-1] - window_size +1) && mf.score <= table[i][j-2].score){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1084 //if(j_prime == MAX_WINDOW_SIZE) break;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1085 //Calculate the real j position in the windowed table
762009a91895 Uploaded
bitlab
parents:
diff changeset
1086
762009a91895 Uploaded
bitlab
parents:
diff changeset
1087 j_left_prime = ((int64_t)j_prime - (2 - delta_dif_1_0));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1088 //j_diag_prime = ((int64_t)j_prime - (1 - delta_dif_1_0));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1089 j_diag_prime = ((int64_t)j_prime - (1 - delta_dif_1_0));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1090 if(i > 1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1091 j_right_prime = ((int64_t)j_prime - (1 - (delta_dif_1_0 + delta_dif_2_1)));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1092 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1093
762009a91895 Uploaded
bitlab
parents:
diff changeset
1094 if(j > MAX(1, cell_path_y[i-1] - window_size +1) && j < MIN(Yend,(cell_path_y[i-1] + window_size)) && j_left_prime < limit_right && table[i-1][j_left_prime].score >= mf.score){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1095 //mf.score = table[i-1][j-2].score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1096 mf.score = table[i-1][j_left_prime].score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1097 mf.xpos = i-1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1098 mf.ypos = j-2;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1099 if(table[i-1][j_left_prime].score == INT64_MIN){ printf("A: mf.x\t%"PRIu64"\tmf.y\t%"PRIu64"\ts%"PRId64"\n", mf.xpos, mf.ypos, mf.score); printf("@[%"PRIu64", %"PRIu64"] with j_prime: %"PRIu64", wsize: %"PRIu64", cp[i-1]=%"PRId64", cp[i]=%"PRId64"\n", i, j, j_prime, 2*window_size, cell_path_y[i-1], cell_path_y[i]); getchar(); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1100
762009a91895 Uploaded
bitlab
parents:
diff changeset
1101 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1102 //printf("RowMax: %"PRId64"@(%"PRIu64", %"PRIu64")\t", mf.score, mf.xpos, mf.ypos);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1103
762009a91895 Uploaded
bitlab
parents:
diff changeset
1104 //score = (X[i] == Y[j]) ? POINT : -POINT;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1105 score = compare_letters(X[i], Y[j]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1106
762009a91895 Uploaded
bitlab
parents:
diff changeset
1107 //Precondition: Upper row needs to reach up to diagonal
762009a91895 Uploaded
bitlab
parents:
diff changeset
1108 //if((cell_path_y[i-1]+window_size) >= j-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1109 if(i > 1 && j >= 1 && j-1 >= MAX(1,(cell_path_y[i-2] - window_size)) && j-1 < MIN(Yend,(cell_path_y[i-2] + window_size)) && j_right_prime >= limit_left && j_right_prime < limit_right && table[i-2][j_right_prime].score >= mc[j-1].score ){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1110 //mc[j-1].score = table[i-2][j-(1+j_prime)].score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1111 //Should be the j_prime we had at cell_path_y
762009a91895 Uploaded
bitlab
parents:
diff changeset
1112 //MAX(1,(cell_path_y[i] - window_size));j<MIN(Yend,(cell_path_y[i] + window_size))
762009a91895 Uploaded
bitlab
parents:
diff changeset
1113
762009a91895 Uploaded
bitlab
parents:
diff changeset
1114 mc[j-1].score = table[i-2][j_right_prime].score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1115 mc[j-1].xpos = i-2;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1116 mc[j-1].ypos = j-1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1117
762009a91895 Uploaded
bitlab
parents:
diff changeset
1118 if(table[i-2][j_right_prime].score == INT64_MIN){ printf("A: j-1\t%"PRIu64"\tmc.xpos\t%"PRIu64"\ts%"PRId64"\n", j-1, mc[j-1].xpos, mc[j-1].score); printf("@[%"PRIu64", %"PRIu64"] with j_prime: %"PRIu64", wsize: %"PRIu64", cp[i-1]=%"PRId64", cp[i]=%"PRId64"\n", i, j, j_prime, 2*window_size, cell_path_y[i-1], cell_path_y[i]); getchar(); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1119
762009a91895 Uploaded
bitlab
parents:
diff changeset
1120 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1121
762009a91895 Uploaded
bitlab
parents:
diff changeset
1122
762009a91895 Uploaded
bitlab
parents:
diff changeset
1123 if(j-1 >= MAX(0, (cell_path_y[i-1]-window_size)) && (cell_path_y[i-1]+window_size) >= j-1 && j_diag_prime >= limit_left && j_diag_prime < limit_right && j_diag_prime < cell_path_y[i-1]+window_size){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1124 //scoreDiagonal = table[i-1][j-1].score + score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1125 //printf("prevdiag: %"PRId64"\n", table[i-1][j_diag_prime].score);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1126 scoreDiagonal = table[i-1][j_diag_prime].score + score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1127 if(table[i-1][j_diag_prime].score == INT64_MIN){ printf("A: i-1\t%"PRIu64"\tj_diag\t%"PRIu64"\ts%"PRId64"\n", i-1, j_diag_prime, table[i-1][j_diag_prime].score); printf("@[%"PRIu64", %"PRIu64"] with j_prime: %"PRIu64", wsize: %"PRIu64", cp[i-1]=%"PRId64", cp[i]=%"PRId64"\n", i, j, j_prime, 2*window_size, cell_path_y[i-1], cell_path_y[i]); getchar(); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1128 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1129 scoreDiagonal = INT64_MIN;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1130 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1131
762009a91895 Uploaded
bitlab
parents:
diff changeset
1132 if(i>=1 && j>1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1133 scoreLeft = mf.score + iGap + (j - (mf.ypos+2))*eGap + score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1134
762009a91895 Uploaded
bitlab
parents:
diff changeset
1135 if(mf.score == INT64_MIN){ printf("A: mf.x\t%"PRIu64"\tmf.y\t%"PRIu64"\ts%"PRId64"\n", mf.xpos, mf.ypos, mf.score); printf("@[%"PRIu64", %"PRIu64"] with j_prime: %"PRIu64", wsize: %"PRIu64", cp[i-1]=%"PRId64", cp[i]=%"PRId64"\n", i, j, j_prime, 2*window_size, cell_path_y[i-1], cell_path_y[i]); getchar(); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1136 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1137 scoreLeft = INT64_MIN;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1138 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1139
762009a91895 Uploaded
bitlab
parents:
diff changeset
1140 if(j>=1 && i>1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1141 scoreRight = mc[j-1].score + iGap + (i - (mc[j-1].xpos+2))*eGap + score;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1142 //if(scoreRight == -12) printf("MC: %"PRId64", From: %"PRIu64", %"PRIu64"->", mc[j-1].score, mc[j-1].xpos, mc[j-1].ypos);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1143
762009a91895 Uploaded
bitlab
parents:
diff changeset
1144 if(mc[j-1].score == INT64_MIN){ printf("A: j-1\t%"PRIu64"\tmc.xpos\t%"PRIu64"\ts%"PRId64"\n", j-1, mc[j-1].xpos, mc[j-1].score); printf("@[%"PRIu64", %"PRIu64"] with j_prime: %"PRIu64", wsize: %"PRIu64", cp[i-1]=%"PRId64", cp[i]=%"PRId64"\n", i, j, j_prime, 2*window_size, cell_path_y[i-1], cell_path_y[i]); getchar(); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1145 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1146 scoreRight = INT64_MIN;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1147 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1148
762009a91895 Uploaded
bitlab
parents:
diff changeset
1149 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
1150 if(Xend == 799 && Yend == 2497 && i >= 152 && i == 153){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1151 printf("@%"PRIu64", %"PRIu64" -> scores: %"PRId64", %"PRId64", %"PRId64"\n", i, j, scoreDiagonal, scoreRight, scoreLeft);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1152 printf("in position @ jprime= %"PRIu64" cellpaths [i-2, i-1, i] are %"PRId64", %"PRId64", %"PRId64", window_size: %"PRId64", j_diag_prime: %"PRId64"\n", j_prime, cell_path_y[i-2], cell_path_y[i-1], cell_path_y[i], window_size, j_diag_prime);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1153 printf("Mfs from scoreLeft: mf.x\t%"PRIu64"\tmf.y\t%"PRIu64"\ts%"PRId64"\n", mf.xpos, mf.ypos, mf.score);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1154 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1155 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1156 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1157
762009a91895 Uploaded
bitlab
parents:
diff changeset
1158 //Choose maximum
762009a91895 Uploaded
bitlab
parents:
diff changeset
1159 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
1160 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1161 printf("The game starts at %"PRId64"\n", MAX(0, cell_path_y[i] - window_size));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1162 printf("from %c %c and I get to %"PRIu64" while j=%"PRIu64"\n", X[i], Y[j], j_prime, j);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1163 printf("j_prime: %"PRId64"\n", j_prime);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1164 printf("j_diag_prime: %"PRId64" limits[%"PRId64", %"PRId64"]\n", j_diag_prime, limit_left, limit_right);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1165 printf("Score DIAG: %"PRId64"; LEFT: %"PRId64"; RIGHT: %"PRId64"\n", scoreDiagonal, scoreLeft, scoreRight);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1166 printf("currmf: %"PRId64" mc: %"PRId64"\n", mf.score, mc[j-1].score);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1167 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1168 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1169
762009a91895 Uploaded
bitlab
parents:
diff changeset
1170
762009a91895 Uploaded
bitlab
parents:
diff changeset
1171 //if(i >= MAX_READ_SIZE){ printf("i=%"PRIu64"\n", i); terror("i overflowed\n");}
762009a91895 Uploaded
bitlab
parents:
diff changeset
1172 //if(j_prime >= MAX_WINDOW_SIZE){ printf("upper : %"PRId64"\n", MIN(Yend,(cell_path_y[i] + window_size-1))); printf("jp=%"PRIu64"\n", j_prime); terror("j overflowed\n"); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1173
762009a91895 Uploaded
bitlab
parents:
diff changeset
1174
762009a91895 Uploaded
bitlab
parents:
diff changeset
1175
762009a91895 Uploaded
bitlab
parents:
diff changeset
1176 if(scoreDiagonal >= scoreLeft && scoreDiagonal >= scoreRight){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1177 //Diagonal
762009a91895 Uploaded
bitlab
parents:
diff changeset
1178
762009a91895 Uploaded
bitlab
parents:
diff changeset
1179 //fprintf(stdout, "The JPRIME: %"PRId64" actual pos: %"PRIu64"\n", j_prime, j); getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1180 table[i][j_prime].score = scoreDiagonal;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1181 table[i][j_prime].xfrom = i-1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1182 table[i][j_prime].yfrom = j-1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1183
762009a91895 Uploaded
bitlab
parents:
diff changeset
1184
762009a91895 Uploaded
bitlab
parents:
diff changeset
1185 }else if(scoreRight > scoreLeft){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1186 table[i][j_prime].score = scoreRight;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1187 table[i][j_prime].xfrom = mc[j-1].xpos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1188 table[i][j_prime].yfrom = mc[j-1].ypos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1189
762009a91895 Uploaded
bitlab
parents:
diff changeset
1190 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1191 //printf("Scores %"PRId64", %"PRId64", %"PRId64"\n", scoreDiagonal, scoreLeft, scoreRight);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1192 table[i][j_prime].score = scoreLeft;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1193 table[i][j_prime].xfrom = mf.xpos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1194 table[i][j_prime].yfrom = mf.ypos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1195 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1196 //printf("F: i\t%"PRIu64"\tj_prime\t%"PRIu64"\n", i, j_prime);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1197 //getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1198 //if(i == 94){ printf("showing j %"PRIu64" jprime %"PRIu64" lleft %"PRIu64", llright %"PRIu64"\n", j, j_prime, limit_left, limit_right); getchar(); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1199 //if(i == 94 && j == 374){ printf("stopped at 94, 374 s %"PRId64"\n", table[i][j_prime].score); getchar(); }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1200
762009a91895 Uploaded
bitlab
parents:
diff changeset
1201
762009a91895 Uploaded
bitlab
parents:
diff changeset
1202
762009a91895 Uploaded
bitlab
parents:
diff changeset
1203
762009a91895 Uploaded
bitlab
parents:
diff changeset
1204 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
1205 if(i == 264 && j == 176){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1206 printf("@%"PRIu64", %"PRIu64"\n", i, j);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1207 printf("my score is %"PRId64"\n", mc[j-1].score);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1208 printf("in position @ jprime= %"PRIu64" cellpaths [i-1, i] are %"PRId64", %"PRId64"\n", j_prime, cell_path_y[i-1], cell_path_y[i]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1209 printf("Scores %"PRId64", %"PRId64", %"PRId64"\n", scoreDiagonal, scoreLeft, scoreRight);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1210 printf("check j_right_prime == %"PRIu64"\n", j_right_prime);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1211 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1212 //exit(-1);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1213 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1214 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1215
762009a91895 Uploaded
bitlab
parents:
diff changeset
1216 //check if column max has changed
762009a91895 Uploaded
bitlab
parents:
diff changeset
1217 //New condition: check if you filled i-2, j-1
762009a91895 Uploaded
bitlab
parents:
diff changeset
1218
762009a91895 Uploaded
bitlab
parents:
diff changeset
1219
762009a91895 Uploaded
bitlab
parents:
diff changeset
1220 if(i == Xend-1 || j == Yend-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1221
762009a91895 Uploaded
bitlab
parents:
diff changeset
1222 if(i == Xend-1 && j != Yend-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1223 table[i][j_prime].score = table[i][j_prime].score + iGap + (Yend - j)*eGap;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1224 }else if(j == Yend-1 && i != Xend-1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1225 table[i][j_prime].score = table[i][j_prime].score + iGap + (Xend - i)*eGap;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1226 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1227 //Check for best cell
762009a91895 Uploaded
bitlab
parents:
diff changeset
1228 if(table[i][j_prime].score >= bc.c.score){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1229
762009a91895 Uploaded
bitlab
parents:
diff changeset
1230 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
1231 if(i == 798 && j == 1052){ // yields 799, 2497
762009a91895 Uploaded
bitlab
parents:
diff changeset
1232 printf("in position @ jprime= %"PRIu64" cellpaths [i-1, i] are %"PRId64", %"PRId64"\n", j_prime, cell_path_y[i-1], cell_path_y[i]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1233 printf("Scores %"PRId64", %"PRId64", %"PRId64"\n", scoreDiagonal, scoreLeft, scoreRight);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1234 printf("score comes from %"PRIu64", %"PRIu64",\n", mc[j-1].xpos, mc[j-1].ypos);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1235 printf("IDlengths: %"PRIu64", %"PRIu64"\n", Xend, Yend);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1236
762009a91895 Uploaded
bitlab
parents:
diff changeset
1237 //exit(-1);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1238 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1239 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1240
762009a91895 Uploaded
bitlab
parents:
diff changeset
1241 bc.c.score = table[i][j_prime].score; bc.c.xpos = i; bc.c.ypos = j; bc.j_prime = j_prime;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1242 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1243 //bc.c.score = table[i][j_prime].score; bc.c.xpos = i; bc.c.ypos = j; bc.j_prime = j_prime;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1244 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1245
762009a91895 Uploaded
bitlab
parents:
diff changeset
1246
762009a91895 Uploaded
bitlab
parents:
diff changeset
1247 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1248 //printf("Put score: %"PRId64"\n\n", table[i][j_prime].score);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1249 //printf("(%"PRId64")%02"PRId64" ", j_diag_prime, table[i][j_prime].score); //printf("->(%"PRIu64", %"PRIu64")", i, j); printf("[%c %c]", X[i], Y[j]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1250 //if(scoreDiagonal >= scoreLeft && scoreDiagonal >= scoreRight) printf("*\t");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1251 //else if(scoreRight > scoreLeft) printf("{\t"); else printf("}\t");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1252 //getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1253
762009a91895 Uploaded
bitlab
parents:
diff changeset
1254 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1255 j_prime++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1256 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1257 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1258 printf("\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1259 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1260 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1261 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1262
762009a91895 Uploaded
bitlab
parents:
diff changeset
1263 return bc;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1264 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1265
762009a91895 Uploaded
bitlab
parents:
diff changeset
1266
762009a91895 Uploaded
bitlab
parents:
diff changeset
1267
762009a91895 Uploaded
bitlab
parents:
diff changeset
1268 void backtrackingNW(unsigned char * X, uint64_t Xstart, uint64_t Xend, unsigned char * Y, uint64_t Ystart, uint64_t Yend, struct cell ** table, char * rec_X, char * rec_Y, struct best_cell * bc, uint64_t * ret_head_x, uint64_t * ret_head_y, BasicAlignment * ba, int64_t * cell_path_y, uint64_t window_size){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1269 uint64_t curr_x, curr_y, prev_x, prev_y, head_x, head_y, limit_x, limit_y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1270 int64_t k, j_prime, delta_diff = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1271
762009a91895 Uploaded
bitlab
parents:
diff changeset
1272 //limit_x = 2*MAX_READ_SIZE-1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1273 //limit_y = limit_x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1274 limit_x = 2*MAX(Xend, Yend);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1275 limit_y = limit_x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1276 //head_x = 2*MAX(Xend, Yend);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1277 //head_y = 2*MAX(Xend, Yend);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1278 head_x = limit_x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1279 head_y = limit_y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1280 curr_x = bc->c.xpos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1281 curr_y = bc->c.ypos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1282 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1283 printf("Optimum : %"PRIu64", %"PRIu64"\n", curr_x, curr_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1284 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1285 //printf("Optimum : %"PRIu64", %"PRIu64"\n", curr_x, curr_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1286
762009a91895 Uploaded
bitlab
parents:
diff changeset
1287 prev_x = curr_x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1288 prev_y = curr_y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1289 int show = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1290
762009a91895 Uploaded
bitlab
parents:
diff changeset
1291 for(k=Xend-1; k>curr_x; k--) rec_X[head_x--] = '-';
762009a91895 Uploaded
bitlab
parents:
diff changeset
1292 for(k=Yend-1; k>curr_y; k--) rec_Y[head_y--] = '-';
762009a91895 Uploaded
bitlab
parents:
diff changeset
1293
762009a91895 Uploaded
bitlab
parents:
diff changeset
1294 j_prime = bc->j_prime;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1295 //printf("init prime: %"PRIu64"\n", j_prime);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1296 unsigned char first_track = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1297
762009a91895 Uploaded
bitlab
parents:
diff changeset
1298 while(curr_x > 0 && curr_y > 0){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1299
762009a91895 Uploaded
bitlab
parents:
diff changeset
1300
762009a91895 Uploaded
bitlab
parents:
diff changeset
1301 if(first_track == 0){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1302 delta_diff = MAX(1, cell_path_y[prev_x] - (int64_t) window_size) - MAX(1, cell_path_y[curr_x] - (int64_t)window_size); //j-1
762009a91895 Uploaded
bitlab
parents:
diff changeset
1303 j_prime = MAX(0, j_prime - (int64_t)(prev_y - curr_y) + (int64_t) delta_diff);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1304
762009a91895 Uploaded
bitlab
parents:
diff changeset
1305
762009a91895 Uploaded
bitlab
parents:
diff changeset
1306 if(/*(bc->c.xpos == 630 && bc->c.ypos == 541 )||*/ j_prime > MAX_WINDOW_SIZE){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1307
762009a91895 Uploaded
bitlab
parents:
diff changeset
1308 printf("from %"PRIu64", %"PRIu64"\nto %"PRIu64", %"PRIu64"\n", prev_x, prev_y, curr_x, curr_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1309 printf("jp: %"PRIu64", py,cy %"PRIu64", %"PRIu64", delta: %"PRId64"\n", j_prime, prev_y, curr_y, (int64_t)delta_diff);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1310 printf("currx curry : %"PRIu64", %"PRIu64"\n", curr_x, curr_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1311 printf("window size: %"PRIu64"\n", window_size);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1312 printf("cp[prev, curr] : %"PRId64", %"PRId64"\n", cell_path_y[prev_x], cell_path_y[curr_x]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1313 printf("my cell path: %"PRId64"\n", cell_path_y[curr_x]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1314 printf("Optimum : %"PRIu64", %"PRIu64"\n", bc->c.xpos, bc->c.ypos);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1315 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1316 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1317
762009a91895 Uploaded
bitlab
parents:
diff changeset
1318 //j_prime = j_prime - (int64_t)(prev_y - curr_y) + (int64_t) delta_diff;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1319
762009a91895 Uploaded
bitlab
parents:
diff changeset
1320 prev_x = curr_x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1321 prev_y = curr_y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1322
762009a91895 Uploaded
bitlab
parents:
diff changeset
1323 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
1324 if(bc->c.xpos == 798 && bc->c.ypos == 1052){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1325 printf("[%c %c]", X[prev_x], Y[prev_y]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1326 printf("(%"PRIu64", %"PRIu64") ::: \n", curr_x, curr_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1327
762009a91895 Uploaded
bitlab
parents:
diff changeset
1328 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1329 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1330
762009a91895 Uploaded
bitlab
parents:
diff changeset
1331 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1332 //printf("Jprime: %"PRId64" :DELTADIF:%"PRId64"\n", j_prime, delta_diff);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1333 printf("[%c %c]", X[prev_x], Y[prev_y]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1334 printf("(%"PRIu64", %"PRIu64") ::: \n", curr_x, curr_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1335 //printf("(%"PRIu64", %"PRIu64") ::: \n", prev_x, prev_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1336 //printf("cellp Prev: %"PRId64" Post: %"PRId64"\n", cell_path_y[prev_x], cell_path_y[curr_x]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1337 //printf("the difs? %"PRId64" the other: %"PRId64"\n", MAX(0, cell_path_y[prev_x] - (int64_t) window_size), MAX(0, cell_path_y[curr_x] - (int64_t)window_size));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1338 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1339 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1340
762009a91895 Uploaded
bitlab
parents:
diff changeset
1341 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1342
762009a91895 Uploaded
bitlab
parents:
diff changeset
1343 //if(table[prev_x][j_prime].xfrom > MAX_READ_SIZE || table[prev_x][j_prime].yfrom > MAX_WINDOW_SIZE) fprintf(stdout, "OH NOES !! %"PRIu64"\t%"PRId64"\t%"PRIu64"\t%"PRIu64" dangers: %"PRIu64", %"PRIu64"\n", prev_x, j_prime, Xend, Yend, table[prev_x][j_prime].xfrom, table[prev_x][j_prime].yfrom);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1344
762009a91895 Uploaded
bitlab
parents:
diff changeset
1345 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
1346 if(table[prev_x][j_prime].xfrom > MAX_READ_SIZE || table[prev_x][j_prime].yfrom > MAX_WINDOW_SIZE){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1347 fprintf(stdout, "OH NOES !! %"PRIu64"\t%"PRId64"\t%"PRIu64"\t%"PRIu64" dangers: %"PRIu64", %"PRIu64"\n", prev_x, j_prime, Xend, Yend, table[prev_x][j_prime].xfrom, table[prev_x][j_prime].yfrom);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1348 uint64_t k;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1349 for(k=0;k<Xend;k++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1350 fprintf(stdout, "%c", X[k]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1351 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1352 fprintf(stdout, "\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1353 for(k=0;k<Yend;k++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1354 fprintf(stdout, "%c", Y[k]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1355 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1356 fprintf(stdout, "\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1357 show = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1358 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1359 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1360 if(j_prime >= MAX_WINDOW_SIZE) printf("j_prime:overflow %"PRIu64"\n", j_prime);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1361
762009a91895 Uploaded
bitlab
parents:
diff changeset
1362
762009a91895 Uploaded
bitlab
parents:
diff changeset
1363 curr_x = table[prev_x][j_prime].xfrom;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1364 curr_y = table[prev_x][j_prime].yfrom;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1365 first_track = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1366
762009a91895 Uploaded
bitlab
parents:
diff changeset
1367 //printf("w: %"PRIu64"- %"PRIu64"\n", curr_x, curr_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1368
762009a91895 Uploaded
bitlab
parents:
diff changeset
1369
762009a91895 Uploaded
bitlab
parents:
diff changeset
1370 if((curr_x == (prev_x - 1)) && (curr_y == (prev_y -1))){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1371 //Diagonal case
762009a91895 Uploaded
bitlab
parents:
diff changeset
1372 //printf("DIAG\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1373 if(head_x == 0 || head_y == 0) goto exit_point;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1374 rec_X[head_x--] = (char) X[prev_x];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1375 rec_Y[head_y--] = (char) Y[prev_y];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1376 ba->length++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1377
762009a91895 Uploaded
bitlab
parents:
diff changeset
1378 }else if((prev_x - curr_x) > (prev_y - curr_y)){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1379 //Gap in X
762009a91895 Uploaded
bitlab
parents:
diff changeset
1380 //printf("Gap X\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1381 if(head_x == 0 || head_y == 0) goto exit_point;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1382 if(bc->c.xpos != prev_x && bc->c.ypos != prev_y){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1383 rec_Y[head_y--] = Y[prev_y];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1384 rec_X[head_x--] = X[prev_x];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1385 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1386 rec_Y[head_y--] = '-';
762009a91895 Uploaded
bitlab
parents:
diff changeset
1387 rec_X[head_x--] = X[prev_x];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1388 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1389 ba->length++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1390
762009a91895 Uploaded
bitlab
parents:
diff changeset
1391 for(k=prev_x-1;k>curr_x;k--){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1392 if(head_x == 0 || head_y == 0) goto exit_point;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1393 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1394 if(head_x == 0 || head_y == 0){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1395 printf("%"PRIu64" %"PRIu64" and prevs are %"PRIu64" %"PRIu64"\n", head_x, head_y, prev_x, prev_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1396 printf("origin is %"PRIu64", %"PRIu64"\n", bc->c.xpos, bc->c.ypos);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1397 uint64_t z;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1398 for(z=head_x;z<limit_x;z++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1399 fprintf(stdout, "%c", (char) rec_X[z]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1400 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1401 printf("\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1402 for(z=head_y;z<limit_y;z++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1403 fprintf(stdout, "%c", (char) rec_Y[z]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1404 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1405 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1406 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1407 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1408 rec_Y[head_y--] = '-';
762009a91895 Uploaded
bitlab
parents:
diff changeset
1409 rec_X[head_x--] = (char) X[k];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1410 ba->length++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1411 ba->egaps++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1412 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1413 ba->igaps += 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1414 ba->egaps--;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1415 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1416 //Gap in Y
762009a91895 Uploaded
bitlab
parents:
diff changeset
1417 //printf("GAP Y\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1418 //10, 0, 401, 281
762009a91895 Uploaded
bitlab
parents:
diff changeset
1419 if(head_x == 0 || head_y == 0) goto exit_point;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1420 if(bc->c.xpos != prev_x && bc->c.ypos != prev_y){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1421 rec_Y[head_y--] = Y[prev_y];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1422 rec_X[head_x--] = X[prev_x];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1423 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1424 rec_Y[head_y--] = Y[prev_y];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1425 rec_X[head_x--] = '-';
762009a91895 Uploaded
bitlab
parents:
diff changeset
1426 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1427 ba->length++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1428
762009a91895 Uploaded
bitlab
parents:
diff changeset
1429 for(k=prev_y-1;k>curr_y;k--){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1430 if(head_x == 0 || head_y == 0) goto exit_point;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1431 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1432 if(head_x == 0 || head_y == 0){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1433 printf("%"PRIu64" %"PRIu64" and prevs are %"PRIu64" %"PRIu64"\n", head_x, head_y, prev_x, prev_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1434 printf("origin is %"PRIu64", %"PRIu64"\n", bc->c.xpos, bc->c.ypos);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1435 uint64_t z;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1436 for(z=head_x;z<limit_x;z++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1437 fprintf(stdout, "%c", (char) rec_X[z]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1438 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1439 printf("\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1440 for(z=head_y;z<limit_y;z++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1441 fprintf(stdout, "%c", (char) rec_Y[z]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1442 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1443 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1444 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1445 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1446 rec_X[head_x--] = '-';
762009a91895 Uploaded
bitlab
parents:
diff changeset
1447 rec_Y[head_y--] = (char) Y[k];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1448 ba->length++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1449 ba->egaps++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1450 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1451
762009a91895 Uploaded
bitlab
parents:
diff changeset
1452 ba->igaps += 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1453 ba->egaps--;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1454 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1455
762009a91895 Uploaded
bitlab
parents:
diff changeset
1456 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1457
762009a91895 Uploaded
bitlab
parents:
diff changeset
1458 if(curr_x == 0 && curr_y == 0 && (curr_x == (prev_x - 1)) && (curr_y == (prev_y -1))){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1459 rec_X[head_x--] = (char) X[curr_x];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1460 rec_Y[head_y--] = (char) Y[curr_y];
762009a91895 Uploaded
bitlab
parents:
diff changeset
1461 ba->length++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1462 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1463
762009a91895 Uploaded
bitlab
parents:
diff changeset
1464 exit_point:
762009a91895 Uploaded
bitlab
parents:
diff changeset
1465
762009a91895 Uploaded
bitlab
parents:
diff changeset
1466 //printf("curr: %"PRIu64", %"PRIu64"\n", curr_x, curr_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1467 //printf("Heads: %"PRIu64", %"PRIu64"\n", head_x, head_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1468 if(show == 1)fprintf(stdout, "%"PRIu64", %"PRIu64"\n", head_x, head_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1469 uint64_t huecos_x = 0, huecos_y = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1470 k=(int64_t)curr_x-1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1471 while(k>=0){ if(head_x == 0) break; rec_X[head_x--] = '-'; huecos_x++; k--; }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1472 k=(int64_t)curr_y-1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1473 while(k>=0){ if(head_y == 0) break; rec_Y[head_y--] = '-'; huecos_y++; k--; }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1474
762009a91895 Uploaded
bitlab
parents:
diff changeset
1475 if(show == 1)fprintf(stdout, "%"PRIu64", %"PRIu64"\n", head_x, head_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1476
762009a91895 Uploaded
bitlab
parents:
diff changeset
1477 if(huecos_x >= huecos_y){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1478 while(huecos_x > 0) { if(head_y == 0) break; rec_Y[head_y--] = ' '; huecos_x--;}
762009a91895 Uploaded
bitlab
parents:
diff changeset
1479 }else{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1480 while(huecos_y > 0) { if(head_x == 0) break; rec_X[head_x--] = ' '; huecos_y--;}
762009a91895 Uploaded
bitlab
parents:
diff changeset
1481 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1482
762009a91895 Uploaded
bitlab
parents:
diff changeset
1483 if(show == 1){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1484 fprintf(stdout, "%"PRIu64", %"PRIu64"\n", head_x, head_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1485 fprintf(stdout, "%"PRIu64", %"PRIu64"\n", 2*Xend, 2*Yend);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1486 uint64_t k;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1487 for(k=head_x;k<limit_x;k++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1488 fprintf(stdout, "%c", (char) rec_X[k]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1489 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1490 printf("\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1491 for(k=head_y;k<limit_y;k++){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1492 fprintf(stdout, "%c", (char) rec_Y[k]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1493 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1494 printf("\n");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1495 getchar();
762009a91895 Uploaded
bitlab
parents:
diff changeset
1496 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1497
762009a91895 Uploaded
bitlab
parents:
diff changeset
1498 *ret_head_x = head_x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1499 *ret_head_y = head_y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1500 #ifdef VERBOSE
762009a91895 Uploaded
bitlab
parents:
diff changeset
1501 printf("hx hy: %"PRIu64", %"PRIu64"\n", head_x, head_y);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1502 #endif
762009a91895 Uploaded
bitlab
parents:
diff changeset
1503 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1504
762009a91895 Uploaded
bitlab
parents:
diff changeset
1505
762009a91895 Uploaded
bitlab
parents:
diff changeset
1506 AVLTree * getNewLocationAVLTree(Mempool_AVL * mp, uint64_t * n_pools_used, uint64_t key){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1507
762009a91895 Uploaded
bitlab
parents:
diff changeset
1508 if(mp[*n_pools_used].current == POOL_SIZE){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1509 *n_pools_used += 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1510 if(*n_pools_used == MAX_MEM_POOLS) terror("Reached max pools");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1511 init_mem_pool_AVL(&mp[*n_pools_used]);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1512
762009a91895 Uploaded
bitlab
parents:
diff changeset
1513 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1514
762009a91895 Uploaded
bitlab
parents:
diff changeset
1515 AVLTree * new_pos = mp[*n_pools_used].base + mp[*n_pools_used].current;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1516 mp[*n_pools_used].current++;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1517
762009a91895 Uploaded
bitlab
parents:
diff changeset
1518 new_pos->key = key;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1519 new_pos->count = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1520 new_pos->height = 1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1521
762009a91895 Uploaded
bitlab
parents:
diff changeset
1522 return new_pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1523 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1524
762009a91895 Uploaded
bitlab
parents:
diff changeset
1525 void init_mem_pool_AVL(Mempool_AVL * mp){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1526 mp->base = (AVLTree *) calloc(POOL_SIZE, sizeof(AVLTree));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1527 if(mp->base == NULL) terror("Could not request memory pool");
762009a91895 Uploaded
bitlab
parents:
diff changeset
1528 mp->current = 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1529 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1530
762009a91895 Uploaded
bitlab
parents:
diff changeset
1531
762009a91895 Uploaded
bitlab
parents:
diff changeset
1532
762009a91895 Uploaded
bitlab
parents:
diff changeset
1533 /*
762009a91895 Uploaded
bitlab
parents:
diff changeset
1534 // An AVL tree node
762009a91895 Uploaded
bitlab
parents:
diff changeset
1535 typedef struct AVL_Node{
762009a91895 Uploaded
bitlab
parents:
diff changeset
1536 uint64_t key;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1537 struct AVL_Node * left;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1538 struct AVL_Node * right;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1539 uint64_t height;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1540 llpos * next;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1541 } AVLTree;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1542 */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1543
762009a91895 Uploaded
bitlab
parents:
diff changeset
1544 // A utility function to get height of the tree
762009a91895 Uploaded
bitlab
parents:
diff changeset
1545
762009a91895 Uploaded
bitlab
parents:
diff changeset
1546 uint64_t height(AVLTree * N){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1547 if (N == NULL)
762009a91895 Uploaded
bitlab
parents:
diff changeset
1548 return 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1549 return N->height;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1550 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1551
762009a91895 Uploaded
bitlab
parents:
diff changeset
1552 /* Substituted by (x == NULL) ? (0) : (x->height) */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1553
762009a91895 Uploaded
bitlab
parents:
diff changeset
1554 /* Helper function that allocates a new node with the given key and
762009a91895 Uploaded
bitlab
parents:
diff changeset
1555 NULL left and right pointers. */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1556
762009a91895 Uploaded
bitlab
parents:
diff changeset
1557 /* This one is substituted by AVLTree * getNewLocationAVLTree(Mempool_AVL * mp, uint64_t * n_pools_used, uint64_t key) */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1558
762009a91895 Uploaded
bitlab
parents:
diff changeset
1559 // A utility function to right rotate subtree rooted with y
762009a91895 Uploaded
bitlab
parents:
diff changeset
1560 // See the diagram given above.
762009a91895 Uploaded
bitlab
parents:
diff changeset
1561 AVLTree * right_rotate(AVLTree * y){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1562 AVLTree * x = y->left;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1563 AVLTree * T2 = x->right;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1564
762009a91895 Uploaded
bitlab
parents:
diff changeset
1565 // Perform rotation
762009a91895 Uploaded
bitlab
parents:
diff changeset
1566 x->right = y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1567 y->left = T2;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1568
762009a91895 Uploaded
bitlab
parents:
diff changeset
1569 // Update heights
762009a91895 Uploaded
bitlab
parents:
diff changeset
1570 //x->height = MAX((x == NULL) ? (0) : (x->left->height), (x == NULL) ? (0) : (x->right->height))+1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1571 //y->height = MAX((y == NULL) ? (0) : (y->left->height), (y == NULL) ? (0) : (y->right->height))+1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1572 // Update heights
762009a91895 Uploaded
bitlab
parents:
diff changeset
1573 y->height = MAX(height(y->left), height(y->right))+1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1574 x->height = MAX(height(x->left), height(x->right))+1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1575
762009a91895 Uploaded
bitlab
parents:
diff changeset
1576 // Return new root
762009a91895 Uploaded
bitlab
parents:
diff changeset
1577 return x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1578 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1579
762009a91895 Uploaded
bitlab
parents:
diff changeset
1580 // A utility function to left rotate subtree rooted with x
762009a91895 Uploaded
bitlab
parents:
diff changeset
1581 // See the diagram given above.
762009a91895 Uploaded
bitlab
parents:
diff changeset
1582 AVLTree * left_rotate(AVLTree * x){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1583 AVLTree * y = x->right;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1584 AVLTree * T2 = y->left;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1585
762009a91895 Uploaded
bitlab
parents:
diff changeset
1586 // Perform rotation
762009a91895 Uploaded
bitlab
parents:
diff changeset
1587 y->left = x;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1588 x->right = T2;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1589
762009a91895 Uploaded
bitlab
parents:
diff changeset
1590 // Update heights
762009a91895 Uploaded
bitlab
parents:
diff changeset
1591 //x->height = MAX((x == NULL) ? (0) : (x->left->height), (x == NULL) ? (0) : (x->right->height))+1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1592 //y->height = MAX((y == NULL) ? (0) : (y->left->height), (y == NULL) ? (0) : (y->right->height))+1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1593 x->height = MAX(height(x->left), height(x->right))+1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1594 y->height = MAX(height(y->left), height(y->right))+1;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1595
762009a91895 Uploaded
bitlab
parents:
diff changeset
1596 // Return new root
762009a91895 Uploaded
bitlab
parents:
diff changeset
1597 return y;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1598 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1599
762009a91895 Uploaded
bitlab
parents:
diff changeset
1600 // Get Balance factor of node N
762009a91895 Uploaded
bitlab
parents:
diff changeset
1601
762009a91895 Uploaded
bitlab
parents:
diff changeset
1602 int64_t get_balance(AVLTree * N){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1603 if (N == NULL)
762009a91895 Uploaded
bitlab
parents:
diff changeset
1604 return 0;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1605 return height(N->left) - height(N->right);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1606 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1607
762009a91895 Uploaded
bitlab
parents:
diff changeset
1608 /* Substituted by (node == NULL) ? (0) : ((int64_t) node->left->height - (int64_t) node->right->height) */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1609
762009a91895 Uploaded
bitlab
parents:
diff changeset
1610 AVLTree * find_AVLTree(AVLTree * node, uint64_t key){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1611 AVLTree * found = NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1612 if(node == NULL) return NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1613
762009a91895 Uploaded
bitlab
parents:
diff changeset
1614 if (key < node->key) {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1615 found = find_AVLTree(node->left, key);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1616 } else if (key > node->key) {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1617 found = find_AVLTree(node->right, key);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1618 } else {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1619 return node;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1620 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1621 return found;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1622 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1623
762009a91895 Uploaded
bitlab
parents:
diff changeset
1624 llpos * find_AVLTree_llpos(AVLTree * node, uint64_t key){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1625 llpos * aux = NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1626 if(node == NULL) return NULL;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1627
762009a91895 Uploaded
bitlab
parents:
diff changeset
1628 if (key < node->key) {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1629 aux = find_AVLTree_llpos(node->left, key);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1630 } else if (key > node->key) {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1631 aux = find_AVLTree_llpos(node->right, key);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1632 } else {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1633 return node->next;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1634 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1635 return aux;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1636 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1637
762009a91895 Uploaded
bitlab
parents:
diff changeset
1638 // Recursive function to insert key in subtree rooted
762009a91895 Uploaded
bitlab
parents:
diff changeset
1639 // with node and returns new root of subtree.
762009a91895 Uploaded
bitlab
parents:
diff changeset
1640 AVLTree * insert_AVLTree(AVLTree * node, uint64_t key, Mempool_AVL * mp, uint64_t * n_pools_used, uint64_t pos, Mempool_l * mp_l, uint64_t * n_pools_used_l, uint64_t s_id){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1641 /* 1. Perform the normal BST insertion */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1642 if (node == NULL){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1643
762009a91895 Uploaded
bitlab
parents:
diff changeset
1644 AVLTree * n_node = getNewLocationAVLTree(mp, n_pools_used, key);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1645 llpos * aux = getNewLocationllpos(mp_l, n_pools_used_l);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1646 aux->pos = pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1647 aux->s_id = s_id;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1648 n_node->next = aux;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1649 return n_node;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1650 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1651
762009a91895 Uploaded
bitlab
parents:
diff changeset
1652 if (key < node->key) {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1653 node->left = insert_AVLTree(node->left, key, mp, n_pools_used, pos, mp_l, n_pools_used_l, s_id);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1654 } else if (key > node->key) {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1655 node->right = insert_AVLTree(node->right, key, mp, n_pools_used, pos, mp_l, n_pools_used_l, s_id);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1656 } else {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1657 // Equal keys are inserted as a linked list
762009a91895 Uploaded
bitlab
parents:
diff changeset
1658 llpos * aux = getNewLocationllpos(mp_l, n_pools_used_l);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1659 aux->pos = pos;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1660 aux->s_id = s_id;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1661 aux->next = node->next;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1662 node->next = aux;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1663 ++(node->count);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1664 return node;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1665 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1666
762009a91895 Uploaded
bitlab
parents:
diff changeset
1667 /* 2. Update height of this ancestor node */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1668 //node->height = 1 + MAX((node->left == NULL) ? (0) : (node->left->height), (node->right == NULL) ? (0) : (node->right->height));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1669 node->height = 1 + MAX(height(node->left), height(node->right));
762009a91895 Uploaded
bitlab
parents:
diff changeset
1670
762009a91895 Uploaded
bitlab
parents:
diff changeset
1671 /* 3. Get the balance factor of this ancestor
762009a91895 Uploaded
bitlab
parents:
diff changeset
1672 node to check whether this node became
762009a91895 Uploaded
bitlab
parents:
diff changeset
1673 unbalanced */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1674 //int64_t balance = (node->left == NULL || node->right == NULL) ? (0) : ((int64_t) node->left->height - (int64_t) node->right->height);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1675 int64_t balance = get_balance(node);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1676
762009a91895 Uploaded
bitlab
parents:
diff changeset
1677 // If this node becomes unbalanced, then
762009a91895 Uploaded
bitlab
parents:
diff changeset
1678 // there are 4 cases
762009a91895 Uploaded
bitlab
parents:
diff changeset
1679
762009a91895 Uploaded
bitlab
parents:
diff changeset
1680 // Left Left Case
762009a91895 Uploaded
bitlab
parents:
diff changeset
1681 if (balance > 1 && key < node->left->key)
762009a91895 Uploaded
bitlab
parents:
diff changeset
1682 return right_rotate(node);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1683
762009a91895 Uploaded
bitlab
parents:
diff changeset
1684 // Right Right Case
762009a91895 Uploaded
bitlab
parents:
diff changeset
1685 if (balance < -1 && key > node->right->key)
762009a91895 Uploaded
bitlab
parents:
diff changeset
1686 return left_rotate(node);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1687
762009a91895 Uploaded
bitlab
parents:
diff changeset
1688 // Left Right Case
762009a91895 Uploaded
bitlab
parents:
diff changeset
1689 if (balance > 1 && key > node->left->key)
762009a91895 Uploaded
bitlab
parents:
diff changeset
1690 {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1691 node->left = left_rotate(node->left);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1692 return right_rotate(node);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1693 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1694
762009a91895 Uploaded
bitlab
parents:
diff changeset
1695 // Right Left Case
762009a91895 Uploaded
bitlab
parents:
diff changeset
1696 if (balance < -1 && key < node->right->key)
762009a91895 Uploaded
bitlab
parents:
diff changeset
1697 {
762009a91895 Uploaded
bitlab
parents:
diff changeset
1698 node->right = right_rotate(node->right);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1699 return left_rotate(node);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1700 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1701
762009a91895 Uploaded
bitlab
parents:
diff changeset
1702 /* return the (unchanged) node pointer */
762009a91895 Uploaded
bitlab
parents:
diff changeset
1703 return node;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1704 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1705
762009a91895 Uploaded
bitlab
parents:
diff changeset
1706 // A utility function to print preorder traversal
762009a91895 Uploaded
bitlab
parents:
diff changeset
1707 // of the tree.
762009a91895 Uploaded
bitlab
parents:
diff changeset
1708 // The function also prints height of every node
762009a91895 Uploaded
bitlab
parents:
diff changeset
1709
762009a91895 Uploaded
bitlab
parents:
diff changeset
1710 void pre_order(AVLTree * root){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1711 if(root != NULL){
762009a91895 Uploaded
bitlab
parents:
diff changeset
1712 printf("%"PRIu64" ", root->key);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1713 llpos * aux = root->next;
762009a91895 Uploaded
bitlab
parents:
diff changeset
1714 while(aux != NULL){ printf("#%"PRIu64", ", aux->pos); aux = aux->next; }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1715 pre_order(root->left);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1716 pre_order(root->right);
762009a91895 Uploaded
bitlab
parents:
diff changeset
1717 }
762009a91895 Uploaded
bitlab
parents:
diff changeset
1718 }