Et kommunalt vannverk har det minste ingeniørmiljøet og de eldste navnekonvensjonene av alt på denne siden. Personen som satte opp tagnavnene, var en integrator på et prosjekt for femten år siden. Vedkommende kommer ikke tilbake, og det de visste, ble aldri skrevet ned noe sted som har overlevd.
To ting gjorde dette presserende og ikke bare rotete. NIS2 legger rapporteringsplikter på virksomheter som ikke har noen til å skrive rapporten, og angrepet på demningen i Bremanger i 2025 flyttet OT-robusthet fra en lysbildepresentasjon til et styrespørsmål. Begge stiller det samme første spørsmålet: hva har dere egentlig, og virker det fortsatt?
Det spørsmålet kan besvares ut fra tagger, verdier og det papirarbeidet som har overlevd, og det er nettopp det kompilatoren spiser. Denne siden sa før at vi ikke hadde kjørt på vann og ikke kom til å late som noe annet. Nå har vi kjørt på vann.
Nettet er C-Town, publisert sammen med BATADAL-konkurransen under CC BY 4.0: et referansedatasett for et distribusjonsnett basert på en virkelig mellomstor by, med et år med SCADA-målinger per time simulert fra den hydrauliske modellen, og modellen publisert ved siden av. Det er ikke data fra et vannverk i drift, og vi har ennå ikke kjørt på et. 43 tagger, 7 tanker, 11 pumper. Modellfilen er papirarbeidet, og kompilatoren åpner den aldri. Den brukes til å rette svarene, slik HAI-manualen gjør på riggsiden.
Det vanlige resultatet først. Uten noen vann-connector plasserer kompilatoren ingenting og avviser alle 43 taggene, som er det samme svaret den gir for enhver sektor den aldri har sett, og som er den ærlige formen på dette produktet. Med en connector, som er en tekstfil på 78 linjer og ikke en ny versjon, plasserer den 39 av 43 og får hver maskin riktig. Navnematching får også hver maskin riktig, fordi dette nettet skriver elementnavnene sine inn i taggene, og på størrelsen slår den oss 100 mot 93. Det kriteriet ble ikke oppfylt, og det rapporteres som ikke oppfylt.
Grunnen til at det ikke ble oppfylt, er den mer interessante halvdelen. De tre taggene vi mistet, er F_PU3, F_PU5 og F_PU9, og alle tre står flatt på null i hver eneste av de 4 177 timene. Det er reservepumper som aldri starter. Kompilatoren leser verdier i tillegg til navn, og en serie som ikke er annet enn null, ser nøyaktig ut som et av-signal, så den kalte dem statuser. Navnematching har rett om dem bare fordi den aldri ser etter: den leser F-en og sier strømning, og på en død kanal treffer den gjetningen tilfeldigvis.
Så kommer delen ingen konkurrent har. Hvilken pumpe som fyller hvilken tank, står ikke i noe tagnavn. F_PU2 og L_T1 har ikke ett tegn til felles som betyr noe, så ingen regulære uttrykk, ingen ordbok og ingen språkmodell som leser navn kan koble dem sammen. Svaret ligger i tallene: en tank som stiger mens en pumpe går, i et helt år. Med modellfilen lukket fikk kompilatoren seks av seks på det spørsmålet, og styringslogikken skrevet av dem som bygde nettet er enig i hver eneste en.
Én tank skulle den ha avvist, og det gjorde den ikke. T6 har ingen overvåket pumpe, og kompilatoren pekte på PU10 med en korrelasjon på 0,53. Det er ikke støy: PU10 leverer fem rør fra T6 og ti fra T7, tanken styringen faktisk nevner, så T6 ligger på hovedledningen PU10 pumper inn i. Svaret beskriver hydraulikken riktig og motsier styringsregelen, og kriteriet sa avvis. Det er ført opp som en feil, fordi det er det det er.
Den feilen er nå rettet, og rettelsen ga noe bedre enn det den rettet. Korrelasjon svarte på feil spørsmål: den finner området, og en tank som en pumpe fyller ser utenfra helt lik ut som en tank som bare ligger nedstrøms for en. Men en styrt tank gjør noe en nedstrøms tank ikke kan. Den kommanderer pumpen, og kommandoen er en terskel, så ved hver eneste innkobling står nivået i den styrende tanken på nesten samme verdi, mens nivået i alle andre tanker står der det tilfeldigvis står. Kjennetegnet er ikke korrelasjon, det er hvor tett verdiene ligger.
Tettheten gir tilbake tallet i tillegg til paret. Ikke bare at PU2 henger sammen med T1, men at PU2 starter når T1 faller forbi 1,0 meter og stopper ved 4,5. På en fil den aldri hadde sett, ble 5 av 5 pumper som går av og på ofte nok til å testes, koblet til tanken som styrer dem, T6 ble avvist, og de 10 gjenfunne tersklene lå i median 2 centimeter fra tallene i nettets egen modell. 3 av de 10 traff det oppgitte tallet på centimeteren.
Det tok tre forhåndsregistrerte kjøringer å komme dit, og én av dem feilet. Den første estimatoren var skjev, alltid mot midten av tanken, fordi i det øyeblikket en pumpe starter slutter tanken å falle og begynner å stige, så målingen etter innkoblingen ligger over der tanken var på vei. Rettelsen av den skjevheten ga mer støy, og det samme tallet ble brukt både til å velge tank og til å oppgi terskelen, så den nøyaktige versjonen begynte å avvise pumper den skjeve hadde koblet riktig. Å velge krever et stabilt tall og å rapportere krever et forventningsrett tall, og det er ikke det samme tallet. Hver kjøring er skrevet ned, også den som gikk bakover.