rocker 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -9,11 +9,11 @@ script/destroy
9
9
  script/generate
10
10
  test/test_helper.rb
11
11
  test/test_rocker.rb
12
- ext/rocker/extconf.rb
13
- ext/rocker/auc_info.h
14
- ext/rocker/constants.h
15
- ext/rocker/fetcher.h
16
- ext/rocker/updater.h
17
- ext/rocker/line_input_iterator.h
18
- ext/rocker/rocker.h
19
- ext/rocker/rocker.cpp
12
+ ext/rockerxx/extconf.rb
13
+ ext/rockerxx/auc_info.h
14
+ ext/rockerxx/constants.h
15
+ ext/rockerxx/fetcher.h
16
+ ext/rockerxx/updater.h
17
+ ext/rockerxx/line_input_iterator.h
18
+ ext/rockerxx/rockerxx.h
19
+ ext/rockerxx/rockerxx.cpp
data/Rakefile CHANGED
@@ -14,7 +14,6 @@ $hoe = Hoe.spec 'rocker' do
14
14
  self.developer 'John Woods', 'john.woods@marcottelab.org'
15
15
  self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
16
16
  # self.extra_deps = [['activesupport','>= 2.0.2']]
17
-
18
17
  end
19
18
 
20
19
  require 'newgem/tasks'
File without changes
File without changes
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'mkmf-rice'
3
3
 
4
- dir_config("rocker")
4
+ dir_config("rockerxx")
5
5
  dir_config("boost")
6
6
 
7
7
  have_library("stdc++")
@@ -12,4 +12,4 @@ if RUBY_VERSION =~ /1.9/ then
12
12
  $CPPFLAGS += " -DRUBY_19"
13
13
  end
14
14
 
15
- create_makefile('rocker')
15
+ create_makefile('rockerxx')
@@ -1,9 +1,11 @@
1
1
  #include <iostream>
2
2
  #include <set>
3
3
  #include <vector>
4
+ #include <map>
4
5
  #include <string>
5
6
  #include <sstream>
6
7
  #include <pqxx/transactor.hxx>
8
+ #include <pqxx/nontransaction.hxx>
7
9
  #include <pqxx/result.hxx>
8
10
 
9
11
  using std::cout;
@@ -11,42 +13,49 @@ using std::cerr;
11
13
  using std::endl;
12
14
  using std::set;
13
15
  using std::vector;
16
+ using std::map;
14
17
  using std::string;
15
18
  using std::ostringstream;
16
19
  using pqxx::transactor;
20
+ using pqxx::nontransaction;
17
21
  using pqxx::result;
18
22
 
19
23
  typedef unsigned int uint;
20
24
 
21
25
 
