@@ -107,24 +107,29 @@ struct Profile[
107107 var length = Int(score_matrix.size * segment_length)
108108 var profile = AlignedMemory[T, size, size](length)
109109
110- # Generate query profile and rearrange query sequence and calculate the weight of match/mismatch
111110 var p = profile.as_span()
112- var t_idx = 0
111+
112+ var bias_typed = bias.cast[T]()
113+
113114 for nt in range (0 , score_matrix.size):
115+ var nt_base_idx = nt * segment_length
116+
114117 for i in range (0 , segment_length):
115- var j = i
116- for segment_idx in range (0 , size):
117- keep(t_idx)
118- keep(segment_idx)
119- p[t_idx][segment_idx] = (
120- bias if j
121- >= len (query) else (
122- score_matrix.get(nt, Int(query[j]))
123- + bias.cast[DType.int8]()
124- ).cast[DType.uint8]()
125- ).cast[T]()
126- j += segment_length
127- t_idx += 1
118+ var simd_vector = SIMD [T, size]()
119+
120+ @parameter
121+ for lane in range (size):
122+ var query_pos = i + lane * segment_length
123+ if query_pos < len (query):
124+ var score = score_matrix.get(nt, Int(query[query_pos]))
125+ simd_vector[lane] = (
126+ score + bias.cast[DType.int8]()
127+ ).cast[T]()
128+ else :
129+ simd_vector[lane] = bias_typed
130+
131+ p[nt_base_idx + i] = simd_vector
132+
128133 return profile
129134
130135
@@ -287,7 +292,9 @@ fn semi_global_aln[
287292 return AlignmentResult(AlignmentEnd(0 , 0 , 0 ))
288293
289294 var end_query : Int32 = query_len - 1
290- var end_reference : Int32 = - 1 # 0 based best alignment ending point; initialized as isn't aligned -1
295+ var end_reference : Int32 = (
296+ - 1
297+ ) # 0 based best alignment ending point; initialized as isn't aligned -1
291298 var segment_length = (query_len + width - 1 ) // width
292299 var offset = (query_len - 1 ) % segment_length
293300 var position = (width - 1 ) - (query_len - 1 ) // segment_length
@@ -413,13 +420,13 @@ fn semi_global_aln[
413420 # Possible speedup - check if v_f has any updates to start with
414421 var break_out = False
415422 for _k in range (0 , width):
416- var tmp = (ZERO - gap_open_penalty).cast[
417- DType.int32
418- ]() if free_target_start_gaps else (
419- boundary[i + 1 ] - gap_open_penalty
420- ).cast[
421- DType.int32
422- ]( )
423+ var tmp = (
424+ ( ZERO - gap_open_penalty)
425+ .cast[DType.int32 ]() if free_target_start_gaps else (
426+ boundary[i + 1 ] - gap_open_penalty
427+ )
428+ .cast[ DType.int32]()
429+ )
423430 var tmp2 = MIN if tmp < Int32(MIN ) else tmp.cast[dt]()
424431
425432 v_f = v_f.shift_right[1 ]()
0 commit comments