y_nelson 2.1.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{Ruby_for_YNelson_Users_in_20_minutes.lyx → Introduction_to_Ruby_for_YNelson_Users.lyx} +1042 -55
- data/Introduction_to_Ruby_for_YNelson_Users.pdf +0 -0
- data/Introduction_to_YNelson.lyx +23 -18
- data/Introduction_to_YNelson.pdf +0 -0
- data/LICENSE.txt +1 -2
- data/Object_model_of_YNelson_and_YPetri.lyx +3806 -0
- data/Object_model_of_YNelson_and_YPetri.pdf +0 -0
- data/README.md +1 -0
- data/Rakefile +1 -0
- data/lib/y_nelson/agent.rb +57 -117
- data/lib/y_nelson/dsl.rb +3 -2
- data/lib/y_nelson/place.rb +0 -1
- data/lib/y_nelson/version.rb +1 -1
- data/lib/y_nelson/zz_point.rb +1 -1
- data/lib/y_nelson.rb +16 -2
- data/y_nelson.gemspec +3 -3
- metadata +10 -15
- data/Ruby_for_YNelson_Users_in_20_minutes.pdf +0 -0
- data/YNelson_&_YPetri_User_Manual.lyx +0 -1037
- data/YNelson_&_YPetri_User_Manual.pdf +0 -0
- data/YNelson_-_Hands-on_Tutorial.lyx +0 -3701
- data/YNelson_-_Hands-on_Tutorial.pdf +0 -0
- data/config/mongoid.yml +0 -6
- data/lib/y_nelson/zz.png +0 -0
- data/test/zz.png +0 -0
Binary file
|
data/README.md
CHANGED
data/Rakefile
CHANGED
data/lib/y_nelson/agent.rb
CHANGED
@@ -16,8 +16,14 @@
|
|
16
16
|
class YNelson::Agent
|
17
17
|
attr_reader :world
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
★ YPetri::Agent::PetriNetAspect
|
20
|
+
★ YPetri::Agent::SimulationAspect
|
21
|
+
|
22
|
+
# Future module YNelson::Agent::SimulationRelated
|
23
|
+
|
24
|
+
# Calls #finalize before invoking YPetri::Agent#new_simulation.
|
25
|
+
#
|
26
|
+
def new_simulation *args; finalize; super end
|
21
27
|
|
22
28
|
# Initialization of a YNelson::Agent instance. For YNelson manipulators, the
|
23
29
|
# world is always YNelson itself.
|
@@ -37,6 +43,7 @@ class YNelson::Agent
|
|
37
43
|
YNelson::DimensionPoint.new YNelson.Dimension( :row )
|
38
44
|
@secondary_dimension_point =
|
39
45
|
YNelson::DimensionPoint.new YNelson.Dimension( :column )
|
46
|
+
@todo = [] # array of blocks
|
40
47
|
end
|
41
48
|
|
42
49
|
# Now the part related to the zz structure itself, like in
|
@@ -48,20 +55,9 @@ class YNelson::Agent
|
|
48
55
|
attr_reader :sheets
|
49
56
|
|
50
57
|
# Dimension convenience constructor from
|
51
|
-
delegate
|
52
|
-
|
58
|
+
delegate :Dimension,
|
59
|
+
to: :world
|
53
60
|
|
54
|
-
# Creation of a single-output formula known well from spreadseets. Given a
|
55
|
-
# place, it creates a new assignment transition.
|
56
|
-
#
|
57
|
-
def ϝ &block
|
58
|
-
new_place = YNelson::Place.new
|
59
|
-
new_transition = YNelson::Transition.new assignment: true,
|
60
|
-
codomain: new_place,
|
61
|
-
action: block
|
62
|
-
return new_place, new_transition
|
63
|
-
end
|
64
|
-
|
65
61
|
# Now let's look into the graph visualization.
|
66
62
|
|
67
63
|
def default_dimension
|
@@ -151,6 +147,52 @@ class YNelson::Agent
|
|
151
147
|
|
152
148
|
# graphviz [:domain, 0 ], [:codomain, 0]
|
153
149
|
|
150
|
+
|
151
|
+
# Creation of a place governed by a single assignment transition. In other
|
152
|
+
# words, creation of a place with a unary-output formula known well from
|
153
|
+
# spreadsheets. The transition is named automatically by adding "_ϝ"
|
154
|
+
# (digamma, resembles mathematical f used to denote functions) suffix to
|
155
|
+
# the place's name, as soon as the place is named. For example,
|
156
|
+
#
|
157
|
+
# Fred = PAT Joe do |joe| joe * 2 end
|
158
|
+
#
|
159
|
+
# creates a place named "Fred" and an assignment transition named "Fred_ϝ"
|
160
|
+
# that keeps Fred equal to 2 times Joe.
|
161
|
+
#
|
162
|
+
def PAT *domain, **named_args, &block
|
163
|
+
Place().tap do |p| # place can be instantiated right away
|
164
|
+
p.name = named_args.delete :name if named_args.has? :name, syn!: :ɴ
|
165
|
+
@todo << -> {
|
166
|
+
t = AT p, domain: domain, &block
|
167
|
+
if p.name then t.name = "#{p.name}_ϝ" else
|
168
|
+
# Rig the hook to name the transition as soon as the place is named.
|
169
|
+
p.name_set_hook do |name| transition.name = "#{name}_ϝ" end
|
170
|
+
end
|
171
|
+
# Monkey-patch the place with default marking closure.
|
172
|
+
p.define_singleton_method :default_marking do
|
173
|
+
if has_default_marking? then local_variable_get :@default_marking else
|
174
|
+
t.action_closure.( *t.domain.map( &:default_marking ) )
|
175
|
+
end
|
176
|
+
end
|
177
|
+
}
|
178
|
+
end
|
179
|
+
end
|
180
|
+
alias ϝ PAT
|
181
|
+
|
182
|
+
# Executes all @todo closures.
|
183
|
+
#
|
184
|
+
def finalize
|
185
|
+
while not @todo.empty?
|
186
|
+
@todo[-1].call # May raise errors in which case we don't want to pop.
|
187
|
+
@todo.pop # That's why not @todo.pop.call while not @todo.empty?
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
# ============================================================================
|
192
|
+
# === THE METHODS BELOW ARE NOT REVIEWED FOR THE NEW VERSION AND NOT ===
|
193
|
+
# === EXPOSED IN THE DSL YET ===
|
194
|
+
# ============================================================================
|
195
|
+
|
154
196
|
# Cell side referencers with r. to primary and secondary point
|
155
197
|
def ξ_posward_side dim=nil; ::YTed::POINT.posward_side dim end
|
156
198
|
alias :ξp :ξ_posward_side
|
@@ -273,106 +315,4 @@ class YNelson::Agent
|
|
273
315
|
.define_singleton_method name.to_sym do ::YTed::SHEETS[name] end
|
274
316
|
return ::YTed::SHEETS[name]
|
275
317
|
end
|
276
|
-
|
277
|
-
def make_transitions
|
278
|
-
# require 'debug'
|
279
|
-
# LATER: When walking around the sheets, currently, there is no
|
280
|
-
# protection against references to empty cells
|
281
|
-
@transitions_to_make.map { |prescription|
|
282
|
-
sheet = prescription[:sheet]
|
283
|
-
type = prescription[:type]
|
284
|
-
place = prescription[:place]
|
285
|
-
block = prescription[:assignment_closure]
|
286
|
-
|
287
|
-
case type
|
288
|
-
when :unary_codomain_w_magic_block
|
289
|
-
# PARAMETER MAGIC:
|
290
|
-
# Blocks with specially named input arguments
|
291
|
-
domain = block.parameters.map{ |e| e[1].to_s }.map{ |param|
|
292
|
-
point = ZzPoint.new( place )
|
293
|
-
if SHEETS.keys.include? sheet_name = param.split('_')[0] then
|
294
|
-
# if the name consists of a sheet and parameter name, then ok
|
295
|
-
rest = param[sheet_name.size + 1..-1]
|
296
|
-
point = ZzPoint.new( SHEETS[sheet_name][0][0] )
|
297
|
-
col = [*('a'..'z')].index rest[0]
|
298
|
-
point.rewind_negward! :x
|
299
|
-
if rest.size > 1 then # also change row, asssuming "a0" style
|
300
|
-
point.rewind_negward! :y
|
301
|
-
row = rest[1..-1].to_i
|
302
|
-
row.times { point.step_posward :y }
|
303
|
-
end
|
304
|
-
col.times { point.step_posward :x }
|
305
|
-
point.cell
|
306
|
-
elsif [*('a'..'z')].include? param[0] then
|
307
|
-
# if the name consists of an alphabetic letter...
|
308
|
-
col = [*('a'..'z')].index param[0]
|
309
|
-
point.rewind_negward! :x
|
310
|
-
if param.size > 1 then # also change row, assuming "a0" style
|
311
|
-
point.rewind_negward! :y
|
312
|
-
row = param[1..-1].to_i
|
313
|
-
row.times { point.step_posward :y }
|
314
|
-
end
|
315
|
-
col.times { point.step_posward :x }
|
316
|
-
point.cell
|
317
|
-
elsif param[0] = '_' then
|
318
|
-
# Params named '_1', '_2', ... refer to different rows, same :col,
|
319
|
-
# param named '__' refers to same cell
|
320
|
-
if param == '__' then cell else
|
321
|
-
i = param[1..-1].to_i
|
322
|
-
point.rewind_negward! :y
|
323
|
-
i.times { point.step_posward :x }
|
324
|
-
point.cell
|
325
|
-
end
|
326
|
-
else
|
327
|
-
raise TypeError, "unrecognized magic block parameter: #{param}"
|
328
|
-
end
|
329
|
-
} # block.parameters.map
|
330
|
-
|
331
|
-
# Instantiate the new transition (do not fire it yet):
|
332
|
-
Transition( domain: domain,
|
333
|
-
codomain: [ place ],
|
334
|
-
action_closure: block,
|
335
|
-
assignment_action: true )
|
336
|
-
when :downstream_copy
|
337
|
-
# DOWNSTREAM COPY
|
338
|
-
# A single transition assigning upstream value to the downstream cell
|
339
|
-
Transition( domain: prescription[:domain],
|
340
|
-
codomain: [ place ],
|
341
|
-
action_closure: λ {|v| v },
|
342
|
-
assignment_action: true )
|
343
|
-
else raise "Unknown transition prescription type: #{prescription[:type]}"
|
344
|
-
end
|
345
|
-
} # @transitions_to_make.map
|
346
|
-
end
|
347
|
-
|
348
|
-
# Places an order for a spreadsheet-like assignment transition. The order
|
349
|
-
# will be fullfilled later when #make_transitions method is called.
|
350
|
-
#
|
351
|
-
def new_downstream_cell &block
|
352
|
-
# The place can be instatiated right away
|
353
|
-
place = ZzCell( nil )
|
354
|
-
|
355
|
-
# Transition making requests get remembered in @transitions_to_make:
|
356
|
-
( @transitions_to_make ||= [] ) <<
|
357
|
-
{ place: place,
|
358
|
-
sheet: @current_sheet_name,
|
359
|
-
assignment_closure: block,
|
360
|
-
type: :unary_codomain_w_magic_block }
|
361
|
-
return place
|
362
|
-
end
|
363
|
-
alias :ϝ :new_downstream_cell
|
364
|
-
|
365
|
-
# Places an order for a spreadsheet-lie pure reference to another cell.
|
366
|
-
#
|
367
|
-
def new_downstream_copy( cell )
|
368
|
-
# Again, the place can be instantiated immediately
|
369
|
-
p = ZzCell( nil )
|
370
|
-
|
371
|
-
# And put the transition making request to @transitions_to_make:
|
372
|
-
( @transitions_to_make ||= [] ) <<
|
373
|
-
{ place: p, sheet: @current_sheet_name, domain: cell,
|
374
|
-
type: :downstream_copy }
|
375
|
-
return p
|
376
|
-
end
|
377
|
-
alias :↱ :new_downstream_copy
|
378
318
|
end
|
data/lib/y_nelson/dsl.rb
CHANGED
@@ -67,10 +67,9 @@ module YNelson
|
|
67
67
|
:plot_delta,
|
68
68
|
to: :y_nelson_agent )
|
69
69
|
|
70
|
-
|
71
70
|
# Zz aspect.
|
72
71
|
delegate( :Dimension,
|
73
|
-
|
72
|
+
:sheets,
|
74
73
|
:default_dimension,
|
75
74
|
:primary_point, :p1,
|
76
75
|
:secondary_point, :p2,
|
@@ -78,5 +77,7 @@ module YNelson
|
|
78
77
|
:secondary_dimension_point, :d2,
|
79
78
|
:visualize,
|
80
79
|
:graphviz,
|
80
|
+
:PAT, :ϝ,
|
81
|
+
:finalize,
|
81
82
|
to: :y_nelson_agent )
|
82
83
|
end # module YNelson
|
data/lib/y_nelson/place.rb
CHANGED
data/lib/y_nelson/version.rb
CHANGED
data/lib/y_nelson/zz_point.rb
CHANGED
data/lib/y_nelson.rb
CHANGED
@@ -61,8 +61,8 @@ module YNelson
|
|
61
61
|
attr_reader :dimensions
|
62
62
|
|
63
63
|
# Including instance methods of YPetri::World:
|
64
|
-
include YPetri::World::
|
65
|
-
include YPetri::World::
|
64
|
+
include YPetri::World::PetriNetAspect
|
65
|
+
include YPetri::World::SimulationAspect
|
66
66
|
|
67
67
|
# Allows summoning YNelson::DSL by 'include YNelson'.
|
68
68
|
#
|
@@ -70,6 +70,20 @@ module YNelson
|
|
70
70
|
receiver.extend YNelson::DSL
|
71
71
|
receiver.delegate :y_nelson_agent, to: "self.class"
|
72
72
|
end
|
73
|
+
|
74
|
+
# TODO: YNelson class, obviously, works. But there is something funny
|
75
|
+
# about how it works. It seems that all the important methods, such
|
76
|
+
# as Place(), Transition(), run!() don't go through the Agent (via
|
77
|
+
# receiver.extend YNelson::DSL), but instead go directly through
|
78
|
+
# include YPetri::World::PetriNetAspect and
|
79
|
+
# include YPetri::World::SimulationAspect. While it is appropriate
|
80
|
+
# that YNelson singleton class, since we have decided that it would
|
81
|
+
# be basically a kind of YPetri::World, should have attributes of
|
82
|
+
# YPetri::World, it is surprising that the method calls that are
|
83
|
+
# supposed to be intercepted by the agent and only then sent to the
|
84
|
+
# world, are handled by the world directly. This seems to be a problem
|
85
|
+
# and a topic for the future refactor.
|
86
|
+
|
73
87
|
end # class << self
|
74
88
|
|
75
89
|
# Parametrize the Place / Transition / Net classes.
|
data/y_nelson.gemspec
CHANGED
@@ -8,12 +8,12 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = YNelson::VERSION
|
9
9
|
spec.authors = ["boris"]
|
10
10
|
spec.email = ["\"boris@iis.sinica.edu.tw\""]
|
11
|
-
spec.description = %q{Formalization and generalization of a spreadsheet.}
|
12
11
|
spec.summary = %q{A fusion of functional Petri net with a zz structure.}
|
12
|
+
spec.description = %q{Formalization and generalization of a spreadsheet.}
|
13
13
|
spec.homepage = ""
|
14
14
|
spec.license = "GPLv3"
|
15
15
|
|
16
|
-
spec.files = `git ls-files`.split(
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
@@ -21,6 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_dependency 'yzz'
|
22
22
|
spec.add_dependency 'y_petri'
|
23
23
|
|
24
|
-
spec.add_development_dependency "bundler", "~> 1.
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
25
25
|
spec.add_development_dependency "rake"
|
26
26
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: y_nelson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- boris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yzz
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
47
|
+
version: '1.6'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1.
|
54
|
+
version: '1.6'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,17 +75,15 @@ extra_rdoc_files: []
|
|
75
75
|
files:
|
76
76
|
- .gitignore
|
77
77
|
- Gemfile
|
78
|
+
- Introduction_to_Ruby_for_YNelson_Users.lyx
|
79
|
+
- Introduction_to_Ruby_for_YNelson_Users.pdf
|
78
80
|
- Introduction_to_YNelson.lyx
|
81
|
+
- Introduction_to_YNelson.pdf
|
79
82
|
- LICENSE.txt
|
83
|
+
- Object_model_of_YNelson_and_YPetri.lyx
|
84
|
+
- Object_model_of_YNelson_and_YPetri.pdf
|
80
85
|
- README.md
|
81
86
|
- Rakefile
|
82
|
-
- Ruby_for_YNelson_Users_in_20_minutes.lyx
|
83
|
-
- Ruby_for_YNelson_Users_in_20_minutes.pdf
|
84
|
-
- YNelson_&_YPetri_User_Manual.lyx
|
85
|
-
- YNelson_&_YPetri_User_Manual.pdf
|
86
|
-
- YNelson_-_Hands-on_Tutorial.lyx
|
87
|
-
- YNelson_-_Hands-on_Tutorial.pdf
|
88
|
-
- config/mongoid.yml
|
89
87
|
- lib/y_nelson.rb
|
90
88
|
- lib/y_nelson/agent.rb
|
91
89
|
- lib/y_nelson/dimension.rb
|
@@ -96,11 +94,9 @@ files:
|
|
96
94
|
- lib/y_nelson/transition.rb
|
97
95
|
- lib/y_nelson/version.rb
|
98
96
|
- lib/y_nelson/yzz.rb
|
99
|
-
- lib/y_nelson/zz.png
|
100
97
|
- lib/y_nelson/zz_point.rb
|
101
98
|
- test/mongoid_example.rb
|
102
99
|
- test/y_nelson_test.rb
|
103
|
-
- test/zz.png
|
104
100
|
- y_nelson.gemspec
|
105
101
|
homepage: ''
|
106
102
|
licenses:
|
@@ -122,11 +118,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
118
|
version: '0'
|
123
119
|
requirements: []
|
124
120
|
rubyforge_project:
|
125
|
-
rubygems_version: 2.0.
|
121
|
+
rubygems_version: 2.0.14
|
126
122
|
signing_key:
|
127
123
|
specification_version: 4
|
128
124
|
summary: A fusion of functional Petri net with a zz structure.
|
129
125
|
test_files:
|
130
126
|
- test/mongoid_example.rb
|
131
127
|
- test/y_nelson_test.rb
|
132
|
-
- test/zz.png
|
Binary file
|