graphkit 0.1.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/graphkit.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  script_folder = File.dirname(File.expand_path(__FILE__))
2
2
 
3
3
  require 'pp'
4
- require script_folder + '/box_of_tricks.rb'
5
- require script_folder + '/gnuplot.rb'
4
+ #require script_folder + '/box_of_tricks.rb'
5
+ #require script_folder + '/gnuplot.rb'
6
6
 
7
7
  class Matrix
8
8
  def shape
@@ -47,6 +47,7 @@ class SparseTensor < Hash
47
47
 
48
48
 
49
49
  attr_reader :rank, :shape
50
+ #attr_accessor :default_val
50
51
 
51
52
  # Create a new tensor.
52
53
 
@@ -78,7 +79,16 @@ class SparseTensor < Hash
78
79
  # p args
79
80
 
80
81
  raise RankError.new("Rank is #@rank, not #{args.size}") unless args.size == @rank
81
- return super(args)
82
+ return nil unless keys.include? args
83
+ #if self.keys.include?(args) or @default_val == nil
84
+ #eputs args.pretty_inspect
85
+ #eputs self.pretty_inspect
86
+ #eputs self.class, self.class.ancestors
87
+ super(args)
88
+ #else
89
+ #return @default_val
90
+ #end
91
+
82
92
  end
83
93
 
84
94
  # Set an element of the tensor. E.g. for a rank 2 tensor
@@ -142,6 +152,21 @@ class SparseTensor < Hash
142
152
 
143
153
 
144
154
 
155
+ def alter!(&block)
156
+ self.keys.each do |k|
157
+ self[k] = yield(self[k])
158
+ end
159
+ end
160
+ def self.from_hash(hash)
161
+ st = new(hash.keys[0].size)
162
+ hash.each{|k,v| st[k] = v}
163
+ st
164
+ end
165
+ def inspect
166
+ "SparseTensor.from_hash(#{super})"
167
+ end
168
+
169
+
145
170
  end
146
171
 
147
172
 
@@ -253,6 +278,12 @@ class GraphKit < KitHash
253
278
  include Kit
254
279
  include Log
255
280
  AXES = [:x, :y, :z, :f]
