yinspire 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/README +24 -0
  2. data/bench/pq/Makefile +5 -0
  3. data/bench/pq/bench.cc +321 -0
  4. data/bench/pq/bench.rb +125 -0
  5. data/bench/pq/bench_binaryheap.h +46 -0
  6. data/bench/pq/bench_calendarqueue.h +58 -0
  7. data/bench/pq/bench_pairingheap.h +61 -0
  8. data/bench/pq/bench_stlpq.h +46 -0
  9. data/bench/pq/benchmark.h +225 -0
  10. data/bench/pq/distribution.h +93 -0
  11. data/bench/pq/make.rb +24 -0
  12. data/bin/yinspire +186 -0
  13. data/examples/nets/gereon2005.c.json +93723 -0
  14. data/examples/nets/gereon2005.yin +232650 -0
  15. data/examples/nets/skorpion.graphml +396 -0
  16. data/examples/nets/spiketrains_angle_180.txt +8 -0
  17. data/lib/Algorithms/Array.h +52 -0
  18. data/lib/Algorithms/BinaryHeap.h +265 -0
  19. data/lib/Algorithms/CalendarQueue.h +257 -0
  20. data/lib/Algorithms/IndexedBinaryHeap.h +90 -0
  21. data/lib/Algorithms/PairingHeap.h +169 -0
  22. data/lib/Allocators/ChunkedFreelistAllocator.h +96 -0
  23. data/lib/Allocators/MemoryAllocator.h +45 -0
  24. data/lib/Allocators/RubyMemoryAllocator.h +37 -0
  25. data/lib/Yinspire.rb +69 -0
  26. data/lib/Yinspire/All.rb +10 -0
  27. data/lib/Yinspire/Core/NeuralEntity.rb +133 -0
  28. data/lib/Yinspire/Core/Neuron.rb +162 -0
  29. data/lib/Yinspire/Core/Scheduling/NeuralEntity.rb +123 -0
  30. data/lib/Yinspire/Core/Scheduling/Simulator.rb +94 -0
  31. data/lib/Yinspire/Core/Simulator.rb +36 -0
  32. data/lib/Yinspire/Core/StimuliMixin.rb +103 -0
  33. data/lib/Yinspire/Core/Stimulus.rb +25 -0
  34. data/lib/Yinspire/Core/Synapse.rb +64 -0
  35. data/lib/Yinspire/Dumpers/Dumper.rb +19 -0
  36. data/lib/Yinspire/Dumpers/Dumper_Dot.rb +28 -0
  37. data/lib/Yinspire/Loaders/GraphML.rb +84 -0
  38. data/lib/Yinspire/Loaders/Loader.rb +31 -0
  39. data/lib/Yinspire/Loaders/Loader_GraphML.rb +97 -0
  40. data/lib/Yinspire/Loaders/Loader_JSON.rb +181 -0
  41. data/lib/Yinspire/Loaders/Loader_Spike.rb +42 -0
  42. data/lib/Yinspire/Loaders/Loader_Yin.rb +62 -0
  43. data/lib/Yinspire/Loaders/YinScanner.rb +247 -0
  44. data/lib/Yinspire/Models/Neuron_Base.rb +38 -0
  45. data/lib/Yinspire/Models/Neuron_Input.rb +12 -0
  46. data/lib/Yinspire/Models/Neuron_InputOutput.rb +39 -0
  47. data/lib/Yinspire/Models/Neuron_Output.rb +15 -0
  48. data/lib/Yinspire/Models/Neuron_SRM01.rb +50 -0
  49. data/lib/Yinspire/Models/Neuron_SRM02.rb +64 -0
  50. data/lib/Yinspire/Models/Synapse_Hebb.rb +67 -0
  51. data/pure_cpp/Makefile +22 -0
  52. data/pure_cpp/README +2 -0
  53. data/pure_cpp/src/algo/binary_heap.h +277 -0
  54. data/pure_cpp/src/algo/indexed_binary_heap.h +90 -0
  55. data/pure_cpp/src/json/json.cc +542 -0
  56. data/pure_cpp/src/json/json.h +182 -0
  57. data/pure_cpp/src/json/json_parser.cc +685 -0
  58. data/pure_cpp/src/json/json_parser.h +15 -0
  59. data/pure_cpp/src/json/json_parser.rl +213 -0
  60. data/pure_cpp/src/main.cc +49 -0
  61. data/pure_cpp/src/memory_allocator.h +45 -0
  62. data/pure_cpp/src/neural_entity.cc +208 -0
  63. data/pure_cpp/src/neural_entity.h +243 -0
  64. data/pure_cpp/src/neuron.cc +136 -0
  65. data/pure_cpp/src/neuron.h +70 -0
  66. data/pure_cpp/src/neuron_srm_01.cc +77 -0
  67. data/pure_cpp/src/neuron_srm_01.h +36 -0
  68. data/pure_cpp/src/simulator.cc +151 -0
  69. data/pure_cpp/src/simulator.h +116 -0
  70. data/pure_cpp/src/synapse.cc +117 -0
  71. data/pure_cpp/src/synapse.h +60 -0
  72. data/pure_cpp/src/types.h +18 -0
  73. data/run.rb +68 -0
  74. data/tools/conv_jsonc_to_yin.rb +165 -0
  75. data/tools/converter.rb +93 -0
  76. data/tools/json_writer.rb +122 -0
  77. data/yinspire.gemspec +20 -0
  78. metadata +156 -0