22
- class Fetcher : public transactor <> {
26
+ class Fetcher : public transactor<nontransaction> {
23
27
  public:
24
- Fetcher() : transactor<>("Fetcher") {}
28
+ Fetcher(uint m_id, map<uint, set<uint> >* known)
29
+ : transactor<nontransaction>("Fetcher"), matrix_id(m_id), known_correct(known)
30
+ {
31
+ cerr << "Constructed" << endl;
32
+ }
25
33
 
26
- uint matrix_id;
27
- uint experiment_id;
28
- vector< set<uint> > known_correct;
29
- string query;
34
+ Fetcher(const Fetcher& rhs)
35
+ : query(rhs.query), matrix_id(rhs.matrix_id), known_correct(rhs.known_correct)
36
+ {
37
+ cerr << "Copy constructed" << endl;
38
+ }
39
+
40
+ ~Fetcher() {
41
+ cerr << "De-allocate" << endl;
42
+ }
30
43
 
31
44
  void operator()(argument_type &T) {
32
45
  result R;
33
- query = make_known_correct_query().c_str();
46
+ query = make_known_correct_query();
34
47
 
35
48
  try {
36
49
  R = T.exec(query);
37
50
 
38
- vector< set<uint> > known(R.size());
39
-
40
51
  // Get the row and add it to the results set
41
52
  for (result::const_iterator it = R.begin(); it != R.end(); ++it) {
42
53
  uint i; uint j;
43
54
  (*it)[1].to(j); // Get column
44
55
  (*it)[2].to(i); // Get gene
45
- known[j].insert(i);
56
+ (*known_correct)[j].insert(i);
46
57
  }
47
58
 
48
- known_correct = known;
49
-
50
59
  } catch (pqxx::sql_error e) {
51
60
  cerr << "SQL error in Fetcher transactor." << endl;
52
61
  cerr << "Query: " << e.query() << endl;
@@ -54,7 +63,20 @@ public:
54
63
  }
55
64
  }
56
65
 
66
+ set<uint>& operator[](size_t idx) {
67
+ return (*known_correct)[idx];
68
+ }
69
+
70
+ set<uint> operator[](size_t idx) const {
71
+ return (*known_correct).find(idx)->second;
72
+ }
73
+
57
74
  protected:
75
+ string query;
76
+ uint matrix_id;
77
+
78
+ map<uint, set<uint> >* known_correct;
79
+
58
80
  string make_known_correct_query() const {
59
81
  ostringstream q;
60
82
  q << "SELECT id, j, i FROM entries WHERE matrix_id = " << matrix_id
File without changes
@@ -33,7 +33,7 @@ using std::cout;
33
33
  using std::endl;
34
34
  using namespace Rice;
35
35
 
36
- #include "rocker.h"
36
+ #include "rockerxx.h"
37
37
 
38
38
  //#include "line_input_iterator.h"
39
39
 
@@ -41,15 +41,15 @@ typedef LineInputIterator<std::string> line_input_iterator;
41
41
 
42
42
 
43
43
  extern "C"
44
- void Init_rocker() {
44
+ void Init_rockerxx() {
45
45
 
46
46
  // Expose Rocker class to Ruby
47
47
  //database_string dbarg(DBNAME, USER, PASSWORD);
48
- Data_Type<Rocker> rb_cRocker =
49
- define_class<Rocker>("Rocker")
48
+ Data_Type<Rocker> rb_cRockerxx =
49
+ define_class<Rocker>("Rockerxx")
50
50
  .define_constructor(Constructor<Rocker,std::string,uint,uint>())
51
51
  .define_method("process_results", &Rocker::process_results)
52
- .define_method("fetch", &Rocker::fetch, (Arg("j")))
52
+ .define_method("fetch_column", &Rocker::fetch_column, (Arg("j")))
53
53
  .define_method("calculate_statistic",
54
54
  &Rocker::calculate_statistic,
55
55
  (Arg("j"), Arg("threshold") = (double)(0.0)))
@@ -46,38 +46,39 @@ class Rocker {
46
46
  public:
47
47
 
48
48
  // Connect to the database and create the read transaction
49
- Rocker(string dbarg, uint m_id, uint e_id) : c(dbarg), mean_auc_(0.0) {
49
+ Rocker(string dbarg, uint m_id, uint e_id)
50
+ : c(dbarg), known_(new map<uint, set<uint> >), fetch(m_id, known_), update(e_id)
51
+ {
50
52
  // Make sure the fetcher knows which matrix to restrict queries to.
51
- fetcher.matrix_id = m_id;
53
+ // fetcher.matrix_id = m_id;
52
54
 
53
55
  // Set up a transaction
54
- action = new pqxx::transaction<>(c, READ_TRANSACTION);
56
+ // action = new pqxx::transaction<>(c, READ_TRANSACTION);
55
57
 
56
- fetcher(*action); // Perform the fetch.
58
+ c.perform(fetch);
59
+ // fetcher(*action); // Perform the fetch.
57
60
 
58
- delete action;
61
+ // delete action;
62
+ update.aucs = process_results();
59
63
 
60
- updater.experiment_id = e_id;
61
- updater.aucs = process_results();
64
+ c.perform(update);
65
+ // action = new pqxx::transaction<>(c, WRITE_TRANSACTION);
62
66
 
63
- action = new pqxx::transaction<>(c, WRITE_TRANSACTION);
67
+ // updater(*action);
64
68
 
65
- updater(*action);
66
-
67
- // Make sure to actually save the results.
68
- action->commit();
69
-
70
- delete action;
69
+ // delete action;
71
70
  }
72
71
 
73
72
 
74
73
  //
75
- ~Rocker() { }
74
+ ~Rocker() {
75
+ delete known_;
76
+ }
76
77
 
77
78
 
78
79
  // Return the mean AUC calculated -- requires that process_results was called,
79
80
  // which happens in the constructor, so it's okay.
80
- double mean_auc() { return updater.mean_auc; }
81
+ double mean_auc() { return update.mean_auc; }
81
82
 
82
83
  // Go through the results directory
83
84
  map<uint,auc_info> process_results() {
@@ -102,24 +103,32 @@ public:
102
103
 
103
104
  // Calculate the mean AUC
104
105
  if (divide_by > 0)
105
- updater.mean_auc = temp_auc_accum / (double)(divide_by);
106
+ update.mean_auc = temp_auc_accum / (double)(divide_by);
106
107
  else
107
- updater.mean_auc = 0;
108
+ update.mean_auc = 0;
108
109
 
109
110
  return rocs;
110
111
  }
111
112
 
112
113
 
113
114
  // Get genes with a specific phenotype association (phenotype id = j).
114
- set<uint> fetch(uint j) const {
115
- return fetcher.known_correct[j];
115
+ set<uint> fetch_column(uint j) const {
116
+ return (*known_)[j];
116
117
  }
117
118
 
118
119
 
119
120
  // For some phenotype j, determine AUC, fp, tp, fn, tn, etc.
120
121
  auc_info calculate_statistic(uint j, double threshold = 0.0) const {
121
- set<uint> known_correct = fetch(j);
122
+ set<uint> known_correct = fetch_column(j);
122
123
  gene_score_list candidates = read_candidates(j);
124
+ auc_info result;
125
+
126
+ if (known_correct.size() == 0) {
127
+ result.auc = 0;
128
+ return result;
129
+ }
130
+
131
+
123
132
  //cerr << "Size of known_correct: " << known_correct.size() << endl;
124
133
 
125
134
  // Attempted transcription of code from Ruby into C++, after having taken
@@ -129,7 +138,7 @@ public:
129
138
  t.reserve(candidates.size()+1); t.push_back(0);
130
139
  vector<size_t> f = t;
131
140
 
132
- auc_info result;
141
+
133
142
 
134
143
  for (gene_score_list::const_iterator i = candidates.begin(); i != candidates.end(); ++i) {
135
144
  if (known_correct.find(i->first) != known_correct.end()) {
@@ -216,15 +225,8 @@ public:
216
225
 
217
226
 
218
227
  protected:
219
-
220
- uint matrix_id;
221
- uint experiment_id;
222
- uint current_j;
223
228
  pqxx::connection c;
224
- pqxx::transaction<>* action;
225
-
226
- double mean_auc_;
227
-
228
- Fetcher fetcher;
229
- Updater updater;
229
+ map<uint, set<uint> >* known_;
230
+ Fetcher fetch;
231
+ Updater update;
230
232
  };
@@ -45,12 +45,10 @@ typedef unsigned int uint;
45
45
 
46
46
  class Updater : public transactor <> {
47
47
  public:
48
- Updater() : transactor<>("Updater") {}
48
+ Updater(uint exp_id) : transactor<>("Updater"), experiment_id(exp_id) {}
49
49
 
50
- uint experiment_id;
51
50
  map<uint,auc_info> aucs;
52
51
  double mean_auc;
53
- string insert_query, update_query;
54
52
 
55
53
  void operator()(argument_type &T) {
56
54
  result R;
@@ -60,19 +58,16 @@ public:
60
58
  return;
61
59
  }
62
60
 
63
- insert_query = make_insertion_sql().c_str();
64
- update_query = make_update_total_auc_sql().c_str();
61
+ query = make_insertion_sql() + "\n" + make_update_total_auc_sql();
65
62
 
66
63
  try {
67
64
  // Insert the AUCs
68
- R = T.exec(insert_query);
69
- cout << "Query:" << endl;
70
- cout << insert_query << endl;
71
-
72
65
  // Update the average AUC
73
- R = T.exec(update_query);
66
+ R = T.exec(query);
74
67
  cout << "Query:" << endl;
75
- cout << update_query << endl;
68
+ cout << query << endl;
69
+
70
+ T.commit();
76
71
  } catch (pqxx::sql_error e) {
77
72
  cerr << "SQL error in Updater transactor." << endl;
78
73
  cerr << "Query: " << e.query() << endl;
@@ -82,14 +77,17 @@ public:
82
77
  }
83
78
 
84
79
  protected:
80
+ uint experiment_id;
81
+ string query;
82
+
85
83
  string make_insertion_sql() const {
86
84
  ostringstream q;
87
- q << "INSERT INTO rocs " << AUC_COLUMNS << " VALUES \n";
85
+ q << "INSERT INTO rocs " << AUC_COLUMNS << " VALUES ";
88
86
  list<string> insertions;
89
87
  for (map<uint,auc_info>::const_iterator i = aucs.begin(); i != aucs.end(); ++i) {
90
88
  insertions.push_back( i->second.entry(experiment_id, i->first) );
91
89
  }
92
- q << join(insertions, ",\n") << ';';
90
+ q << join(insertions, ", ") << ';';
93
91
  return q.str();
94
92
  }
95
93
 
@@ -97,6 +95,6 @@ protected:
97
95
  ostringstream q;
98
96
  q << "UPDATE experiments SET total_auc = " << mean_auc
99
97
  << " WHERE experiments.id = " << experiment_id << ';';
100
-
98
+ return q.str();
101
99
  }
102
100
  };
data/lib/rocker.rb CHANGED
@@ -1,8 +1,18 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
- require 'rocker.so'
4
+ # STDERR.puts("__FILE__=#{__FILE__}\ndirname=#{File.dirname(__FILE__)}")
5
+ # $:.unshift(File.join(File.dirname(__FILE__),'..','ext','rocker'))
6
+ # STDERR.puts($:)
5
7
 
6
- class Rocker
7
- VERSION = '0.0.8'
8
+ #require 'rockerxx'
9
+
10
+ module Rocker
11
+ VERSION = '0.0.9'
12
+ DBARGS = "dbname=crossval_development user=jwoods password=youwish1"
13
+
14
+ # Calculate AUCs in the current working directory
15
+ def self.calculate(matrix_id, experiment_id)
16
+ Rockerxx.new(DBARGS, matrix_id, experiment_id)
17
+ end
8
18
  end
@@ -1,15 +1,14 @@
1
1
  require "test/unit"
2
2
 
3
- $:.unshift File.dirname(__FILE__) + "/../ext/rocker"
4
- require "rocker.so"
5
-
6
- def database_string dbn = "crossval_development", u = "jwoods", p = "youwish1"
7
- "dbname=#{dbn} user=#{u} password=#{p}"
8
- end
3
+ $:.unshift File.dirname(__FILE__) + "/../ext/rockerxx"
4
+ require "rockerxx.so"
9
5
 
10
6
  class TestRockerExtn < Test::Unit::TestCase
11
7
  def test_working
12
- t = Rocker.new(database_string, 1, 167)
8
+ t = nil
9
+ #Dir.chdir("../crossval/tmp/work/matrix_1/experiment_167/results.20100318222010/") do
10
+ t = Rocker.calculate(1, 167)
11
+ #end
13
12
  x = t.mean_auc
14
13
  puts "Mean AUC was #{x}"
15
14
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 8
9
- version: 0.0.8
8
+ - 9
9
+ version: 0.0.9
10
10
  platform: ruby
11
11
  authors:
12
12
  - John Woods
@@ -59,7 +59,7 @@ email:
59
59
  executables: []
60
60
 
61
61
  extensions:
62
- - ext/rocker/extconf.rb
62
+ - ext/rockerxx/extconf.rb
63
63
  extra_rdoc_files:
64
64
  - History.txt
65
65
  - Manifest.txt
@@ -76,14 +76,14 @@ files:
76
76
  - script/generate
77
77
  - test/test_helper.rb
78
78
  - test/test_rocker.rb
79
- - ext/rocker/extconf.rb
80
- - ext/rocker/auc_info.h
81
- - ext/rocker/constants.h
82
- - ext/rocker/fetcher.h
83
- - ext/rocker/updater.h
84
- - ext/rocker/line_input_iterator.h
85
- - ext/rocker/rocker.h
86
- - ext/rocker/rocker.cpp
79
+ - ext/rockerxx/extconf.rb
80
+ - ext/rockerxx/auc_info.h
81
+ - ext/rockerxx/constants.h
82
+ - ext/rockerxx/fetcher.h
83
+ - ext/rockerxx/updater.h
84
+ - ext/rockerxx/line_input_iterator.h
85
+ - ext/rockerxx/rockerxx.h
86
+ - ext/rockerxx/rockerxx.cpp
87
87
  has_rdoc: true
88
88
  homepage: http://github.com/MarcotteLabGit/rocker
89
89
  licenses: []
@@ -94,7 +94,7 @@ rdoc_options:
94
94
  - README.rdoc
95
95
  require_paths:
96
96
  - lib
97
- - ext/rocker
97
+ - ext/rockerxx
98
98
  required_ruby_version: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - ">="