Relationsnätverk

Innehåll

  1. Definition
  2. Transport och unifiering
  3. Representation av osäkerhet
  4. Exempel på relationer
  5. Cartesisk produkt
  6. Grafrelationen
  7. Summarelationen
  8. Translationsrelationen
  9. Tidsuppdatering
  10. Mängdrepresentation
  11. Bildrepresentation
  12. Språket Retina
  13. Relationer i Retina
  14. Bildrelationer i Retina
  15. Instruktioner i Retina
  16. Exekvering av Retina
  17. Exempel

Definition

Ett relationsnätverk är ett nätverk med noder och relationer, som t.ex.



x,y,z,u,w är noder, som representerar värdet av olika "storheter" eller "variabler", och som också representerar osäkerheten om dessa värden.

+, R och f är relationer mellan dessa värden. Relationen + kan betyda att:

z = x + y
Pilarna vid +-symbolen anger vilka värden som går in i summan. Den pillösa linjen markerar resultatet av summan. Det här är en ternär relation (en relation mellan 3). Relationen f betyder att
u = f(z)
dvs här har vi en relation som uppfyller kraven på en funktion (entydig u som uppfyller relationen för varje tänkbart z). f ger en binär relation (en relation mellan 2). R är en allmän relation (binär) som skrivs
wRz
Vänsterelementet i den här notationen motsvarar en pil vid R

Transport och unifiering

Givet någon information om ett värde (i form av en representation om osäkerheten om värdet) och givet en relation med en grannod. Då kan man säga något om värdet på grannoden. Denna process kallas transport, och man säger att man lägger ett bud på värdet hos grannoden.

Om en nod är kopplad till flera grannoder via relationer, kan det på det här sättet komma flera bud på nodvärdet. Dessutom kan det i noden själv finnas ett a-priori-bud på nodvärdet. Det kan då uppkomma en förhandling där man försöker finna ett uttalande som alla buden (budgivarna) kan enas om. Denna process kallas unifiering.

Efter unifieringen respekteras resultatet av förhandlingen av det omgivande nätverket, och resultatet kan nu transporteras vidare till andra noder, eller tillbaka till budgivarna. På så sätt sprids information genom nätet, och genuint ny information skapas när information möts från olika håll. Det finns en slags "Huygens princip" för information.

Givet en relation mellan x och y, så kan man alltid lägga ett bud på x, givet y, och man kan alltid lägga ett bud på y givet x. All möjlig trafik i ett relationsnätverk är därför dubbelriktad. Förbindelsen mellan noder är alltid ömsesidig. Detta hänger samman med den symmetriska naturen hos relationer. En relation är inte "från-till" utan "mellan". Om en relation beskrivs av en funktion, så kan man transportera information genom funktionen men också genom funktionens invers.

Representation av osäkerhet

Osäkerheten om nodvärdet i en nod kan representeras på olika sätt. Det tre mest närliggande är

  1. som stokastiska variabler
  2. som mängder
  3. med logiska predikat
Stokastiska variabler representeras i sin tur med hjälp av sannolikhetstätheter, och transport och unifiering blir operationer på dessa sannolikhetstätheter. Detta finns beskrivet här [pdf].

I mängdrepresentationen, finns i varje nod en mängd. Om mängden X finns i noden x, så betyder det utsagan

x X
Transport genom funktioner ges genom att applicera funktionen på mängden X. Om alltså relationen är y = f(x) och noden x rymmer mängden X, så blir budet YX på y:
YX = f(X)
Motsvarande kan göras för till exempel addition
ZXY = X + Y = {x + y | x X y Y }
För den allmännare binära relationen xRy har vi ett bud XY som
XY = { x | y Y : xRy }
Unifiering är mängdskärning.

Representationen med predikatlogik, innebär att det i varje nod finns ett predikat, dvs en funktion P, som avbildar varje tänkbart x-värde på sant eller falskt. Om P(ξ) är sann, så är ξ ett möjligt värde på x. Predikatrepresentationen överförs på mängdrepresentationen genom följande avbildningar

I fortsättningen beskrivs mängdrepresentationen, och mängderna i noderna ges samma namn som variablerna (dvs t.ex. små bokstäver).