@@ -0,0 +1,90 @@
1
+ /*
2
+ * An Indexed Binary Heap
3
+ *
4
+ * Copyright (c) 2007, 2008 by Michael Neumann (mneumann@ntecs.de)
5
+ *
6
+ * The Indexed Binary Heap keeps track of the indices of it's elements
7
+ * stored in the heap to allow efficient updating of their priorities.
8
+ *
9
+ * The requirement was to modify an elements priority. In a regular
10
+ * implicit binary heap this is an inefficient operation as the element
11
+ * has to be found prior to modifying it's priority. And finding an
12
+ * element is O(n) in an implicit binary heap due to it's non sorted
13
+ * nature (i.e. can't apply binary search). By keeping track of the
14
+ * elements index and storing this value inside the elements structure,
15
+ * the complexity of modifying an elements priority is reduced to
16
+ * O(log n) in the worst-case!
17
+ *
18
+ * NOTE: Index 0 of the elements array is unused. It's the index that
19
+ * should be used to denote that an element is NOT actually present in
20
+ * the binary heap.
21
+ *
22
+ * See documentation of BinaryHeap as well.
23
+ *
24
+ * Example:
25
+ *
26
+ * struct E
27
+ * {
28
+ * float schedule_at;
29
+ * unsigned int schedule_index;
30
+ *
31
+ * inline static bool less(const E& e1, const E& e2)
32
+ * {
33
+ * return e1.schedule_at < e2.schedule_at;
34
+ * }
35
+ *
36
+ * inline static unsigned int& index(const E& e)
37
+ * {
38
+ * return e.schedule_index;
39
+ * }
40
+ * };
41
+ *
42
+ * IndexedBinaryHeap<E, MemoryAllocator> heap;
43
+ * ...
44
+ *
45
+ */
46
+
47
+ #ifndef __YINSPIRE__INDEXED_BINARY_HEAP__
48
+ #define __YINSPIRE__INDEXED_BINARY_HEAP__
49
+
50
+ #include "binary_heap.h"
51
+
52
+ template <typename E, class Acc=E>
53
+ struct BinaryHeapIndexer
54
+ {
55
+ static inline void index_changed(E& e, unsigned int i)
56
+ {
57
+ Acc::index(e) = i;
58
+ }
59
+ };
60
+
61
+
62
+ template <typename E, class Alloc, class Acc=E, unsigned int MIN_CAPA=1024>
63
+ class IndexedBinaryHeap : public BinaryHeap<E, Alloc, Acc, BinaryHeapIndexer<E, Acc>, MIN_CAPA>
64
+ {
65
+ typedef unsigned int I; // index type
66
+ typedef BinaryHeap<E, Alloc, Acc, BinaryHeapIndexer<E, Acc>, MIN_CAPA> super;
67
+ typedef BinaryHeapIndexer<E, Acc> Idx;
68
+
69
+ public:
70
+
71
+ void
72
+ update(const E& element)
73
+ {
74
+ I i = Acc::index(element);
75
+ if (i == 0)
76
+ {
77
+ super::push(element);
78
+ }
79
+ else
80
+ {
81
+ // FIXME: use propagate up/down instead
82
+ Idx::index_changed(this->elements[i], 0); // detach from heap
83
+ I bubble = super::move_bubble_down(i);
84
+ super::insert_and_bubble_up(bubble, element);
85
+ }
86
+ }
87
+
88
+ };
89
+
90
+ #endif
@@ -0,0 +1,542 @@
1
+ #include "json.h"
2
+ #include <string.h>
3
+ #include <math.h>
4
+
5
+ /* TODO:
6
+ * output indentation
7
+ * escape string (\0 characters in string?)
8
+ */
9
+
10
+ struct jsonArrayItem
11
+ {
12
+ jsonValue* value;
13
+ jsonArrayItem* next;
14
+
15
+ jsonArrayItem(jsonValue* value, jsonArrayItem* next=NULL)
16
+ {
17
+ this->value = value;
18
+ this->next = next;
19
+ this->value->ref_incr();
20
+ }
21
+
22
+ ~jsonArrayItem()
23
+ {
24
+ this->value->ref_decr();
25
+ }
26
+ };
27
+
28
+ struct jsonHashItem
29
+ {
30
+ jsonString* key;
31
+ jsonValue* value;
32
+ jsonHashItem* next;
33
+
34
+ jsonHashItem(jsonString* key, jsonValue* value, jsonHashItem* next=NULL)
35
+ {
36
+ this->key = key;
37
+ this->value = value;
38
+ this->next = next;
39
+
40
+ this->key->ref_incr();
41
+ this->value->ref_incr();
42
+ }
43
+
44
+ ~jsonHashItem()
45
+ {
46
+ this->key->ref_decr();
47
+ this->value->ref_decr();
48
+ }
49
+ };
50
+
51
+ jsonValue::jsonValue()
52
+ {
53
+ this->ref_count = 1;
54
+ }
55
+
56
+ jsonValue::~jsonValue()
57
+ {
58
+ }
59
+
60
+ const char* jsonValue::type()
61
+ {
62
+ return "value";
63
+ }
64
+
65
+ bool jsonValue::is_type(const char* t)
66
+ {
67
+ return (strcmp(t, type()) == 0);
68
+ }
69
+
70
+ void jsonValue::ref_incr()
71
+ {
72
+ this->ref_count++;
73
+ }
74
+
75
+ void jsonValue::ref_decr()
76
+ {
77
+ if (--this->ref_count <= 0) delete this;
78
+ }
79
+
80
+ jsonNull* jsonValue::asNull()
81
+ {
82
+ return dynamic_cast<jsonNull*>(this);
83
+ }
84
+
85
+ jsonTrue* jsonValue::asTrue()
86
+ {
87
+ return dynamic_cast<jsonTrue*>(this);
88
+ }
89
+
90
+ jsonFalse* jsonValue::asFalse()
91
+ {
92
+ return dynamic_cast<jsonFalse*>(this);
93
+ }
94
+
95
+ jsonNumber* jsonValue::asNumber()
96
+ {
97
+ return dynamic_cast<jsonNumber*>(this);
98
+ }
99
+
100
+ jsonString* jsonValue::asString()
101
+ {
102
+ return dynamic_cast<jsonString*>(this);
103
+ }
104
+
105
+ jsonArray* jsonValue::asArray()
106
+ {
107
+ return dynamic_cast<jsonArray*>(this);
108
+ }
109
+
110
+ jsonHash* jsonValue::asHash()
111
+ {
112
+ return dynamic_cast<jsonHash*>(this);
113
+ }
114
+
115
+ void jsonNull::output(std::ostream& s)
116
+ {
117
+ s << "null";
118
+ }
119
+ const char* jsonNull::type()
120
+ {
121
+ return "null";
122
+ }
123
+
124
+ void jsonTrue::output(std::ostream& s)
125
+ {
126
+ s << "true";
127
+ }
128
+
129
+ const char* jsonTrue::type()
130
+ {
131
+ return "true";
132
+ }
133
+
134
+ void jsonFalse::output(std::ostream& s)
135
+ {
136
+ s << "false";
137
+ }
138
+
139
+ const char* jsonFalse::type()
140
+ {
141
+ return "false";
142
+ }
143
+
144
+ jsonNumber::jsonNumber(double value)
145
+ {
146
+ this->value = value;
147
+ }
148
+
149
+ void jsonNumber::output(std::ostream& s) {
150
+ if (isinf(value))
151
+ {
152
+ if (value < 0.0)
153
+ {
154
+ s << "-Infinity";
155
+ }
156
+ else
157
+ {
158
+ s << "Infinity";
159
+ }
160
+ }
161
+ else
162
+ {
163
+ s << value;
164
+ }
165
+ }
166
+
167
+ const char* jsonNumber::type()
168
+ {
169
+ return "number";
170
+ }
171
+
172
+ jsonString::jsonString(std::string& value)
173
+ {
174
+ this->value = value;
175
+ }
176
+
177
+ jsonString::jsonString(const char* value)
178
+ {
179
+ this->value = value;
180
+ }
181
+
182
+ jsonString::jsonString(const char* _value, int len) : value(_value, len)
183
+ {
184
+ }
185
+
186
+ void jsonString::output(std::ostream& s)
187
+ {
188
+ s << '"' << value << '"';
189
+ }
190
+
191
+ const char* jsonString::type()
192
+ {
193
+ return "string";
194
+ }
195
+
196
+ jsonArrayIterator::jsonArrayIterator(jsonArray *array)
197
+ {
198
+ this->array = array;
199
+ this->array->ref_incr();
200
+ this->pos = this->array->head;
201
+ }
202
+
203
+ jsonArrayIterator::~jsonArrayIterator()
204
+ {
205
+ this->array->ref_decr();
206
+ }
207
+
208
+ void jsonArrayIterator::next()
209
+ {
210
+ if (this->pos != NULL)
211
+ {
212
+ this->pos = this->pos->next;
213
+ }
214
+ }
215
+
216
+ jsonValue *jsonArrayIterator::current()
217
+ {
218
+ if (this->pos != NULL)
219
+ {
220
+ return this->pos->value;
221
+ }
222
+ else
223
+ {
224
+ return NULL;
225
+ }
226
+ }
227
+
228
+ jsonHashIterator::jsonHashIterator(jsonHash *hash)
229
+ {
230
+ this->hash = hash;
231
+ this->hash->ref_incr();
232
+ this->pos = this->hash->head;
233
+ }
234
+
235
+ jsonHashIterator::~jsonHashIterator()
236
+ {
237
+ this->hash->ref_decr();
238
+ }
239
+
240
+ void jsonHashIterator::next()
241
+ {
242
+ if (this->pos != NULL)
243
+ {
244
+ this->pos = this->pos->next;
245
+ }
246
+ }
247
+
248
+ jsonString *jsonHashIterator::current_key()
249
+ {
250
+ if (this->pos != NULL)
251
+ {
252
+ return this->pos->key;
253
+ }
254
+ else
255
+ {
256
+ return NULL;
257
+ }
258
+ }
259
+
260
+ jsonValue *jsonHashIterator::current_value()
261
+ {
262
+ if (this->pos != NULL)
263
+ {
264
+ return this->pos->value;
265
+ }
266
+ else
267
+ {
268
+ return NULL;
269
+ }
270
+ }
271
+
272
+ jsonArray::jsonArray()
273
+ {
274
+ head = tail = NULL;
275
+ }
276
+
277
+ jsonArray::~jsonArray()
278
+ {
279
+ jsonArrayItem* j;
280
+ for (jsonArrayItem* i=head; i != NULL; )
281
+ {
282
+ j = i->next;
283
+ delete i;
284
+ i = j;
285
+ }
286
+ }
287
+
288
+ void jsonArray::output(std::ostream& s)
289
+ {
290
+ s << "[";
291
+ for (jsonArrayItem* i=head; i != NULL; i=i->next)
292
+ {
293
+ if (i != head) s << ", ";
294
+ i->value->output(s);
295
+ }
296
+ s << "]";
297
+ }
298
+
299
+ void jsonArray::push(jsonValue* value)
300
+ {
301
+ jsonArrayItem* i = new jsonArrayItem(value);
302
+
303
+ if (head == NULL)
304
+ {
305
+ head = tail = i;
306
+ }
307
+ else
308
+ {
309
+ tail->next = i;
310
+ tail = i;
311
+ }
312
+ }
313
+
314
+ /*void jsonArray::each(void (*iter)(jsonValue*, void*), void* data)
315
+ {
316
+ for (jsonArrayItem* i=head; i != NULL; i=i->next)
317
+ {
318
+ iter(i->value, data);
319
+ }
320
+ }
321
+ */
322
+
323
+ jsonValue* jsonArray::get(int index)
324
+ {
325
+ for (jsonArrayItem* i=head; i != NULL; i=i->next, index--)
326
+ {
327
+ if (index == 0)
328
+ return i->value;
329
+ }
330
+ return NULL;
331
+ }
332
+
333
+ const char* jsonArray::type()
334
+ {
335
+ return "array";
336
+ }
337
+
338
+ jsonHash::jsonHash()
339
+ {
340
+ head = tail = NULL;
341
+ }
342
+
343
+ jsonHash::~jsonHash()
344
+ {
345
+ jsonHashItem* j;
346
+ for (jsonHashItem* i=head; i != NULL; )
347
+ {
348
+ j = i->next;
349
+ delete i;
350
+ i = j;
351
+ }
352
+ }
353
+
354
+ void jsonHash::output(std::ostream& s)
355
+ {
356
+ s << "{";
357
+ for (jsonHashItem* i=head; i != NULL; i=i->next)
358
+ {
359
+ if (i != head) s << ", " << std::endl;
360
+ i->key->output(s);
361
+ s << ": ";
362
+ i->value->output(s);
363
+ }
364
+ s << "}";
365
+ }
366
+
367
+ /*void jsonHash::each(void (*iter)(jsonString*, jsonValue*, void*), void* data)
368
+ {
369
+ for (jsonHashItem* i=head; i != NULL; i=i->next)
370
+ {
371
+ iter(i->key, i->value, data);
372
+ }
373
+ }
374
+ */
375
+
376
+ jsonValue* jsonHash::get(const char* key)
377
+ {
378
+ for (jsonHashItem* i=head; i != NULL; i=i->next)
379
+ {
380
+ if (i->key->value == key)
381
+ {
382
+ return i->value;
383
+ }
384
+ }
385
+ return NULL;
386
+ }
387
+
388
+ jsonValue* jsonHash::get(std::string& key)
389
+ {
390
+ return get(key.c_str());
391
+ }
392
+
393
+ jsonValue* jsonHash::get(jsonString* key)
394
+ {
395
+ return get(key->value);
396
+ }
397
+
398
+ bool jsonHash::has_key(const char* key)
399
+ {
400
+ return (get(key) != NULL);
401
+ }
402
+
403
+ bool jsonHash::has_key(std::string& key)
404
+ {
405
+ return (get(key.c_str()) != NULL);
406
+ }
407
+
408
+ bool jsonHash::has_key(jsonString* key)
409
+ {
410
+ return (get(key) != NULL);
411
+ }
412
+
413
+ bool jsonHash::get_bool(const char* key, bool default_value)
414
+ {
415
+ jsonValue* v = get(key);
416
+ if (v != NULL)
417
+ {
418
+ if (v->is_type("true"))
419
+ {
420
+ return true;
421
+ }
422
+ else if (v->is_type("false"))
423
+ {
424
+ return false;
425
+ }
426
+ else
427
+ {
428
+ throw "invalid type cast";
429
+ }
430
+ }
431
+ else
432
+ {
433
+ return default_value;
434
+ }
435
+ }
436
+
437
+ double jsonHash::get_number(const char* key, double default_value)
438
+ {
439
+ jsonValue* v = get(key);
440
+ if (v != NULL)
441
+ {
442
+ if (v->is_type("number"))
443
+ {
444
+ return ((jsonNumber*)v)->value;
445
+ }
446
+ else
447
+ {
448
+ throw "invalid type cast";
449
+ }
450
+ }
451
+ else
452
+ {
453
+ return default_value;
454
+ }
455
+ }
456
+
457
+ std::string& jsonHash::get_string(const char* key)
458
+ {
459
+ jsonValue* v = get(key);
460
+ if (v != NULL)
461
+ {
462
+ if (v->is_type("string"))
463
+ {
464
+ return ((jsonString*)v)->value;
465
+ }
466
+ else
467
+ {
468
+ throw "invalid type cast";
469
+ }
470
+ }
471
+ else
472
+ {
473
+ throw "key not found";
474
+ }
475
+ }
476
+
477
+ void jsonHash::set(const char* key, jsonValue* value)
478
+ {
479
+ set(new jsonString(key), value);
480
+ }
481
+
482
+ void jsonHash::set(const char* key, double value)
483
+ {
484
+ set(new jsonString(key), new jsonNumber(value));
485
+ }
486
+
487
+ void jsonHash::set(const char* key, int value)
488
+ {
489
+ set(new jsonString(key), new jsonNumber(value));
490
+ }
491
+
492
+ void jsonHash::set(const char* key, bool value)
493
+ {
494
+ set(new jsonString(key), value ? (jsonValue*)new jsonTrue() : (jsonValue*)new jsonFalse());
495
+ }
496
+
497
+ void jsonHash::set(const char* key, const char* value)
498
+ {
499
+ set(new jsonString(key), new jsonString(value));
500
+ }
501
+
502
+ void jsonHash::set(const char* key, std::string& value)
503
+ {
504
+ set(new jsonString(key), new jsonString(value));
505
+ }
506
+
507
+ void jsonHash::set(jsonString* key, jsonValue* value)
508
+ {
509
+ if (head == NULL)
510
+ {
511
+ head = tail = new jsonHashItem(key, value);
512
+ }
513
+ else
514
+ {
515
+ bool duplicate = false;
516
+
517
+ for (jsonHashItem* i=head; i != NULL; i=i->next)
518
+ {
519
+ if (i->key->value == key->value)
520
+ {
521
+ i->key->ref_decr();
522
+ i->value->ref_decr();
523
+ i->key = key;
524
+ i->value = value;
525
+ duplicate = true;
526
+ break;
527
+ }
528
+ }
529
+
530
+ if (!duplicate)
531
+ {
532
+ jsonHashItem* t = new jsonHashItem(key, value);
533
+ tail->next = t;
534
+ tail = t;
535
+ }
536
+ }
537
+ }
538
+
539
+ const char* jsonHash::type()
540
+ {
541
+ return "hash";
542
+ }