cauldron 0.1.3 → 0.1.5

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.
Files changed (409) hide show
  1. data/.gitignore +51 -0
  2. data/Gemfile +6 -3
  3. data/Gemfile.lock +16 -3
  4. data/Rakefile +94 -92
  5. data/VERSION +1 -1
  6. data/bin/cauldron +2 -2
  7. data/cauldron.gemspec +15 -451
  8. data/features/cauldron_new_approach.feature +46 -0
  9. data/features/step_definitions/cauldron_steps.rb +11 -0
  10. data/features/step_definitions/terminal_steps.rb +0 -2
  11. data/features/support/env.rb +11 -1
  12. data/features/support/hooks.rb +5 -0
  13. data/lib/cauldron.rb +13 -7
  14. data/lib/cauldron/array_reverse_operator.rb +39 -0
  15. data/lib/cauldron/concat_operator.rb +34 -0
  16. data/lib/cauldron/if_relationship.rb +37 -0
  17. data/lib/cauldron/numeric_operator.rb +45 -0
  18. data/lib/cauldron/pot.rb +54 -162
  19. data/lib/cauldron/relationship.rb +5 -0
  20. data/lib/cauldron/terminal.rb +4 -60
  21. data/lib/cauldron/version.rb +3 -0
  22. data/lib/core/string.rb +21 -0
  23. data/sandbox.rb +27 -6
  24. data/spec/cauldron/array_reverse_operator_spec.rb +59 -0
  25. data/spec/cauldron/concat_operator_spec.rb +89 -0
  26. data/spec/cauldron/if_relationship_spec.rb +25 -0
  27. data/spec/cauldron/numeric_operator_spec.rb +70 -0
  28. data/spec/cauldron/pot_spec.rb +81 -151
  29. data/spec/cauldron/terminal_spec.rb +1 -39
  30. data/spec/examples/adding_if_statement.yml +13 -0
  31. data/spec/examples/simple_head_theory.txt +13 -0
  32. data/spec/spec_helper.rb +1 -14
  33. data/tasks/theory_tasks.rake +207 -207
  34. metadata +92 -532
  35. data/cauldron/.autotest +0 -23
  36. data/cauldron/History.txt +0 -6
  37. data/cauldron/Manifest.txt +0 -8
  38. data/cauldron/README.txt +0 -57
  39. data/cauldron/Rakefile +0 -27
  40. data/cauldron/bin/cauldron +0 -3
  41. data/cauldron/lib/cauldron.rb +0 -3
  42. data/cauldron/test/test_cauldron.rb +0 -8
  43. data/features/cauldron_example_cases.feature +0 -13
  44. data/features/cauldron_generates_runtime_method.feature +0 -16
  45. data/features/cauldron_generates_single_paramter_methods.feature +0 -25
  46. data/features/cauldron_interactive_start_terminal.feature +0 -17
  47. data/features/cauldron_quit_terminal.feature +0 -9
  48. data/features/cauldron_start_terminal.feature +0 -12
  49. data/features/support/method_1.example +0 -3
  50. data/features/support/method_2.example +0 -6
  51. data/lib/Chain.rb +0 -771
  52. data/lib/ChainMapping.rb +0 -172
  53. data/lib/CodeHandler.rb +0 -513
  54. data/lib/Mapping.rb +0 -27
  55. data/lib/MappingValues.rb +0 -24
  56. data/lib/PartialChain.rb +0 -253
  57. data/lib/Theory.rb +0 -295
  58. data/lib/UnifiedChain.rb +0 -351
  59. data/lib/cauldron/conversion.rb +0 -15
  60. data/lib/cauldron/demos.rb +0 -280
  61. data/lib/cauldron/env.rb +0 -1
  62. data/lib/cauldron/sexp2cauldron.rb +0 -139
  63. data/lib/cauldron/theory_factory.rb +0 -10
  64. data/lib/cauldron/util/home.rb +0 -21
  65. data/lib/cauldron/util/saver.rb +0 -45
  66. data/lib/core/ActsAsCode.rb +0 -25
  67. data/lib/core/BlockToken.rb +0 -33
  68. data/lib/core/CCall.rb +0 -7
  69. data/lib/core/CTestCase.rb +0 -27
  70. data/lib/core/ClassMethodCallContainer.rb +0 -58
  71. data/lib/core/Container.rb +0 -95
  72. data/lib/core/InstanceCallContainer.rb +0 -298
  73. data/lib/core/MethodUsage.rb +0 -65
  74. data/lib/core/PrintVariables.rb +0 -25
  75. data/lib/core/TheoryGenerator.rb +0 -753
  76. data/lib/core/Token.rb +0 -7
  77. data/lib/core/assignment/Assignment.rb +0 -18
  78. data/lib/core/assignment/Equal.rb +0 -39
  79. data/lib/core/assignment/Equivalent.rb +0 -20
  80. data/lib/core/assignment/NotEqual.rb +0 -14
  81. data/lib/core/call_container/CallContainer.rb +0 -72
  82. data/lib/core/class_method_call/New.rb +0 -15
  83. data/lib/core/class_method_call/RuntimeClassMethodCall.rb +0 -31
  84. data/lib/core/declaration/Declaration.rb +0 -16
  85. data/lib/core/declaration/LiteralDeclaration.rb +0 -47
  86. data/lib/core/declaration/VariableDeclaration.rb +0 -59
  87. data/lib/core/instance_call/ArrayEach.rb +0 -23
  88. data/lib/core/instance_call/ArrayLength.rb +0 -15
  89. data/lib/core/instance_call/Chop.rb +0 -19
  90. data/lib/core/instance_call/Copy.rb +0 -22
  91. data/lib/core/instance_call/DeclaredVariable.rb +0 -18
  92. data/lib/core/instance_call/InstanceCall.rb +0 -77
  93. data/lib/core/instance_call/Params.rb +0 -15
  94. data/lib/core/instance_call/Push.rb +0 -20
  95. data/lib/core/instance_call/StringLength.rb +0 -32
  96. data/lib/core/instance_call/Times.rb +0 -20
  97. data/lib/core/instance_call/instance_calls.rb +0 -176
  98. data/lib/core/instance_call/length_equal.rb +0 -15
  99. data/lib/core/kernal/EvalCall.rb +0 -15
  100. data/lib/core/kernal/LocalVariablesCall.rb +0 -15
  101. data/lib/core/literal/Literal.rb +0 -111
  102. data/lib/core/literal/Raw.rb +0 -23
  103. data/lib/core/literal/RuntimeMethodLiteral.rb +0 -21
  104. data/lib/core/literal/StatementLiteral.rb +0 -28
  105. data/lib/core/method_call/AvailableVariablesCall.rb +0 -25
  106. data/lib/core/method_call/ClassCall.rb +0 -33
  107. data/lib/core/method_call/DefCall.rb +0 -72
  108. data/lib/core/method_call/EvaluateClassCall.rb +0 -29
  109. data/lib/core/method_call/MethodNameCall.rb +0 -27
  110. data/lib/core/method_call/ToDeclarationCall.rb +0 -15
  111. data/lib/core/requirement/Requirement.rb +0 -292
  112. data/lib/core/runtime_class/ArrayClass.rb +0 -19
  113. data/lib/core/runtime_class/ClassCallClass.rb +0 -23
  114. data/lib/core/runtime_class/ClassEvaluationClass.rb +0 -19
  115. data/lib/core/runtime_class/ClassName.rb +0 -18
  116. data/lib/core/runtime_class/DefCallClass.rb +0 -21
  117. data/lib/core/runtime_class/EqualClass.rb +0 -19
  118. data/lib/core/runtime_class/FixnumClass.rb +0 -15
  119. data/lib/core/runtime_class/InstanceCallClass.rb +0 -19
  120. data/lib/core/runtime_class/InstanceCallContainerClass.rb +0 -16
  121. data/lib/core/runtime_class/InstanceClassCallClass.rb +0 -19
  122. data/lib/core/runtime_class/LiteralClass.rb +0 -19
  123. data/lib/core/runtime_class/MethodParameterClass.rb +0 -27
  124. data/lib/core/runtime_class/MethodUsageClass.rb +0 -27
  125. data/lib/core/runtime_class/RequirementClass.rb +0 -19
  126. data/lib/core/runtime_class/ReturnClass.rb +0 -21
  127. data/lib/core/runtime_class/RuntimeClass.rb +0 -30
  128. data/lib/core/runtime_class/RuntimeClassClass.rb +0 -19
  129. data/lib/core/runtime_class/RuntimeMethodClass.rb +0 -34
  130. data/lib/core/runtime_class/StatementClass.rb +0 -53
  131. data/lib/core/runtime_class/StringClass.rb +0 -23
  132. data/lib/core/runtime_class/StringLengthClass.rb +0 -19
  133. data/lib/core/runtime_class/StringVariableClass.rb +0 -19
  134. data/lib/core/runtime_class/ThisClass.rb +0 -15
  135. data/lib/core/runtime_class/UnknownClass.rb +0 -23
  136. data/lib/core/runtime_class/class_names.rb +0 -95
  137. data/lib/core/runtime_class/runtime_class.rb +0 -123
  138. data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +0 -293
  139. data/lib/core/runtime_method/ParametersContainer.rb +0 -29
  140. data/lib/core/runtime_method/RealisedRuntimeMethod.rb +0 -94
  141. data/lib/core/runtime_method/RuntimeMethod.rb +0 -814
  142. data/lib/core/runtime_method/WriteParameters.rb +0 -35
  143. data/lib/core/statement/ActsAsStatement.rb +0 -20
  144. data/lib/core/statement/ArrayAccess.rb +0 -122
  145. data/lib/core/statement/BlockStatement.rb +0 -348
  146. data/lib/core/statement/DeclarationStatement.rb +0 -19
  147. data/lib/core/statement/HackStatement.rb +0 -25
  148. data/lib/core/statement/HashAccess.rb +0 -18
  149. data/lib/core/statement/OpenStatement.rb +0 -178
  150. data/lib/core/statement/RealisedStatement.rb +0 -5
  151. data/lib/core/statement/SingleLineBlockStatement.rb +0 -39
  152. data/lib/core/statement/Statement.rb +0 -1091
  153. data/lib/core/statement/StatementGroup.rb +0 -157
  154. data/lib/core/statement/StatementStructure2.rb +0 -224
  155. data/lib/core/statement/TheoryStatement.rb +0 -68
  156. data/lib/core/statement/TopologicalStatements.rb +0 -34
  157. data/lib/core/syntax/Addition.rb +0 -26
  158. data/lib/core/syntax/BlockContainer.rb +0 -102
  159. data/lib/core/syntax/Boolean.rb +0 -15
  160. data/lib/core/syntax/Code.rb +0 -11
  161. data/lib/core/syntax/Do.rb +0 -20
  162. data/lib/core/syntax/False.rb +0 -12
  163. data/lib/core/syntax/If.rb +0 -36
  164. data/lib/core/syntax/Nil.rb +0 -15
  165. data/lib/core/syntax/Return.rb +0 -33
  166. data/lib/core/syntax/Subtract.rb +0 -19
  167. data/lib/core/syntax/This.rb +0 -40
  168. data/lib/core/syntax/True.rb +0 -20
  169. data/lib/core/syntax/syntax.rb +0 -24
  170. data/lib/core/tracking/ActsAsTrackable.rb +0 -65
  171. data/lib/core/tracking/History.rb +0 -167
  172. data/lib/core/tracking/RuntimeTrackingMethod.rb +0 -32
  173. data/lib/core/tracking/Step.rb +0 -52
  174. data/lib/core/variable/ArrayVariable.rb +0 -76
  175. data/lib/core/variable/BaseVariable.rb +0 -152
  176. data/lib/core/variable/BlockVariable.rb +0 -92
  177. data/lib/core/variable/FixnumVariable.rb +0 -35
  178. data/lib/core/variable/HistoryVariable.rb +0 -8
  179. data/lib/core/variable/MethodParameter.rb +0 -179
  180. data/lib/core/variable/MethodUsageVariable.rb +0 -60
  181. data/lib/core/variable/NilVariable.rb +0 -29
  182. data/lib/core/variable/RuntimeMethodParameter.rb +0 -67
  183. data/lib/core/variable/StatementVariable.rb +0 -72
  184. data/lib/core/variable/StepVariable.rb +0 -7
  185. data/lib/core/variable/StringVariable.rb +0 -46
  186. data/lib/core/variable/TypeVariable.rb +0 -72
  187. data/lib/core/variable/Unknown.rb +0 -102
  188. data/lib/core/variable/UnknownVariable.rb +0 -29
  189. data/lib/core/variable/Variable.rb +0 -70
  190. data/lib/core/variable/VariableContainer.rb +0 -28
  191. data/lib/core/variable/VariableIncluded.rb +0 -27
  192. data/lib/core/variable/VariableReference.rb +0 -85
  193. data/lib/error/FailedToFindStatementContainerError.rb +0 -7
  194. data/lib/error/FailedToFindStatementError.rb +0 -7
  195. data/lib/error/FailedToFindVariableError.rb +0 -7
  196. data/lib/error/FailedToLiteraliseError.rb +0 -7
  197. data/lib/error/FailedVariableMatch.rb +0 -7
  198. data/lib/error/ImproperStatementUsageError.rb +0 -7
  199. data/lib/error/IncompatiableRequirementsError.rb +0 -7
  200. data/lib/error/InvalidStatementError.rb +0 -7
  201. data/lib/error/MethodSizeError.rb +0 -7
  202. data/lib/error/RuntimeSyntaxError.rb +0 -7
  203. data/lib/error/UnexpectedStatementTypeError.rb +0 -7
  204. data/lib/error/UnknownStatementType.rb +0 -7
  205. data/lib/error/UnliteralisableError.rb +0 -7
  206. data/lib/implemented_chain.rb +0 -35
  207. data/lib/intrinsic/IntrinsicLastRuntimeMethod.rb +0 -20
  208. data/lib/intrinsic/IntrinsicLiteral.rb +0 -26
  209. data/lib/intrinsic/IntrinsicObject.rb +0 -22
  210. data/lib/intrinsic/IntrinsicRuntimeMethod.rb +0 -27
  211. data/lib/intrinsic/IntrinsicTestCases.rb +0 -17
  212. data/lib/logger/StandardLogger.rb +0 -62
  213. data/lib/required.rb +0 -222
  214. data/lib/ruby_code/Array.rb +0 -95
  215. data/lib/ruby_code/Fixnum.rb +0 -39
  216. data/lib/ruby_code/Hash.rb +0 -25
  217. data/lib/ruby_code/NilClass.rb +0 -19
  218. data/lib/ruby_code/Object.rb +0 -24
  219. data/lib/ruby_code/String.rb +0 -63
  220. data/lib/ruby_code/Symbol.rb +0 -7
  221. data/lib/standard_library/Tasks.rb +0 -12
  222. data/lib/theories.rb +0 -166
  223. data/lib/theory/ActionImplementation.rb +0 -17
  224. data/lib/theory/TheoryAction.rb +0 -100
  225. data/lib/theory/TheoryChainValidator.rb +0 -103
  226. data/lib/theory/TheoryComponent.rb +0 -59
  227. data/lib/theory/TheoryConnector.rb +0 -756
  228. data/lib/theory/TheoryDependent.rb +0 -135
  229. data/lib/theory/TheoryImplementation.rb +0 -75
  230. data/lib/theory/TheoryResult.rb +0 -131
  231. data/lib/theory/TheoryVariable.rb +0 -63
  232. data/lib/theory/theory_collection.rb +0 -62
  233. data/lib/util/ClassEvaluation.rb +0 -44
  234. data/lib/util/CodeEvaluation.rb +0 -39
  235. data/lib/util/DeclarationStatementEvaluation.rb +0 -32
  236. data/lib/util/MethodEvaluation.rb +0 -49
  237. data/lib/util/MethodTester.rb +0 -71
  238. data/lib/util/MethodValidation.rb +0 -149
  239. data/lib/util/MethodWriter.rb +0 -66
  240. data/lib/util/Parser.rb +0 -305
  241. data/lib/util/StatementCheck.rb +0 -44
  242. data/lib/util/StringToTheory.rb +0 -142
  243. data/lib/util/System.rb +0 -8
  244. data/spec/cauldron/chain_spec.rb +0 -24
  245. data/spec/cauldron/demos_spec.rb +0 -30
  246. data/spec/cauldron/runtime_method_spec.rb +0 -92
  247. data/spec/cauldron/saver_spec.rb +0 -45
  248. data/spec/cauldron/sexp_2_cauldron_spec.rb +0 -118
  249. data/spec/cauldron/theory_action_spec.rb +0 -25
  250. data/spec/cauldron/theory_connector_spec.rb +0 -52
  251. data/spec/cauldron/theory_spec.rb +0 -59
  252. data/spec/cauldron/unified_chain_spec.rb +0 -140
  253. data/test/fixtures/chains/1/declaration.txt +0 -26
  254. data/test/fixtures/chains/1/dump +0 -0
  255. data/test/fixtures/chains/2/declaration.txt +0 -26
  256. data/test/fixtures/chains/2/dump +0 -0
  257. data/test/fixtures/chains/3/declaration.txt +0 -26
  258. data/test/fixtures/chains/3/dump +0 -0
  259. data/test/fixtures/implementation_results/0/declaration.txt +0 -3
  260. data/test/fixtures/implementation_results/0/dump +0 -0
  261. data/test/fixtures/theories/0/declaration.txt +0 -9
  262. data/test/fixtures/theories/0/desc +0 -10
  263. data/test/fixtures/theories/0/dump +0 -0
  264. data/test/fixtures/theories/1/declaration.txt +0 -15
  265. data/test/fixtures/theories/1/desc +0 -11
  266. data/test/fixtures/theories/1/dump +0 -0
  267. data/test/fixtures/theories/10/declaration.txt +0 -23
  268. data/test/fixtures/theories/10/desc +0 -17
  269. data/test/fixtures/theories/10/dump +0 -0
  270. data/test/fixtures/theories/11/declaration.txt +0 -20
  271. data/test/fixtures/theories/11/desc +0 -14
  272. data/test/fixtures/theories/11/dump +0 -0
  273. data/test/fixtures/theories/12/declaration.txt +0 -18
  274. data/test/fixtures/theories/12/desc +0 -12
  275. data/test/fixtures/theories/12/dump +0 -0
  276. data/test/fixtures/theories/13/declaration.txt +0 -24
  277. data/test/fixtures/theories/13/desc +0 -20
  278. data/test/fixtures/theories/13/dump +0 -0
  279. data/test/fixtures/theories/14/declaration.txt +0 -26
  280. data/test/fixtures/theories/14/desc +0 -20
  281. data/test/fixtures/theories/14/dump +0 -0
  282. data/test/fixtures/theories/15/declaration.txt +0 -20
  283. data/test/fixtures/theories/15/desc +0 -14
  284. data/test/fixtures/theories/15/dump +0 -0
  285. data/test/fixtures/theories/16/declaration.txt +0 -30
  286. data/test/fixtures/theories/16/desc +0 -14
  287. data/test/fixtures/theories/16/dump +0 -0
  288. data/test/fixtures/theories/17/declaration.txt +0 -25
  289. data/test/fixtures/theories/17/desc +0 -11
  290. data/test/fixtures/theories/17/dump +0 -0
  291. data/test/fixtures/theories/18/declaration.txt +0 -23
  292. data/test/fixtures/theories/18/desc +0 -11
  293. data/test/fixtures/theories/18/dump +0 -0
  294. data/test/fixtures/theories/19/declaration.txt +0 -23
  295. data/test/fixtures/theories/19/desc +0 -11
  296. data/test/fixtures/theories/19/dump +0 -0
  297. data/test/fixtures/theories/2/declaration.txt +0 -12
  298. data/test/fixtures/theories/2/desc +0 -10
  299. data/test/fixtures/theories/2/dump +0 -0
  300. data/test/fixtures/theories/20/declaration.txt +0 -23
  301. data/test/fixtures/theories/20/desc +0 -17
  302. data/test/fixtures/theories/20/dump +0 -0
  303. data/test/fixtures/theories/3/declaration.txt +0 -19
  304. data/test/fixtures/theories/3/desc +0 -11
  305. data/test/fixtures/theories/3/dump +0 -0
  306. data/test/fixtures/theories/4/declaration.txt +0 -11
  307. data/test/fixtures/theories/4/desc +0 -11
  308. data/test/fixtures/theories/4/dump +0 -0
  309. data/test/fixtures/theories/5/declaration.txt +0 -6
  310. data/test/fixtures/theories/5/desc +0 -9
  311. data/test/fixtures/theories/5/dump +0 -0
  312. data/test/fixtures/theories/6/declaration.txt +0 -13
  313. data/test/fixtures/theories/6/desc +0 -11
  314. data/test/fixtures/theories/6/dump +0 -0
  315. data/test/fixtures/theories/7/declaration.txt +0 -19
  316. data/test/fixtures/theories/7/desc +0 -11
  317. data/test/fixtures/theories/7/dump +0 -0
  318. data/test/fixtures/theories/8/declaration.txt +0 -21
  319. data/test/fixtures/theories/8/desc +0 -11
  320. data/test/fixtures/theories/8/dump +0 -0
  321. data/test/fixtures/theories/9/declaration.txt +0 -24
  322. data/test/fixtures/theories/9/desc +0 -20
  323. data/test/fixtures/theories/9/dump +0 -0
  324. data/test/fixtures/theory_implementations/0/declaration.txt +0 -11
  325. data/test/fixtures/theory_implementations/0/desc.txt +0 -9
  326. data/test/fixtures/theory_implementations/0/dump +0 -0
  327. data/test/fixtures/theory_implementations/0/theory_id +0 -1
  328. data/test/fixtures/theory_implementations/1/declaration.txt +0 -11
  329. data/test/fixtures/theory_implementations/1/desc.txt +0 -9
  330. data/test/fixtures/theory_implementations/1/dump +0 -1
  331. data/test/fixtures/theory_implementations/1/theory_id +0 -1
  332. data/test/fixtures/theory_implementations/2/declaration.txt +0 -11
  333. data/test/fixtures/theory_implementations/2/desc.txt +0 -9
  334. data/test/fixtures/theory_implementations/2/dump +0 -0
  335. data/test/fixtures/theory_implementations/2/theory_id +0 -1
  336. data/test/output/simple_method.txt +0 -5
  337. data/test/output/test_method/first_possible_method.txt +0 -6
  338. data/test/output/test_simple_cases/simple_case_01.txt +0 -8
  339. data/test/output/test_simple_cases/simple_case_02.txt +0 -7
  340. data/test/output/test_simple_cases/simple_case_03.txt +0 -8
  341. data/test/output/test_simple_cases/simple_case_04.txt +0 -8
  342. data/test/output/test_simple_cases/simple_case_05.txt +0 -8
  343. data/test/output/test_simple_cases/simple_case_06.txt +0 -9
  344. data/test/output/test_simple_cases/simple_case_07.txt +0 -9
  345. data/test/output/test_simple_cases/simple_case_08.txt +0 -9
  346. data/test/tc_describe.rb +0 -46
  347. data/test/tc_method.rb +0 -130
  348. data/test/tc_requirement.rb +0 -30
  349. data/test/tc_suite_complete.rb +0 -26
  350. data/test/tc_variable.rb +0 -52
  351. data/test/ts_complete.rb +0 -74
  352. data/test/ts_stable.rb +0 -81
  353. data/test/unit/core/declaration/tc_literal_declaration.rb +0 -34
  354. data/test/unit/core/method_call/tc_class_call.rb +0 -20
  355. data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +0 -132
  356. data/test/unit/core/runtime_method/tc_runtime_method.rb +0 -546
  357. data/test/unit/core/statement/tc_array_access.rb +0 -63
  358. data/test/unit/core/statement/tc_block_statement.rb +0 -53
  359. data/test/unit/core/statement/tc_hack_statement.rb +0 -26
  360. data/test/unit/core/statement/tc_open_statement.rb +0 -79
  361. data/test/unit/core/statement/tc_statement.rb +0 -483
  362. data/test/unit/core/statement/tc_statement_group.rb +0 -35
  363. data/test/unit/core/statement/tc_statement_replace_variable.rb +0 -61
  364. data/test/unit/core/statement/tc_theory_statement.rb +0 -53
  365. data/test/unit/core/syntax/tc_block_container.rb +0 -32
  366. data/test/unit/core/syntax/tc_if_container.rb +0 -39
  367. data/test/unit/core/tc_class_method_call.rb +0 -34
  368. data/test/unit/core/tc_container.rb +0 -41
  369. data/test/unit/core/tc_ctest_case.rb +0 -25
  370. data/test/unit/core/tc_instance_call_container.rb +0 -93
  371. data/test/unit/core/tc_literal.rb +0 -30
  372. data/test/unit/core/tc_theory_generator.rb +0 -336
  373. data/test/unit/core/tc_theory_generator_heavy.rb +0 -42
  374. data/test/unit/core/tracking/tc_history.rb +0 -104
  375. data/test/unit/core/tracking/tc_step.rb +0 -65
  376. data/test/unit/core/variable/tc_array_variable.rb +0 -61
  377. data/test/unit/core/variable/tc_block_variable.rb +0 -17
  378. data/test/unit/core/variable/tc_fixnum_variable.rb +0 -54
  379. data/test/unit/core/variable/tc_method_parameter_variable.rb +0 -22
  380. data/test/unit/core/variable/tc_runtime_method_variable.rb +0 -32
  381. data/test/unit/core/variable/tc_string_variable.rb +0 -37
  382. data/test/unit/core/variable/tc_unknown.rb +0 -24
  383. data/test/unit/core/variable/tc_variable_reference.rb +0 -28
  384. data/test/unit/ruby_code/tc_array.rb +0 -64
  385. data/test/unit/ruby_code/tc_fixnum.rb +0 -18
  386. data/test/unit/ruby_code/tc_hash.rb +0 -41
  387. data/test/unit/ruby_code/tc_string.rb +0 -38
  388. data/test/unit/tc_chain.rb +0 -434
  389. data/test/unit/tc_chain_mapping.rb +0 -62
  390. data/test/unit/tc_chain_with_case_1.rb +0 -169
  391. data/test/unit/tc_instance_call.rb +0 -40
  392. data/test/unit/tc_method_usage.rb +0 -35
  393. data/test/unit/tc_pot.rb +0 -124
  394. data/test/unit/tc_runtime_tracking_method.rb +0 -40
  395. data/test/unit/tc_theory.rb +0 -531
  396. data/test/unit/tc_variable_declaration.rb +0 -32
  397. data/test/unit/theory/tc_theory_action.rb +0 -108
  398. data/test/unit/theory/tc_theory_action_implementation.rb +0 -23
  399. data/test/unit/theory/tc_theory_chain_validator.rb +0 -340
  400. data/test/unit/theory/tc_theory_connector.rb +0 -361
  401. data/test/unit/theory/tc_theory_dependent.rb +0 -153
  402. data/test/unit/theory/tc_theory_implementation.rb +0 -137
  403. data/test/unit/theory/tc_theory_result.rb +0 -112
  404. data/test/unit/theory/tc_theory_variable.rb +0 -45
  405. data/test/unit/util/tc_method_validation.rb +0 -101
  406. data/test/unit/util/tc_parser.rb +0 -110
  407. data/test/unit/util/tc_string_to_theory.rb +0 -300
  408. data/test/unit/variable/tc_method_usage_variable.rb +0 -25
  409. data/tmp/runtime_method_evaluation.rb +0 -16