Exempel på relationer

Cartesisk produkt

Givet två värden ξ och η ur två mängder, x och y, så finns det en parbildningsoperation, som ger paret (ξ,η). Mängden av alla par, som man kan bilda på detta sätt kallas den Cartesiska produkten mellan x och y och betecknas x × y:

x × y = { (ξ,η) | ξ x, η y }
Man kan se den Cartesiska produkten som att man applicerar parbildningsfunktionen (,) på mängder. Symboliskt
× = (,)s
Den Cartesiska produkten används för att bygga upp rum av högre dimensioner ur rum av lägre, t.ex. ett rum av ett golv och en höjd.

Den Cartesiska produktens invers är en projektion ner på rum av lägre dimension. Givet en mängd z och en mängd y och relationen z = x × y. Vad är budet på x ? Det korrektaste svaret är: Mängden av alla vänsterelement ur sådana par ur z, som har högerelement, som finns i y.
xzy = { ξ | (ξ,η) z, där η y }
Grafiskt kan det se ut på följande sätt:



Praktiskt behöver man inte göra unifieringen på detta sätt. Man kan utelämna kravet på att högerelementet i z måste tillhöra y. Då måste man först unifiera z från y och x och sedan x från z:



Observera att mängden z i de här figurerna inte skulle kunna uppstå som en Cartesisk produkt. En sådan mängd måste vara rektangulär. z måste komma från en annan del av nätet.



Om vi projicerar z på x och y, och sedan transporterar x och y tillbaka till z, så händer ingenting, för z har kvar sitt värde, och det blir kvar efter unifieringen, som är en mängdskärning. Men i det här nätet är processen att gå från z till z' informationsförstörande:



Den Cartesiska produkten avbildar den tomma mängden på den tomma mängden. Antag att
z = x × y
och att x = . z är då mängden av alla par bildade av ett element ur x och ett element i y. Men det finns inga element i x, och därför finns det inga par i z. Efter unifiering först till z och sedan till y, finns det inga element i y heller, dvs y = .

Grafrelationen

Grafen för en relation definieras av:

Graf(R) = {(x,y) | xRy }
alltså mängden av par (x,y) av x och y, som uppfyller relationen. I ett relationsnätverk är en relation implicit definierad av att man pekar ut 2 noder. Givet detta så kan man då beräkna grafen för den relationen och placera den som en mängd av par i en nod. Detta representerar en förbindelse mellan två skilda världar i ett relationsnätverk; dess noder och dess relationer. Sedan grafen bildats kan man använda den för att på nytt generera relationen genom att projicera grafen på en x-nod och en y-nod:



I praktiken måste man göra två tillägg till den här beskrivningen.



För att styra förgrovningen förser man först noden α med datastrukturen i den nedre delen av figuren, alltså en uppsättning eller lista av intervall. Om relationen kan beskrivas som en funktion, f, alltså om β = f(α), och noden α är laddad med intervall αi, så ges budet på den förgrovade grafen av
Gαβ = ii × f(αi))

Summa-relationen

Om vi har relationen

z = x + y
och noderna innehåller mängderna x och y, så blir budet
zxy= { ξ + η | ξ x, η y }
En förutsättning för att detta skall vara definierat är att elementen ξ och η går att addera. I allmänhet antar vi att detta är möjligt genom att de är medlemmar i ett vektorrum, dvs x och y är delmängder av vektorrum. I själva verket måste ju ξ och η vara medlemmar i samma vektorrum, och då t.ex. vara vektorer av samma dimension. Addition innebär en ökning av osäkerhet. Om det finns en osäkerhet både i x och y (så att varken x eller y är punktmängder), så blir osäkerheten om z ännu större. Figuren visar en summarelation mellan tre storheter i ett 2-dimensionellt vektorrum



Inversen till summa är differens. Differensen ökar också osäkerheten. Ur relationen z = x + y, kan vi lösa x = z - y, som kan skrivas x = z + -y. Detta är fortfarande addition, men med y speglat i origo. Om z och y givna enligt föregående bild får vi följande bild av budet på x:



