appswarm 0.0.1

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 (305) hide show
  1. data/.autotest +124 -0
  2. data/History.txt +7 -0
  3. data/Manifest.txt +304 -0
  4. data/README.txt +373 -0
  5. data/Rakefile +153 -0
  6. data/TODO +7 -0
  7. data/apps/README.txt +17 -0
  8. data/apps/admin/admin.rb +79 -0
  9. data/apps/admin/controllers/admin.rb +81 -0
  10. data/apps/admin/controllers/settings.rb +63 -0
  11. data/apps/admin/controllers/users.rb +3 -0
  12. data/apps/admin/features/access.feature +21 -0
  13. data/apps/admin/features/mountLocal.feature +12 -0
  14. data/apps/admin/features/settings.feature +68 -0
  15. data/apps/admin/features/startApps.feature +27 -0
  16. data/apps/admin/layouts/main.rhtml +10 -0
  17. data/apps/admin/lib/settings.rb +52 -0
  18. data/apps/admin/static/admin.css +23 -0
  19. data/apps/admin/views/_log.rhtml +21 -0
  20. data/apps/admin/views/index.rhtml +43 -0
  21. data/apps/admin/views/info.rhtml +7 -0
  22. data/apps/admin/views/settings.rhtml +9 -0
  23. data/apps/admin/views/settings/_http_app.rhtml +15 -0
  24. data/apps/admin/views/settings/_web_server.rhtml +32 -0
  25. data/apps/admin/views/settings/index.rhtml +3 -0
  26. data/apps/admin/views/users/index.rhtml +6 -0
  27. data/apps/application_provider/application_provider.rb +11 -0
  28. data/apps/blog/blog.rb +27 -0
  29. data/apps/blog/controllers/blog.rb +29 -0
  30. data/apps/blog/views/index.rhtml +27 -0
  31. data/apps/browser_starter/browser_starter.rb +32 -0
  32. data/apps/crypto/crypto.rb +47 -0
  33. data/apps/crypto/crypto_rsa.rb +102 -0
  34. data/apps/crypto/spec/crypto_spec.rb +10 -0
  35. data/apps/directory_service/directory_service.rb +107 -0
  36. data/apps/directory_service/net_application.rb +92 -0
  37. data/apps/directory_service/spec/directory_service_spec.rb +36 -0
  38. data/apps/directory_service/spec/net_application_spec.rb +3 -0
  39. data/apps/global_application_interface/global_application.rb +52 -0
  40. data/apps/global_application_interface/global_application_interface.rb +84 -0
  41. data/apps/global_application_interface/spec/app_api_spec.rb +5 -0
  42. data/apps/global_tuple_space/global_tuple_space.rb +27 -0
  43. data/apps/global_web_proxy/features/session_handling.feature +7 -0
  44. data/apps/global_web_proxy/global_web_proxy.rb +221 -0
  45. data/apps/global_web_proxy/proxy/HTTPProxyServer-Dateien/rdoc-style.css +208 -0
  46. data/apps/global_web_proxy/proxy/HTTPProxyServer.html +566 -0
  47. data/apps/global_web_proxy/proxy/dnstest.rb +30 -0
  48. data/apps/global_web_proxy/proxy/proxy.rb +86 -0
  49. data/apps/global_web_proxy/proxy/wiki.html +267 -0
  50. data/apps/global_web_proxy/proxy/wiki.rb +115 -0
  51. data/apps/global_web_proxy/spec/res1 +112 -0
  52. data/apps/global_web_proxy/spec/res2 +125 -0
  53. data/apps/global_web_proxy/spec/web_proxy_spec.rb +88 -0
  54. data/apps/global_web_server/global_web_server.rb +120 -0
  55. data/apps/global_web_server/global_web_servlet.rb +6 -0
  56. data/apps/hello_world/controllers/hello_world.rb +11 -0
  57. data/apps/hello_world/features/show_on_local_web_server.feature +44 -0
  58. data/apps/hello_world/features/starting_apps.feature +6 -0
  59. data/apps/hello_world/features/through_global.feature +12 -0
  60. data/apps/hello_world/hello_world.rb +3 -0
  61. data/apps/hello_world/views/get.rhtml +10 -0
  62. data/apps/hello_world/views/index.rhtml +9 -0
  63. data/apps/hello_world/views/post.rhtml +10 -0
  64. data/apps/home/controllers/home.rb +11 -0
  65. data/apps/home/home.rb +12 -0
  66. data/apps/home/layouts/main.rhtml +16 -0
  67. data/apps/home/static/Zeichnung.svg +240 -0
  68. data/apps/home/static/home.css +134 -0
  69. data/apps/home/static/menu.css +99 -0
  70. data/apps/home/views/_appInfo.rhtml +22 -0
  71. data/apps/home/views/_dummy_fill.rhtml +3 -0
  72. data/apps/home/views/_info.rhtml +6 -0
  73. data/apps/home/views/_menu.rhtml +17 -0
  74. data/apps/home/views/index.rhtml +4 -0
  75. data/apps/home/views/overview.rhtml +2 -0
  76. data/apps/local_chunk_store/chunk_store.rb +15 -0
  77. data/apps/local_chunk_store/local_chunk_store.rb +123 -0
  78. data/apps/local_chunk_store/spec/local_chunk_store_spec.rb +30 -0
  79. data/apps/local_file_store/app_configuration.rb +78 -0
  80. data/apps/local_file_store/app_file_store.rb +32 -0
  81. data/apps/local_file_store/cached_file_store.rb +94 -0
  82. data/apps/local_file_store/features/testbed_handling_of_directories.feature +20 -0
  83. data/apps/local_file_store/local_file_store.rb +47 -0
  84. data/apps/local_file_store/spec/app_configuration_spec.rb +30 -0
  85. data/apps/local_file_store/spec/local_file_store_spec.rb +54 -0
  86. data/apps/local_object_storage/lib/cell.rb +29 -0
  87. data/apps/local_object_storage/lib/cellmgr.rb +57 -0
  88. data/apps/local_object_storage/lib/index.rb +43 -0
  89. data/apps/local_object_storage/lib/marshal.rb +96 -0
  90. data/apps/local_object_storage/lib/pagefile.rb +6 -0
  91. data/apps/local_object_storage/lib/persistent_object.rb +126 -0
  92. data/apps/local_object_storage/local_object_storage.rb +148 -0
  93. data/apps/local_object_storage/spec/local_object_storage_spec.rb +123 -0
  94. data/apps/local_secure_file_store/local_secure_file_store.rb +64 -0
  95. data/apps/local_secure_file_store/spec/local_secure_file_store_spec.rb +23 -0
  96. data/apps/local_tuple_space/local_tuple_space.rb +92 -0
  97. data/apps/local_tuple_space/spec/tuple_space_spec.rb +25 -0
  98. data/apps/local_web_server/features/parsing_args.feature +18 -0
  99. data/apps/local_web_server/local_web_server.rb +166 -0
  100. data/apps/logger/logger.rb +27 -0
  101. data/apps/master/master.rb +46 -0
  102. data/apps/master/spec/master_spec.rb +31 -0
  103. data/apps/my_spec_spec.rb +15 -0
  104. data/apps/name_service/name_service.rb +75 -0
  105. data/apps/name_service/spec/name_service_spec.rb +51 -0
  106. data/apps/network_discovery/network_discovery.rb +45 -0
  107. data/apps/network_discovery_localstore/network_discovery_localstore.rb +20 -0
  108. data/apps/network_discovery_udp/network_discovery_udp.rb +51 -0
  109. data/apps/network_lookup/network_lookup.rb +61 -0
  110. data/apps/network_node/abstract_node.rb +104 -0
  111. data/apps/network_node/drb_node.rb +90 -0
  112. data/apps/network_node/network_app.rb +9 -0
  113. data/apps/network_node/network_node.rb +471 -0
  114. data/apps/network_node/remote_service.rb +45 -0
  115. data/apps/network_node/secure_node.rb +125 -0
  116. data/apps/network_node/spec/drb_spec.rb +41 -0
  117. data/apps/network_node/spec/network_node_spec_not.rb +264 -0
  118. data/apps/new_network_node/new_network_node.rb +427 -0
  119. data/apps/new_network_node/spec/new_network_node_spec.rb +186 -0
  120. data/apps/node_broadcast/node_broadcast.rb +167 -0
  121. data/apps/node_broadcast/spec/node_broadcast_spec.rb +59 -0
  122. data/apps/permaspace/permaspace.rb +47 -0
  123. data/apps/plaindb/lib/btree.rb +38 -0
  124. data/apps/plaindb/plaindb.rb +199 -0
  125. data/apps/plaindb/spec/table_write_spec.rb +36 -0
  126. data/apps/routed_network/routed_network.rb +23 -0
  127. data/apps/routed_network/spec/routed_network_spec.rb +17 -0
  128. data/apps/session_manager/session_manager.rb +18 -0
  129. data/apps/spec_output.html +222 -0
  130. data/apps/todo/controllers/todo.rb +87 -0
  131. data/apps/todo/model/comment.rb +10 -0
  132. data/apps/todo/model/project.rb +20 -0
  133. data/apps/todo/model/todo.rb +16 -0
  134. data/apps/todo/model/user.rb +5 -0
  135. data/apps/todo/todo.rb +21 -0
  136. data/apps/todo/views/_commentList.rhtml +7 -0
  137. data/apps/todo/views/_createProject.rhtml +5 -0
  138. data/apps/todo/views/_partList.rhtml +12 -0
  139. data/apps/todo/views/_projectList.rhtml +16 -0
  140. data/apps/todo/views/edit.rhtml +11 -0
  141. data/apps/todo/views/editPart.rhtml +10 -0
  142. data/apps/todo/views/index.rhtml +2 -0
  143. data/apps/todo/views/question.rhtml +4 -0
  144. data/apps/transparent_network/transparent_network.rb +7 -0
  145. data/apps/udp_network/big_transfer.rb +97 -0
  146. data/apps/udp_network/features/information.feature +7 -0
  147. data/apps/udp_network/message_queue.rb +84 -0
  148. data/apps/udp_network/network_interface_api.rb +39 -0
  149. data/apps/udp_network/qos_queue.rb +186 -0
  150. data/apps/udp_network/simple_api.rb +180 -0
  151. data/apps/udp_network/spec/big_transfer_spec.rb +0 -0
  152. data/apps/udp_network/spec/qos_queue_spec.rb +99 -0
  153. data/apps/udp_network/spec/simple_api_spec.rb +35 -0
  154. data/apps/udp_network/spec/udp_network_spec.rb +115 -0
  155. data/apps/udp_network/spec/udp_transceiver_spec.rb +90 -0
  156. data/apps/udp_network/udp_network.rb +196 -0
  157. data/apps/udp_network/udp_transceiver.rb +329 -0
  158. data/apps/wiki/controllers/wiki.rb +56 -0
  159. data/apps/wiki/features/editing.feature +21 -0
  160. data/apps/wiki/layouts/main.rhtml +18 -0
  161. data/apps/wiki/lib/media_wiki_html.rb +35 -0
  162. data/apps/wiki/lib/wikicreole.rb +2147 -0
  163. data/apps/wiki/lib/wikicreole.tt +135 -0
  164. data/apps/wiki/lib/wikitest.rb +158 -0
  165. data/apps/wiki/lib/wikitest.tt +17 -0
  166. data/apps/wiki/model/menu.rb +15 -0
  167. data/apps/wiki/model/page.rb +31 -0
  168. data/apps/wiki/spec/wiki_creole_spec.rb +20 -0
  169. data/apps/wiki/spec/wiki_spec.rb +19 -0
  170. data/apps/wiki/static/Zeichnung.svg +240 -0
  171. data/apps/wiki/static/home.css +134 -0
  172. data/apps/wiki/static/mainMenu.css +32 -0
  173. data/apps/wiki/static/menu.css +99 -0
  174. data/apps/wiki/views/_mainMenu.rhtml +3 -0
  175. data/apps/wiki/views/_menu.rhtml +13 -0
  176. data/apps/wiki/views/edit.rhtml +13 -0
  177. data/apps/wiki/views/index.rhtml +2 -0
  178. data/apps/wiki/views/save.rhtml +1 -0
  179. data/apps/wiki/wiki.rb +17 -0
  180. data/bin/appswarm +47 -0
  181. data/cucumber.yml +2 -0
  182. data/data/PermaspaceApp/AFS_WikiApp_wiki_config +6 -0
  183. data/data/draft.txt +63 -0
  184. data/docs/appswarm_motivation.graffle +0 -0
  185. data/docs/appswarm_pics.graffle/QuickLook/Preview.pdf +0 -0
  186. data/docs/appswarm_pics.graffle/QuickLook/Thumbnail.tiff +0 -0
  187. data/docs/appswarm_pics.graffle/data.plist +63494 -0
  188. data/docs/appswarm_pics.graffle/image1.tiff +0 -0
  189. data/docs/appswarm_pics.graffle/image2.tif +0 -0
  190. data/docs/appswarm_pics.graffle/image3.tif +0 -0
  191. data/docs/appswarm_pics.graffle/image4.tif +0 -0
  192. data/docs/appswarm_pics.graffle/image5.tiff +0 -0
  193. data/docs/routing.graffle +0 -0
  194. data/features/step_definitions/appstart_steps.rb +28 -0
  195. data/features/step_definitions/cluster_steps.rb +18 -0
  196. data/features/step_definitions/testbed_steps.rb +64 -0
  197. data/features/step_definitions/webapp_steps.rb +257 -0
  198. data/features/support/env.rb +7 -0
  199. data/lib/appswarm.rb +127 -0
  200. data/lib/appswarm/README.txt +67 -0
  201. data/lib/appswarm/app_config.rb +19 -0
  202. data/lib/appswarm/application.rb +267 -0
  203. data/lib/appswarm/breaking_mutex.rb +41 -0
  204. data/lib/appswarm/cluster_funcs.rb +157 -0
  205. data/lib/appswarm/cross_spectool.rb +153 -0
  206. data/lib/appswarm/crypt.rb +10 -0
  207. data/lib/appswarm/crypt/crypto.rb +90 -0
  208. data/lib/appswarm/crypt/rsa_key +15 -0
  209. data/lib/appswarm/crypt/rsa_key.pub +5 -0
  210. data/lib/appswarm/crypt/test.rb +27 -0
  211. data/lib/appswarm/dir_tool.rb +41 -0
  212. data/lib/appswarm/event_api.rb +7 -0
  213. data/lib/appswarm/features_helper.rb +44 -0
  214. data/lib/appswarm/global_service.rb +38 -0
  215. data/lib/appswarm/http.rb +1 -0
  216. data/lib/appswarm/http/http_app.rb +257 -0
  217. data/lib/appswarm/http/http_controller.rb +267 -0
  218. data/lib/appswarm/http/http_provider.rb +80 -0
  219. data/lib/appswarm/http/static/favicon.ico +0 -0
  220. data/lib/appswarm/http/static/javascript/._prototype.js +0 -0
  221. data/lib/appswarm/http/static/javascript/prototype.js +2515 -0
  222. data/lib/appswarm/http/webrick_logger.rb +12 -0
  223. data/lib/appswarm/net_service.rb +69 -0
  224. data/lib/appswarm/package.rb +88 -0
  225. data/lib/appswarm/parallel_each.rb +46 -0
  226. data/lib/appswarm/protocols/protocol_dice.rb +25 -0
  227. data/lib/appswarm/proxy_testing.rb +48 -0
  228. data/lib/appswarm/public_api.rb +35 -0
  229. data/lib/appswarm/routing/matrix_math.rb +57 -0
  230. data/lib/appswarm/routing/pca.rb +211 -0
  231. data/lib/appswarm/routing/routetest.rb +85 -0
  232. data/lib/appswarm/routing/routing.rb +326 -0
  233. data/lib/appswarm/routing/spec/nods_spec.rb +23 -0
  234. data/lib/appswarm/routing/spec/pca_spec.rb +27 -0
  235. data/lib/appswarm/routing/spec/routing_spec.rb +91 -0
  236. data/lib/appswarm/secure_con.rb +437 -0
  237. data/lib/appswarm/secure_connection.rb +79 -0
  238. data/lib/appswarm/secure_marshal.rb +137 -0
  239. data/lib/appswarm/service.rb +76 -0
  240. data/lib/appswarm/simple_marshal.rb +96 -0
  241. data/lib/appswarm/simple_marshal_parser.rb +1243 -0
  242. data/lib/appswarm/simple_marshal_parser.tt +158 -0
  243. data/lib/appswarm/spec/application_spec.rb +50 -0
  244. data/lib/appswarm/spec/cluster_spec.rb +2 -0
  245. data/lib/appswarm/spec/hexdist_spec.rb +13 -0
  246. data/lib/appswarm/spec/http_controller_spec.rb +18 -0
  247. data/lib/appswarm/spec/main_spec.rb +6 -0
  248. data/lib/appswarm/spec/parallel_each_spec.rb +30 -0
  249. data/lib/appswarm/spec/secure_connection_spec.rb +108 -0
  250. data/lib/appswarm/spec/secure_marshal_spec.rb +93 -0
  251. data/lib/appswarm/spec/simple_marshal_spec.rb +87 -0
  252. data/lib/appswarm/spec/tools_spec.rb +13 -0
  253. data/lib/appswarm/spec/whiteboard_spec.rb +20 -0
  254. data/lib/appswarm/spec_helper.rb +18 -0
  255. data/lib/appswarm/test_bed.rb +207 -0
  256. data/lib/appswarm/tools.rb +284 -0
  257. data/lib/appswarm/tools/http_tunnel_client.rb +139 -0
  258. data/lib/appswarm/tools/http_tunnel_common.rb +8 -0
  259. data/lib/appswarm/tools/http_tunnel_server.rb +78 -0
  260. data/lib/appswarm/tools/parser/example_data.simple +102 -0
  261. data/lib/appswarm/tools/parser/match_test.rb +14 -0
  262. data/lib/appswarm/tools/parser/parser_lib.rb +165 -0
  263. data/lib/appswarm/tools/parser/parser_test.rb +104 -0
  264. data/lib/appswarm/tools/parser/spec/parser_spec.rb +44 -0
  265. data/lib/appswarm/tools/pipes.rb +95 -0
  266. data/lib/appswarm/tools/spec/tracing_spec.rb +16 -0
  267. data/lib/appswarm/tools/spec/waiting_queue_spec.rb +15 -0
  268. data/lib/appswarm/tools/thread_tool.rb +61 -0
  269. data/lib/appswarm/tools/tracing.rb +84 -0
  270. data/lib/appswarm/tools/treetop_test.rb +20 -0
  271. data/lib/appswarm/tools/treetop_test_grammar.rb +114 -0
  272. data/lib/appswarm/tools/treetop_test_grammar.tt +7 -0
  273. data/lib/appswarm/tools/waiting_prio_queue.rb +47 -0
  274. data/lib/appswarm/tools/waiting_queue.rb +34 -0
  275. data/lib/appswarm/whiteboard.rb +73 -0
  276. data/nettest.rb +50 -0
  277. data/packages/README.txt +1 -0
  278. data/packages/msandbox/data/packages/store/my.txt +1 -0
  279. data/packages/msandbox/interfaces.rb +172 -0
  280. data/packages/msandbox/old/defa.rb +3 -0
  281. data/packages/msandbox/old/test.rb +14 -0
  282. data/packages/msandbox/old/test2.rb +56 -0
  283. data/packages/msandbox/package.rb +67 -0
  284. data/packages/msandbox/packages/store/config.yml +1 -0
  285. data/packages/msandbox/packages/store/main.rb +27 -0
  286. data/packages/msandbox/packages/store/myinclude.rb +7 -0
  287. data/packages/msandbox/packages/store_test/config.yml +1 -0
  288. data/packages/msandbox/packages/store_test/main.rb +9 -0
  289. data/packages/msandbox/server.rb +146 -0
  290. data/packages/msandbox/test.rb +13 -0
  291. data/packages/msandbox/test2.rb +29 -0
  292. data/templates/web/appswarm/controllers/appswarm.rb +41 -0
  293. data/templates/web/appswarm/layouts/main.rhtml +20 -0
  294. data/templates/web/appswarm/models/asmenu.rb +14 -0
  295. data/templates/web/appswarm/models/asuser.rb +30 -0
  296. data/templates/web/appswarm/static/custom.css +15 -0
  297. data/templates/web/appswarm/static/home.css +134 -0
  298. data/templates/web/appswarm/static/mainMenu.css +32 -0
  299. data/templates/web/appswarm/static/menu.css +99 -0
  300. data/templates/web/appswarm/views/_mainMenu.rhtml +5 -0
  301. data/templates/web/appswarm/views/_menu.rhtml +13 -0
  302. data/templates/web/appswarm/views/_userInfo.rhtml +7 -0
  303. data/templates/web/appswarm/views/login.rhtml +9 -0
  304. data/tools/checkPort.rb +11 -0
  305. metadata +379 -0
