file:/local_home/local_home/hugo/neurospaces_project/heccer/source/c/snapshots/0/tests/code/spiker1.c (Mon Jun 16 00:03:50 2008
) HOME
1: //
2: // Heccer : a compartmental solver that implements efficient Crank-Nicolson
3: // integration for neuronal models.
4: //
5:
6: //////////////////////////////////////////////////////////////////////////////
7: //'
8: //' Heccer : testbed C implementation
9: //'
10: //' Copyright (C) 2006-2008 Hugo Cornelis
11: //'
12: //' functional ideas .. Hugo Cornelis, hugo.cornelis@gmail.com
13: //'
14: //' coding ............ Hugo Cornelis, hugo.cornelis@gmail.com
15: //'
16: //////////////////////////////////////////////////////////////////////////////
17:
18:
19: #include <stdlib.h>
20:
21: #include "../../heccer/addressing.h"
22: #include "../../heccer/compartment.h"
23: #include "../../heccer/heccer.h"
24: #include "../../heccer/output.h"
25:
26:
27: #define HECCER_TEST_CONSTRUCT \
28: memcpy(&pheccer->inter, &inter, sizeof(inter)); \
29: pheccer->iStatus = HECCER_STATUS_PHASE_2
30: #define HECCER_TEST_REPORTING_GRANULARITY 10000
31: #define HECCER_TEST_STEPS 10000
32: #define HECCER_TEST_TESTED_THINGS ( HECCER_DUMP_VM_COMPARTMENT_MATRIX \
33: | HECCER_DUMP_VM_COMPARTMENT_DATA \
34: | HECCER_DUMP_VM_COMPARTMENT_OPERATIONS \
35: | HECCER_DUMP_VM_MECHANISM_DATA \
36: | HECCER_DUMP_VM_MECHANISM_OPERATIONS \
37: | HECCER_DUMP_VM_SUMMARY \
38: )
39: #define HECCER_TEST_TIME_STEP (1e-6)
40:
41:
42: struct Compartment compSoma =
43: {
44: //m administrative overhead
45:
46: {
47: //m type of structure
48:
49: MATH_TYPE_Compartment,
50: },
51:
52: //m index of parent compartment, -1 for none
53:
54: -1,
55:
56: /* //m first mechanism */
57:
58: /* NULL, */
59:
60: /* //m number of mechanisms */
61:
62: /* 0, */
63:
64: //m descriptive values, alphabetical order
65:
66: /* double dCm; */
67:
68: 4.57537e-11, // unscaled 0.0164,
69:
70: /* double dEm; */
71:
72: -0.08,
73:
74: /* double dInitVm; */
75:
76: -0.065,
77:
78: /* double dInject; */
79:
80: 2e-9,
81:
82: /* double dRa; */
83:
84: 360502, // unscaled 2.5,
85:
86: /* double dRm; */
87:
88: 3.58441e+08, // unscaled 1
89: };
90:
91:
92: //v a regular delayed rectifier, taken from the genesis website
93:
94: struct ChannelAct caKdr =
95: {
96: //m administrative overhead
97:
98: {
99: //m type of structure
100:
101: MATH_TYPE_ChannelAct,
102: },
103:
104: //m first set of descriptive values, alphabetical order
105:
106: //m initial reversal potential
107:
108: -0.085,
109:
110: //m get reversal potential from this intermediary, -1 for none
111:
112: -1,
113:
114: //m maximal conductance when all channels are permissive
115:
116: 1.004349542e-06,
117:
118: //m contributes to this concentration pool, -1 for none, boolean indicator only.
119:
120: -1,
121:
122: //m activation description
123:
124: {
125: //m power, for a standard heccer, something between 1 and 4 or so.
126:
127: 4,
128:
129: //m gate definition
130:
131: {
132: //m initial value, commonly forward over backward steady states
133:
134: 0.3176769506,
135:
136: //m corresponding index in tables, set to -1 for initialization.
137:
138: -1,
139:
140: {
141: //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
142:
143: {
144: //m multiplier
145:
146: -550.0,
147:
148: //m multiplier membrane dependence, 0.0 for no dependence
149:
150: 10000,
151:
152: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
153:
154: 0.0,
155:
156: //m choose between nominator or denominator, 1 means nominator, -1
157: //m means denominator
158:
159: -1.0,
160:
161: //m nominator or denominator offset
162:
163: -1.0,
164:
165: //m membrane offset
166:
167: 0.055,
168:
169: //m denormalized time constant
170:
171: -0.01,
172: },
173:
174: //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
175:
176: {
177: //m multiplier
178:
179: 125.0,
180:
181: //m multiplier membrane dependence, 0.0 for no dependence
182:
183: 0.0,
184:
185: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
186:
187: 0.0,
188:
189: //m choose between nominator or denominator, 1 means nominator, -1
190: //m means denominator
191:
192: -1.0,
193:
194: //m nominator or denominator offset
195:
196: 0.0,
197:
198: //m membrane offset
199:
200: 0.065,
201:
202: //m denormalized time constant
203:
204: 0.08,
205: },
206: },
207: },
208: },
209:
210: };
211:
212:
213: //v a simple fast sodium channel
214:
215: struct ChannelActInact caiNaF =
216: {
217: //m administrative overhead
218:
219: {
220: //m type of structure
221:
222: MATH_TYPE_ChannelActInact,
223: },
224:
225: //m first set of descriptive values, alphabetical order
226:
227: //m initial reversal potential
228:
229: 0.045,
230:
231: //m get reversal potential from this intermediary, -1 for none
232:
233: -1,
234:
235: //m maximal conductance when all channels are permissive
236:
237: 0.00001,
238:
239: //m contributes to this concentration pool, -1 for none, boolean indicator only.
240:
241: -1,
242:
243: //m activation description
244:
245: {
246: //m power, for a standard heccer, something between 1 and 4 or so.
247:
248: 3,
249:
250: //m gate definition
251:
252: {
253: //m initial value, commonly forward over backward steady states
254:
255: 0.01224204035,
256:
257: //m corresponding index in tables, set to -1 for initialization.
258:
259: -1,
260:
261: {
262: //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
263:
264: {
265: //m multiplier
266:
267: 35.0e3,
268:
269: //m multiplier membrane dependence, 0.0 for no dependence
270:
271: 0.0,
272:
273: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
274:
275: 0.0,
276:
277: //m choose between nominator or denominator, 1 means nominator, -1
278: //m means denominator
279:
280: -1.0,
281:
282: //m nominator or denominator offset
283:
284: 0.0,
285:
286: //m membrane offset
287:
288: 5.0e-3,
289:
290: //m denormalized time constant
291:
292: -10.0e-3,
293: },
294:
295: //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
296:
297: {
298: //m multiplier
299:
300: 7.0e3,
301:
302: //m multiplier membrane dependence, 0.0 for no dependence
303:
304: 0.0,
305:
306: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
307:
308: 0.0,
309:
310: //m choose between nominator or denominator, 1 means nominator, -1
311: //m means denominator
312:
313: -1.0,
314:
315: //m nominator or denominator offset
316:
317: 0.0,
318:
319: //m membrane offset
320:
321: 65.0e-3,
322:
323: //m denormalized time constant
324:
325: 20.0e-3,
326: },
327: },
328: },
329: },
330:
331: //m inactivation description
332:
333: {
334: //m power, for a standard heccer, something between 1 and 4 or so.
335:
336: 1,
337:
338: //m gate definition
339:
340: {
341: //m initial value, commonly forward over backward steady states
342:
343: 0.1930685015,
344:
345: //m corresponding index in tables, set to -1 for initialization.
346:
347: -1,
348:
349: {
350: //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
351:
352: {
353: //m multiplier
354:
355: 0.225e3,
356:
357: //m multiplier membrane dependence, 0.0 for no dependence
358:
359: 0.0,
360:
361: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
362:
363: 0.0,
364:
365: //m choose between nominator or denominator, 1 means nominator, -1
366: //m means denominator
367:
368: -1.0,
369:
370: //m nominator or denominator offset
371:
372: 1.0,
373:
374: //m membrane offset
375:
376: 80.0e-3,
377:
378: //m denormalized time constant
379:
380: 10.0e-3,
381: },
382:
383: //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
384:
385: {
386: //m multiplier
387:
388: 7.5e3,
389:
390: //m multiplier membrane dependence, 0.0 for no dependence
391:
392: 0.0,
393:
394: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
395:
396: 0.0,
397:
398: //m choose between nominator or denominator, 1 means nominator, -1
399: //m means denominator
400:
401: -1.0,
402:
403: //m nominator or denominator offset
404:
405: 0.0,
406:
407: //m membrane offset
408:
409: -3.0e-3,
410:
411: //m denormalized time constant
412:
413: -18.0e-3,
414: },
415: },
416: },
417: },
418: };
419:
420:
421: struct SpikeGenerator sg =
422: {
423: //m administrative overhead
424:
425: {
426: //m type of structure
427:
428: MATH_TYPE_SpikeGenerator,
429:
430: #ifdef HECCER_SOURCE_NEUROSPACES
431:
432: //m identification
433:
434: ADDRESSING_NEUROSPACES_2_HECCER(1000),
435:
436: #endif
437:
438: },
439:
440: //m refractory time
441:
442: 0.001,
443:
444: //m spiking threshold
445:
446: 0.0,
447:
448: //m reset value, FLT_MAX for none
449:
450: FLT_MAX,
451:
452: //m table in event distributor with targets
453:
454: 0,
455: };
456:
457:
458: int piC2m[] =
459: {
460: 3,
461: -1,
462: };
463:
464:
465: struct MathComponentArray mca =
466: {
467: //m number of math components
468:
469: 3,
470:
471: //m math component data
472:
473: NULL,
474:
475: //m math component index, initialize to NULL
476:
477: NULL,
478:
479: };
480:
481:
482: struct Intermediary inter =
483: {
484: //m compartment array
485:
486: 1,
487:
488: &compSoma,
489:
490: //m all other mathematical components
491:
492: &mca,
493:
494: //m compartment 2 first mechanism number
495:
496: piC2m,
497: };
498:
499:
500: #include "../../heccer/eventdistributor.h"
501:
502: struct EventDistributorMatrix pedm[] =
503: {
504: {
505: NULL,
506: -1,
507: NULL,
508: -1,
509: },
510: {
511: NULL,
512: -1,
513: NULL,
514: -1,
515: },
516: };
517:
518: struct EventDistributorData edd =
519: {
520: //m number of connections in the matrix
521:
522: 2,
523:
524: //m last used
525:
526: 1,
527:
528: //m array of targets
529:
530: pedm,
531: };
532:
533:
534: struct EventDistributor ed =
535: {
536: //m service specific data
537:
538: &edd,
539:
540: //m distribute an event over the targets
541:
542: EventDistributorSend,
543: };
544:
545:
546: struct OutputGenerator *pogSpike = NULL;
547: struct OutputGenerator * pogVm = NULL;
548:
549: /* double *pdVm = NULL; */
550:
551: char pcStep[100] = "";
552:
553: #include "main.h"
554:
555:
556: int main(int argc, char *argv[])
557: {
558: //- set default result : ok
559:
560: int iResult = EXIT_SUCCESS;
561:
562: //- determine intermediary size, and allocate
563:
564: struct MathComponentInfo *pmciKdr = MathComponentInfoLookup(caKdr.mc.iType);
565:
566: struct MathComponentInfo *pmciNaF = MathComponentInfoLookup(caiNaF.mc.iType);
567:
568: struct MathComponentInfo *pmciSpiker = MathComponentInfoLookup(sg.mc.iType);
569:
570: int iChars = pmciKdr->iChars + pmciNaF->iChars + pmciSpiker->iChars;
571:
572: void *pmc = calloc(sizeof(char), iChars);
573:
574: //- prepare the mechanism intermediary
575:
576: struct ChannelAct *pca = (struct ChannelAct *)pmc;
577:
578: *pca = caKdr;
579:
580: struct ChannelActInact *pcai = (struct ChannelActInact *)&((char *)pca)[pmciKdr->iChars];
581:
582: *pcai = caiNaF;
583:
584: struct SpikeGenerator *psg = (struct SpikeGenerator *)&((char *)pcai)[pmciNaF->iChars];
585:
586: *psg = sg;
587:
588: //- link the intermediary
589:
590: mca.pmc = pmc;
591:
592: //- link spiking element to output generator
593:
594: pogSpike = OutputGeneratorNew("/tmp/output_spike");
595:
596: pedm[0].pvObject = pogSpike;
597: pedm[0].pvFunction = OutputGeneratorTimedStep;
598:
599: //- create output elements
600:
601: pogVm = OutputGeneratorNew("/tmp/output_vm");
602:
603: //d prepare output of membrane potential and spikes
604:
605: #define HECCER_TEST_INITIATE \
606: double *pdVm = HeccerAddressCompartmentVariable(pheccer, 0, "Vm"); \
607: OutputGeneratorAddVariable(pogVm, "Vm", pdVm); \
608: double *pdSpike = HeccerAddressMechanismVariable(pheccer, 2, "spike"); \
609: OutputGeneratorAddVariable(pogSpike, "spike", pdSpike)
610:
611: //d generate output of membrane potential each step
612:
613: #define HECCER_TEST_OUTPUT \
614: OutputGeneratorAnnotatedStep(pogVm, sprintf(pcStep, "%i", i) ? pcStep : "sprintf() failed")
615:
616: //- allocate the heccer, for the event distributor service
617:
618: //t the event distributor should be added to the heccer instances
619: //t during output object construction, such that this is closer to
620: //t SSP behaviour, and closer to CBI architecture specs.
621:
622: //t so that is during HECCER_TEST_INITIATE ?
623:
624: pheccer = HeccerNew("spiker1", NULL, &ed, NULL);
625:
626: //- do the simulation
627:
628: simulate(argc,argv);
629:
630: //- finish the simulation output
631:
632: OutputGeneratorFinish(pogVm);
633:
634: OutputGeneratorFinish(pogSpike);
635:
636: //- add the simulation output to the program output
637:
638: WriteOutput("/tmp/output_vm");
639:
640: WriteOutput("/tmp/output_spike");
641:
642: //- return result
643:
644: return(iResult);
645: }
646:
647:
648: #define main(argc,argv) simulate(argc,argv)
649:
650: //t this prototype can give warning and perhaps errors.
651:
652: int main(int argc, char *argv[]);
653:
654:
655: #include "main.c"
656:
657:
658:
Generated by Xrefactory version 2.0.14 on Thu Jul 24 22:41:20 2008