Translationsrelationen

Relationen translation, skriven

x + y z
definieras av följande bud på x:
xzy = { ξ | ξ + y z }
Med ξ + y menar vi här translation av mängden y (som är en delmängd av ett vektorrum) med vektorn ξ (vi kunde också skriva det med samma mängdnotation som tidigare som {ξ } + y). x är allltså mängden av alla vektorer ξ sådana att y translaterat med detta ξ får plats i z. Här uttrycker y och z vanligtvis inte osäkerhet utan form. Det resultat vi får i x kan däremot uttrycka osäkerhet. Den vanliga användningen av relationen är att leta efter något som liknar y i en värld z. x ger oss positionen, men om x inte är en punktmängd, så har vi en osäkerhet om positionen hos det funna objektet. I världen z kan det också finnas flera "y", och i så fall blir x en mängd av flera åtskilda positioner. Eftersom y är en bekskrivning av något som vi letar efter, kallar vi y för en specifikation. Translationsrelationen är symmetrisk i x och y, och det är godtyckligt vilken av noderna x och y man låter vara specifikation, och ur vilken nod man tar ut resultatet. Man kan inte hitta ett föremål i z, som ser ut som y men är mindre än y med den här relationen. I så fall får man börja med först förstora mängderna i z genom att addera en storleksosäkerhet. Följande figur visar detta, och den visar också symbolen för translationsrelationen:



I följande exempelprogram visas mängden av translationer av en kub inuti i en pyramid. Tryck på return, så visas resultatet i gult. Tryck på return igen för att avsluta. Klicka sedan på "tillbaka" för att återvända.


Tidsuppdatering

Det finns inte någon, en gång för alla given, relation mellan ett nodvärde vid en tidpunkt, och samma nodvärde vid en annan tidpunkt. Ett dynamiskt system har dock en uppsättning variabler xi (tillståndsvariabler), som kan ses som koordinater för en punkt (tillståndet) i ett tillståndsrum. Den utmärkande egenskaper för tillståndsvariablerna (och också för tillståndet) är att det finns en relation mellan dessa för en tidpunkt och för en annan. Den tar formen av en funktion Φt1,t så att

xi(t1) = Φt1,t( {xi(t) })
System är vanligtvis tidsinvarianta så att Φ bara beror på t1 - t och inte på t1 och t var för sig. Om vi håller ihop alla tillståndsvariablerna i en n-dimensionell nod, x, så kan vi skapa ett nät, som beräknar tillståndet Δt tidsentheter längre fram.



Detta är nu en modell av systemet. I det sammanhanget kräver man också att tillståndvariablerna (eller tillståndet) skall karakterisera systemet så väl, att varje storhet, y, som modellen är relevant för, skall kunna beräknas ur x som h(x). Vi kan nu tänka oss att Δt är given, och att aktuell tid är underförstådd i systemet, så att x(t) kan kallas x. x(t+Δt) kallar vi då för x+ (nästa tid). Då kan vi rita modellen som:



Nu kan vi göra ett tidsskift, och låta den underförstådda tiden gå från t till t+Δt. Därmed är det noden x+, som innehåller rätt värde på x, så vi bör flytta värdet i x+ till x. Nu har det ingen betydelse vad x var tidigare, så vi skall inte unifiera med x, utan vi har en process, där vi direkt skriver i noden utan unifiering. Vi markerar detta med en pil in i noden, vilket vi annars aldrig har. y har inte längre något samband med vad y var tidigare, utan y skall räknas ut ur x genom unifieringar. Därför måste vi vid tidsskiftet sätta y till u (unknown).



Ett annat synsätt på detta visas i följande figur. Där betyder P i xP "previous" dvs. föregående värde. Tidsskiftet innebär att värdet i noden x "degraderas" till att representera föregående värde. Nuvarande värde kan vi nu skapa genom att unifiera genom funktionen Φ:



