|
Nerves & Nerve Script
Nerves... je jednoduchý ale vysokovýkonný a univerzálny engine pre bunečné automaty, ktorého jadro je napísané v C++ aj v Jave. Nerves je presná kópia biologických procesov prebiehajúcich vo zvieracích nervových sústavách, rastlinných a zvieracích obehových systémoch, ktoré všetky mohli byť zredukované na symboly v odovzdávajúcich a uskladňujúcich mechanizmoch.
Veľmi výstižne to popisuje nasledujúci citát :
< If you want to simulate biology you must emulate biology >
Nerves a jeho pridružený jazyk - NerveScript, dovolí užívateľovi definovať veľký počet ľubovoľných ciest na riešenie a zbierky súborov podporných prúdov z ľubovoľných symbolov, symbolov uskladnenia, symbolov korelácie, a filtrácie. Nerves si požičiava mnoho konceptov od neurónových sietí a riadených grafov používaných v zhode s genetickým a generujúcim algoritmom, ako popisovali Ray, Sims (Ray 1994b, Sims 1994) a iní.
Komponenty Nerves budú základom Seeder Gardens, poskytnú funkcie analogické ku kvapkaniu zavlažovacieho systému, definujúci konečný a preto regulovateľný zdroj z ktorého rastliny musia čerpať pre trvalý vzrast. Naviac, kontrolné väzby Nerves budú môcť byť vytvárané pomocou samotných L-systémov, s výhradou spojení medzi geometriou a približovacími snímačmi v modely. Toto bude umožňovať interakciu s rastlinnými modelmi. Keď sa prerezáva výskyt rastlinnej geometrie, potom sa vzrastové podnety stanú vzácne a zmena rastlinných modelov sa môže spustiť.
Následným krokom bude vloženie autonómnych jednotiek do Gardens (Záhrad), ktoré my nazývame herbivores ('bylinožravce'), tieto sa budú usilovať premeniť "energiu" znázorňovanú polygónmi v rastlinných modeloch, do reprodukčnej kapacity. Týto dravci budú vybavení iným zdrojom riadenia v takomto jednoduchom ekosystéme. Gardens (Záhrady) budú udržiavať svoje interaktívne kapacity, dovoľujúce užívateľovi vstúpiť, siať rastliny, vložiť alebo likvidovať dravce, a prerezávať rastliny. Gardens (Záhrady) budú tiež fungovať ako automatické systémy, udržiavajúce polygónovú komplexnosť vo vymedzených hraniciach, ktoré dovoľujú užívateľovi vstúpiť do tohto životného prostredia.
NerveScript...
- je jednoduchý metajazyk použiteľný na popis kompaktnej neurónovej siete, v jednoducho spracovateľnej forme.
- môže byť vytváraný pomocou textového editora, alebo generovaný vizuálnym programovacím prostredím.
- je navrhnutý v textovej (ASCII) podobe, čiže môže byť posielaný pomocou elektronickej pošty
Komponenty jazyka NerveScript
- Pathways
NerveScript priamo popisuje cesty v neurónovej sieti. Tieto cesty sú linky obsahujúce objekty (odvolávajúce sa na tokens), definované od zdroja ku cieľu. Cesty môžu obsahovať oneskorovacie komponenty, ktoré oneskorujú o N krokov, N je definovaný počet v tej ktorej komponente, pri vykonávaní NerveScriptu. Ostatné komponenty v Ceste majú definované ako základné spozdenie jedná pri vykonávaní svojej činnosti.
- Tokens
Tokens môžu reprezentovať dátum, ako aj správu z operačného systému, zápis v databáze, udalosť prerušenia. Vstupujúce dáta do NerveScript neurónovej siete sú mapované do príslušných mien token-ov. Obsah týchto dátových objektov je potom menený ako prechádza neurónovou sieťou
- Pools
Je určitá množina token-ov. Pools sú definované tak aby mohli obsahovať neobmedzené množstvo token-ov. Pool obsahuje Token-y bez zoradenia.
- Taps
Taps sú testy nad pool-om. Výsledkom testu je 'true' ak pool obsahuje príslušný token. Tap môže vložiť/vybrať token z pool, alebo vytvárať kópie token-ov. Tap tiež dokáže presunúť token z medzi dvoma pool-my spojenými pomocou cesty alebo funkcie.
- Functions
Funkcia je každý objekt, ktorý príjme tokeny od Tap. objekty funkcií vo VRLM môžu byť : eventOuts, _changed ExposedFields. Token-y (alebo s ním asociované dáta) môžu byť presunuté do iných script-ov, pre následnú transformáciu.
Špecifiká NerveScript :
- NerveScript rozlišuje veľké a malé písmená.
- NerveScript je závislý na poradí tapy sú testované v poradí v akom boli definované).
- Nerves je časovaný a deterministický:tokeny sa posúvajú po sieti s určeným časovaním.
- NerveScript neobsahuje dimenzie (Cesty nemajú súradnice, môžu byť náhodne poprepájané).
- NerveScript je adresovaný: každý pool v každej sieti môže adresovať, hoci ktorý token.
spinalTap.nrv DEF spinalCordSeg Bundle
{
-spinalTapA-Swim-bodyMotion[4]-Complex;
-spinalTapB-Swim-bodyMotion[4]-Complex;
}
NerveScript kódovací jazyk
Pre použitie Nerves sa očakáva previazanie veľkého množstva už uvedených procesov, ako sú VRML, ... Nerves je popísaný sadou public domain APIs a uverejneným jazykom - NerveScript. Spodný obrázok zobrazuje typický NerveScript, ktorý popisujú dve reťazové neurónové cesty, ktorý by sa mohol používať aj ako chrbtica jednoduchej plávajúcej ryby. DEF definuje znovu použiteľný objekt spinalCordSeg pozostávajúci zo vstupných väzieb spinalTapA a spinalTapB, ktorým prejdú len symbol Swim (Plávať) do štvor - stupňového filtra nazývaný BodyMotion (telový - pohyb). Všetky generované symboly skončia v Complex (súhrn), a v NerveBundle (nervových uzlinách), definovaných inde.
Ukážka vizualizácie pracujúceho NerveScript kódu v NerveScript vývojovom prostredí
Vo VRML prostredí, väzba spinalTapA a B sú napájané pri eventOut (proces-von) hlásení nakreslených mimo scenegraph-u zatiaľ čo Nerve bundles (nervové uzlíky) vytvárajú eventIns späť k VRML s použitím EAI. Nerves je celkom popísaný na adrese: NERVES.
NerveScript príklady ...
- "Standalone" príklad amoeby sa nachádza na linke: Amoeba_NerveScript, a tu je popis tohto simulátora Molekulárnej nanotechnológie.
- Nasledujúci príklad "Nerves" simuluje veľmi jednoduchý nervový systém plávajúcej rybky. Tento nervový systém odpovedá na dve typy stimulov :
- Pohyb ukazovateľa myšky.
- Blízkosť geometrických objektov alebo ukazovateľa.
Nervový systém sa snaží usmerniť rybku k plynulému vlnivému pohybu, ako majú reálne organizmy. Taktiež sa snaží dostať telo rybky do blízkosti ukazovateľa myšky. Ak sa rybka dostane do blízkosti nejakých geometrických objektov, alebo inej rybky, nervový systém zastaví plávanie.
|
# An example of a Nerve Node
DEF SwimmingFish Nerves {
field.. #definition of fields
# exposed fields which can be used to send stimulus into the nerve net
eventIn MFString set_proximity
eventIn MFInt32 set_mousePosn
# _changed fields which the nerve net can set
eventOut MFInt32 bodyMotion_changed
DEF tokens.. token {
# define token maps for
# mouseEvents and proximityEvents and new tokens
# used only inside the Nerve net (leftSwim etc) ... }
DEF functions.. func {# define mapping of functions,
# followThatMouse, barrierDetector, leftSwim etc. ... }
# Definition of the complete nerve net, one nerve bundle at a time
# First Nerve bundle for the fish to be able to see the mouse movement and notice when it is
# getting close to an object
DEF frontEnd Bundle {
# 1. mouseEvents and proximityEvents enter the fishEye and then the visualCortex
# 2. From the visualCortex, mouseEvent tokens are tested by followThatMouse, results sent to
# brainStem (as a stream of new left and right swim tokens)
-mouseEvent,proximityEvent-fishEye-visualCortex-mouseEvent-followThatMouse-brainStem
# 3. The visual cortex passes proximityEvents to a barrierDetector which passes new tokens
# (such as stopSwim) to brainStem and on to the next Nerve bundle through the stitching
visualCortex-proximityEvent-barrierDetector-brainStem
# 4. All unused tokens are dumped
visualCortex-forgetAboutIt }
# Second bundle: taking all tokens into a pool called spinalTap and letting the functions
# leftSwim, rightSwim and stopSwim test for them and set exposedFields bodyMotion[]
# to permit other nodes to display the fish in an undulating motion. The tokens are all
# passed on down the spinal cord to the next segment bundle through spinalTap.
DEF spinalCordSeg Bundle {
spinalTap=leftSwim-bodyMotion[]
spinalTap=rightSwim-bodyMotion[]
spinalTap=stopSwim-bodyMotion[]
# If this this the last stitch in a repeating sequence, dump remaining messages
lastStitch-forgetAboutIt }
# Now we use the Stitch keyword to connect the two Bundles and create a larger nerve net.
# Nine instances of the spinalCordSeg Bundle are stitched onto the frontEnd at the brainStem
# to simulate a fish with a long backbone.
DEF fishNerves Stitch {
frontEnd.brainStem TO 9[spinalCordSeg.spinalTap]
} }
# End of Example
|
|