edlib 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 41a9c8bdf279436f3ca2da4840a62d875c62ab5630c0411c7751446dd7c6db48
4
- data.tar.gz: 62436d4433d308d71e76ec5095a57d85c1da88a3a6addf1531cb00e65ed37d72
3
+ metadata.gz: 72ca7381d858e17e8ba5e2641d072cb4f391410b97ef9138504efa6851020373
4
+ data.tar.gz: 180e15f4a09149af7031536817a635be580d55afd25896341cb44cf54a9902be
5
5
  SHA512:
6
- metadata.gz: 9afed6c6ab4e8a59906a98441c464f093ad45a4b92464b0efba67166d925cf0243e4e484b063264940a2afb4867a181deb7dc55733cfb8ae0f082b472f47f286
7
- data.tar.gz: c472407d2aa613f12c75c554d525c3adafa21f689921c82e9fac3d43395ce3759f5240fafa06fe4c6985bac7d6ba5bf42944c746e55c0584b067ba57d8b455fb
6
+ metadata.gz: 5f53003d5e12d9d55b40201f435a278b4a99d6e01569cf0f5e96a263822058257d3dd1b65c7c0f48d39a92177c271131d7752bf982c68893316e5dccbdeefc9f
7
+ data.tar.gz: 27e1ec9237c5f86fe8775100dbda7e2b9851071a9043cace94b927a65e372afa0b7cbbca741d51266b1f2a0493917eeaf1b4b60da92600def529b2e4ac724edb
data/ext/edlib/edlibext.c CHANGED
@@ -1,11 +1,30 @@
1
1
  #include "ruby.h"
2
2
  #include "edlibext.h"
3
3
 
4
+ #define ALIGNER_GET_(name) \
5
+ static VALUE \
6
+ aligner_get_##name(VALUE self) \
7
+ { \
8
+ EdlibAlignConfig *config = aligner_get_config(self); \
9
+ return get_##name(config); \
10
+ }
11
+
12
+ #define ALIGNER_SET_(name) \
13
+ static VALUE \
14
+ aligner_set_##name(VALUE self, VALUE value) \
15
+ { \
16
+ EdlibAlignConfig *config = aligner_get_config(self); \
17
+ return set_##name(config, value); \
18
+ }
19
+
4
20
  VALUE mEdlib;
5
21
  VALUE cAligner;
6
22
 
7
23
  // Aligner class
8
24
 
25
+ static size_t aligner_config_memsize(const void *ptr);
26
+ static void aligner_config_free(void *ptr);
27
+
9
28
  static const rb_data_type_t config_type = {
10
29
  .wrap_struct_name = "RbAlignConfig",
11
30
  .function = {
@@ -73,12 +92,7 @@ get_k(EdlibAlignConfig *config)
73
92
  return INT2NUM(config->k);
74
93
  }
75
94
 
76
- static VALUE
77
- aligner_get_k(VALUE self)
78
- {
79
- EdlibAlignConfig *config = aligner_get_config(self);
80
- return get_k(config);
81
- }
95
+ ALIGNER_GET_(k)
82
96
 
83
97
  static VALUE
84
98
  set_k(EdlibAlignConfig *config, VALUE k)
@@ -87,35 +101,25 @@ set_k(EdlibAlignConfig *config, VALUE k)
87
101
  return k;
88
102
  }
89
103
 
90
- static VALUE
91
- aligner_set_k(VALUE self, VALUE k)
92
- {
93
- EdlibAlignConfig *config = aligner_get_config(self);
94
- return set_k(config, k);
95
- }
104
+ ALIGNER_SET_(k)
96
105
 
97
106
  static VALUE
98
107
  get_mode(EdlibAlignConfig *config)
99
108
  {
100
109
  switch (config->mode)
101
110
  {
102
- case 0:
111
+ case EDLIB_MODE_NW:
103
112
  return rb_str_new2("NW");
104
- case 1:
113
+ case EDLIB_MODE_SHW:
105
114
  return rb_str_new2("SHW");
106
- case 2:
115
+ case EDLIB_MODE_HW:
107
116
  return rb_str_new2("HW");
108
117
  default:
109
118
  return Qnil;
110
119
  }
111
120
  }
112
121
 
113
- static VALUE
114
- aligner_get_mode(VALUE self)
115
- {
116
- EdlibAlignConfig *config = aligner_get_config(self);
117
- return get_mode(config);
118
- }
122
+ ALIGNER_GET_(mode)
119
123
 
120
124
  static VALUE
121
125
  set_mode(EdlibAlignConfig *config, VALUE mode)
@@ -127,18 +131,19 @@ set_mode(EdlibAlignConfig *config, VALUE mode)
127
131
  switch (TYPE(mode))