Noden y kan nu representera en storhet som vi kan mäta. Vi får in mätsignalen från omvärlden i en mätvärdesnod, men vi måste sedan uttrycka att mätapparaten kan mäta fel, genom att addera en osäkerhet till mätvärdet. Då får vi i noden y ett korrekt bud på storheten y. Vi kan också vara osäkra på om funktionen Φ verkligen ger oss en exakt prediktion av tillståndet, och vi kan uttrycka detta genom att addera en osäkerhet es någonstans. I figuren har vi ritat es som ett extra argument till Φ, som kan uttrycka externa men okända krafter etc.



Nu kan vi iterera fram x över tiden, men vi kan också dra slutsatser om x genom att transportera mätvärdena i y baklänges genom h och unifiera. Detta ser ut som ett Kalmanfilter. Om funktionerna Φ och h är lineära, och alla variabler är stokastiska variabler med Gaussisk fördelning initialt, och om mätfelen och störningarna, som vi här tar hänsyn till genom tilläget av osäkerheterna e och es, är Gaussiska vita brus, så blir alla variabler Gaussiska även i fortsättningen, och därmed är alla förutsättningarna uppfyllda för att man skall kunna använda ett Kalmanfilter. Om vi i vårt relationsnätverk representerar osäkerhet med stokastiska variabler, så blir detta system identiskt med ett Kalmanfilter. Detta visas här [pdf]. Men relationsnätverket fungerar även med godtyckliga fördelningar och olineära funktioner.

I Kalmanfiltret är det nödvändigt att bruset, tex. e är vitt. Här fungerar detta så här: Om vi unifierar noden e, så kan vi faktiskt bestämma e med en osäkerhet, som bestäms av vad vi har för osäkerhet om x. Men till nästa mättillfälle har vi ingen nytta av detta, om vi vet att bruset är vitt. Då måste vi i samband med tidsskiftet ladda om noden e med ett mått p brusets styrka. (Vi skall egentligen ladda e med u, men sedan får vi ansluta e till en nod, som är skyddad vid tidsskiftet, och som innehåller ett intervall, som svarar mot brusets styrka.) Men om bruset inte är vitt, så kan vi utnyttja detta, så att vi laddar e med ett värde som baseras på e's tidigare värde, men som tillför en osäkerhet. Med andra ord tillför vi en dynamikmodell för e av samma slag som för x. På så sätt kan vi hantera icke- vitt brus. I Kalmanfiltret får man istället göra så kallad noise whitening.


Mängdrepresentation

Sedan man beslutat sig för att representera osäkerhet med mängder, så återstår att i sin tur representera mängderna med någon datastruktur. Därefter söker man för en mängdoperaton, t.ex. , en motsvarande operation på datastrukturen, D, så att följande diagram kommuterar:



F är här den funktion, som för en given mängd ger motsvarande datastruktur. Man förväntar sig att F har en invers. I så fall har vi en isomorfism mellan mängdvärlden och datastrukturvärlden, och det är då också klart att varje operation i mängdvärlden har en motsvarighet i datastrukturvärlden. Svårigheten är bara att hitta den, och ingenjörsmässigt realisera den.

För att representera mängder, använder vi begreppet konvexa höljet. Om våra mängder är delmängder av ett vektorrum, så vet vi vad som menas med en rät linje. Speciellt vet vi vad som menas med en rät linje mellan två punkter P och Q. Vi identifierar punkter med ortsvektorer från ett givet origo till punkterna. Då är

LPQ(α) = P + α(Q-P)
en punkt på den räta linjen mellan P och Q, om α tillhör intervallet I=(0,1). Hela linjen är då LPQ(I). En mängd M är konvex om
LPQ(I) M om P M och Q M
Det konvexa höljet C(M) till M är nu den minsta konvexa mängd, som innehåller M.

Nu kan vi representera konvexa mängder M, som har plana sidor, som
C(mängden av hörnpunkter i M)
Mängder som inte har plana sidor kan godtyckligt väl approximeras med sådana här mängder.



De plana sidorna blir månghörningar, som kan ha tre eller fler kanter. Om de har fler än tre kanter, dvs inte är trianglar, kan de i alla fall delas upp i trianglar. Då är hela randen till mängden beskriven som en union av trianglar. Därför kallas denna representation för en triangulering av mängden (eller dess rand). Begreppet går tillbaka till Henri Poincaré.