281
+ DEFAULT_COLOURS = {0 => "#df0000", 1 => "#00df00", 2 => "#0000df", 3 => "#a000a0", 4 => "#0090a0", 5 => "#e59500", 7 => "#82c290", 8 => "#f76dba", 9 => "#c20f00", 10 => "#4f1099"}
282
+ DEFAULT_COLOURS_GNUPLOT = DEFAULT_COLOURS
283
+ DEFAULT_COLOURS_MATHEMATICA = DEFAULT_COLOURS.inject({}) do |hash, (i, coll)|
284
+ hash[i] = coll.sub(/#/, '').scan(/.{2}/).map{|str| (eval("0x#{str}").to_f / 255.0).round(2)}
285
+ hash
286
+ end
256
287
 
257
288
  # attr_reader :gnuplot_options
258
289
 
@@ -383,8 +414,9 @@ class GraphKit < KitHash
383
414
  # Duplicate the graphkit.
384
415
 
385
416
  def dup
386
- logf :dup
387
- self.class.new(naxes, self)
417
+ #logf :dup
418
+ #self.class.new(naxes, self)
419
+ eval(inspect)
388
420
  end
389
421
 
390
422
  # Combine with another graph; titles and labels from the first graph will override the second.
@@ -441,16 +473,83 @@ class GraphKit < KitHash
441
473
  self.xrange, self.yrange = xrange, yrange
442
474
  end
443
475
 
476
+ def convert(&block)
477
+ #ep 'Converting graph...'
478
+ kit = self.dup
479
+ #p kit
480
+
481
+ kit.data.map! do |dk|
482
+ dk.convert(&block)
483
+ end
484
+ kit
485
+ end
444
486
  # end #class GraphKit
445
487
 
488
+
489
+ # Convert the rank of the data from from_to[0] to from_to[1].
490
+ # E.g. convert a line of values of [x, y, z] with rank [1,1,2]
491
+ # to a matrix of values [x, y, z] with rank [1, 1, 2]
492
+ # convert_rank!([[1,1,1], [1,1,2]])
493
+
494
+ def convert_rank!(from_to, options={})
495
+ ep "Converting Rank"
496
+ case from_to
497
+ when [[1,1,1], [1,1,2]]
498
+ dependent_dimension = options[:dd] || options[:dependent_dimension] || 2
499
+ other_dims = [0,1,2] - [dependent_dimension]
500
+ od0 = other_dims[0]
501
+ od1 = other_dims[1]
502
+ data.each do |dk|
503
+ new_data = SparseTensor.new(2)
504
+ od0_data = dk.axes[AXES[od0]].data.to_a.uniq.sort
505
+ od1_data = dk.axes[AXES[od1]].data.to_a.uniq.sort
506
+
507
+ for i in 0...dk.axes[:x].data.size
508
+ od0_index = od0_data.index(dk.axes[AXES[od0]].data[i])
509
+ od1_index = od1_data.index(dk.axes[AXES[od1]].data[i])
510
+ new_data[[od0_index, od1_index]] = dk.axes[AXES[dependent_dimension]].data[i]
511
+ end
512
+ dk.axes[AXES[od0]].data = od0_data
513
+ dk.axes[AXES[od1]].data = od1_data
514
+ dk.axes[AXES[dependent_dimension]].data = new_data
515
+ end
516
+
517
+ else
518
+ raise "Converting from #{from_to[0].inspect} to #{from_to[1].inspect} is not implemented yet."
519
+ end
520
+ eputs self.pretty_inspect
521
+ end
522
+
446
523
  class DataKit < KitHash
524
+ def convert(&block)
525
+
526
+ xdat = self.axes[:x].data.to_gslv
527
+ ydat = self.axes[:y].data.to_gslv
528
+ xnew = GSL::Vector.alloc(xdat.size)
529
+ ynew = GSL::Vector.alloc(xdat.size)
530
+
531
+ for i in 0...xdat.size
532
+ xnew[i], ynew[i] = yield(xdat[i], ydat[i])
533
+ end
534
+ self.axes[:x].data=xnew
535
+ self.axes[:y].data=ynew
536
+ #p 'dk', self
537
+ self
538
+
539
+ end
447
540
 
448
541
  # include Kit
449
542
  include Log
450
543
  AXES = GraphKit::AXES
544
+ AXES.each{|ax| define_method(ax){self.axes[ax]}}
545
+ AXES.each{|ax| define_method(ax + "=".to_sym){|val| self.axes[ax] = val}}
451
546
 
452
547
  # attr_accessor :labels, :ranges, :has_legend, :units, :dimensions
453
548
 
549
+
550
+ def axes_array
551
+ self.axes.values_at(*AXES).compact
552
+ end
454
553
  def initialize(options = {})
455
554
  super()
456
555
  self[:axes] = {}
@@ -499,7 +598,6 @@ class DataKit < KitHash
499
598
 
500
599
  # shape = f.shape
501
600
  log 'checking ranks'
502
- allowed_ranks = [[1], [1,1], [1,1,1], [1,1,2], [1,1,1,1], [1,1,2,2], [1,1,1,3]]
503
601
  rnks = ranks
504
602
  log rnks
505
603
  raise IntegrityError.new("The combination of ranks of your data cannot be plotted. Your data has a set of axes with ranks #{rnks.inspect}. (NB, rank 1 corresponds to a vector, rank 2 to a matrix and 3 to a third rank tensor). The only possible sets of types are #{allowed_ranks.inspect}") unless allowed_ranks.include? rnks
@@ -516,10 +614,10 @@ class DataKit < KitHash
516
614
  passed = false unless axes[:z].shape == [axes[:x].shape[0], axes[:y].shape[0]]
517
615
  passed = false unless axes[:z].shape == axes[:f].shape if axes[:f]
518
616
  when [1,1,1,3]
519
- axes.values_at(:x, :y, :z).map{|axiskit| axiskit.shape}.inject do |old, new|
520
- passed = false unless new == old
521
- old
522
- end
617
+ #axes.values_at(:x, :y, :z).map{|axiskit| axiskit.shape}.inject do |old, new|
618
+ #passed = false unless new == old
619
+ #old
620
+ #end
523
621
  passed = false unless axes[:f].shape == [axes[:x].shape[0], axes[:y].shape[0], axes[:z].shape[0]]
524
622
  end
525
623
  raise IntegrityError.new(%[The dimensions of this data do not match: \n#{axes.inject(""){|str, (axis, axiskit)| str + "#{axis}: #{axiskit.shape}\n"}}\nranks: #{rnks}]) unless passed
@@ -529,6 +627,20 @@ class DataKit < KitHash
529
627
  return true
530
628
  end
531
629
 
630
+ #ALLOWED_RANKS = [[1], [1,1], [1,1,1], [1,1,2], [1,1,1,1], [1,1,2,2], [1,1,1,3]]
631
+ ALLOWED_RANKS = [[1], [1,1], [1,1,1], [1,1,2], [2,2,2], [2,2,2,2], [1,1,1,1], [1,1,2,2], [1,1,1,3], [3,3,3,3]]
632
+
633
+ def allowed_ranks
634
+ ALLOWED_RANKS
635
+ end
636
+ #def ranks_c_switch_hash
637
+ #hash = {}
638
+ #allowed_ranks.each_with_index do |rank,i|
639
+ #hash[rank] = i
640
+ #end
641
+ #p hash
642
+ #hash
643
+ #end
532
644
  def shapes
533
645
  logf :shapes
534
646
  ans = axes.values_at(*AXES).compact.inject([]){|arr, axis| arr.push axis.shape}
@@ -536,6 +648,13 @@ class DataKit < KitHash
536
648
  return ans
537
649
  end
538
650
 
651
+ def rank_c_switch
652
+ #i = -1
653
+ #puts ALLOWED_RANKS.map{|r| i+=1;"#{i} --> #{r}"}
654
+ switch = ALLOWED_RANKS.index(ranks)
655
+ switch
656
+
657
+ end
539
658
  def ranks
540
659
  logf :ranks
541
660
  ans = shapes.map{|shape| shape.size}
@@ -619,6 +738,7 @@ class DataKit < KitHash
619
738
  # p data[0].axes[key]
620
739
  axdata = axiskit.data #(key == :f) ? data[0].f.data : (next unless data[0].axes[key]; data[0].axes[key].data)
621
740
  next unless axdata
741
+ #p 'axdatamin', axdata.min
622
742
  ans.push [axdata.min, axdata.max]
623
743
  end
624
744
  end
@@ -775,6 +895,10 @@ end
775
895
 
776
896
  end # class GraphKit
777
897
 
898
+ require 'graphkit/gnuplot.rb'
899
+ require 'graphkit/mm.rb'
900
+ require 'graphkit/csv.rb'
901
+ require 'graphkit/vtk_legacy_ruby.rb'
778
902
  # end #class CodeRunner
779
903
 
780
904
 
@@ -849,4 +973,4 @@ end
849
973
 
850
974
 
851
975
  # A graph kit is 'everything you need..
852
- #A graph kit is, in fact, a very intelligent hash
976
+ #A graph kit is, in fact, a very intelligent hash
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'graphkit'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestGraphkit < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata CHANGED
@@ -1,71 +1,134 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: graphkit
3
- version: !ruby/object:Gem::Version
4
- hash: 69
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- - 1
11
- version: 0.1.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
12
6
  platform: ruby
13
- authors:
7
+ authors:
14
8
  - Edmund Highcock
15
9
  autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
-
19
- date: 2010-07-26 00:00:00 +01:00
20
- default_executable:
21
- dependencies: []
22
-
23
- description: "A GraphKit is a device independent intelligent data container that allows the easy sharing, combining and plotting of graphic data representations. Easily created from data, they can be output in a variety of formats using packages such as gnuplot. *** Currently broken: fix on its way ****"
24
- email:
12
+ date: 2012-10-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: shoulda
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdoc
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '3.12'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.12'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bundler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>'
52
+ - !ruby/object:Gem::Version
53
+ version: 1.0.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>'
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: jeweler
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.8.4
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.8.4
78
+ description: ! 'A GraphKit is a device independent intelligent data container that
79
+ allows the easy sharing, combining and plotting of graphic data representations.
80
+ Easily created from data, they can be output in a variety of formats using packages
81
+ such as gnuplot. '
82
+ email: edmundhighcock@sourceforge.net
25
83
  executables: []
26
-
27
84
  extensions: []
28
-
29
- extra_rdoc_files: []
30
-
31
- files:
85
+ extra_rdoc_files:
86
+ - LICENSE.txt
87
+ - README.md
88
+ - README.rdoc
89
+ files:
90
+ - .document
91
+ - Gemfile
92
+ - LICENSE.txt
93
+ - README.md
94
+ - README.rdoc
95
+ - Rakefile
96
+ - VERSION
97
+ - graphkit.gemspec
32
98
  - lib/graphkit.rb
99
+ - lib/graphkit/csv.rb
33
100
  - lib/graphkit/gnuplot.rb
34
- has_rdoc: true
35
- homepage: http://graphkit.rubyforge.org/
36
- licenses: []
37
-
101
+ - lib/graphkit/mm.rb
102
+ - lib/graphkit/vtk_legacy_ruby.rb
103
+ - test/helper.rb
104
+ - test/test_graphkit.rb
105
+ homepage: http://github.com/edmundhighcock/graphkit
106
+ licenses:
107
+ - GPLv3
38
108
  post_install_message:
39
109
  rdoc_options: []
40
-
41
- require_paths:
110
+ require_paths:
42
111
  - lib
43
- required_ruby_version: !ruby/object:Gem::Requirement
112
+ required_ruby_version: !ruby/object:Gem::Requirement
44
113
  none: false
45
- requirements:
46
- - - ">="
47
- - !ruby/object:Gem::Version
48
- hash: 51
49
- segments:
50
- - 1
51
- - 9
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ segments:
52
119
  - 0
53
- version: 1.9.0
54
- required_rubygems_version: !ruby/object:Gem::Requirement
120
+ hash: 4377792926943609585
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
122
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
63
127
  requirements: []
64
-
65
- rubyforge_project: graphkit
66
- rubygems_version: 1.3.7
128
+ rubyforge_project:
129
+ rubygems_version: 1.8.24
67
130
  signing_key:
68
131
  specification_version: 3
69
- summary: Graph object with intuitive combining and plotting functions.
132
+ summary: A GraphKit is a device independent intelligent data container for generating
133
+ and plotting graphs.
70
134
  test_files: []
71
-