128
132
  {
129
133
  case T_STRING:;
130
- rb_funcall(mode, rb_intern("upcase!"), 0);
131
- if (strcmp(RSTRING_PTR(mode), "NW") == 0)
134
+ VALUE mode_str = rb_funcall(mode, rb_intern("upcase"), 0);
135
+ char *mode_s = RSTRING_PTR(mode_str);
136
+ if (strcmp(mode_s, "NW") == 0)
132
137
  {
133
- config->mode = 0;
138
+ config->mode = EDLIB_MODE_NW;
134
139
  }
135
- else if (strcmp(RSTRING_PTR(mode), "SHW") == 0)
140
+ else if (strcmp(mode_s, "SHW") == 0)
136
141
  {
137
- config->mode = 1;
142
+ config->mode = EDLIB_MODE_SHW;
138
143
  }
139
- else if (strcmp(RSTRING_PTR(mode), "HW") == 0)
144
+ else if (strcmp(mode_s, "HW") == 0)
140
145
  {
141
- config->mode = 2;
146
+ config->mode = EDLIB_MODE_HW;
142
147
  }
143
148
  else
144
149
  {
@@ -159,35 +164,25 @@ set_mode(EdlibAlignConfig *config, VALUE mode)
159
164
  return mode;
160
165
  }
161
166
 
162
- static VALUE
163
- aligner_set_mode(VALUE self, VALUE mode)
164
- {
165
- EdlibAlignConfig *config = aligner_get_config(self);
166
- return set_mode(config, mode);
167
- }
167
+ ALIGNER_SET_(mode)
168
168
 
169
169
  static VALUE
170
170
  get_task(EdlibAlignConfig *config)
171
171
  {
172
172
  switch (config->task)
173
173
  {
174
- case 0:
174
+ case EDLIB_TASK_DISTANCE:
175
175
  return rb_str_new2("DISTANCE");
176
- case 1:
176
+ case EDLIB_TASK_LOC:
177
177
  return rb_str_new2("LOC");
178
- case 2:
178
+ case EDLIB_TASK_PATH:
179
179
  return rb_str_new2("PATH");
180
180
  default:
181
181
  return Qnil;
182
182
  }
183
183
  }
184
184
 
185
- static VALUE
186
- aligner_get_task(VALUE self)
187
- {
188
- EdlibAlignConfig *config = aligner_get_config(self);
189
- return get_task(config);
190
- }
185
+ ALIGNER_GET_(task)
191
186
 
192
187
  static VALUE
193
188
  set_task(EdlibAlignConfig *config, VALUE task)
@@ -199,18 +194,19 @@ set_task(EdlibAlignConfig *config, VALUE task)
199
194
  switch (TYPE(task))
200
195
  {
201
196
  case T_STRING:;
202
- rb_funcall(task, rb_intern("upcase!"), 0);
203
- if (strcmp(RSTRING_PTR(task), "DISTANCE") == 0)
197
+ VALUE task_str = rb_funcall(task, rb_intern("upcase"), 0);
198
+ char *task_s = RSTRING_PTR(task_str);
199
+ if (strcmp(task_s, "DISTANCE") == 0)
204
200
  {
205
- config->task = 0;
201
+ config->task = EDLIB_TASK_DISTANCE;
206
202
  }
207
- else if (strcmp(RSTRING_PTR(task), "LOC") == 0)
203
+ else if (strcmp(task_s, "LOC") == 0)
208
204
  {
209
- config->task = 1;
205
+ config->task = EDLIB_TASK_LOC;
210
206
  }
211
- else if (strcmp(RSTRING_PTR(task), "PATH") == 0)
207
+ else if (strcmp(task_s, "PATH") == 0)
212
208
  {
213
- config->task = 2;
209
+ config->task = EDLIB_TASK_PATH;
214
210
  }
215
211
  else
216
212
  {
@@ -231,12 +227,7 @@ set_task(EdlibAlignConfig *config, VALUE task)
231
227
  return task;
232
228
  }
233
229
 
234
- static VALUE
235
- aligner_set_task(VALUE self, VALUE task)
236
- {
237
- EdlibAlignConfig *config = aligner_get_config(self);
238
- return set_task(config, task);
239
- }
230
+ ALIGNER_SET_(task)
240
231
 
241
232
  static VALUE
242
233
  get_additional_equalities(EdlibAlignConfig *config)
@@ -255,12 +246,7 @@ get_additional_equalities(EdlibAlignConfig *config)
255
246
  return equalities;
256
247
  }
257
248
 
258
- static VALUE
259
- aligner_get_additional_equalities(VALUE self)
260
- {
261
- EdlibAlignConfig *config = aligner_get_config(self);
262
- return get_additional_equalities(config);
263
- }
249
+ ALIGNER_GET_(additional_equalities)
264
250
 
265
251
  static VALUE
266
252
  set_additional_equalities(EdlibAlignConfig *config, EdlibEqualityPair *eqpairs, VALUE equalities)
@@ -455,5 +441,5 @@ void Init_edlibext(void)
455
441
  rb_define_method(cAligner, "additional_equalities", aligner_get_additional_equalities, 0);
456
442
  rb_define_method(cAligner, "additional_equalities=", aligner_set_additional_equalities, 1);
457
443
  rb_define_method(cAligner, "config", aligner_config_hash, 0);
458
- rb_define_method(cAligner, "align", aligner_align, 2);
444
+ rb_define_method(cAligner, "align_raw", aligner_align, 2);
459
445
  }
