appswarm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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