@@ -1,17 +0,0 @@
1
- class ActionImplementation < TheoryAction
2
-
3
- attr_reader :target_id
4
-
5
- def initialize(statement,target_id,theory_component_id=nil)
6
- super(statement,target_id,theory_component_id)
7
- end
8
-
9
- def copy
10
- return ActionImplementation.new(@action.copy,@target_id.copy,@theory_component_id)
11
- end
12
-
13
- def write(tab=0)
14
- return (" "*tab)+"runtime_method.add_statement_at(#{@action.write},#{@target_id.write})"
15
- end
16
-
17
- end
@@ -1,100 +0,0 @@
1
- # The theory action represents the what theory inserts into the
2
- # main runtime method.
3
- #
4
- class TheoryAction
5
- include TheoryComponent
6
-
7
- attr_reader :target_id, :action
8
- #
9
- # @param action A statement to insert into the main runtime method.
10
- # e.g. action.write => "return var8"
11
- # @param target_id The id of the nested statement or method to add the generated statement to.
12
- #
13
- def initialize(action,target_id,theory_component_id=nil)
14
- raise StandardError.new('Expecting theory statement but was '+action.class.to_s) unless action.kind_of?(TheoryStatement)
15
- @action = action
16
- @target_id = target_id
17
- @theory_component_id = theory_component_id unless theory_component_id.nil?
18
- generate_theory_component_id
19
- end
20
-
21
- # Provide a general description of the action, explaining the statement
22
- # it will add to the runtime method and where. This is pseudo code
23
- # and shouldn't be interpretted at runtime. Use "write" for runtime
24
- # actions.
25
- #
26
- # @param tab
27
- #
28
- def describe(tab=0)
29
- # TODO That is nicer way to do tabs - I should make the other methods consistent with it
30
- return (" "*tab)+"<runtime_method>.add_statement_at(#{@action.describe},#{@target_id.describe})"
31
- end
32
-
33
- def write(tab=0)
34
- return (' '*tab)+"<runtime_method>.add_statement_at(#{@action.write},#{@target_id.write})"
35
- end
36
-
37
- # Returns all the theory vairables in this theory action
38
- #
39
- def theory_variables
40
- return @action.select_all {|x| x.kind_of?(TheoryVariable)}
41
- end
42
-
43
- # Returns a action implementation with the theory variable declarations replaced with
44
- # the values in the mapping hash.
45
- #
46
- def map_to(mapping)
47
-
48
- # Duplicate the current statement before it is rewritten
49
- rewritten_statement = @action.copy
50
- target_id = @target_id.copy
51
-
52
- # Find all containers of VariableDeclarations that declare a TheoryVariable
53
- containers = [rewritten_statement,target_id].select_all {|x| x.respond_to?(:has?)}
54
- theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
55
-
56
- # Do any of the containers contain each other?
57
- # => TODO Need to prevent this
58
- all_theory_variables = Set.new
59
- theory_variable_containers.each do |x|
60
- results = x.select_all([]) {|y| y.kind_of?(TheoryVariable)}
61
- all_theory_variables += results
62
- end
63
-
64
- map = {}
65
- all_theory_variables.each do |x|
66
- next if mapping[x.theory_variable_id].nil?
67
- map[x] = mapping[x.theory_variable_id]
68
- end
69
-
70
- rewritten_statement.replace_variables_alt!(map)
71
- target_id.replace_variables_alt!(map)
72
-
73
- return ActionImplementation.new(rewritten_statement,target_id,@theory_component_id)
74
-
75
- end
76
-
77
- def copy
78
- return TheoryAction.new(@action.copy,@target_id,@theory_component_id)
79
- end
80
-
81
- def statements_with_variable(variable_id)
82
-
83
- # Duplicate the current statement before it is rewritten
84
- rewritten_statement = @action.copy
85
- target_id = @target_id.copy
86
-
87
- # Find all containers of VariableDeclarations that declare a TheoryVariable
88
- containers = [rewritten_statement,target_id].select_all {|x| x.respond_to?(:has?)}
89
- theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
90
-
91
- results = theory_variable_containers.select do |x|
92
- reg = eval '/var'+variable_id.to_s+'/'
93
- x.write.match(reg)
94
- end
95
- return results
96
-
97
- end
98
-
99
-
100
- end
@@ -1,103 +0,0 @@
1
- # Instances of this class receive a chain of order theories and proceed
2
- # to apply each of them and confirm their expected output. The valid chain
3
- # can then be used to generate an appropriate runtime method.
4
- #
5
- class TheoryChainValidator
6
-
7
- # TODO Is 'potential_values' used?
8
- # Returns the first runtime method that could be created with the implemented chains
9
- # supplied. This actually generates the runtime method to check the links of the chain
10
- # are accurate - unlike the complete? check in chain instances.
11
- #
12
- def build(runtime_method,test_cases,theory_implementation_chains,potential_values=[])
13
- validated_chains = []
14
- theory_implementation_chains.each do |chain|
15
- validate_next_chain_link(validated_chains,chain,runtime_method.copy,test_cases.copy,0)
16
- end
17
- raise StandardError.new('Failed to generate a valid runtime method') if validated_chains.length == 0
18
-
19
- # Select the first chain and return the runtime method it generates
20
- results = build_method_from_chain(validated_chains.first,runtime_method.copy,test_cases.copy)
21
- return results
22
-
23
- end
24
-
25
- # Validates that the next link in the chain is consistent with the
26
- # theories expected result. If it is then the next link is checked
27
- # and so on. if all the links are consistent then the chain is add
28
- # to the validated chain array.
29
- #
30
- def validate_next_chain_link(validated_chains,chain,runtime_method,test_cases,position)
31
-
32
- # Check that current link in the chain meets in dependencies
33
- # if its dependents are met it isn't suppose to work
34
- unless chain[position].meets_dependencies?(runtime_method.copy,test_cases.copy)
35
- return nil
36
- end
37
-
38
- # Add the theories action to the chains runtime method and realise the runtime method
39
- # TODO This creates a new runtime method each time (so ignores what the previous theory did - BAD)
40
- result = runtime_method.copy
41
- unless chain[position].action.nil?
42
- begin
43
- result = add_statement_to_method(test_cases,runtime_method.copy,chain[position].action)
44
- rescue SyntaxError => e
45
- StandardLogger.instance.warn e
46
- return nil
47
- rescue TypeError => e
48
- StandardLogger.instance.warn e
49
- return nil
50
- end
51
-
52
- end
53
-
54
- # Now check that the runtime method with the theories action also responds
55
- # as the theory said it would in the result.
56
- if chain[position].results.all? {|x| x.validates?(result,test_cases)}
57
-
58
- # Has the chain been completed?
59
- if (position+1) == chain.length
60
- validated_chains << chain
61
- return
62
- else
63
- # Continue along the chain
64
- validate_next_chain_link(validated_chains,chain,result,test_cases,(position+1))
65
- end
66
- else
67
- # Theory was wrong
68
- # chain[position].results.each do |x|
69
- # unless x.validates?(result,test_cases)
70
- # StandardLogger.instance.info('The following result failed to be met')
71
- # StandardLogger.instance.info(x.write)
72
- # end
73
- # end
74
- return nil
75
- end
76
-
77
- end
78
-
79
- # Builds the method using the chain without checking that the depenedents
80
- # and results are accurate.
81
- #
82
- def build_method_from_chain(chain,runtime_method,test_cases)
83
- runtime_method = runtime_method.copy
84
- chain.each do |link|
85
- next if link.action.nil?
86
- runtime_method = add_statement_to_method(test_cases,runtime_method,link.action)
87
- end
88
- return runtime_method
89
- end
90
-
91
- def add_statement_to_method(test_cases,runtime_method,action)
92
- evaluation_code = ''
93
- # TODO I don't think this line below is needed
94
- evaluation_code += "test_cases = #{test_cases.write}"+"\n"
95
- evaluation_code += "last_runtime_method = runtime_method.copy"+"\n"
96
- evaluation_code += action.write+"\n"
97
- evaluation_code += 'return runtime_method'+"\n"
98
- eval evaluation_code
99
- rescue NoMethodError => e
100
- return nil
101
- end
102
-
103
- end
@@ -1,59 +0,0 @@
1
- module TheoryComponent
2
- include ActsAsCode
3
-
4
- attr_reader :theory_component_id
5
-
6
- # TODO Complete hack for issue where component ids aren't unique - using marshal load
7
- @@theory_component_id = 0
8
-
9
- def generate_theory_component_id
10
- if @theory_component_id.nil?
11
- @theory_component_id = @@theory_component_id
12
- @@theory_component_id += 1
13
- end
14
- end
15
-
16
- # Returns all the theory vairables in this theory
17
- # dependent.
18
- #
19
- def theory_variables
20
- return @statement.select_all {|x| x.kind_of?(TheoryVariable)}
21
- end
22
-
23
- def tokens
24
- return @statement.tokens
25
- end
26
-
27
- def statements_with_variable(variable_id)
28
-
29
- # Duplicate the current statement before it is rewritten
30
- rewritten_statement = @statement.copy
31
-
32
- # Find all containers of VariableDeclarations that declare a TheoryVariable
33
- containers = [rewritten_statement].select_all {|x| x.respond_to?(:has?)}
34
- theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
35
-
36
- results = theory_variable_containers.select do |x|
37
- reg = eval '/var'+variable_id.to_s+'/'
38
- x.write.match(reg)
39
- end
40
- return results
41
-
42
- end
43
-
44
- # Returns an array of any of the accessors in the statement. An accessor
45
- # is the chain to access a property e.g. in the following statement =>
46
- #
47
- # var1[:params][var3].something(var6)
48
- #
49
- # it would return ["var1[:params][var3]","var6"]
50
- #
51
- # The needed when trying to determine intrinsic values. So in this case
52
- # var1 couln't be a runtime_method instance becuase it doesn't use
53
- # the has key
54
- #
55
- def accessors
56
-
57
- end
58
-
59
- end
@@ -1,756 +0,0 @@
1
-
2
- # Instances are expected to connect any number of theories so
3
- # that the chain finishes with a particular outcome.
4
- #
5
- # e.g. '<runtime_method>.all_pass?(<test_cases>) = true'
6
- #
7
- class TheoryConnector
8
-
9
- def initialize(potential_values)
10
- @potential_values = potential_values
11
- end
12
-
13
- # Attempts to chain the theories togeather so that the final theory
14
- # results in the specified "finish".
15
- #
16
- # @param runtime_method This is an instance of the core runtime method
17
- # instance that is populated with any number of statements.
18
- # @param test_cases An array of test cases that contain the values for
19
- # runtime method's paramters and the expected return value
20
- # given those parameters.
21
- # @param finish A description of the desired final outcome - this will
22
- # probably be
23
- # '<runtime_method>.all_pass?(<test_cases>) = true'
24
- # @param theories A array of theories to be chained togeather to result
25
- # in the finish outcome.
26
- #
27
- # TODO Last runtime method dependencies can't be shared down the the theory chain
28
- #
29
- def chain(runtime_method,test_cases,finish,theories)
30
-
31
- return create_possible_chains(runtime_method,test_cases,finish,theories)
32
-
33
- end
34
-
35
- # NOTE: Will probably replace the create_possible_chains and chain call
36
- # Returns an array of complete chains that conclude with a valid
37
- # runtime method.
38
- #
39
- def generate_chains(runtime_method,test_cases,theories,exclude=[])
40
-
41
- theories = remove_irrelevant_theories(theories)
42
-
43
- # Create the inital chain (with the head and tail)
44
- intial_chain = Chain.new
45
-
46
- # Find a theory that can act as the head
47
- possible_head_theories = theories.select {|x| x.dependents.length == 0}
48
-
49
- # Create the initial chains
50
- possible_chains = []
51
- possible_head_theories.each do |x|
52
- possible_chains += intial_chain.copy.extension_permutaions(x)
53
- end
54
-
55
- # Check the initial chains incase they're complete
56
- complete_chains = []
57
- if possible_chains.any? {|x| x.complete? }
58
- complete_chains += possible_chains.select {|x| x.complete?}
59
- possible_chains.delete_if {|x| x.complete?}
60
- end
61
- complete_chains = complete_chains.delete_if do |x|
62
- exclude.any? {|y| y == x.theories_sequence}
63
- end
64
- unless complete_chains.empty?
65
- return complete_chains
66
- end
67
- possible_chains.each do |chain|
68
-
69
- # Remove the head theory to avoid it being re-used
70
- head_free_theories = theories.copy
71
- head_free_theories.delete_if {|theory| theory.theory_id == chain.first.theory_id}
72
- complete_chains += complete_chain(chain,head_free_theories)
73
- end
74
- return complete_chains
75
-
76
- end
77
-
78
- def complete_chain(chain,theories)
79
- res = catch(:complete) do
80
- converge_chain(chain,theories)
81
- #raise StandardError.new('Failed to generate a chain')
82
- return []
83
- end
84
- return [res]
85
-
86
- end
87
-
88
- def remove_existing_theories(chain,theories)
89
- theories.delete_if do |theory|
90
- chain.theories_sequence.include?(theory.theory_id)
91
- end
92
- end
93
-
94
- def converge_chain(chain,theories,step=0)
95
-
96
- theories = remove_existing_theories(chain.copy,theories.copy)
97
-
98
- extended_chains = add_to_chain(chain.copy,theories.copy,step)
99
-
100
- if extended_chains.any? {|x| x.complete? }
101
- res2 = extended_chains.select {|x| x.complete?}
102
- raise StandardError.new('More than one complete chain found') if res2.length > 1
103
- throw :complete, res2.first.freeze
104
- end
105
- closer = closer_chains(chain.copy,extended_chains)
106
-
107
- complete_chains = []
108
- unless closer.empty?
109
- closer.each do |x|
110
- complete_chains += converge_chain(x,theories,step+1)
111
- end
112
- else
113
- extended_chains.each do |x|
114
- complete_chains += converge_chain(x,theories,(step+1))
115
- end
116
- end
117
-
118
- return complete_chains
119
- end
120
-
121
- def closer_chains(chain,chains)
122
- closer_chains = []
123
- chains.each do |x|
124
- if ((chain.unmet_dependents_ids-x.unmet_dependents_ids).length == chain.unmet_dependents_ids.length)
125
- closer_chains << x
126
- end
127
- end
128
- return closer_chains
129
- end
130
-
131
- def add_to_chain(chain,theories,step)
132
- extended_chains = []
133
- theories.each do |theory|
134
- last_position = 1
135
- chains = chain.add_link_to(theory,last_position,[])
136
-
137
- #chains = chain.extension_permutaions(theory,[])
138
- next if chains.empty?
139
- extended_chains += chains
140
- end
141
- return extended_chains
142
- end
143
-
144
- def extend_chain(chain,theories)
145
-
146
- complete_chains = []
147
- theories.each do |x|
148
- extended_chains = chain.copy.extension_permutaions(x)
149
- next if extended_chains.empty?
150
-
151
- # Don't allow the same theory to be added twice - for now
152
- updated_theories = theories.copy
153
- updated_theories.delete_if {|theory| theory.theory_id == x.theory_id}
154
-
155
- complete_chains += extended_chains.select {|y| y.complete?}
156
- extended_chains.delete_if {|y| y.complete?}
157
- extended_chains.each do |y|
158
- complete_chains += extend_chain(y,updated_theories)
159
- end
160
- end
161
- return complete_chains
162
- end
163
-
164
- def remove_irrelevant_theories(theories)
165
- theories.delete_if {|theory| theory.irrelevant? }
166
- end
167
-
168
- def create_possible_chains(runtime_method,test_cases,finish,theories)
169
-
170
- # Generate the head theory - this is the starting point and doesn't have any dependents
171
- accessors, mapping = TheoryGenerator.new.generate_accessors_and_mapping(test_cases,runtime_method,7,0)
172
-
173
- # * Generate all the possible results of this runtime method
174
- theory_results = TheoryGenerator.new.get_theory_results(accessors)
175
-
176
- # * Create the actual head theory
177
- head_theory = Theory.new([],nil,theory_results,runtime_method.copy)
178
-
179
- # Create the initial chain that needs to be connected
180
- intial_chain = Chain.new
181
- intial_chain.form_chain(head_theory,finish,mapping)
182
-
183
- return create_possible_chain_extensions(runtime_method,test_cases,finish,theories,intial_chain)
184
- end
185
-
186
- # This method has been created so the initial chain can be passed in to start the method
187
- # creation. Generating the initial chain can take a couple of minutes.
188
- #
189
- def create_possible_chain_extensions(runtime_method,test_cases,finish,theories,intial_chain)
190
-
191
- # Save any of the complete chains
192
- possible_chains = []
193
-
194
- # Search through the available theories and find one that results in the finish
195
- potential_final_theories = theories.select {|x| x.has_result_structure?(finish)}
196
-
197
- # Attempt to add the potential link to the end of the chain
198
- partial_chains = []
199
- potential_final_theories.each do |theory|
200
- potential_chain = intial_chain.copy
201
- # TODO Maybe should be call add_link_to_tail - then check if it completes
202
- if(potential_chain.add_link(theory))
203
- # A new link has been added - does this complete the chain (tail -> head)
204
- res = potential_chain.complete?
205
- #if potential_chain.complete?
206
- if res
207
- possible_chains << potential_chain
208
- else
209
- partial_chains << potential_chain
210
- end
211
- end
212
-
213
- end
214
-
215
-
216
- # If there are any partial chains try to extend them with additional theories
217
- # - partial chains were connect to the finish but not the head.
218
- partial_chains.each do |partial_chain|
219
-
220
- # Select from the chain the dependents that haven't be met.
221
-
222
- # TODO This looks very messy -
223
-
224
- # Take the first dependent attempt to add a theory to resolve it
225
- # - NOTE: This theory may resolve other of the dependents
226
- #until partial_chain.unmet_dependents.empty?
227
- limit = 1
228
- until partial_chain.unmet_dependents.empty? or limit == 0
229
-
230
- # Select the firs of the unment dependents
231
- dependent = partial_chain.unmet_dependents.first
232
-
233
- # Search through the available theories for ones that match the dependent structure
234
- # TODO This should be empty for "ruby test/unit/theory/tc_theory_connector.rb --name test_chain_with_2_theories"
235
- potential_theories = theories.select {|x| x.has_result_structure?(dependent) }
236
- if potential_theories.length > 10
237
- raise StandardError.new("Have not tested for #{potential_theories.length.to_s} potential theories" )
238
- end
239
-
240
- # Attempt to add the theory to the partial chain (prefers the theories that complete)
241
- potential_theories.each do |t|
242
- updated_chain = partial_chain.copy
243
- # TODO Should create a quick way to switch input on and off while the script is running
244
- if(updated_chain.add_link(t))
245
- partial_chain = updated_chain
246
- if updated_chain.complete?
247
- possible_chains << updated_chain
248
- break
249
- else
250
- end
251
- else
252
- end
253
- end
254
-
255
- limit -= 1
256
- end
257
-
258
- end
259
-
260
- # Return the complete chains
261
- return possible_chains
262
-
263
- end
264
-
265
- # Returns a new chain so that they all use consistent theory variables ids
266
- #
267
- def unify_chain(chain)
268
-
269
- # TODO Break up this method and write tests for the individual parts
270
-
271
- # Find all the ways the theory and results can connected
272
- # - the same_structure? approach is quite loose
273
- arrangements = chain_arrangements(chain.copy.reverse)
274
-
275
- # For each theory in the chain give each each variable a unique id
276
- starting_id = 1
277
- uniq_chain = chain.inject([]) do |total,x|
278
- r = x.uniq_theory_variables(starting_id)
279
- starting_id = r.highest_theory_variable_id+1
280
- total << r
281
- total
282
- end
283
-
284
- # Identify the matching variables
285
- mappings = matching_variables(arrangements,uniq_chain)
286
- # TODO Why are so many of these identical
287
- mappings.uniq!
288
-
289
- # Identify opposed mapping (variables that don't match in the context of the theory aren't equal)
290
- false_mappings = {}
291
- uniq_chain.each do |x|
292
- r = x.all_theory_variables.collect {|x| x.theory_variable_id}
293
- r.each do |y|
294
- false_mappings[y] = r.copy.delete_if {|z| z == y}
295
- end
296
- end
297
-
298
- final_mapping = []
299
- #mappings = [mappings.last]
300
-
301
- count = 0
302
- mappings.each do |m|
303
- count += 1
304
- # Create an array of all variables that are equalivalent
305
- master = combine_matches(m.to_a)
306
-
307
- # Check that the equivalent variables don't occur in the same theory
308
- # TODO If this never occurs I need to re-think things
309
- catch :bad_map do
310
- false_mappings.each do |key,value|
311
-
312
- master.each do |x|
313
- if x.include?(key)
314
- if (x | value).length != x.length+value.length
315
- throw :bad_map
316
- end
317
- end
318
- end
319
- end
320
-
321
- final_mapping << master.collect {|x| x.uniq}
322
- end
323
- end
324
-
325
- # Generate new chains using the final mappings
326
- return [] if final_mapping.empty?
327
-
328
- #m = final_mapping.last
329
- new_chains = []
330
- final_mapping.each do |x|
331
-
332
- # Get the id of all the theory variables
333
- all_theory_variable_ids = uniq_chain.collect {|y| y.all_theory_variables.collect {|z| z.theory_variable_id} }.flatten
334
-
335
- # Unique theory variables
336
- uniq_variables = all_theory_variable_ids-x.flatten
337
- unique_count = (all_theory_variable_ids-x.flatten).length + x.length
338
-
339
- # Prepare the mapping to match each id to a new variable
340
- # (at this stage each of the mappings should be unique)
341
- map = Mapping.new
342
- unique_count.times do |k|
343
- unless uniq_variables.empty?
344
- #map << {uniq_variables.shift=>TheoryVariable.new(k)}
345
- map[uniq_variables.shift] = TheoryVariable.new(k)
346
- next
347
- end
348
- #t = m.shift
349
- var = TheoryVariable.new(k)
350
- #map += x.shift.collect {|u| {u=>var} }
351
- x.shift.each do |j|
352
- map[j] = var
353
- end
354
- end
355
-
356
- # Copy the the chain and update the mapping
357
- new_chains << Chain.new(uniq_chain.collect {|y| y.copy.map_to(map)})
358
-
359
- end
360
- return new_chains
361
-
362
- end
363
-
364
- # Returns an array of arrays containing matching ids
365
- #
366
- # matches e.g. [[5,10],[11,17],[12,18],[1,6],[7,12],[13,5]]
367
- #
368
- def combine_matches(matches)
369
-
370
- results = []
371
- until matches.empty?
372
- start = matches.shift
373
-
374
- catch :no_change do
375
- loop do
376
- initial_length = start.length
377
- #removed = temp2.delete_if {|x| (x | start).length != start.length+x.length }
378
-
379
- # TODO A delete command to that returns what you were deleting would be nice
380
- index = matches.index {|x| (x | start).length != start.length+x.length }
381
- if index.nil?
382
- results << start
383
- throw :no_change
384
- end
385
- b = matches.slice!(index)
386
- start += b
387
- start.uniq!
388
- end
389
-
390
- end
391
- end
392
- return results
393
- end
394
-
395
- # Returns an array that matches one variable to another indicating that
396
- # they should be considered equal.
397
- #
398
- def matching_variables(arrangements,uniq_chain)
399
- mappings = []
400
- arrangements.each do |arrangement|
401
- map = {}
402
- arrangement.each do |theory|
403
-
404
- dependents = uniq_chain.inject([]) {|total,x| total += x.dependents}
405
- results = uniq_chain.inject([]) {|total,x| total += x.results}
406
-
407
- theory.each do |dependent_id,result_id|
408
-
409
- # Find the dependent with the matching id
410
- dependent = dependents.detect() {|x| x.theory_component_id == dependent_id}
411
- result = results.detect() {|x| x.theory_component_id == result_id}
412
-
413
- # Temporary check that everything is tickety boo
414
- if result.theory_variables.length != dependent.theory_variables.length
415
- raise StandardError.new('They should always have the same number of theory variables')
416
- end
417
-
418
- # Go through each of the variables and match up the values
419
- result.theory_variables.zip(dependent.theory_variables) do |x,y|
420
-
421
- if map.has_key?(x.theory_variable_id)
422
- end
423
- map[y.theory_variable_id] = x.theory_variable_id
424
-
425
- end
426
-
427
- end
428
-
429
- end
430
- mappings << map
431
- end
432
- return mappings
433
- end
434
-
435
- # Returns an array of all the ways the theory chain can be arranged
436
- # So dependent A -> result B
437
- #
438
- # @param chain An array containing all the theories in order
439
- #
440
- def chain_arrangements(chain)
441
- arrangements = []
442
- next_link_arrangement(arrangements,[],chain)
443
- return arrangements
444
- end
445
-
446
- def next_link_arrangement(arrangements,arrangement,chain)
447
- # Take out link and find the results that match its dependents
448
- link = chain.pop
449
-
450
- # Stop if the all the links in the chain have been met (the last one has nothing left to be dependent on)
451
- if chain.empty?
452
- arrangements << arrangement
453
- return
454
- end
455
-
456
- # TODO Down the line I should see if Cauldron can tidy this up
457
-
458
- # Saves what dependent connects to what result
459
- # e.g. connection = {16=>[26, 28], 17=>[26, 28]}
460
- connection = {}
461
- link.dependents.each do |dependent|
462
-
463
- # Get all the results from the rest of the chain
464
- results = chain.inject([]) {|total,x| total + x.results }
465
-
466
- # Go through the rest of the chain and find the results with the same structure
467
- connection[dependent.theory_component_id] = results.select do |x|
468
- x.same_structure?(dependent)
469
- end.collect {|x| x.theory_component_id}
470
-
471
- end
472
-
473
- # TODO I need to re-do allot of the connecton stuff - I was using theories with arround 650 dependents and
474
- # it was generating an insane size of arrangements. I think it is plausable to handle that size a theory
475
- # but I should re-do this bit.
476
- #
477
- # I may need to reduce the theories to only include the dependent/result arrangements that change after
478
- # the action is added.
479
-
480
- # Calculate the total number of arrangements
481
- total_arrangements = connection.values.collect {|x| x.length}.inject(1) {|total,y| total *= y}
482
-
483
- # TODO Need to include an escape here if there are too many total_arrangements
484
-
485
- # TODO The theory_generator is generating too many results and dependents.
486
-
487
- # Find the various arrangements for the results
488
- # e.g. [[26,26],[26,28],[28,26],..]
489
- # NOTE I get a RangeError: too big to product with larger theories
490
- connection_arrangements = connection.values.first.product(*connection.values[1..connection.values.length])
491
-
492
- # Alternative
493
- # NOTE: I've rewritten this because the code above generates an error for larger theories
494
- # new_connection_arrangements = []
495
- # extend_arrangement(new_connection_arrangements,connection.values)
496
-
497
- # Jump back to the clearer dependent -> result arrangement
498
- # e.g. [{16=>26, 17=>26}, {16=>26, 17=>28}, {16=>28, 17=>26}, {16=>28, 17=>28}]
499
- nice_connection_arrangements = connection_arrangements.collect do |x|
500
- a = []
501
- connection.keys.zip(x) do |dependent_id,result_id|
502
- a << dependent_id
503
- a << result_id
504
- end
505
- Hash[*a]
506
- end
507
-
508
- # For each arrangement continue to the next link
509
- nice_connection_arrangements.each do |x|
510
- # TODO Maybe use a hash with the theory id in instead
511
- a = arrangement.copy + [x]
512
- next_link_arrangement(arrangements,a,chain.copy)
513
- end
514
-
515
- end
516
-
517
- def extend_arrangement(total,groups,group=[])
518
- if groups.empty?
519
- total << group
520
- return
521
- end
522
- groups.shift.each do |x|
523
- extend_arrangement(total,groups.copy,group.copy.push(x))
524
- end
525
- end
526
-
527
- # Returns all the implementation permutations for the theory.
528
- def implement_chain(chain,mapping=Mapping.new)
529
-
530
-
531
- # Implement the theory in all the permutations
532
- # NOTE: Need to get the mapping during the implementation
533
- link = chain.shift
534
-
535
- # TODO Rewriting permutations takes quite long, I think it could be greatly reduced by
536
- # stricting the posibilities by reviewing the dependents. For example:
537
- #
538
- # if(var6.kind_of?(Fixnum))
539
- # return true
540
- # end
541
- #
542
- # TODO I shouldn't treat the realisable fixnum variables as fair game. They should only
543
- # TestCaseIndexFixnum and only available to things of that type.
544
- #
545
- link_permutations = link.rewrite_permutations(@potential_values,mapping)
546
- implemented_chains = []
547
- link_permutations.each do |x|
548
- implement_next_link(implemented_chains,chain.copy,[link],[x])
549
- end
550
-
551
- return implemented_chains
552
-
553
- end
554
-
555
- def implement_next_link(implemented_chains,chain,previous_chain,partial_implemented_chain)
556
- if chain.empty?
557
- implemented_chains << partial_implemented_chain
558
- return
559
- end
560
- next_link = chain.shift
561
-
562
- # Create an hash to show how the results-dependents are linked.
563
- # TODO Because I am loading the theories from Marshal dumps I need to make sure they all have unique ids
564
- results_to_dependents = {}
565
-
566
- dependent_mapping = conversion_mapping(partial_implemented_chain,previous_chain,next_link)
567
-
568
- # # Now implement the next theory using the mapping dependency already established.
569
- dependent_mapping.each do |mapping|
570
-
571
- # NOTE: The mapping is only restricted between the dependent and result connection
572
- implemented_links = next_link.rewrite_permutations(@potential_values,mapping)
573
-
574
- implemented_links.each do |x|
575
- extended_implemented_chain = partial_implemented_chain.copy << x
576
- previous_chain = previous_chain.copy << next_link
577
- implement_next_link(implemented_chains,chain,previous_chain,extended_implemented_chain)
578
- end
579
- end
580
-
581
- end
582
-
583
- # Returns a mapping hash that will describe how to implement the next theory
584
- # so that it is compatiable with current chain.
585
- #
586
- def conversion_mapping(implemented_chain,current_chain,next_theory)
587
-
588
- # Find all the permutations of theory dependents meet by the current chain.
589
-
590
- # For each dependent find all the current implementations that meet it
591
- # e.g. {16=>[26, 28, 12], 17=>[26, 28, 12]}
592
- # TODO Should only include the most recent chain if the result contains a
593
- # last_runtime_method variable.
594
- results = current_chain.inject([]) {|total,x| total + x.results }
595
- arrangements = next_theory.dependents.inject({}) do |total,dependent|
596
- total[dependent.theory_component_id] = results.select do |x|
597
- x.same_structure?(dependent)
598
- end.collect {|x| x.theory_component_id}
599
- total
600
- end
601
-
602
- # # ------------- Development Code -------------
603
- # arrangements.each do |key,value|
604
- # value.each do |x|
605
- # end
606
- # end
607
-
608
- # Get the various permutations of the dependent to result
609
- result_values = arrangements.values
610
- # http://www.ruby-doc.org/core/classes/Array.html#M000287
611
- # TODO Need to check when there is only one dependent
612
- # [1,2].product() #=> [[1],[2]]
613
- # [1,2].product([]) #=> []
614
-
615
- variations = result_values.first.product(*result_values[1..result_values.length])
616
- # e.g. [[26, 26], [26, 28], [26, 12], [28, 26], [28, 28], [28, 12], [12, 26], [12, 28], [12, 12]]
617
- # TODO Maybe an array with the dependent id in would be more useful
618
- # e.g. [[16=>26,17=>26],[16=>26,17=>28],...
619
-
620
- # Need to find all the mappings that will still be consistent
621
- potential_mappings = []
622
- variations.each do |x|
623
-
624
- # Go through each dependent to result pair
625
- catch :incompatiable do
626
- index = 0
627
- mapping = Mapping.new
628
-
629
- arrangements.each_key do |dependent_id|
630
-
631
- # ----------- Development ----------------
632
-
633
- # Find the implementation with this result
634
- theory_result = results.detect {|y| y.theory_component_id == x[index]}
635
-
636
- # Find the dependent that will be mapped
637
- theory_dependent = next_theory.dependents.detect {|y| y.theory_component_id == dependent_id}
638
-
639
- # Find the implementation that contains the selected result
640
- # TODO This approach implies that the same theory can be used twice in the chain.
641
- # TODO I could probably avoid allot of this by having implementation ids and including the
642
- # mapping with the implementation's results
643
- theory_implementation = implemented_chain.detect do |y|
644
- y.results.any? {|z| z.theory_component_id == x[index]}
645
- end
646
-
647
- # Map the id of dependent to the real value used by the result
648
- theory_result.theory_variables.zip(theory_dependent.theory_variables) do |z,y|
649
-
650
- if mapping.has_key?(y.theory_variable_id)
651
- throw :incompatiable if mapping[y.theory_variable_id] != theory_implementation.mapping[z.theory_variable_id]
652
- end
653
-
654
- mapping[y.theory_variable_id] = theory_implementation.mapping[z.theory_variable_id]
655
- end
656
- index += 1
657
- end
658
- potential_mappings << mapping
659
- end
660
- end
661
-
662
- return potential_mappings
663
-
664
- end
665
-
666
- def find_theories_with_these_results(theories,results)
667
- return theories.select do |theory|
668
- results.all? {|x| theory.has_result_structure?(x)}
669
- end
670
- end
671
-
672
- # Find the theories that match any of the results.
673
- #
674
- def find_the_theories_with_these_results(theories,results)
675
- end
676
-
677
- #
678
- def add_link(complete_chains,chain,theories)
679
-
680
- last_theory = chain.last
681
-
682
-
683
- # Find the theories that can meet last theories dependency
684
- # TODO Should this be looking for just one theory? If more than one theory is
685
- # added they might not be compatible.
686
- results = find_theories_with_these_results(theories,last_theory.dependents)
687
- if results.empty?
688
- complete_chains << chain
689
- return
690
- end
691
-
692
- # Try to find any additional links to the new chain
693
- results.each do |x|
694
- extended_chain = chain.copy.push(x)
695
- add_link(complete_chains,extended_chain,theories)
696
- end
697
-
698
- end
699
-
700
- # Returns a number of updated mappings based on what if possible
701
- # for the first theory and the current mapping for the end.
702
- #
703
- def refine_initial_mapping(theory,mapping,runtime_method,test_cases)
704
-
705
- # TEMP
706
- # 1. What theory variables don't have real values?
707
- # 2. What real values are available?
708
- # 3. For each real variable identify the theory variables it could be.
709
- # 4. Given the possibilities work out the permutations
710
-
711
- # Find the theory variable ids that don't have real values
712
- var_ids = theory.dependents.inject([]){|total,x| total << x.theory_variables.collect {|z| z.theory_variable_id}}.flatten.uniq
713
- unasigned_var_ids = var_ids-mapping.keys
714
-
715
- # Development
716
-
717
- # Find the available real values
718
- available_real_values = @potential_values-mapping.values
719
-
720
- # Determine the mermutations of unassigned var ids to available real values.
721
- # NOTE: I'm sure how efficient it is working out every permutation especially
722
- # when a dependent link "varA.kind_of?(Fixnum)" could narrow the
723
- # combinations considerably.
724
- value_permutations = available_real_values.permutation(unasigned_var_ids.length).to_a
725
- var_value_permutations = value_permutations.inject([]) do |total,x|
726
- r = []
727
- x.zip(unasigned_var_ids) do |y,z|
728
- r << z
729
- r << y
730
- end
731
- total << Mapping.new(Hash[*r])
732
- end
733
-
734
- # = Remove any mapping permutaions that don't work =
735
- passible_mappings = []
736
- var_value_permutations.each_with_index do |possible_mapping,i|
737
-
738
- # Combine the possible mapping with current actual mapping
739
- m = mapping.merge(possible_mapping)
740
-
741
- # Using this mapping go through each dependent and check it works
742
- # (if it doesn't work then it's a none starter)
743
- # TODO I don't really need to implement the full theory - just the dependents
744
- implementation = theory.map_to(m)
745
-
746
- # Use each implementation and find the ones that work
747
- next unless implementation.meets_dependencies?(runtime_method,test_cases)
748
- passible_mappings << m
749
-
750
-
751
- end
752
- return passible_mappings
753
-
754
- end
755
-
756
- end