data/ext/edlib/edlibext.h CHANGED
@@ -9,34 +9,7 @@ typedef struct
9
9
  EdlibEqualityPair *equalityPairs;
10
10
  } RbAlignConfig;
11
11
 
12
- static VALUE aligner_config_allocate(VALUE klass);
13
- static size_t aligner_config_memsize(const void *ptr);
14
- static void aligner_config_free(void *ptr);
15
-
16
12
  static EdlibAlignConfig *aligner_get_config(VALUE self);
17
13
  static EdlibEqualityPair *aligner_get_equalityPairs(VALUE self);
18
14
 
19
- static VALUE get_k(EdlibAlignConfig *config);
20
- static VALUE aligner_get_k(VALUE self);
21
- static VALUE set_k(EdlibAlignConfig *config, VALUE k);
22
- static VALUE aligner_set_k(VALUE self, VALUE k);
23
- static VALUE get_mode(EdlibAlignConfig *config);
24
- static VALUE aligner_get_mode(VALUE self);
25
- static VALUE set_mode(EdlibAlignConfig *config, VALUE mode);
26
- static VALUE aligner_set_mode(VALUE self, VALUE mode);
27
- static VALUE get_task(EdlibAlignConfig *config);
28
- static VALUE aligner_get_task(VALUE self);
29
- static VALUE set_task(EdlibAlignConfig *config, VALUE task);
30
- static VALUE aligner_set_task(VALUE self, VALUE task);
31
- static VALUE get_additional_equalities(EdlibAlignConfig *config);
32
- static VALUE aligner_get_additional_equalities(VALUE self);
33
- static VALUE set_additional_equalities(EdlibAlignConfig *config, EdlibEqualityPair *eqpairs, VALUE equalities);
34
- static VALUE aligner_set_additional_equalities(VALUE self, VALUE equalities);
35
-
36
- static VALUE aligner_config_hash(VALUE self);
37
-
38
- static VALUE aligner_initialize_raw(VALUE self, VALUE k, VALUE mode, VALUE task, VALUE additional_equalities);
39
- static VALUE aligner_align(VALUE self, VALUE query, VALUE target);
40
- void Init_edlibext(void);
41
-
42
15
  #endif // EDLIBEXT_H
data/ext/edlib/extconf.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mkmf'
2
4
 
3
5
  create_makefile('edlib/edlibext')
data/lib/edlib/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Edlib
2
- VERSION = '0.0.6'
4
+ VERSION = '0.0.7'
3
5
  end
data/lib/edlib.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'edlib/edlibext'
2
4
 
3
5
  module Edlib
@@ -9,5 +11,68 @@ module Edlib
9
11
  task = task.upcase if task.is_a? String
10
12
  initialize_raw(k, mode, task, additional_equalities)
11
13
  end
14
+
15
+ def align(query, target, nice: false)
16
+ if nice
17
+ align_nice(query, target)
18
+ else
19
+ align_raw(query, target)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def align_nice(query, target)
26
+ result = align(query, target)
27
+ result.merge(nice(result, query, target))
28
+ end
29
+
30
+ def nice(result, query, target, gap_symbol: '-')
31
+ raise 'result does not have :locations and :cigar' unless result.key?(:locations) && result.key?(:cigar)
32
+
33
+ target_pos = result[:locations][0][0]
34
+ query_pos = 0
35
+ query_aln = String.new
36
+ match_aln = String.new
37
+ target_aln = String.new
38
+ cigar = result[:cigar]
39
+ cigar.scan(/(\d+)(\D)/).each do |num, op|
40
+ num = num.to_i
41
+ case op
42
+ when '='
43
+ target_aln << target[target_pos, num]
44
+ target_pos += num
45
+ query_aln << query[query_pos, num]
46
+ query_pos += num
47
+ match_aln << '|' * num
48
+ when 'X'
49
+ target_aln << target[target_pos, num]
50
+ target_pos += num
51
+ query_aln << query[query_pos, num]
52
+ query_pos += num
53
+ match_aln << '.' * num
54
+ when 'D'
55
+ target_aln << target[target_pos, num]
56
+ target_pos += num
57
+ query_aln << gap_symbol * num
58
+ query_pos += 0
59
+ match_aln << gap_symbol * num
60
+ when 'I'
61
+ target_aln << gap_symbol * num
62
+ target_pos += 0
63
+ query_aln << query[query_pos, num]
64
+ query_pos += num
65
+ match_aln << gap_symbol * num
66
+ else
67
+ raise "Unknown CIGAR operation: #{op}"
68
+ end
69
+ end
70
+
71
+ {
72
+ query_aligned: query_aln,
73
+ match_aligned: match_aln,
74
+ target_aligned: target_aln
75
+ }
76
+ end
12
77
  end
13
78
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edlib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - kojix2
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-02 00:00:00.000000000 Z
11
+ date: 2022-11-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 'Lightweight, super fast C/C++ library for sequence alignment using edit
14
14
  (Levenshtein) distance. '