Språkligt utgår den här beskrivningen från en 3-dimensionell värld, men själva representationen fungerar i godtyckliga dimensioner.

Icke-konvexa mängder får representeras som unioner av konvexa mängder, kallade u-komponenter. Hela representationen av en mängd består då av en uppräkning av tal p[i][j][k], där index i pekar ut en u-komponent, index j pekar ut en punkt i representationen av den u-komponenten, och k pekar ut den k:te koordinaten för den punkten.

Många operationer är lätta att applicera på den här representationen. Lineära funktioner f, realiserar man genom att avbilda varje punkt i representationen genom f. Om man tillämpar samma princip för icke lineära funktioner, så får man ett fel. f(M) har då icke-plana sidor, men den representation man får fram av f(M), har med nödvändighet plana sidor. Om felet blir för stort får man först representera M med flera punkter, alltså flera trianglar. En välartad funktion avbildar tillräckligt små trianglar på en ytor som är tillräckligt nära plan.

Man kan också utnyttja att de flesta operationer är dilationer, dvs sådana att de kommuterar med union. Då kan man utföra operationerna på varje u-komponent för sig. Resultatet är sedan unionen av de avbildade u-komponenterna, och det är underförstått redan i representationen.

Emellertid är representationen av mängdskärning, , en stötesten. För att realisera den går vi till en alternativ definition av konvexa höljet:
C(M) = skärningen av alla halvrymder som innehåller M
I tre dimensioner är en halvrymd det, som ligger på ena sidan av ett plan. Vi generaliserar ekvationen av ett plan till godtycklig dimension så här:
a0 + a1x1+ + a2x2+ ... + anxn = 0
Ekvationen för en halvrymd ges då av
a0 + a1x1+ + a2x2+ ... + anxn > 0
Om vi nu får "fel" sida av planet, så behöver vi bara byta tecken på alla ai. Av "alla" de halvrymder, som ingår i definitionen, så är de flesta överflödiga, därför att de blir överspelade av andra halvrymder i skärningsprocessen. De som inte är överflödiga är de som tangerar de plana ytorna som avgränsar figuren. Det är lättast att utgå från trianglarna i trianguleringen, men om en del trianglar är delar av en större plan yta, så får vi ett antal identiska halvrymder, vilket kan ge vissa tekniska problem.

Nu består representationen av ett antal koeffecienter a[i][j][k], där index i pekar ut en u-komponent, där j pekar ut en viss halvrymd för den u-komponenten, och k pekar ut en viss koeefecient i ekvationen för den halvrymden.

Låt nu en u-komponent Mi av M vara given. För den har vi en lista av halvrymder. För en u-komponent Nj av N har vi också en lista av halvrymder. Om vi sammanför dessa listor till en, så har vi halvrymdsrepresentationen av skärningen Mi Nj. Sedan kan vi bara utnyttja att union distribueras över skärning.
(Mi) (Nj) = ij (Mi Nj)
Vi behöver nu en funktion H som förvandlar en punktrepresentation till en halvrymdsrepresentation samt dess invers. Då har vi:
MD D ND = H-1(H(MD) H H(ND))

Bildrepresentationen

En bild kan ses som en tunn mängd av intensiteter, som "svävar" över ett pixelplan. Om man för varje pixel lägger till en osäkerhet i intensitet, får man en mängd, som inte är tunn. I princip bör man lägga till så mycket osäkerhet till varje pixel, att intensiteten inte diskontinuerligt hoppar från en pixel till dess granne. Nu representerar en bild ett skal av intensiteter som svävar över pixelplanet. En sådan mängd kan naturligtvis representeras på det sätt vi beskrivit förut, men det blir en slösaktig representation, där vi måste ange 8 hörnpunkter för varje pixel, och vi utnyttjar inte att x- och y-koordinaterna är bestämda i ett fixt gitter. Det är bättre att representera en bild som två matriser blij och buij, som ger nedre och övre intensitet för den pixel som har plats (i,j) i pixelgittret. Representationen med övre och nedre gräns för intensitet representerar en inskränkning, eftersom vi inte kan representera unioner av icke disjunkta intervall. Med denna representation införd, kallar vi den tidigare för en koordinatrepresentation.

