graphkit 0.1.0.1 → 0.2.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.
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
-