cauldron 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/Rakefile +7 -0
- data/VERSION +1 -1
- data/features/cauldron_generates_runtime_method.feature +3 -2
- data/features/step_definitions/cauldron_steps.rb +0 -1
- data/features/support/method_1.example +3 -0
- data/features/support/method_2.example +6 -0
- data/lib/Chain.rb +140 -264
- data/lib/CodeHandler.rb +0 -4
- data/lib/ScopeDependencies.rb +1 -0
- data/lib/Theory.rb +12 -15
- data/lib/UnifiedChain.rb +265 -8
- data/lib/cauldron.rb +1 -1
- data/lib/cauldron/demos.rb +280 -0
- data/lib/cauldron/pot.rb +56 -30
- data/lib/cauldron/sexp2cauldron.rb +109 -126
- data/lib/cauldron/terminal.rb +5 -74
- data/lib/core/ClassMethodCallContainer.rb +14 -0
- data/lib/core/Container.rb +12 -2
- data/lib/core/InstanceCallContainer.rb +30 -4
- data/lib/core/TheoryGenerator.rb +2 -9
- data/lib/core/assignment/Equal.rb +1 -1
- data/lib/core/assignment/Equivalent.rb +1 -1
- data/lib/core/assignment/NotEqual.rb +1 -1
- data/lib/core/call_container/CallContainer.rb +7 -1
- data/lib/core/instance_call/Chop.rb +0 -9
- data/lib/core/instance_call/instance_calls.rb +8 -0
- data/lib/core/instance_call/length_equal.rb +1 -1
- data/lib/core/requirement/Requirement.rb +1 -0
- data/lib/core/runtime_class/class_names.rb +12 -12
- data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +0 -7
- data/lib/core/runtime_method/RuntimeMethod.rb +59 -45
- data/lib/core/statement/ActsAsStatement.rb +1 -1
- data/lib/core/statement/ArrayAccess.rb +28 -2
- data/lib/core/statement/OpenStatement.rb +7 -0
- data/lib/core/statement/Statement.rb +22 -18
- data/lib/core/statement/TheoryStatement.rb +8 -1
- data/lib/core/syntax/Addition.rb +3 -2
- data/lib/core/syntax/If.rb +8 -0
- data/lib/core/syntax/Return.rb +1 -1
- data/lib/core/variable/BaseVariable.rb +0 -2
- data/lib/core/variable/MethodParameter.rb +4 -31
- data/lib/core/variable/Unknown.rb +1 -5
- data/lib/implemented_chain.rb +3 -2
- data/lib/required.rb +0 -1
- data/lib/ruby_code/String.rb +0 -17
- data/lib/theories.rb +25 -1
- data/lib/theory/TheoryAction.rb +35 -5
- data/lib/theory/TheoryChainValidator.rb +10 -8
- data/lib/theory/TheoryComponent.rb +17 -0
- data/lib/theory/TheoryConnector.rb +76 -9
- data/lib/theory/TheoryDependent.rb +2 -2
- data/lib/theory/TheoryImplementation.rb +7 -7
- data/lib/util/ClassEvaluation.rb +2 -7
- data/lib/util/MethodValidation.rb +10 -6
- data/lib/util/Parser.rb +26 -20
- data/lib/util/StringToTheory.rb +27 -3
- data/spec/cauldron/chain_spec.rb +24 -0
- data/spec/cauldron/demos_spec.rb +30 -0
- data/spec/cauldron/pot_spec.rb +66 -0
- data/spec/cauldron/runtime_method_spec.rb +47 -5
- data/spec/cauldron/sexp_2_cauldron_spec.rb +92 -0
- data/spec/cauldron/terminal_spec.rb +1 -1
- data/spec/cauldron/theory_action_spec.rb +20 -0
- data/spec/cauldron/theory_connector_spec.rb +52 -0
- data/spec/cauldron/theory_spec.rb +59 -0
- data/spec/cauldron/unified_chain_spec.rb +102 -0
- data/spec/spec_helper.rb +10 -1
- data/tasks/theory_tasks.rake +274 -0
- data/test/fixtures/implementation_results/0/dump +0 -0
- data/test/fixtures/theories/0/dump +0 -0
- data/test/fixtures/theories/1/dump +0 -0
- data/test/fixtures/theories/10/dump +0 -0
- data/test/fixtures/theories/11/dump +0 -0
- data/test/fixtures/theories/12/dump +0 -0
- data/test/fixtures/theories/13/declaration.txt +1 -1
- data/test/fixtures/theories/13/desc +1 -1
- data/test/fixtures/theories/13/dump +0 -0
- data/test/fixtures/theories/14/dump +0 -0
- data/test/fixtures/theories/15/dump +0 -0
- data/test/fixtures/theories/16/dump +0 -0
- data/test/fixtures/theories/17/dump +0 -0
- data/test/fixtures/theories/18/dump +0 -0
- data/test/fixtures/theories/19/dump +0 -0
- data/test/fixtures/theories/2/dump +0 -0
- data/test/fixtures/theories/20/declaration.txt +1 -1
- data/test/fixtures/theories/20/desc +1 -1
- data/test/fixtures/theories/20/dump +0 -0
- data/test/fixtures/theories/3/dump +0 -0
- data/test/fixtures/theories/4/dump +0 -0
- data/test/fixtures/theories/5/dump +0 -0
- data/test/fixtures/theories/6/dump +0 -0
- data/test/fixtures/theories/7/dump +0 -0
- data/test/fixtures/theories/8/dump +0 -0
- data/test/fixtures/theories/9/dump +0 -0
- data/test/fixtures/theory_implementations/0/declaration.txt +1 -1
- data/test/fixtures/theory_implementations/0/dump +0 -0
- data/test/fixtures/theory_implementations/1/declaration.txt +11 -0
- data/test/fixtures/theory_implementations/1/dump +0 -0
- data/test/fixtures/theory_implementations/2/declaration.txt +11 -0
- data/test/fixtures/theory_implementations/2/dump +0 -0
- data/test/output/simple_method.txt +0 -1
- data/test/tc_contextual_variables.rb +2 -41
- data/test/tc_describe.rb +1 -2
- data/test/tc_method.rb +2 -5
- data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +5 -3
- data/test/unit/core/runtime_method/tc_runtime_method.rb +34 -56
- data/test/unit/core/statement/tc_block_statement.rb +2 -0
- data/test/unit/core/statement/tc_open_statement.rb +15 -6
- data/test/unit/core/statement/tc_statement.rb +4 -5
- data/test/unit/core/statement/tc_statement_dependencies.rb +1 -0
- data/test/unit/core/statement/tc_theory_statement.rb +2 -0
- data/test/unit/core/syntax/tc_if_container.rb +5 -5
- data/test/unit/core/tc_theory_generator_heavy.rb +1 -1
- data/test/unit/core/tracking/tc_history.rb +3 -1
- data/test/unit/core/variable/tc_method_parameter_variable.rb +2 -2
- data/test/unit/tc_chain_with_case_1.rb +1 -1
- data/test/unit/tc_method_usage.rb +1 -1
- data/test/unit/tc_theory.rb +8 -2
- data/test/unit/theory/tc_theory_action.rb +37 -5
- data/test/unit/theory/tc_theory_chain_validator.rb +3 -3
- data/test/unit/theory/tc_theory_connector.rb +2 -37
- data/test/unit/theory/tc_theory_dependent.rb +2 -0
- data/test/unit/theory/tc_theory_implementation.rb +5 -1
- data/test/unit/theory/tc_theory_result.rb +3 -2
- data/test/unit/util/tc_method_validation.rb +4 -1
- data/test/unit/util/tc_parser.rb +2 -0
- data/test/unit/util/tc_string_to_theory.rb +3 -2
- data/tmp/runtime_method_evaluation.rb +7 -4
- metadata +59 -13
- data/lib/core/syntax/IfContainer.rb +0 -100
data/lib/CodeHandler.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# TODO Look into matrix
|
2
|
-
require "matrix"
|
3
1
|
require "tsort"
|
4
2
|
|
5
3
|
# A code handler continualy considers how to extend the complexity
|
@@ -13,8 +11,6 @@ require "tsort"
|
|
13
11
|
# can. Note they are consider unique if the process to create them is
|
14
12
|
# new, NOT whether or not there value is new.
|
15
13
|
#
|
16
|
-
# TODO Look up dynamic refactoring
|
17
|
-
#
|
18
14
|
class CodeHandler
|
19
15
|
|
20
16
|
attr_reader :runtime_methods
|
data/lib/ScopeDependencies.rb
CHANGED
data/lib/Theory.rb
CHANGED
@@ -22,6 +22,10 @@ class Theory
|
|
22
22
|
return Marshal.load(Marshal.dump(self))
|
23
23
|
end
|
24
24
|
|
25
|
+
def irrelevant?
|
26
|
+
dependents.empty? and results.empty? and action.nil?
|
27
|
+
end
|
28
|
+
|
25
29
|
# Identify the dependents and actions that haven't changed between adding the action.
|
26
30
|
#
|
27
31
|
def identify_unchanged
|
@@ -51,20 +55,6 @@ class Theory
|
|
51
55
|
return Theory.new(changing_dependents,action.copy,changing_results,example_runtime_method.copy)
|
52
56
|
end
|
53
57
|
|
54
|
-
# # NOTE: This method might not be useful.
|
55
|
-
# # Returns a number of theories but with the number of dependents and results limited by the
|
56
|
-
# # the numbers specified.
|
57
|
-
# #
|
58
|
-
# def variants(dependent_limit=4,results_limit=4)
|
59
|
-
# results = []
|
60
|
-
# @dependents.copy.permutation(dependent_limit).each do |d|
|
61
|
-
# @results.copy.permutation(results_limit).each do |r|
|
62
|
-
# results << Theory.new(d.copy,action.copy,r,example_runtime_method.copy)
|
63
|
-
# end
|
64
|
-
# end
|
65
|
-
# return results
|
66
|
-
# end
|
67
|
-
|
68
58
|
# Loads a particular theory that has been saved to a file
|
69
59
|
#
|
70
60
|
def self.load_theory(theory_id)
|
@@ -140,13 +130,20 @@ class Theory
|
|
140
130
|
#
|
141
131
|
def map_to(mapping,values={})
|
142
132
|
raise StandardError.new('Please use the maping datatype') unless mapping.kind_of?(Mapping)
|
133
|
+
# return TheoryImplementation.new(
|
134
|
+
# @dependents.collect {|y| y.map_to(mapping)},
|
135
|
+
# @action ? @action.map_to(mapping) : nil,
|
136
|
+
# @results.collect {|y| y.map_to(mapping)},
|
137
|
+
# mapping,
|
138
|
+
# values
|
139
|
+
# )
|
143
140
|
return TheoryImplementation.new(
|
144
141
|
@dependents.collect {|y| y.map_to(mapping)},
|
145
142
|
@action ? @action.map_to(mapping) : nil,
|
146
143
|
@results.collect {|y| y.map_to(mapping)},
|
147
144
|
mapping,
|
148
145
|
values
|
149
|
-
)
|
146
|
+
)
|
150
147
|
end
|
151
148
|
|
152
149
|
# TODO Need to write tests for this that use the mapping
|
data/lib/UnifiedChain.rb
CHANGED
@@ -35,7 +35,261 @@ class UnifiedChain < Chain
|
|
35
35
|
implemented_nodes = @nodes.inject([]) do |total,theory|
|
36
36
|
total << theory.map_to(mapping)
|
37
37
|
end
|
38
|
-
return ImplementedChain.new(implemented_nodes)
|
38
|
+
return ImplementedChain.new(implemented_nodes,mapping)
|
39
|
+
end
|
40
|
+
|
41
|
+
def implementation_permuatations2(runtime_method,test_cases,mapping)
|
42
|
+
|
43
|
+
more_mapping = valid_mapping_permutations(runtime_method.copy,test_cases.copy)
|
44
|
+
|
45
|
+
return more_mapping.inject([]) { |total,mapping| total << self.copy.implement(mapping) }
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
def valid_mapping_permutations(runtime_method,test_cases)
|
50
|
+
|
51
|
+
# Get the initially available intrinsic values
|
52
|
+
intrinsic_values = [IntrinsicRuntimeMethod.new,IntrinsicTestCases.new]
|
53
|
+
|
54
|
+
total_variables = self.theory_variables.length
|
55
|
+
|
56
|
+
available_values = [IntrinsicRuntimeMethod.new,IntrinsicTestCases.new]
|
57
|
+
|
58
|
+
valid_mappings = [Mapping.new]
|
59
|
+
|
60
|
+
#itteration_limit = 6
|
61
|
+
itteration_limit = 8
|
62
|
+
|
63
|
+
@nodes.each_with_index do |node,index|
|
64
|
+
|
65
|
+
node.dependents.each do |dependent|
|
66
|
+
if index == 0
|
67
|
+
chain = partial_chain(0)
|
68
|
+
else
|
69
|
+
chain = partial_chain(index-1)
|
70
|
+
end
|
71
|
+
limit = 0
|
72
|
+
until has_all_variables_been_found?(dependent,valid_mappings) or limit > itteration_limit
|
73
|
+
valid_mappings = extend_mapping(valid_mappings,dependent,runtime_method.copy,test_cases.copy,chain,available_values)
|
74
|
+
limit += 1
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
unless node.action.nil?
|
79
|
+
if index == 0
|
80
|
+
chain = partial_chain(0)
|
81
|
+
else
|
82
|
+
chain = partial_chain(index-1)
|
83
|
+
end
|
84
|
+
limit = 0
|
85
|
+
until has_all_variables_been_found?(node.action,valid_mappings) or limit > itteration_limit
|
86
|
+
valid_mappings = extend_mapping(valid_mappings,node.action,runtime_method.copy,test_cases.copy,chain,available_values)
|
87
|
+
limit += 1
|
88
|
+
end
|
89
|
+
if limit > itteration_limit
|
90
|
+
raise StandardError.new('Unable to resolve action: '+node.action.write)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
node.results.each do |result|
|
95
|
+
chain = partial_chain(index)
|
96
|
+
limit = 0
|
97
|
+
until has_all_variables_been_found?(result,valid_mappings) or limit > itteration_limit
|
98
|
+
valid_mappings = extend_mapping(valid_mappings,result,runtime_method.copy,test_cases.copy,chain,available_values)
|
99
|
+
limit += 1
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
return valid_mappings.collect {|x| Mapping.new(x)}
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
def has_all_variables_been_found?(component,mappings)
|
111
|
+
component.theory_variables.each do |var|
|
112
|
+
mappings.each do |mapping|
|
113
|
+
return false unless mapping.has_key? var.theory_variable_id
|
114
|
+
end
|
115
|
+
end
|
116
|
+
return true
|
117
|
+
end
|
118
|
+
|
119
|
+
def extend_mapping(valid_mappings,component,runtime_method,test_cases,chain,available_values)
|
120
|
+
|
121
|
+
new_mappings = []
|
122
|
+
component.theory_variables.each do |var|
|
123
|
+
next if valid_mappings.first.has_key?(var.theory_variable_id)
|
124
|
+
valid_mappings.each do |mapping|
|
125
|
+
|
126
|
+
#next if mapping.has_key?(var.theory_variable_id)
|
127
|
+
implemented_chain = chain.implement(Mapping.new(mapping))
|
128
|
+
implemented_runtime_method = TheoryChainValidator.new.build_method_from_chain(
|
129
|
+
implemented_chain,runtime_method.copy,test_cases.copy
|
130
|
+
)
|
131
|
+
|
132
|
+
possible_values = available_values-mapping.values
|
133
|
+
begin
|
134
|
+
values = intrinsic_values_for_variable(
|
135
|
+
var.theory_variable_id,
|
136
|
+
component,
|
137
|
+
mapping,
|
138
|
+
implemented_runtime_method,
|
139
|
+
test_cases.copy,
|
140
|
+
possible_values
|
141
|
+
)
|
142
|
+
rescue NoMethodError => e
|
143
|
+
valid_mappings = valid_mappings-[mapping]
|
144
|
+
next
|
145
|
+
end
|
146
|
+
values = values.uniq
|
147
|
+
values.each do |value|
|
148
|
+
copied_mapping = mapping.copy
|
149
|
+
copied_mapping[var.theory_variable_id] = value
|
150
|
+
new_mappings << copied_mapping
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
# => QUICK Hack
|
156
|
+
new_mappings = identify_uniq_mappings(new_mappings)
|
157
|
+
longest_mapping = new_mappings.inject(0) do |highest,m|
|
158
|
+
if(m.length > highest)
|
159
|
+
highest = m.length
|
160
|
+
end
|
161
|
+
highest
|
162
|
+
end
|
163
|
+
res = new_mappings.select {|x| x.length == longest_mapping}
|
164
|
+
new_mappings = res
|
165
|
+
|
166
|
+
unless new_mappings.empty?
|
167
|
+
valid_mappings = new_mappings
|
168
|
+
end
|
169
|
+
return valid_mappings
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
def identify_uniq_mappings(mappings)
|
174
|
+
uniq_mappings = []
|
175
|
+
count = mappings.length
|
176
|
+
until mappings.empty?
|
177
|
+
mapping = mappings.shift
|
178
|
+
already_exists = mappings.any? do |x|
|
179
|
+
next false unless x.length == mapping.length
|
180
|
+
next false unless x.keys.sort == mapping.keys.sort
|
181
|
+
all_values_the_same = true
|
182
|
+
x.each do |key,value|
|
183
|
+
if mapping[key].class != value.class
|
184
|
+
all_values_the_same = false
|
185
|
+
end
|
186
|
+
if mapping[key].class == value.class
|
187
|
+
if mapping[key].kind_of?(IntrinsicLiteral)
|
188
|
+
if mapping[key].write != value.write
|
189
|
+
all_values_the_same = false
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
next false unless all_values_the_same
|
195
|
+
next true
|
196
|
+
end
|
197
|
+
unless already_exists
|
198
|
+
uniq_mappings << mapping
|
199
|
+
end
|
200
|
+
end
|
201
|
+
if uniq_mappings.length == 0 && count != 0
|
202
|
+
raise StandardError.new('uniq_mappings should not be 0')
|
203
|
+
end
|
204
|
+
return uniq_mappings
|
205
|
+
end
|
206
|
+
|
207
|
+
def intrinsic_values_for_variable(id,component,mapping,runtime_method,test_cases,intrinsic_values)
|
208
|
+
|
209
|
+
values = []
|
210
|
+
component.statements_with_variable(id).each do |statement|
|
211
|
+
reg = eval('/^var'+id.to_s+'\./')
|
212
|
+
if statement.write.match(reg)
|
213
|
+
|
214
|
+
intrinsic_values.each do |value|
|
215
|
+
temp_mapping = mapping.copy
|
216
|
+
temp_mapping[id] = value
|
217
|
+
# => TODO Not validating the component - e.g. if(var1.kind_of?(RuntimeMethod))
|
218
|
+
if valid_mapping?(runtime_method.copy,test_cases.copy,statement,temp_mapping)
|
219
|
+
values << value
|
220
|
+
end
|
221
|
+
end
|
222
|
+
next
|
223
|
+
end
|
224
|
+
|
225
|
+
# values for index
|
226
|
+
index_values = []
|
227
|
+
intrinsic_statement = statement.map_to(mapping)
|
228
|
+
if intrinsic_statement.select_all {|z| z.kind_of?(TheoryVariable)}.length > 0
|
229
|
+
if m = intrinsic_statement.write.match(/([\w\.]+)\[var(\d)+\]/)
|
230
|
+
method_call = $1
|
231
|
+
if m2 = method_call.match(/var(\d+)/)
|
232
|
+
next
|
233
|
+
end
|
234
|
+
literal = evaluate_statement(method_call,runtime_method.copy,test_cases.copy)
|
235
|
+
literal.length.times do |n|
|
236
|
+
index_values << IntrinsicLiteral.new(n)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
values += index_values
|
241
|
+
|
242
|
+
#variable_values = []
|
243
|
+
#result.statements_with_variable(var.theory_variable_id).each do |statement|
|
244
|
+
#variable_values += values_for_variable_as_argument(var,statement,mapping,intrinsic_values,implemented_runtime_method.copy,test_cases.copy)
|
245
|
+
#end
|
246
|
+
#values += variable_values
|
247
|
+
|
248
|
+
#intrinsic_statement = statement.map_to(mapping)
|
249
|
+
variable_values = []
|
250
|
+
intrinsic_values.each do |value|
|
251
|
+
literal = intrinsic_statement.write.gsub(/var(\d)+/,value.write)
|
252
|
+
begin
|
253
|
+
eval literal
|
254
|
+
variable_values << value
|
255
|
+
rescue
|
256
|
+
next
|
257
|
+
end
|
258
|
+
end
|
259
|
+
#return results
|
260
|
+
values += variable_values
|
261
|
+
|
262
|
+
|
263
|
+
end
|
264
|
+
return values
|
265
|
+
end
|
266
|
+
|
267
|
+
def partial_chain(limit)
|
268
|
+
links = @nodes[1..limit].collect {|x| x.copy }
|
269
|
+
UnifiedChain.new(links)
|
270
|
+
end
|
271
|
+
|
272
|
+
def mapping_permutations(keys,values)
|
273
|
+
values.permutation(keys.length).to_a.inject([]) do |total,value_permutation|
|
274
|
+
total << Hash[*keys.zip(value_permutation).flatten]
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
def valid_mapping?(runtime_method,test_cases,statement,mapping)
|
279
|
+
intrinsic_statement = statement.map_to(mapping)
|
280
|
+
return false unless intrinsic_statement.select_all {|z| z.kind_of?(TheoryVariable)}.length == 0
|
281
|
+
valid_statement?(intrinsic_statement,runtime_method.copy,test_cases.copy)
|
282
|
+
end
|
283
|
+
|
284
|
+
def evaluate_statement(statement,runtime_method,test_cases)
|
285
|
+
eval statement
|
286
|
+
end
|
287
|
+
|
288
|
+
def valid_statement?(statement,runtime_method,test_cases)
|
289
|
+
eval statement.write
|
290
|
+
return true
|
291
|
+
rescue NoMethodError
|
292
|
+
return false
|
39
293
|
end
|
40
294
|
|
41
295
|
# Returns an array of implemented chains using the various value
|
@@ -48,6 +302,8 @@ class UnifiedChain < Chain
|
|
48
302
|
#
|
49
303
|
def implementation_permuatations(runtime_method,test_cases,mapping)
|
50
304
|
|
305
|
+
return implementation_permuatations2(runtime_method,test_cases,mapping)
|
306
|
+
|
51
307
|
# Determine the number of variables without intrinsic values
|
52
308
|
theory_variable_ids = theory_variables.collect {|x| x.theory_variable_id}
|
53
309
|
|
@@ -57,22 +313,24 @@ class UnifiedChain < Chain
|
|
57
313
|
# Take the first theory and identify all the accessors
|
58
314
|
# (need to work out what is the runtime method and what the test cases)
|
59
315
|
|
60
|
-
#pp missing_intrinsic_values
|
61
|
-
#puts @nodes.first.class.to_s
|
62
|
-
#@nodes.each {|x| puts x.class}
|
63
316
|
# TEMP: Why are these implemented theories
|
64
|
-
@nodes.first.all_theory_variables
|
317
|
+
# @nodes.first.all_theory_variables
|
65
318
|
|
66
319
|
# Create the theory generator
|
67
320
|
generator = TheoryGenerator.new()
|
68
|
-
|
321
|
+
|
322
|
+
#accessors, temp_mapping = generator.generate_accessors_and_mapping(test_cases,runtime_method,1)
|
323
|
+
accessors, temp_mapping = generator.generate_accessors_and_mapping(test_cases,runtime_method,3)
|
324
|
+
|
69
325
|
if temp_mapping.length > missing_intrinsic_values.length
|
70
326
|
|
71
327
|
# Now to assign real values to the chain
|
72
328
|
|
73
329
|
# Apply the values in the various permutaions
|
74
330
|
# (this is very crude and means that odd calls )
|
75
|
-
theory_variable_ids = @nodes.first.all_theory_variables.collect {|x| x.theory_variable_id }
|
331
|
+
#theory_variable_ids = @nodes.first.all_theory_variables.collect {|x| x.theory_variable_id }
|
332
|
+
|
333
|
+
theory_variable_ids = self.theory_variables.collect {|x| x.theory_variable_id }
|
76
334
|
|
77
335
|
# Get the posible sets for values in an array so that non of the arrays contain all the same values
|
78
336
|
res = temp_mapping.values.collect {|x| x}
|
@@ -81,7 +339,6 @@ class UnifiedChain < Chain
|
|
81
339
|
intrinsic_res = res.collect {|x| x.to_intrinsic}
|
82
340
|
value_permutaions = intrinsic_res.permutation(theory_variable_ids.length).to_a
|
83
341
|
uniq_value_permutations = value_permutaions.collect {|x| x.to_set}.uniq
|
84
|
-
|
85
342
|
possible_mappings = []
|
86
343
|
|
87
344
|
theory_variable_id_permutations = theory_variable_ids.permutation(theory_variable_ids.length).to_a
|
data/lib/cauldron.rb
CHANGED
@@ -0,0 +1,280 @@
|
|
1
|
+
module Cauldron
|
2
|
+
|
3
|
+
module Demos
|
4
|
+
|
5
|
+
def convert_to_cauldron_test_cases(cases)
|
6
|
+
cases.inject([]) do |total,x|
|
7
|
+
cauldron_case = CTestCase.new
|
8
|
+
cauldron_case[:params] = x[0]
|
9
|
+
cauldron_case[:output] = x[1]
|
10
|
+
total << cauldron_case
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def demo(id)
|
15
|
+
|
16
|
+
if id == '1'
|
17
|
+
return demo_one
|
18
|
+
end
|
19
|
+
raise StandardError.new('Unable to find demo with id '+id)
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def demo_one
|
24
|
+
|
25
|
+
@demo_1_test_cases = convert_to_cauldron_test_cases(
|
26
|
+
[
|
27
|
+
[['sparky'],'sparky'],
|
28
|
+
[['kel'],'kel']
|
29
|
+
]
|
30
|
+
)
|
31
|
+
|
32
|
+
# Create demo #1 chain
|
33
|
+
# Create the head for the chain
|
34
|
+
head = Theory.new([],nil,[])
|
35
|
+
|
36
|
+
link_one_action = TheoryAction.new(
|
37
|
+
TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var1.params[var3])')),
|
38
|
+
StringToTheory.run('var1.statement_id')
|
39
|
+
)
|
40
|
+
# NOTE: I need to add one result so the theory can be flagged as complete - I might not need it
|
41
|
+
# to be complete -
|
42
|
+
link_one_result = TheoryResult.new(StringToTheory.run("if(var1.all_pass?(var2))\nreturn true\nend"))
|
43
|
+
link_one = Theory.new([],link_one_action,[link_one_result])
|
44
|
+
chain = Chain.new
|
45
|
+
chain = chain.extension_permutaions(head).first
|
46
|
+
chain = chain.extension_permutaions(
|
47
|
+
link_one,
|
48
|
+
{
|
49
|
+
1=>IntrinsicRuntimeMethod.new,
|
50
|
+
2=>IntrinsicTestCases.new,
|
51
|
+
3=>IntrinsicLiteral.new(0)
|
52
|
+
}
|
53
|
+
).first
|
54
|
+
|
55
|
+
# Now implement the chain
|
56
|
+
implemented_chain = chain.implement
|
57
|
+
|
58
|
+
# TODO It should generate the values too.(TheoryGenerator)
|
59
|
+
return {
|
60
|
+
:initial_method=>RuntimeMethod.new(MethodUsage.new(MethodParameter.new)),
|
61
|
+
:test_cases=>@demo_1_test_cases,
|
62
|
+
:chain=>chain,
|
63
|
+
:values=>{}
|
64
|
+
}
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
# => "def method_3(var_0)\n\tif(var_0 == 'fish')\n\t\treturn 'animal'\n\tend\n\treturn 'vegetable'\nend\n"
|
69
|
+
def demo_two
|
70
|
+
@demo_2_test_cases = convert_to_cauldron_test_cases(
|
71
|
+
[
|
72
|
+
[['fish'],'animal'],
|
73
|
+
[['carrot'],'vegtable'],
|
74
|
+
]
|
75
|
+
)
|
76
|
+
head = Theory.new([],nil,[])
|
77
|
+
|
78
|
+
# Statementents
|
79
|
+
# => TODO Need a clear way to format theories
|
80
|
+
# => OpenStatement.new(If.new,Container.new(runtime_method.params[var1],Equivalent.new,test_cases[var2][:params][var3]))
|
81
|
+
# => Statement.new(Return.new,test_cases[var2][:result]) (added to the open statement)
|
82
|
+
# => Statement.new(Return.new,test_cases[var6][:result])
|
83
|
+
|
84
|
+
# => TODO Don't actually want to include these connection hacks
|
85
|
+
|
86
|
+
# => HEAD
|
87
|
+
head_result = TheoryResult.new(StringToTheory.run(
|
88
|
+
"if(var1.kind_of?(RuntimeMethod))\nreturn true\nend")
|
89
|
+
)
|
90
|
+
head_result_2 = TheoryResult.new(StringToTheory.run(
|
91
|
+
"if(var2.length == 2)\nreturn true\nend")
|
92
|
+
)
|
93
|
+
head = Theory.new([],nil,[head_result,head_result_2])
|
94
|
+
|
95
|
+
# => LINK #1
|
96
|
+
link_one_dependent = TheoryDependent.new(StringToTheory.run(
|
97
|
+
"if(var1.kind_of?(RuntimeMethod))\nreturn true\nend"
|
98
|
+
)
|
99
|
+
)
|
100
|
+
link_one_dependent_2 = TheoryDependent.new(StringToTheory.run(
|
101
|
+
"if(var2.length == 2)\nreturn true\nend")
|
102
|
+
)
|
103
|
+
link_one_action = TheoryAction.new(
|
104
|
+
TheoryStatement.new(StringToTheory.run(
|
105
|
+
'OpenStatement.new(TheoryStatement.new(If.new,Container.new(var1.params[var3],Equivalent.new,var2[var4][:params][var5])))'
|
106
|
+
)),
|
107
|
+
StringToTheory.run('var1.statement_id')
|
108
|
+
)
|
109
|
+
link_one_result = TheoryResult.new(StringToTheory.run(
|
110
|
+
"if(var1.kind_of?(RuntimeMethod))\nreturn true\nend"
|
111
|
+
))
|
112
|
+
link_one_result_2 = TheoryResult.new(StringToTheory.run(
|
113
|
+
"if(var2.length == 2)\nreturn true\nend"
|
114
|
+
))
|
115
|
+
link_one_result_3 = TheoryResult.new(StringToTheory.run(
|
116
|
+
"if(var4.kind_of?(Fixnum))\nreturn true\nend"
|
117
|
+
))
|
118
|
+
link_one = Theory.new([link_one_dependent,link_one_dependent_2],link_one_action,[link_one_result,link_one_result_2,link_one_result_3])
|
119
|
+
|
120
|
+
# => LINK #2
|
121
|
+
link_two_dependent = TheoryDependent.new(StringToTheory.run(
|
122
|
+
"if(var1.kind_of?(RuntimeMethod))\nreturn true\nend"
|
123
|
+
))
|
124
|
+
link_two_dependent_2 = TheoryDependent.new(StringToTheory.run(
|
125
|
+
"if(var2.length == 2)\nreturn true\nend"
|
126
|
+
))
|
127
|
+
link_two_dependent_3 = TheoryDependent.new(StringToTheory.run(
|
128
|
+
"if(var4.kind_of?(Fixnum))\nreturn true\nend"
|
129
|
+
))
|
130
|
+
link_two_action = TheoryAction.new(
|
131
|
+
TheoryStatement.new(StringToTheory.run(
|
132
|
+
'Statement.new(Return.new,var2[var4][:output])'
|
133
|
+
)),
|
134
|
+
StringToTheory.run('var1.first.statement_id')
|
135
|
+
)
|
136
|
+
# link_two_result = TheoryResult.new(StringToTheory.run(
|
137
|
+
# "if(var1.history(var2[var4][:params]) == var2[var4][:output])\nreturn true\nend"
|
138
|
+
# ))
|
139
|
+
link_two_result = TheoryResult.new(StringToTheory.run(
|
140
|
+
"if(var2[var4][:params].length == 1)\nreturn true\nend"
|
141
|
+
))
|
142
|
+
# TODO Don't want to have to include this one
|
143
|
+
link_two_result_2 = TheoryResult.new(StringToTheory.run(
|
144
|
+
"if(var6.kind_of?(Fixnum))\nreturn true\nend"
|
145
|
+
))
|
146
|
+
link_two_result_3 = TheoryResult.new(StringToTheory.run(
|
147
|
+
"if(var1.kind_of?(RuntimeMethod))\nreturn true\nend"
|
148
|
+
))
|
149
|
+
|
150
|
+
link_two = Theory.new(
|
151
|
+
[link_two_dependent,link_two_dependent_2,link_two_dependent_3],
|
152
|
+
link_two_action,
|
153
|
+
[link_two_result,link_two_result_2,link_two_result_3]
|
154
|
+
)
|
155
|
+
|
156
|
+
# => LINK #3
|
157
|
+
# link_three_dependent = TheoryDependent.new(StringToTheory.run(
|
158
|
+
# "if(var1.history(var2[var4][:params]) == var2[var4][:output])\nreturn true\nend"
|
159
|
+
# ))
|
160
|
+
link_three_dependent = TheoryDependent.new(StringToTheory.run(
|
161
|
+
"if(var2[var4][:params].length == 1)\nreturn true\nend"
|
162
|
+
))
|
163
|
+
link_three_dependent_2 = TheoryDependent.new(StringToTheory.run(
|
164
|
+
"if(var6.kind_of?(Fixnum))\nreturn true\nend"
|
165
|
+
))
|
166
|
+
link_three_dependent_3 = TheoryDependent.new(StringToTheory.run(
|
167
|
+
"if(var1.kind_of?(RuntimeMethod))\nreturn true\nend"
|
168
|
+
))
|
169
|
+
link_three_action = TheoryAction.new(
|
170
|
+
TheoryStatement.new(
|
171
|
+
StringToTheory.run(
|
172
|
+
'Statement.new(Return.new,var2[var6][:output])'
|
173
|
+
)
|
174
|
+
),
|
175
|
+
StringToTheory.run('var1.statement_id')
|
176
|
+
)
|
177
|
+
#link_three_result = TheoryResult.new(StringToTheory.run(
|
178
|
+
# "if(var1.history(var2[var6][:params]) == var2[var6][:output])\nreturn true\nend"
|
179
|
+
#))
|
180
|
+
link_three_result = TheoryResult.new(StringToTheory.run(
|
181
|
+
"if(var2[var4][:params].length == 1)\nreturn true\nend"
|
182
|
+
))
|
183
|
+
link_three_result_2 = TheoryResult.new(StringToTheory.run(
|
184
|
+
"if(var2.length == 2)\nreturn true\nend"
|
185
|
+
))
|
186
|
+
link_three_result_3 = TheoryResult.new(StringToTheory.run(
|
187
|
+
"if(var1.length == 2)\nreturn true\nend"
|
188
|
+
))
|
189
|
+
link_three = Theory.new(
|
190
|
+
[link_three_dependent,link_three_dependent_2,link_three_dependent_3],
|
191
|
+
link_three_action,
|
192
|
+
[link_three_result,link_three_result_2,link_three_result_3]
|
193
|
+
)
|
194
|
+
|
195
|
+
# => LINK #4
|
196
|
+
#link_four_dependent = TheoryDependent.new(StringToTheory.run(
|
197
|
+
# "if(var1.history(var2[var6][:params]) == var2[var6][:output])\nreturn true\nend"
|
198
|
+
#))
|
199
|
+
link_four_dependent = TheoryDependent.new(StringToTheory.run(
|
200
|
+
"if(var1.kind_of?(RuntimeMethod))\nreturn true\nend"
|
201
|
+
))
|
202
|
+
link_four_dependent_2 = TheoryDependent.new(StringToTheory.run(
|
203
|
+
"if(var2.length == 2)\nreturn true\nend"
|
204
|
+
))
|
205
|
+
link_four_dependent_3 = TheoryDependent.new(StringToTheory.run(
|
206
|
+
"if(var1.length == 2)\nreturn true\nend"
|
207
|
+
))
|
208
|
+
link_four_result = TheoryResult.new(StringToTheory.run(
|
209
|
+
"if(var1.all_pass?(var2))\nreturn true\nend"
|
210
|
+
))
|
211
|
+
link_four = Theory.new(
|
212
|
+
[link_four_dependent,link_four_dependent_2,link_four_dependent_3],
|
213
|
+
nil,
|
214
|
+
[link_four_result]
|
215
|
+
)
|
216
|
+
|
217
|
+
chain = Chain.new
|
218
|
+
chains = chain.extension_permutaions(head)
|
219
|
+
chain = chains.first
|
220
|
+
|
221
|
+
head_id = chain.first.theory_id
|
222
|
+
last_id = chain.last.theory_id
|
223
|
+
|
224
|
+
values = {
|
225
|
+
1=>IntrinsicRuntimeMethod.new,
|
226
|
+
2=>IntrinsicTestCases.new,
|
227
|
+
3=>IntrinsicLiteral.new(0),
|
228
|
+
4=>IntrinsicLiteral.new(0),
|
229
|
+
5=>IntrinsicLiteral.new(0),
|
230
|
+
6=>IntrinsicLiteral.new(1)
|
231
|
+
}
|
232
|
+
|
233
|
+
chains = chain.extension_permutaions(
|
234
|
+
link_one,values
|
235
|
+
)
|
236
|
+
order = [head_id,link_one.theory_id,last_id]
|
237
|
+
chain = chains.detect do |c|
|
238
|
+
c.collect {|t| t.theory_id} == order
|
239
|
+
end
|
240
|
+
|
241
|
+
chains = chain.extension_permutaions(
|
242
|
+
link_two,values
|
243
|
+
)
|
244
|
+
order = [head_id,link_one.theory_id,link_two.theory_id,last_id]
|
245
|
+
chain = chains.detect do |c|
|
246
|
+
c.collect {|t| t.theory_id} == order
|
247
|
+
end
|
248
|
+
|
249
|
+
chains = chain.extension_permutaions(
|
250
|
+
link_three,values
|
251
|
+
)
|
252
|
+
order = [head_id,link_one.theory_id,link_two.theory_id,link_three.theory_id,last_id]
|
253
|
+
chain = chains.detect do |c|
|
254
|
+
c.collect {|t| t.theory_id} == order
|
255
|
+
end
|
256
|
+
|
257
|
+
chains = chain.extension_permutaions(
|
258
|
+
link_four,values
|
259
|
+
)
|
260
|
+
order = [head_id,link_one.theory_id,link_two.theory_id,link_three.theory_id,link_four.theory_id,last_id]
|
261
|
+
chain = chains.detect do |c|
|
262
|
+
c.collect {|t| t.theory_id} == order
|
263
|
+
end
|
264
|
+
|
265
|
+
unified_chain = chain.unify_chain
|
266
|
+
|
267
|
+
implemented_chain = chain.implement
|
268
|
+
|
269
|
+
return {
|
270
|
+
:initial_method=>RuntimeMethod.new(MethodUsage.new(MethodParameter.new)),
|
271
|
+
:test_cases=>@demo_2_test_cases,
|
272
|
+
:chain=>chain,
|
273
|
+
:values=>{}
|
274
|
+
}
|
275
|
+
|
276
|
+
end
|
277
|
+
|
278
|
+
end
|
279
|
+
|
280
|
+
end
|