matr 0.0.2 → 0.1.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/exe/matr +20 -74
- data/lib/matr.rb +92 -1
- data/lib/matr/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27143ae159138fad54cd2d4c85138c47dbacf90a
|
4
|
+
data.tar.gz: d35cebbbe078e2a3689c9f32ba1c093c1befa2ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08c61835a0633930babf25435a2ee4d96a5f2444003ff1ce1ced4ce426d98eb18459738619007d9d2c5b84cdb0a2586d35ed297061aeb6be8cff6978df57526e'
|
7
|
+
data.tar.gz: fbee20edd8a637b072b3f6e5a34964f11131744722e316ad9e59567c276bcd7143a960a50ad6953e123aea855ae763854370f663368ee7f5e3a0afc1a8bd0c32
|
data/Gemfile.lock
CHANGED
data/exe/matr
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
Signal.trap("PIPE", "EXIT")
|
4
4
|
|
5
|
+
require "matr"
|
6
|
+
|
5
7
|
require "set"
|
6
8
|
require "trollop"
|
7
9
|
|
@@ -10,89 +12,33 @@ opts = Trollop.options do
|
|
10
12
|
|
11
13
|
Take a three-column matrix file and ensure that it is symmetric for input into R.
|
12
14
|
|
13
|
-
|
14
|
-
EOS
|
15
|
+
*Note* -- I ALWAYS enforce symmetry of the output.
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
opt(:self_score, "Score for self connections", default: 100)
|
19
|
-
opt(:missing_score, "Score for missing connections", default: 0)
|
20
|
-
opt(:output_style, "Output style [wide,long]", default: "wide")
|
21
|
-
end
|
22
|
-
|
23
|
-
infile = opts[:infile]
|
24
|
-
self_score = opts[:self_score]
|
25
|
-
missing_score = opts[:missing_score]
|
26
|
-
output_style = opts[:output_style]
|
27
|
-
|
28
|
-
unless File.exist? infile
|
29
|
-
abort "FATAL -- infile '#{infile}' does not exist"
|
30
|
-
end
|
31
|
-
|
32
|
-
unless output_style == "wide" || output_style == "long"
|
33
|
-
abort "FATAL -- output style must be either wide or long"
|
34
|
-
end
|
17
|
+
Option details
|
18
|
+
--------------
|
35
19
|
|
36
|
-
|
37
|
-
|
38
|
-
header = nil
|
20
|
+
--self-scores: I will add a self score of this value if one is not already specified.
|
21
|
+
--ensure-self-scores: I will ensure all self scores equal the value set in --self-scores even if a self-score is present but set to something else.
|
39
22
|
|
40
|
-
|
41
|
-
|
23
|
+
Things I do
|
24
|
+
------------------
|
42
25
|
|
43
|
-
|
44
|
-
|
45
|
-
else
|
46
|
-
source, target, score = line.split "\t"
|
26
|
+
- Raise error if a source-target pair is specified twice with a different score
|
27
|
+
- Raise error if source-target and target-source are both specified and they don't match.
|
47
28
|
|
48
|
-
|
49
|
-
|
50
|
-
# If you have duplicates with different scores, that's an error: a
|
51
|
-
# => b = 10 and a => b = 20
|
52
|
-
if graph[source].has_key?(target) && graph[source][target] != score
|
53
|
-
abort "source--target (#{source}--#{target}) was repeated with a different score"
|
54
|
-
end
|
55
|
-
|
56
|
-
graph[source][target] = score
|
29
|
+
Options:
|
30
|
+
EOS
|
57
31
|
|
58
|
-
|
59
|
-
# => a = 10, that would be okay. But if you have a => b = 10, and
|
60
|
-
# b => a = 5, then that would be an error.
|
61
|
-
if graph[target].has_key?(source) && graph[target][source] != score
|
62
|
-
abort "target--source (#{target}--#{source}) is specified seperately from source--target (#{source}--#{target}), BUT there scores do not match. This means your matrix is NOT symmetric."
|
32
|
+
opt(:infile, "Input file", type: :string)
|
63
33
|
|
64
|
-
|
34
|
+
opt(:missing_score, "Score for missing connections (unless they are already put in because of symmetry)", default: 0)
|
65
35
|
|
66
|
-
|
36
|
+
# opt(:ensure_symmetry, "This flag will ensure that your output will be a symmetric matrix.", default: true)
|
67
37
|
|
68
|
-
|
69
|
-
|
70
|
-
end
|
38
|
+
opt(:self_score, "Score for self connections", default: 100)
|
39
|
+
opt(:ensure_self_scores, "This flag will ensure that self hit scores all match the value of --self-score option", default: true)
|
71
40
|
|
72
|
-
|
73
|
-
graph[source][source] = self_score
|
74
|
-
end
|
75
|
-
end
|
41
|
+
opt(:output_style, "Output style [wide,long]", default: "wide")
|
76
42
|
end
|
77
43
|
|
78
|
-
|
79
|
-
puts header
|
80
|
-
|
81
|
-
all_keys.each do |source|
|
82
|
-
all_keys.each do |target|
|
83
|
-
puts [source, target, graph[source][target] || missing_score].join "\t"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
else
|
87
|
-
all_keys = all_keys.sort
|
88
|
-
|
89
|
-
puts ["", all_keys].join "\t"
|
90
|
-
|
91
|
-
all_keys.each do |source|
|
92
|
-
row = all_keys.map do |target|
|
93
|
-
graph[source][target] || missing_score
|
94
|
-
end
|
95
|
-
|
96
|
-
puts [source, row].join "\t"
|
97
|
-
end
|
98
|
-
end
|
44
|
+
Matr.main opts
|
data/lib/matr.rb
CHANGED
@@ -1,5 +1,96 @@
|
|
1
1
|
require "matr/version"
|
2
2
|
|
3
3
|
module Matr
|
4
|
-
|
4
|
+
def self.default_opt opts, key, default
|
5
|
+
opts.has_key?(key) ? opts[key] : default
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.main opts
|
9
|
+
|
10
|
+
infile = opts[:infile]
|
11
|
+
self_score = self.default_opt opts, :self_score, 100
|
12
|
+
missing_score = self.default_opt opts, :missing_score, 0
|
13
|
+
output_style = self.default_opt opts, :output_style, "wide"
|
14
|
+
ensure_symmetry = true # self.default_opt opts, :ensure_symmetry, true
|
15
|
+
ensure_self_scores = self.default_opt opts, :ensure_self_scores, true
|
16
|
+
|
17
|
+
unless File.exist? infile
|
18
|
+
raise StandardError, "FATAL -- infile '#{infile}' does not exist"
|
19
|
+
end
|
20
|
+
|
21
|
+
unless output_style == "wide" || output_style == "long"
|
22
|
+
raise StandardError, "FATAL -- output style must be either wide or long"
|
23
|
+
end
|
24
|
+
|
25
|
+
graph = Hash.new { |ht, k| ht[k] = Hash.new }
|
26
|
+
all_keys = Set.new
|
27
|
+
header = nil
|
28
|
+
|
29
|
+
File.open(infile, "rt").each_line.with_index do |line, idx|
|
30
|
+
line.chomp!
|
31
|
+
|
32
|
+
if idx.zero?
|
33
|
+
header = line
|
34
|
+
else
|
35
|
+
source, target, score = line.split "\t"
|
36
|
+
|
37
|
+
all_keys << source << target
|
38
|
+
|
39
|
+
# Fix self score if the option is there.
|
40
|
+
if source == target && ensure_self_scores
|
41
|
+
score = self_score
|
42
|
+
end
|
43
|
+
|
44
|
+
# If you have duplicates with different scores, that's an error: a
|
45
|
+
# => b = 10 and a => b = 20
|
46
|
+
if graph[source].has_key?(target) && graph[source][target] != score
|
47
|
+
raise StandardError, "FATAL -- source--target (#{source}--#{target}) was repeated with a different score"
|
48
|
+
end
|
49
|
+
|
50
|
+
graph[source][target] = score
|
51
|
+
|
52
|
+
if ensure_symmetry
|
53
|
+
# Since you might have a files that specifies a => b = 10, and b
|
54
|
+
# => a = 10, that would be okay. But if you have a => b = 10, and
|
55
|
+
# b => a = 5, then that would be an error.
|
56
|
+
if graph[target].has_key?(source) && graph[target][source] != score
|
57
|
+
raise StandardError, "FATAL -- target--source (#{target}--#{source}) is specified seperately from source--target (#{source}--#{target}), BUT their scores do not match. This means your matrix is NOT symmetric. Did you really mean to pass the --ensure-symmetry flag?"
|
58
|
+
end
|
59
|
+
|
60
|
+
graph[target][source] = score
|
61
|
+
end
|
62
|
+
|
63
|
+
# Makes sure these weren't already specified earlier.
|
64
|
+
unless graph[target].has_key? target
|
65
|
+
graph[target][target] = self_score
|
66
|
+
end
|
67
|
+
|
68
|
+
unless graph[source].has_key? source
|
69
|
+
graph[source][source] = self_score
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
if output_style == "long"
|
75
|
+
puts header
|
76
|
+
|
77
|
+
all_keys.each do |source|
|
78
|
+
all_keys.each do |target|
|
79
|
+
puts [source, target, graph[source][target] || missing_score].join "\t"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
else
|
83
|
+
all_keys = all_keys.sort
|
84
|
+
|
85
|
+
puts ["", all_keys].join "\t"
|
86
|
+
|
87
|
+
all_keys.each do |source|
|
88
|
+
row = all_keys.map do |target|
|
89
|
+
graph[source][target] || missing_score
|
90
|
+
end
|
91
|
+
|
92
|
+
puts [source, row].join "\t"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
5
96
|
end
|
data/lib/matr/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: matr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Moore
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trollop
|