Vi kallar också mängder som ges i koordinatrepresentation för koordinatmängder och mängder som ges i bildrepresentation för bildmängder (Oegentligt eftersom de är mängder, rätt och slätt) och vi tala också om koordinatnoder och bildnoder. Nu måste vi införa transformationer mellan de båda representationerna, och vi måste införa operationer på bilddatastrukturen, som svarar mot olika mängdoperationer. Bildrepresentationen är sådan att den också kan hantera färgbilder. I princip har vi då en mängd som hör hemma i R5 med två pixelkoordinater och 3 koordinater för en RGB rymd. Tekniskt placerar vi i bl och bu data för de tre färgerna packade i 1 dataord. Det betyder att vi för varje pixel kan representera en parallellepiped i RGB-rymden. Den karakteriseras av de båda ändarna av sin huvuddiagonal, som finns packade i bl resp bu. Det här innebär ytterligare en inskränkning av vad vi kan representera i bildrepresentationen.


Språket Retina

Ett särskilt språk har utvecklats för att realisera relationsnätverksfilter. Det heter Retina efter Relation Network Analyser, eller efter ett latinskt ord ung. retina som betyder nät. Numera skrivs det med XML-notation. Syntaxen beskrivs här med tecknen < och > utbytta mot [ och ] för att inte aktivera webbläsarens känslor för HTML-språket.

Mellan parenteserna [nodes] och [/nodes] står det alltså ett godtyckligt antal konstanter och variabler, gärna blandade i ordning. Strängen xxx är en värdeangivelse för att ange begynnelsevärde i noden i en speciell syntax. Denna value-del är valfri, och om inget värde anges, så tilldelas noden en representation för u="okänt" (unknown). Om man önskar en oövrskrivbar nod med värdet u, så kan det alltså vara relevant att införa en konstant utan att tilldela den något värde. Parentersrna [dim][/dim] innesluter variabelns dimension, dvs dimensionen på det vektorrum, där den är inbäddad. Om en nod rymmer en bildnod inkapslas den i en parentes med taggen 'image'. Bilderna placeras på fasta positioner (slots) i systemet, och vilken slot en viss bild hamnar i anges mellan parenteser med samma slots. Man kan lägga olika bilder på samma slot om man inte behöver dem samtidigt.

För relationerna finns en given uppsättning typer, som symboliseras med taggen RTYP. För relationerna anges de noder, som är anslutna till relationen, och hur många de är bestäms av relationen. Vissa relationer kan ha ett variabelt antal noder. Se mera här.

Instruktionerna styr hur transporter och unifieringar görs i nätet, men också hur resultat listas eller visas grafiskt. Det finns en given uppsättning instruktioner, som symboliseras med taggen ITYP. Olika instruktioner har olika slags argument, som innesluts med olika XML-parenteser med olika taggar. Se mera här.

Relationer i Retina

Följande relationer finns implementerade för koordinatnoder Beträffande bildnoder se här. Observera också att det inte finns någon graf-relation. Praktiskt har genereringen av en graf utförts som en grafinstruktion

Bildrelationer

Många av relationerna har en tolkning i termer av mängder, som egentligen inte skall påverkas av om mängderna är representerade på koordinatform eller bildform. Vissa relationer kan användas för konverteringar mellan de båda formerna. Vi kan ta Cartesisk produkt som ett exempel:

Bild = Pixelplan × Intensitet
I noden bild har vi en bildmängd. Om denna bildmängd har pixlar med tomma intensitetsmängder, så får vi i noden Pixelplan en binär bild, som är 0 där vi hade tom intensitet och 1 annars. De binära värdena 0 och 1 representeras på ett speciellt sätt, så att 0:orna kan tolkas som tomma intensiteter, och så att en visualisering av bilden kan göras. 1:orna representeras som vit färg. Men vi kan också ta ut resultatet som en koordinatmängd, genom att deklarera Pixelplan som en koordinatnod. Här får vi då ut mängden av pixelkoordinater, där Bild har en icke-tom intensitet. Det här blir normalt sätt en mängd med en komplicerad representation, så det är nödvändigt för systemet att på något sätt föra samman sammanhängande områden med 1:or. Givet en bild i noden Bild, kan vi också projicera ut dess intensitetsrepertoar eller färgrepertoar genom noden Intensitet. Men vi kan också skapa bilder genom att förse noden Pixelplan med en plan figur och noden Intensitet med en färg. Bild blir en bild med en enfärgad figur med tomma intensiteter därutanför, men vi kan bilda flera sådana bilder och ta unionen mellan dem.