@@ -0,0 +1,85 @@
1
+ require 'routing.rb'
2
+
3
+
4
+ ns=Nodes.new(100,2)
5
+ ns.computeDistances
6
+
7
+
8
+ baseNode=ns.nodes[0]
9
+
10
+
11
+ gr=GlobalRouting.new(baseNode,ns)
12
+
13
+ neighbor=baseNode.neighbors[0]
14
+ lr=LocalRouting.new(neighbor,ns)
15
+
16
+ newNeighbors=(lr.neighbors-baseNode.neighbors)
17
+ puts "__"
18
+ puts newNeighbors
19
+ newNeighbor=newNeighbors[0]
20
+
21
+ pos=lr.getNodePos(newNeighbor)
22
+
23
+
24
+ tpos=gr.translateFromNeighborToLocal(pos,neighbor)
25
+ #pp pos
26
+ pp tpos
27
+
28
+ exit
29
+
30
+
31
+ localRouting=LocalRouting.new(baseNode,ns)
32
+ neighbor=baseNode.neighbors[0]
33
+ p=localRouting.getNodePos(neighbor)
34
+ pp p
35
+ rVec=localRouting.routeVector(p)
36
+ pp rVec
37
+
38
+ pp localRouting.routeVectorDirect(neighbor)
39
+
40
+ exit
41
+
42
+ neighborNodes=baseNode.neighborHood(2)
43
+
44
+ puts "NEIGHBORS",neighborNodes.length
45
+
46
+ assert{!neighborNodes.member?(baseNode)}
47
+ m=ns.createMatrix(neighborNodes)
48
+ mInv=Linalg::DMatrix[*m].pseudo_inverse
49
+
50
+
51
+ base=PCA::Base.new(PCA::Input.new(m))
52
+
53
+ base.reduce([base.dimension-2,8].min)
54
+
55
+ pp base.dimension
56
+
57
+ pp base.measureSingleError(ns.createDistances(neighborNodes,ns.nodes[50]))
58
+
59
+ routingMatrix=ns.computeRoutingMatrix(baseNode,neighborNodes)
60
+
61
+ neighborNodes.each{|n|
62
+ dVec=m[neighborNodes.index(n)]
63
+ pp dVec
64
+ pos=base.compress(dVec)
65
+ vpos=base.decompress(pos)
66
+ pp "---"
67
+ pp dVec,vpos
68
+ tmpRes=(mInv*(vpos.transpose))
69
+ res=routingMatrix*(mInv*(vpos.transpose))
70
+ pp "RES:",res
71
+ check=Linalg::DMatrix[[1]+[0]*(tmpRes.vsize-1)]
72
+ pp check
73
+ pp routingMatrix*check.transpose
74
+ exit
75
+ }
76
+
77
+
78
+ #pp base
79
+ exit
80
+
81
+ 30.downto(1){|i|
82
+ base.reduce(i)
83
+ pp i
84
+ pp base.measureErrors(m)
85
+ }
@@ -0,0 +1,326 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pp'
3
+ require 'pca.rb'
4
+
5
+ MYMAX=1000000
6
+
7
+ class Array
8
+ def shuffle
9
+ sort{rand*2-1}
10
+ end
11
+
12
+
13
+ def createPermutationFromOrder
14
+ a=(0...length).to_a
15
+ a.sort_by{|x|self[x]}
16
+ end
17
+ end
18
+
19
+ class Node
20
+ attr_reader :neighbors, :id
21
+ def initialize(id)
22
+ @id=id
23
+ @neighbors=[]
24
+ @distance={}
25
+ end
26
+
27
+ def add(n)
28
+ @neighbors << n
29
+ @distance[n]=1
30
+ end
31
+
32
+ def short_to_s
33
+ "("+@id.to_s+")"
34
+ end
35
+
36
+ def to_s
37
+ # "["+@id.to_s+":"+@neighbors.map{|n|n.short_to_s+"="+@distance[n].to_s}.join(",")+"]"
38
+ "["+@id.to_s+"]" #:"+@distance.keys.map{|n|n.short_to_s+"="+@distance[n].to_s}.join(",")+"]"
39
+ end
40
+
41
+ def setDistance(n,d)
42
+ if @distance[n].nil? or @distance[n]>d
43
+ @distance[n]=d
44
+ true
45
+ else
46
+ false
47
+ end
48
+ end
49
+ def distance(n)
50
+ return 0 if n==self
51
+ return @distance[n] if @distance.key?(n)
52
+ MYMAX
53
+ end
54
+
55
+ def neighborHood(len=3)
56
+ @distance.keys.select{|k|@distance[k]<=len}-[self]
57
+ end
58
+
59
+ def ==(o)
60
+ @id==o.id
61
+ end
62
+ end
63
+
64
+ class Nodes
65
+ attr_reader :nodes
66
+ def initialize(n=10,connectivity=2)
67
+ puts "Setup network"
68
+ @nodes=[]
69
+ n.times{|i|@nodes << Node.new(i) }
70
+ connectUntilAllConnected(connectivity)
71
+ end
72
+ def connectUntilAllConnected(connectivity)
73
+ @nodes.each{|n|
74
+ some=(@nodes-[n]).shuffle
75
+ some[0...connectivity].each{|o|
76
+ o.add(n)
77
+ n.add(o)
78
+ }
79
+ }
80
+ end
81
+
82
+ def computeDistances
83
+ puts "Compute distances..."
84
+ @nodes.each{|n|
85
+ cur=[]
86
+ cur+=n.neighbors
87
+ while cur.length>0
88
+ c=cur.shift
89
+ (c.neighbors-[n]).each{|x|
90
+ nd=n.distance(c)+1
91
+ if n.setDistance(x,nd)
92
+ cur<<x
93
+ end
94
+ }
95
+ end
96
+ }
97
+ puts "Ready"
98
+ end
99
+
100
+ class Path
101
+ attr_reader :nodes
102
+ def initialize(from)
103
+ if from.is_a?(Array)
104
+ @nodes=from
105
+ else
106
+ @nodes=[from]
107
+ end
108
+ end
109
+ def <<(node)
110
+ @nodes << node
111
+ end
112
+ def value
113
+ a=(1..(@nodes.length-1)).to_a
114
+
115
+ val=a.inject(0){|old,i|
116
+ a=@nodes[i-1]
117
+ b=@nodes[i]
118
+ old.to_i+a.distance(b).to_i
119
+ }
120
+ val
121
+ end
122
+ def initialize_copy(s)
123
+ #puts "S:",*s,s
124
+ #exit
125
+ @nodes=s.nodes.clone
126
+ #Path.new(@nodes.clone)
127
+ end
128
+ def last
129
+ @nodes[-1]
130
+ end
131
+ def to_s
132
+ "[#{@nodes.length} - #{value}]"
133
+ end
134
+ end
135
+
136
+ def shortestPath(from,to)
137
+ paths=[Path.new(from)]
138
+
139
+ loop do
140
+ currentPath=paths.shift
141
+ last=currentPath.last
142
+ return currentPath if last==to
143
+ last.neighbors.each{|n|
144
+ nPath=currentPath.clone
145
+ nPath << n
146
+ if nPath.value < MYMAX
147
+ paths << nPath
148
+ end
149
+ #puts currentPath,nPath
150
+ #exit
151
+ }
152
+
153
+ paths.sort!{|a,b|a.value<=>b.value}
154
+ #puts paths,"--"
155
+ # puts paths.length
156
+ end
157
+ return nil
158
+ end
159
+
160
+
161
+ def createMatrix(nodes=nil)
162
+ nodes||=@nodes
163
+ x=nodes.map{|a|
164
+ nodes.map{|b|
165
+ weight(a.distance(b))
166
+ }
167
+ }
168
+ end
169
+
170
+ def weight(i)
171
+ i
172
+ #1-Math::atan(i)/Math::PI
173
+ end
174
+
175
+ def createDistances(fromArray,toNode)
176
+ fromArray.map{|a|
177
+ weight(a.distance(toNode))
178
+ }
179
+ end
180
+
181
+ # R*v=P
182
+ # v is (0,..,0,1,0,...,0) vector having 1 at pos i
183
+ # P is the vector (over j) describing the probability for reaching node i over neighbor j
184
+ # example: to compute the probabilities to reach node 4, compute
185
+ # R*(0,0,0,0,1,0,...)
186
+ # result may be (0.5,0,0.5) - this means that you can reach node 4 by either crossing neighbor 0 or 2
187
+ # (counting from 0)
188
+ def computeRoutingMatrix(myNode,nodes=nil)
189
+ #nodes||=(@nodes-myNode)
190
+ nodes||=@nodes
191
+ #assert{ !nodes.member?(myNode) }
192
+ neighbors=myNode.neighbors
193
+ #puts "---",neighbors,"--"
194
+ i=[[0]*nodes.length]*neighbors.length
195
+ #nodes.each{|x|puts "#{x} #{myNode.distance(x)}"}
196
+ matrix=Linalg::DMatrix[* i]
197
+ nodes.each{|curNode|
198
+ # assert{curNode!=myNode}
199
+ curArr={}
200
+ neighbors.each{|neighbor|
201
+
202
+ d=neighbor.distance(curNode)+myNode.distance(neighbor)
203
+ myd=myNode.distance(curNode)
204
+ if d<=myd
205
+ curArr[neighbor]=d
206
+ end
207
+ }
208
+ sum=curArr.values.inject(0){|a,b|a+b}
209
+ #assert{sum>0}
210
+ if sum>0
211
+ curArr.each{|k,v|
212
+ y,x=nodes.index(curNode),neighbors.index(k)
213
+ matrix[x,y]=v.to_f/sum
214
+ }
215
+ end
216
+ }
217
+ matrix
218
+ end
219
+ end
220
+
221
+ class LocalRouting
222
+ attr_reader :neighbors, :base
223
+ def initialize(baseNode,network,neighborDepth=2)
224
+ puts "init local routing for #{baseNode}"
225
+ @baseNode=baseNode
226
+ @network=network
227
+ @depth=neighborDepth
228
+ @neighbors=@baseNode.neighborHood(@depth)+[@baseNode]
229
+
230
+ @distMatrix=@network.createMatrix(@neighbors)
231
+ @distMatrixInv=Linalg::DMatrix[*@distMatrix].pseudo_inverse
232
+
233
+ @base=PCA::Base.new(PCA::Input.new(@distMatrix))
234
+
235
+ @base.reduce([@base.dimension,8].min)
236
+
237
+ @routing=@network.computeRoutingMatrix(@baseNode,@neighbors) #-[@baseNode])
238
+ end
239
+
240
+ def getNodePos(neighbor)
241
+ assert{@neighbors.member?(neighbor)}
242
+ distVec=@distMatrix[@neighbors.index(neighbor)]
243
+ #pp distVec
244
+ @base.compress(distVec)
245
+ end
246
+
247
+ def routeVector(nodePos)
248
+ #puts "ROUTEV",nodePos
249
+ r0=(@distMatrixInv*@base.decompress(nodePos).transpose)
250
+ #puts "r0",r0
251
+ #puts @routing
252
+ @routing*r0
253
+ end
254
+
255
+ def getNode(i)
256
+ neighbors[i]
257
+ end
258
+
259
+ def getRouteOrder(nodePos)
260
+ rv=routeVector(nodePos)
261
+ ns=@baseNode.neighbors
262
+ #puts "RV",rv,"neigbors:",ns
263
+ ns.sort{|a,b| rv[ns.index(b)]<=>rv[ns.index(a)]}
264
+ end
265
+
266
+ def routeVectorDirect(neighbor)
267
+ id=@neighbors.index(neighbor)
268
+ @routing*Linalg::DMatrix[[0]*(id)+[1]+[0]*(@neighbors.length-id-1)].transpose
269
+ end
270
+
271
+ def getDistancesForPos(toNodePos)
272
+ distVec=base.decompress(toNodePos).to_a[0]
273
+ nodes={}
274
+ 0.upto(distVec.length-1){|i|
275
+ nodes[@neighbors[i]]=distVec[i]
276
+ }
277
+ nodes
278
+ end
279
+
280
+ def computePosForDistances(distHash)
281
+ distVec=@neighbors.map{|n|distHash[n]}
282
+ @base.compress(distVec)
283
+ end
284
+
285
+ def distance(from,to)
286
+ assert{[from,to]-@neighbors==[]}
287
+ from.distance(to)
288
+ end
289
+
290
+ end
291
+
292
+ class GlobalRouting
293
+ def initialize(baseNode,network,neighborDepth=2)
294
+ @myRouting=LocalRouting.new(baseNode,network,neighborDepth)
295
+ @neighborRouting=(baseNode.neighbors+[baseNode]).map2hash{|n|LocalRouting.new(n,network)}
296
+ end
297
+
298
+ def getNodePos(p)
299
+ @myRouting.getNodePos(p)
300
+ end
301
+ def getRouteOrder(nodePos)
302
+ @myRouting.getRouteOrder(nodePos)
303
+ end
304
+
305
+ def translateFromNeighborToLocal(nodePos,neighbor)
306
+ rt=@neighborRouting[neighbor]
307
+ oldDistances=rt.getDistancesForPos(nodePos)
308
+
309
+ # translateDistances
310
+ neighbors=@myRouting.neighbors
311
+ # collect distances, that are the same
312
+ newDistances=oldDistances.select{|k,v|
313
+ neighbors.member?(k)
314
+ }
315
+ # add missing distances
316
+ (neighbors-newDistances.keys).each{|n|
317
+ newDistances[n]=
318
+ newDistances.map_to_a{|k,v|
319
+ @myRouting.distance(n,k)+v
320
+ }.min
321
+ }
322
+ npos=@myRouting.computePosForDistances(newDistances)
323
+ end
324
+ end
325
+
326
+
@@ -0,0 +1,23 @@
1
+ if false
2
+
3
+ $: << File.expand_path("../..",__FILE__)
4
+ require File.expand_path("../../routing.rb",__FILE__)
5
+
6
+ describe "Nodes" do
7
+ it "should compute the shortest path" do
8
+ ns=Nodes.new(30)
9
+ ns.computeDistances
10
+
11
+
12
+ a=ns.nodes[0]
13
+ b=ns.nodes[1]
14
+
15
+ p=ns.shortestPath(a,b)
16
+ puts a,b,p,p.nodes
17
+
18
+ p.value.should == a.distance(b)
19
+ a.distance(b).should == b.distance(a)
20
+ end
21
+ end#
22
+
23
+ end
@@ -0,0 +1,27 @@
1
+ if false
2
+
3
+ $: << File.expand_path("../..",__FILE__)
4
+
5
+ require 'pca.rb'
6
+
7
+ describe "PCA" do
8
+ it "should compress/decompress without failure if element is in training-set" do
9
+ i=PCA::Input.new
10
+ i<<[1,1,0]
11
+ i<<[0,1,1]
12
+ i<<[0,1,2]
13
+ i<<[9,1,1]
14
+ i<<[0,1,0]
15
+
16
+ base=PCA::Base.new(i)
17
+
18
+ ref=[1,1,0]
19
+
20
+ c=base.compress(ref)
21
+ r=base.decompress(c)
22
+
23
+ (r-Linalg::DMatrix[ref]).norm.should < 0.1
24
+ end
25
+ end
26
+
27
+ end