Summarelationen är ytterligare ett exempel:

Bild = Bild1 + xyz
Om vi har koordinatrepresentationen för en punkt i xyz så får vi i noden Bild en förskjuten kopia av Bild1. Det följer av defintionen av summa. Vi kan förskjuta bilden även i intensitetsled genom att ha z-koordinaten i xyz skild från 0. Om vi låter xyz vara en 5 dimensionell mängd, så tolkas de tre sista koordinaterna som färgdkoordinater, och då kan vi förskjuta bilden i färg. Om xyz är en utbredd mängd, så blir Bild en suddig kopia av Bild1.

Om xyz också är en bild, så finns det en ortodox tolkning av hur Bild, skall beräknas utifrån definitionen av en summa av mängder
X + Y = { x + y | x X, y Y }
Den tolkningen, när X och Y är bildmängder kräver emellertid en enorm mängd beräkningar, och resultatet är också komplicerat och svårtolkat. Å andra sidan finns det ett behov av att lägga ihop 2 bilder pixel för pixel, och det är för denna tolkning som relationen används i Retina-systemet. I varje pixel görs additionen av intervall enligt definitionen av summa ovan.

Translationsrelationen skulle fungera också för bildmängder, och har en viktig uppgift för att leta efter mönster i bilder. På grund av tillämpningarna har dock delmängdsrelationen vänts från till , så att relationen skrivs

Bild S + xyz
Bild är här en bildnod. S är en koordinatmängd, som fungerar som en slags specifikation för vad vi letar efter i bilden. Budet på nod xyz är mängden av translationer (både i pixelled och intensitetsle) som är sådan att S innehåller Bild. Oftast är S en liten figur, som upptar en mindre del av bildytan. För att det skall fungera måste då S kompletteras utanför figuren med stora intensitetsintervall.



I figuren, som visar en en-dimensionell bild, är C bilden i nod Bild. A och B är utfyllnaderna med stora intensiteter utanför den sökta figuren. Den egentliga sökta figuren är rektanglarna mellan A och B.

För bilder är den kompletta processen med transport till ett bud och sedan unifiering mindre intressant. Rent praktiskt använder man bara transportprocessen och den innebär att det beräknade budet skrivs över det som fanns tidigare i noden. Det är också ovanligare i bildfallet att man använder relationer i båda riktningarna. Användningen av relationsnäten påminner då mera om traditionell signalbehandling genom "svarta lådor", och detta påverkar också sättet att beskriva relationerna i det följande.


Instruktioner i Retina

Följande instruktioner finns i Retina. I syntaxen ersätter de parenteserna med taggen ITYP med innehåll. Här anges instruktionernas namn och taggarna på de XML-parenteserna som innehåller argumenten.


Exekvering av Retina

Retina programmet XMLRNF är en Java-klass (men vid demonstrationerna här en Java-Applet), som har en egen "main"-rutin för exekvering. Om man anropar den skall man ange en fil med Retina-kod (i XML-form) som argument. Men man kan också kapsla in XMLRNF-klassen i vilket programsystem, som helst, och i så fall lämna "main"-rutinen oanropad. Då skapar men en instans av klassen med en konstruktor, som tar en retina-fil som argument. Man kan obehindrat skapa många relationsnätverk med olika retina-filer i samma system. Retina-filerna kan tilldela värden till noder, men det finns också metoder i klassen för att ladda noder med:

Sedan exekverar man relationsnätverket med Därefter kan man hämta ut data ur nätet med getrutiner: Nu kan man iterera nätet igen, efter att ha laddat nya indata. De noddata, som man inte laddar om, har kvar sina värden.


Exempel