feat: model core, launcher, reproduction check and the first two skills

The core in modell/kjerne/ is an unmodified copy of sim.py, diagnose.py and
forlop.py from den-dynamiske-rettsstaten @2badc25, pinned by sha256.
kjor.py is the single entry point; kontroll.py reproduces the note's 22 data
files and printed results. Skills: diagnose and forlop (Norwegian).

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-11-11 13:53:32 +01:00
commit 464ad38b49
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
51 changed files with 11207 additions and 0 deletions

126
docs/forbehold.md Normal file
View file

@ -0,0 +1,126 @@
# Forbehold
Forbeholdene ved modellen, diagnosen, forløpet og de norske eksempeltallene. De er hentet fra notatet *Den dynamiske
rettsstaten* (avsnitt 9.8 og 10, vedlegg C), README i notatets repo og koden i `modell/kjerne/` (commit 2badc25).
Ferdighetene tar med de forbeholdene som gjelder for svaret de gir.
## Modellen som helhet
- **Ikke kalibrert på norske data.** Parameterne er stiliserte (tabell 3 i notatet). Simuleringene illustrerer
mekanismer. De er ikke prognoser. Notatet sier at modellen verken er kalibrert eller validert, og at tre av premissene
ikke er påvist: at norsk rettshåndhevelse pendler mellom over- og underhåndhevelse, at domstolen er kjedens bindende
ledd, og at måleproblemet kan løses slik modellen forutsetter.
- **Simuleringene regner på kjernen, ikke hele rammeverket.** Av notatets 39 nummererte ligninger er 18 implementert,
12 forenklet og 9 ikke implementert (vedlegg C). Ikke implementert er blant annet forskyvning mellom kategorier,
lovbryternes strategiske tilpasning, måleligningen, de makroøkonomiske driverne, målfunksjonen og lovgivers
handlingsrom. Se `docs/modellkart.md`.
- **Feilfrie observasjoner.** Alle simuleringer antar et feilfritt estimat; forsinkelsen er eneste
måleimperfeksjon. Resultatene er enkeltbaner uten parameterusikkerhet.
- **Bare ett ledd har kø.** I notatets simuleringer er det domstolen; i `forlop` er det leddet som binder i dine tall.
Etterforskning, påtale og straffegjennomføring har ellers verken kø, frafall eller kapasitet i modellen.
- **Kostnader er ikke regnet i kroner.** Målfunksjonen er stilt opp, men ikke brukt. Ingen kostnader eller gevinster
er tallfestet, og modellens størrelser er normaliserte, ikke årsverk eller kroner.
- **Beslutningsreglene er stiliserte.** Reglene for påtale og budsjett er representasjoner av hvordan myndighetene kan
svare på det de ser, ikke beskrivelser av dagens praksis. Nivåene avhenger av terskler, forsterkninger og
ledetider; det som er robust, er mekanismene.
- **Andelen som kan ledes utenom** er i praksis bestemt av sakenes art og av hjemlene i straffeprosessloven. Den er
et rettspolitisk valg, ikke en styringsparameter.
## Diagnosen (`diagnose`)
- **Saksbeh.tid** er restanse delt på kapasitet, ikke målt saksbehandlingstid. Kolonnen vises bare når målet er
oppgitt som saksbehandlingstid (`maal_tid`).
- **Bevilget kapasitet som ikke virker ennå, regnes ikke med.** Oppgi kapasiteten som virker nå, og trekk det som
allerede er bevilget, fra behovet.
- **Behovet er et grovt anslag.** Det dimensjoneres etter prognosen for strømmen (eller strømmen nå, når ingen prognose
er oppgitt), med restansen over målet avviklet over 24 måneder og 95 % utnyttelse som mål. Tallene 24 og 0,95 er
faste valg i notatets koordinerte regel, ikke noe som er målt.
- **«Utnytt leddet»** (fjerne tapt tid i skranken) er første tiltak, men regnes ikke.
- **Like ledd skilles ikke.** Har to ledd samme utnyttelse på to desimaler, velger verktøyet leddet der restansen vokser
raskest i forhold til kapasiteten, og sier at forskjellen er for liten til å skille leddene.
- **Leddene etter skranken** viser bare det som slipper gjennom den. Når skranken løses, kan innstrømningen dit øke.
- **Saksenheter.** Hvert ledd har sine egne enheter; bare utnyttelsen kan sammenlignes på tvers av ledd.
- **Verktøyet regner på tallene slik de er oppgitt.** Det vurderer ikke om de er riktige eller hvor usikre de er.
## Forløpet over tid (`forlop`)
- **Hva som er dine tall, og hva som er modellens.** Kapasitet, restanse og saksbehandlingstid følger tallene i fila.
Kriminalitet, tillit og politiets innsats følger modellens stiliserte parametere, som ikke er kalibrert på norske
data. Rekkefølgen og retningen er poenget, ikke tallene.
- **Leddet regnes som domstolen i notatet.** Leddet som binder, legges inn som modellens ledd med kø, det som tar imot
sakene politiets innsats gir. For leddene etter regner skriptet bare hva flere avgjorte saker betyr hvis de får
sakene sine gjennom skranken. Hvor sakene som ledes utenom havner, er ikke regnet. Leddene foran vises som politiets
innsats og andelen ledet utenom.
- **Restansen legges inn direkte.** Forløpet starter i restansen i fila, også når den har vokst i årevis. Kriminalitet,
tillit og politiets innsats starter likevel fra modellens egen forhistorie: et ledd i balanse, en varig økning og
første budsjettvedtak høyst 15 måneder senere. For en restanse som har vokst lenger enn det, kommer virkningen av
lang saksbehandlingstid først etter start i modellen. Skriptet sier fra når det gjelder. Er restansen i fila lavere
enn det modellen kan ha med denne kapasiteten, starter forløpet i modellens minste restanse, og skriptet sier fra.
- **Store restanser.** Modellen legger halvparten av virkningen av en sak til tidspunktet saken avgjøres. Når en stor
restanse avvikles, faller kriminaliteten i modellen derfor under nivået før økningen, og skriptet skriver ut et
forbehold. Med tallene i eksempelfila skjer det ved en restanse mellom 3 750 og 4 000 saker at forløpet ikke lenger
regnes (se under).
- **Sammenligningen uten tiltak** får samme tillegg eller fradrag i restansen som forløpet med tiltak. Den starter
høyere når modellen har ledet saker utenom før første vedtak, og skriptet skriver ut hvor den starter.
- **Stabilitetssjekken** gjelder likevekten før økningen og bruker modellens stiliserte tall for hvor fort innsatsen
virker: innsatsen fjerner 10 % av kriminaliteten per måned, og 2 % faller fra av seg selv.
- **«Nå»** er første budsjettvedtak etter økningen. Tallene det bygger på, er 3 måneder gamle, som tallene i fila.
- **Innstrømningen før økningen** antas å være 95 % av kapasiteten når `innstromning_for_okning` ikke er oppgitt.
- **Kapasitet som blir stående.** Kapasitet som ble bestilt for å avvikle restansen, kan bli stående etterpå, fordi
regelen først bygger ned når utnyttelsen er under 0,85. Skriptet sier fra når det skjer.
### Når forløpet ikke regnes
Skriptet skriver «Forløp: ikke regnet» med grunnen, og stabilitetssjekken står fortsatt, når:
- **styringen er ustabil**: forsinkelsen er lengre enn den kritiske. Da finnes det ingen ny balanse å dimensjonere
etter. Styringen må rettes først;
- **prognosen ikke faller til ro** innen 36 måneder (prognosen med dobbel horisont avviker mer enn 1 %): styringen er
for nær grensen eller for treg;
- **kriminaliteten i modellen faller under 0,80 eller politiets innsats under 0,50** av nivået før økningen mens
restansen avvikles. Da gjelder diagnosen alene.
Skriptet skriver «Forløp: ingen ledd binder» når ingen ledd er over full utnyttelse og ingen restanse vokser.
Det stopper med en melding, uten forløp, når tallene ligger utenfor det modellen dekker: innstrømningen før økningen
ligger utenfor 86–98 % av kapasiteten, prognosen er ikke høyere enn innstrømningen før økningen eller mer enn om lag 3
ganger så høy, eller modellens regel ville gjort vedtak før økningen var observert. Se `docs/inndata.md`.
## De norske eksempeltallene (`eksempler/norge_2025.json`)
Fra README i notatets repo:
- **Fengselstallene er anslag.** Kriminalomsorgen oppgir ikke direkte hvor mange dommer som ble iverksatt i fengsel.
Avgangen er regnet fra at 5 180 iverksatte saker i samfunn var 58 % av alle iverksatte saker i 2025, altså om lag
3 750 i fengsel. Innstrømningen er avgangen pluss køveksten fra oktober 2025 til oktober 2026. Utnyttelse over 1
betyr derfor bare at dommer kom inn raskere enn de ble iverksatt. Den sier ikke hvor fulle fengslene er: belegget
var 91 % ved utgangen av oktober 2026.
- **Fengselstallet er følsomt for hva som regnes med.** Køen er uten dem som venter på soning med fotlenke. Med hele
soningskøen (657 mot 284) blir utnyttelsen 1,10. Regnes fotlenke med både i køen og i avgangen, blir den 1,06, og da
ligger politi og påtale høyest.
- **Politiets tall og SSBs tall teller ikke det samme.** Politiets driftsstatistikk har 348 534 anmeldte lovbrudd og
349 450 påtaleavgjorte saker. SSBs offisielle statistikk har 308 438 etterforskede lovbrudd og holder utenfor om lag
35 300 anmeldelser som ble henlagt utenfor straffesak. Regnes kapasitetshenleggelsene som SSBs andel (9,8 % av de
etterforskede lovbruddene) i stedet for som et antall, blir utnyttelsen for politi og påtale 1,11 i stedet for 1,09.
- **Kapasitetshenleggelsene er en registrert begrunnelse.** Det meldes om forholdsvis store forskjeller mellom
politidistriktene i bruken av henleggelseskoder. Riksadvokatens rundskriv om henleggelser (nr. 2/2025) gjelder fra
1. januar 2026, så tall fra 2026 kan ikke uten videre sammenlignes med tidligere år.
- **Politi og påtale og fengsel ligger likt (1,09).** Forskjellen mellom de to leddene er mindre enn usikkerheten i
tallene, så diagnosen skiller dem ikke. Regnes kapasitetshenleggelsene ikke som saker som ikke ble behandlet, er
utnyttelsen for politi og påtale 1,00.
- **Kapasitetsbehovet for fengsel** (om lag 15 % mer, 358 mot 313 iverksettelser i måneden) er et grovt anslag. Om lag
9 % skal til for å holde følge med strømmen; resten er margin, fordi verktøyet dimensjonerer til 95 % utnyttelse.
- **Forløpet for fengsel** (15 % mer kapasitet nå og 7 % til året etter) er modellens stiliserte dynamikk lagt på norske
størrelser, ikke en prognose. Det starter i køen på 596 dommer, som er under målet på to måneder (625).
- **Ingen uavhengig bekreftelse.** Diagnosen bygger på de samme kildene som notatet.
## Hva pluginen ikke gjør
- Den erstatter ikke budsjettarbeidet. Den viser hvor kjeden binder, hvilken type tiltak som følger, og omtrent hvor
stort tiltaket bør være.
- Den sier ingenting om enkeltsaker eller enkeltpersoner. Modellen brukes på kategorier og aggregerte tall, aldri til å
forutsi enkeltpersoners atferd (notatet, avsnitt 9.8). Bruk bare aggregerte tall, aldri persondata.
- Den beslutter ikke. Modellen anbefaler; ansvarlige myndigheter beslutter og begrunner eventuelle avvik.
- Den foreslår ikke å endre straffebud eller strafferammer. Straffebud og strafferammer ligger fast. Det som tilpasses,
er prioriteringer, innsats, organisering, prosess og valg av reaksjon innenfor lovens rammer.
- Den lager ikke prognoser og kalibrerer ikke modellen mot norske tidsserier.
- Den regner ikke kostnader eller gevinster i kroner.
- Forebygging er ikke en beslutningsvariabel i modellen, så den kan bare anbefale tiltak i straffesakskjeden.

168
docs/inndata.md Normal file
View file

@ -0,0 +1,168 @@
# Inndata for `diagnose` og `forlop`
`diagnose` og `forlop` leser samme fil: en JSON-fil med ett objekt per ledd i straffesakskjeden. Denne siden
beskriver hvert felt slik kjernens kode leser det (`modell/kjerne/diagnose.py`: `sjekk`, `analyser`, `TALLFELT`;
`modell/kjerne/forlop.py`: `les_styring`, `modell`). Kjernen er en uendret kopi av koden i notatet *Den dynamiske
rettsstaten* (commit 2badc25).
## Enheter
| Hva | Enhet |
|---|---|
| Strømmer (innstrømning, kapasitet, skjult avgang) | saker per **måned** |
| Beholdninger (restanse, restansemål) | saker (et antall, ikke per måned) |
| Tider (mål for saksbehandlingstid, forsinkelse) | måneder |
| Andeler | desimaltall mellom 0 og 1 (0.2 betyr 20 %) |
Tall skrives med punktum som desimaltegn og uten tusenskille: `29044.5`, ikke `29 044,5`.
## Oppbygning
```json
{
"merknad": "fri tekst, valgfritt",
"styring": {"forsinkelse": 3, "reaktivitet": 3},
"ledd": [
{"navn": "Politi", "innstromning": 150, "kapasitet": 175, "restanse": 300, "maal_tid": 2},
{"navn": "Domstol", "innstromning": 134.32, "kapasitet": 105.263, "restanse": 588.95, "maal_tid": 3,
"prognose_innstromning": 134.32, "maks_andel_utenom": 0.2}
]
}
```
- `ledd` (påkrevd): en liste med minst ett ledd, **i kjedens rekkefølge**. Rekkefølgen brukes: leddene etter
skranken omtales som leddene som får sakene sine gjennom den, og `forlop` regner hva flere avgjorte saker betyr
for dem.
- `styring` (valgfritt): brukes bare av `forlop`. Se under.
- Andre felt på øverste nivå (for eksempel `merknad` og `kilder`) leses ikke av koden. Bruk dem til å skrive ned
hvor tallene kommer fra.
## Feltene i hvert ledd
| Felt | Påkrevd | Enhet | Standard | Brukes til |
|---|---|---|---|---|
| `navn` | ja | tekst | – | navnet i utskriften; `forlop` kan velge leddet med dette navnet |
| `innstromning` | ja | saker/mnd | – | utnyttelsen, og restanseveksten når `restanse_for_12_mnd` mangler |
| `kapasitet` | ja | saker/mnd | – | det leddet kan avgjøre per måned **slik det virker nå** |
| `restanse` | ja | saker | – | saker i kø nå |
| `maal_tid` | ett av de to | mnd | – | mål for saksbehandlingstid; restansemålet blir `maal_tid` × `kapasitet` |
| `restanse_maal` | ett av de to | saker | – | akseptabel restanse; brukes i stedet for `maal_tid` når begge er oppgitt |
| `prognose_innstromning` | nei | saker/mnd | `innstromning` | strømmen når balansen er gjenopprettet; kapasiteten dimensjoneres etter den |
| `maks_andel_utenom` | nei | andel, under 1 | 0 | hvor stor andel av sakene som kan ledes til forenklede reaksjoner |
| `restanse_for_12_mnd` | nei | saker | – | restansen for tolv måneder siden; gir observert vekst i restansen |
| `skjult_avgang` | nei | saker/mnd | 0 | saker som avsluttes uten behandling og som er regnet med i `kapasitet` |
| `innstromning_for_okning` | nei | saker/mnd | 95 % av kapasiteten | bare `forlop`: strømmen før den begynte å øke |
Krav som kontrolleres før regningen (`sjekk`):
- `navn`, `innstromning`, `kapasitet` og `restanse` må finnes, og `maal_tid` eller `restanse_maal`.
- `navn` må være tekst.
- Alle tallfeltene må være tall som er 0 eller større og endelige. `true`/`false` godtas ikke.
- `kapasitet` minus `skjult_avgang` må være større enn 0.
- `maks_andel_utenom` må være mindre enn 1.
Brudd på kravene gir en norsk melding som sier hvilket ledd og hvilket felt det gjelder, og ingen regning.
**Feltnavn med skrivefeil blir ikke oppdaget.** Koden leser bare feltene over og ser bort fra alt annet. Står det
`prognose_innstrømning` (med ø) eller `maks_andel_utenfor`, regner verktøyet stille med standardverdien. Feltnavnene
skrives uten æ, ø og å, nøyaktig som i tabellen.
## Hvordan feltene brukes i regningen
Med Z = `kapasitet` − `skjult_avgang` (avgangen med behandling):
| Størrelse | Regnes som |
|---|---|
| Utnyttelse | `innstromning` / Z |
| Saksbeh.tid | `restanse` / `kapasitet`. Vises bare når målet er `maal_tid`; med `restanse_maal` står det «-». Det er ikke målt saksbehandlingstid |
| Restansemål | `restanse_maal`, ellers `maal_tid` × `kapasitet` |
| Restansevekst per måned | (`restanse` − `restanse_for_12_mnd`) / 12, ellers `innstromning` − `kapasitet` (minst 0) |
| Restanse over målet | `restanse` − restansemålet (minst 0) |
| Skranken som binder | høyest utnyttelse på to desimaler; er den lik, leddet der restanseveksten er størst i forhold til Z |
| Leddet binder | utnyttelsen er over 1, eller restansen vokser |
| Utnyttelse med saker ledet utenom | (1 − `maks_andel_utenom`) × `prognose_innstromning` / Z |
| Kapasitetsbehov | ((1 − `maks_andel_utenom`) × `prognose_innstromning` + restanse over målet / 24) / 0,95 |
Kapasitet bestilles bare når (1 − `maks_andel_utenom`) × `prognose_innstromning` + restanse over målet / 24 er større
enn Z. Faste verdier i regningen, som i notatets koordinerte regel (`ENDO` i `sim.py`): målutnyttelse 0,95, restansen
avvikles over 24 måneder, og bestilt kapasitet virker gradvis fra 6 til 24 måneder etter vedtak.
## `styring` (bare `forlop`)
| Felt | Enhet | Standard | Tillatt | Betyr |
|---|---|---|---|---|
| `forsinkelse` | mnd | 3 | over 0, høyst 60 | tiden fra kriminalitetsbildet endrer seg til innsatsen er endret (statistikk, beslutning, iverksetting) |
| `reaktivitet` | – | 3 | over 0, høyst 50 | prosent mer innsats per prosent avvik fra målet (3 betyr at 10 % over målet gir 30 % mer innsats) |
Uten `styring` brukes regime A i notatet (3 og 3), og `forlop` sier fra om det. Står `styring` i fila, men ett av
feltene mangler, brukes standardverdien for det feltet uten merknad.
## Hva `forlop` krever i tillegg
`forlop` legger leddet som binder (eller leddet du velger med navn) inn som modellens ledd med kø. Det stopper med en
melding når tallene ligger utenfor det modellen dekker:
- Innstrømningen før økningen (`innstromning_for_okning`, eller 95 % av Z når feltet mangler) må ligge mellom 86 og
98 % av Z. Utenfor det ville modellens regel ha endret kapasiteten allerede før økningen.
- `prognose_innstromning` (eller `innstromning`) må være høyere enn innstrømningen før økningen, og ikke mer enn om
lag 3 ganger så høy.
- Restansemålet må være større enn 0 (`maal_tid` eller `restanse_maal` over 0).
Leddet velges med navnet slik det står i fila, med samme store og små bokstaver, mellomrom og komma.
## Vanlige feil
**Årstall i stedet for månedstall.** Strømmene (`innstromning`, `kapasitet`, `skjult_avgang`, `prognose_innstromning`,
`innstromning_for_okning`) er per måned. Årstall deles på 12. Beholdningene (`restanse`, `restanse_for_12_mnd`,
`restanse_maal`) deles **ikke** på 12: de er antall saker på et tidspunkt. `maal_tid` er i måneder (60 dager er 2).
**Kapasitet som ikke virker ennå.** `kapasitet` er det leddet avgjør per måned nå. Kapasitet som er bevilget, men ikke
virker ennå, skal ikke med. Trekk den fra behovet verktøyet regner ut.
**Kapasitet med skjult avgang.** Er tallet for kapasitet hentet fra avgjorte saker, og noen av dem ble avsluttet uten
behandling (for eksempel henlagt på grunn av manglende kapasitet), oppgis de som `skjult_avgang`. Verktøyet trekker dem
da fra kapasiteten. Trekk dem ikke fra selv i tillegg, og oppgi ikke `skjult_avgang` hvis `kapasitet` ikke inneholder
dem.
**`maal_tid` eller `restanse_maal`.** `maal_tid` passer når restansen er hele køen og målet er en saksbehandlingstid.
`restanse_maal` passer når målet er et antall saker, eller når restansen bare er en del av køen (for eksempel saker
eldre enn tre måneder). Oppgis begge, brukes `restanse_maal`, og `maal_tid` blir stående ubrukt.
**Andel som prosent.** `maks_andel_utenom` er en andel: `0.2`, ikke `20`.
**Saksenheter.** Hvert ledd kan telle i sine egne enheter (anmeldelser, saker, dommer). Bare utnyttelsen sammenlignes
på tvers av ledd.
## Eksempelfilene
### `eksempler/eksempel_domstol.json`: stiliserte tall
Tallene er ikke norske. Domstolen er modellens tall i måned 24 i avsnitt 9.5 i notatet (`sim.py`, koordinert regel),
ganget med 1000: innstrømning og prognose 134,32 saker/mnd, kapasitet 105,263 (0,10/0,95 × 1000), og restanse 588,95,
som er restansen over målet (273,16) pluss 3 × kapasiteten. De tre andre leddene er satt under full utnyttelse for å
vise diagnosen. `styring` er regime A (forsinkelse 3, reaktivitet 3).
| Ledd | Innstrømning | Kapasitet | Restanse | Mål | Annet |
|---|---|---|---|---|---|
| Politi | 150 | 175 | 300 | 2 mnd | |
| Påtale | 140 | 160 | 200 | 1,5 mnd | høyst 10 % utenom |
| Domstol | 134,32 | 105,263 | 588,95 | 3 mnd | prognose 134,32; høyst 20 % utenom |
| Kriminalomsorg | 90 | 100 | 150 | 2 mnd | |
`diagnose` gir utnyttelse 1,28 i domstolen og 19 % mer kapasitet, som i avsnitt 9.5. `forlop` gir kritisk forsinkelse
7,2 måneder, 19 % mer kapasitet nå og 12 % til året etter.
### `eksempler/norge_2025.json`: offentlige norske tall
Årstall delt på 12. Kilden til hvert tall står i feltet `kilder` i fila, og tall merket «anslag» der er utledet, ikke
oppgitt i kilden. Tallene for politi og domstoler gjelder 2025. For fengsel er avgangen fra 2025 og køen fra oktober
2025 og oktober 2026.
| Ledd | Slik er feltene brukt |
|---|---|
| Politi og påtale | `restanse` er saker eldre enn tre måneder, så målet er `restanse_maal` (10 % av innkomne saker). `skjult_avgang` er lovbrudd henlagt på grunn av manglende saksbehandlingskapasitet (30 334 / 12). |
| Tingrett, meddomsrett | innkomne og avgjorte saker per måned, `maal_tid` 3; `restanse_for_12_mnd` er et anslag |
| Lagmannsrett, bevisanke | to kategorier lagt sammen; `restanse_for_12_mnd` er et anslag |
| Fengsel | `kapasitet` (iverksettelser i fengsel) og `innstromning` (avgang pluss køvekst) er anslag; `maal_tid` 2 (60 dager) |
`diagnose` gir utnyttelse 1,09 for politi og påtale, 1,04 for tingretten, 0,88 for lagmannsretten og 1,09 for fengsel.
Forbeholdene ved disse tallene står i `docs/forbehold.md`.

269
docs/modellkart.md Normal file
View file

@ -0,0 +1,269 @@
# Modellkart
Kartet beskriver modellen i notatet *Den dynamiske rettsstaten* slik koden i `modell/kjerne/` regner den, ved
**commit 2badc25** i notatets repo (`2badc25e5134ee26309bd8c3bd008ac64afe55a4`). Filene i `modell/kjerne/` er
byte-like kopier av `paper/sim.py`, `paper/diagnose.py` og `paper/forlop.py` ved den commiten, så linjenumrene i
notatets vedlegg C gjelder `modell/kjerne/sim.py` direkte. Verdiene under er lest fra koden. Ligningsnumre, tabeller og
avsnitt er notatets.
Kartet er for den som vil endre modellen: hva tilstanden er, hvor parameterne står, hvilke ligninger koden regner, og
hvilke kontroller som skal holde etter en endring.
## (a) Tilstandsvariabler og avledede størrelser
Tidsenhet: måned. Nivåene er normalisert slik at referanselikevekten har K = 1, T = 1 og Λ = 0,80.
| I koden | Symbol | Betyr | Merknad |
|---|---|---|---|
| `t` | t | tid i måneder | Euler-steg `DT` = 0,05 |
| `K` | K_obj | vektet objektiv kriminalitetsbelastning | 1 i referansen; i `simulate_chain2` er K = K_A + K_B |
| `KA`, `KB` | K_A, K_B | belastning fra alvorlige (A) og øvrige (B) saker | bare `simulate_chain2`; startverdier 0,4 og 0,6 |
| `U` | U | opplevd trygghet | start 0,80 |
| `L` | Λ | tillit | start 0,80; holdes innenfor [10⁻⁴, 1 − 10⁻⁴] etter hvert steg |
| `T` | T | innsats (politiets) | proporsjonal regel T = T₀ + k_p (K(t − τ) − K*), begrenset til [0, T_max]; eller MPC |
| `Q` | Q_D | kø i domstolen (modellens ledd med kø) | normaliserte enheter; aldri negativ |
| `QA`, `QB` | Q_A, Q_B | kø per sakstype | bare `simulate_chain2` |
| `tauD` | τ_D | saksbehandlingstid = m_D + Q_D / Z_D | `tauA`, `tauB` per sakstype |
| `JD` | J_D | innstrømning til domstolen = ξ_D F | lign. (27) |
| `RD` | R_D | avgjorte saker = Z_D Q_D / (Q_D + m_D Z_D) | lign. (28) |
| `Fa`, `F` | F | fjerningsstrøm = `removal(K, L, T)` | lign. (12) og (12′) |
| `Z` | Z_D | kapasitet i domstolen | `ZD0` = 0,10 / 0,95 før sjokket; endogen i `simulate_endo` |
| `xi` | ξ_D | andel saker til domstolen (1 − andel ledet utenom) | ≥ `xi_min` = 0,8 i reglene |
| `q` | q | prosessuell kvalitet | bare kvalitetssløyfen i `simulate_endo` |
| `g` | g | virkning av lang saksbehandlingstid = D / (D + τ_h), D = max(0, τ_D − τ_D^ref) | lign. (30) |
| `Omega(t, p)` | Ω | strukturelt pådrag | Ω₀, ganget med `shock` fra `t_shock` |
| `tau_ref` | τ_D^ref | saksbehandlingstid i utgangslikevekten | 3 måneder |
| `tau` | τ | forsinkelse i politiets sløyfe | argument; et helt antall tidssteg |
| `kp` | k_p | reaktivitet i den proporsjonale regelen | argument, standard 3,0 |
Ligningene slik koden regner dem (`deriv`, `deriv_chain`, `deriv_chain_xz`, `court`):
- K′ = Ω (1 + χ_D g) − (1 − ξ_D ϑ) F − ϑ R_D − δ K. Uten kjede (`deriv`): K′ = Ω − F − δ K.
- F = γ′ Λ^η T K / (1 + K / K_sat), γ′ = γ (1 + 1 / K_sat). Med K_sat = ∞ er F = γ Λ^η T K.
- U′ = κ_U (U_eq − U), U_eq = U₀ − ψ (K − 1), begrenset til [0, 1].
- Λ′ = κ_Λ (Λ₀ + μ₁ (U − U₀) + μ₃ q − μ₄ g − Λ) − μ₂ Λ · max(0, T − T_prop K)², T_prop = 1,6.
- Q_D′ = J_D − R_D − ς_D Q_D.
## (b) Parameterne
### `P`: grunnmodellen (`sim.py`, l. 27–40; tabell 3)
| Navn | Verdi | Enhet | Betyr | I notatet |
|---|---|---|---|---|
| `gamma` | 0,125 | per mnd | effektivitet per enhet tiltak; gir γΛT = 0,10 i likevekt | γ; lign. (12), avsnitt 4.3 |
| `eta` | 1,0 | – | tillitselastisitet | η; lign. (12) |
| `delta` | 0,02 | per mnd | naturlig avgang | δ; lign. (12) |
| `Omega0` | 0,12 | per mnd | strukturelt pådrag ved referansen (gir K = 1 ved T = 1, Λ = 0,8) | Ω₀; lign. (6), avsnitt 3 |
| `shock` | 1,30 | faktor | varig økning i Ω (0,12 → 0,156) | avsnitt 8.1 |
| `t_shock` | 12,0 | mnd | når økningen begynner | avsnitt 8.1 |
| `T0` | 1,0 | – | grunninnsats | T₀; lign. (11), avsnitt 4.2 |
| `Tmax` | 3,0 | – | kapasitetstak for innsatsen | T^max; lign. (11), (23) |
| `Kstar` | 1,0 | – | målnivå for K | K*; lign. (11) |
| `kU` | 0,25 | per mnd | trygghetens tilpasningsrate | κ_U; lign. (20), avsnitt 6.1 |
| `U0` | 0,80 | – | trygghet i referansen | U₀; lign. (20) |
| `psiU` | 0,30 | – | hvor mye trygghet faller per enhet K over 1 | ψ; lign. (20) |
| `kL` | 0,10 | per mnd | tillitens tilpasningsrate | κ_Λ; lign. (21), avsnitt 6.1 |
| `mu1` | 0,50 | – | tillitens følsomhet for trygghet | μ₁; lign. (21) |
| `mu2` | 0,30 | – | tillitstap ved uforholdsmessig innsats | μ₂; lign. (21) |
| `Tprop` | 1,6 | – | grense for forholdsmessig innsats, T_prop(K) = 1,6 K | T_prop; lign. (21) |
| `Lam0` | 0,80 | – | tillit i referansen | Λ₀; lign. (21) |
| `ksat` | ∞ | – | politiets halvmetningsnivå (Holling type II); 3 og 1,5 i robusthetsanalysen | K_sat; lign. (12′), avsnitt 8.3, tabell 5 |
Andre konstanter i `sim.py`:
| Navn | Verdi | Betyr |
|---|---|---|
| `DT` | 0,05 mnd | tidssteg (eksplisitt Euler) |
| `TEND` | 120,0 mnd | horisont for `simulate`, `simulate_chain`, `simulate_chain2`, `simulate_soc`; standard for `simulate_endo` |
| `UPS0` | 0,95 | domstolens utnyttelse før sjokket |
| `TAU_REF` | 3,0 mnd | saksbehandlingstid i utgangslikevekten |
| `ZD0` | 0,10 / 0,95 ≈ 0,105 | domstolens kapasitet før sjokket |
| `VARSIGMA` | 0,01 per mnd | frafall fra køen (henleggelse, foreldelse) |
| `J0` | 0,10 | fjerningsstrømmen i referansen, γ Λ₀ T₀ |
| `MD` | ≈ 0,233 mnd | ren behandlingstid m_D, kalibrert i lukket form slik at τ_D = 3 i utgangslikevekten (l. 155) |
MPC (`mpc_step`, `mpc_step_chain`; lign. (24), avsnitt 6.3 og 8.1): horisont `H` = 24 mnd, vekt på innsatsavvik
`lamT` = 0,05, vekt på tillitsbrudd `lamL` = 20, myk tillitsgrense Λ₀ − 0,05 = 0,75. Beslutningen tas hver måned.
### `CH0`: domstolen som ledd med kø (l. 157–158; tabell 3, avsnitt 7.3 og 8.2)
| Navn | Verdi | Betyr | I notatet |
|---|---|---|---|
| `Z` | `ZD0` ≈ 0,105 | kapasitet | Z_D; lign. (28) |
| `m` | `MD` ≈ 0,233 mnd | ren behandlingstid | m_D; lign. (28) |
| `theta` | 0,5 | andel av virkningen som krever dom | ϑ; lign. (29) |
| `chi` | 0,15 | største økning i Ω av lang saksbehandlingstid (celerity) | χ_D; lign. (30), tabell 4 |
| `mu4` | 0,12 | største tillitstap av lang saksbehandlingstid | μ₄; lign. (30) |
| `tauh` | 9,0 mnd | halvmetningstid for g | τ_h; lign. (30) |
| `varsigma` | 0,01 per mnd | frafall fra køen | ς_D; lign. (28) |
| `xi` | 1,0 | andel saker til domstolen | ξ_D; lign. (27) |
| `Zfun`, `xifun` | `None` | tidsplan for kapasitet og andel (funksjoner av t) | scenario 3–5, avsnitt 8.2 |
| `dbr` | `None` | trommel–buffer–tau: innsatsen begrenses slik at J_D ≤ `dbr` · Z_D (0,95 i scenario 6 og 7) | lign. (32) |
### `CH2`: domstol med to sakstyper (l. 352–354; avsnitt 8.3, tabell 6)
| Navn | Verdi | Betyr |
|---|---|---|
| `Z`, `m`, `chi`, `mu4`, `tauh`, `varsigma` | som `CH0` | |
| `c` | 1 | antall parallelle spor (10 i robusthetsanalysen, med `m` kalibrert av `calibrate_m`) |
| `prio` | `True` | A-saker har forrang; `False` gir felles kø (FIFO) |
| `piA` | 0,4 | alvorlige sakers andel av K |
| `thetaA`, `thetaB` | 0,8, 0,3 | andel av virkningen som krever dom, per sakstype (vektet 0,5) |
| `xiA`, `xiB` | 1,0, 1,0 | andel saker til domstolen, per sakstype |
| `Zfun`, `xiBfun` | `None` | tidsplaner |
| `dbr` | ikke satt | leses med `ch2.get("dbr")`; trommel–buffer–tau via T |
Lign. (33). `c` = 1 gir R = Z Q / (Q + m Z) eksakt; `c` > 1 bruker Erlang C (`erlang_L`, `rho_of_L`).
### `SOC`: rekruttering og vippepunkt (l. 439; avsnitt 8.4, figur 8)
| Navn | Verdi | Betyr |
|---|---|---|
| `eps` | 0,30 | styrken i rekrutteringsleddet ε |
| `Kh` | 2,0 | halvmetningsnivå K_h |
| `pexp` | 4 | bratthet ϱ |
Lign. (34): Ω_soc = ε K^ϱ / (K_h^ϱ + K^ϱ). `simulate_soc` rekalibrerer Ω₀ slik at K = 1 fortsatt er likevekt, og har et
forbigående sjokk: faktor `shock` = 1,6 i månedene `t_on` = 12 til `t_off` = 36.
### `ENDO`: beslutningsreglene (l. 515–530; tabell 3, avsnitt 8.5)
| Navn | Verdi | Betyr | I notatet |
|---|---|---|---|
| `lagD` | 3,0 mnd | observasjonsforsinkelse for kjedestatistikk | τ_D^obs |
| `xi_min` | 0,8 | gulv: høyst 20 % av sakene til forenklede reaksjoner | ξ_min; lign. (35), (37) |
| `tau_thr` | 6,0 mnd | terskel for observert saksbehandlingstid (desentral regel) | τ_D^gr; lign. (35) |
| `k_xi` | 0,2 / 12 per mnd | forsterkning for påtalepraksis (0,2 per år) | k_ξ; lign. (35) |
| `tau_xi` | 6,0 mnd | tidskonstant for endring av påtalepraksis | τ_ξ |
| `ups_star` | 0,95 | målutnyttelse ved dimensjonering | υ*; lign. (36), (37) |
| `ups_hi`, `ups_lo` | 1,0, 0,85 | dødsone: bestill over 1, bygg ned under 0,85 | tabell 3 |
| `kZ` | 1,0 | budsjettforsterkning (1 = hele gapet bestilles) | k_Z; lign. (36) |
| `L1`, `L2` | 6,0, 24,0 mnd | bestilt kapasitet virker lineært fra 6 til 24 mnd etter vedtak | τ_Z |
| `tau_down` | 36,0 mnd | tidskonstant for nedbygging | τ_ned |
| `T_clear` | 24,0 mnd | restansen avvikles over denne tiden (koordinert regel) | H_Q; lign. (37) |
| `H_pred` | 36,0 mnd | prognosehorisont | H_p; lign. (37) |
| `period` | 12,0 mnd | budsjettsyklus | |
| `qloop` | `False` | kvalitetssløyfen av eller på | avsnitt 8.5 |
| `mu3` | 0,5 | tillitsvirkning av q | μ₃; lign. (21) |
| `Lam_star` | 0,78 | tillitsmål for kvalitetssløyfen | Λ* |
| `k_q` | 1 / 12 per mnd | forsterkning (1 per år) | k_q |
| `q_max` | 0,2 | øvre grense for q | q_max |
| `lag_survey` | 3,0 mnd | publiseringsforsinkelse for den årlige tillitsmålingen | |
### Faste verdier i scenarioene (`if __name__ == "__main__"`)
`T_TILTAK` = 24 (vedtak i måned 24), `T_UTV` = 24 (utvidelsen realiseres over 24 mnd), `XI_UND` = 0,8, `ZD_UTV` = 1,34
(+34 % kapasitet), `XI_B_UND` = 1 − 0,2 / 0,6 ≈ 0,67 (20 % av alle saker er 33 % av klasse B), `TEND4` = 180 mnd for
reglene i avsnitt 8.5.
### Konstanter i `diagnose.py` og `forlop.py`
`diagnose.py` bruker ingenting fra `sim.py` og har **egne kopier** av regelverdiene: `UPS_STAR` = 0,95, `UPS_HI` = 1,0,
`T_CLEAR` = 24,0, `L1`, `L2` = 6,0, 24,0. Endres `ENDO` i `sim.py`, må disse endres likt, ellers regner diagnosen og
forløpet med ulike regler. `forlop.py` bruker `ENDO` direkte for regelen og `diagnose.T_CLEAR`/`diagnose.UPS_STAR` for
behovet det sammenligner med.
`forlop.py`: `NAA` = 24 (modellmåneden for første budsjettvedtak), `OBS` = `NAA` − `lagD` = 21, `SLUTT` = 180 mnd,
`LAM_MYK` = Λ₀ − 0,05 = 0,75, `K_GULV` = 0,80 og `T_GULV` = 0,50 (under dette regnes forløpet ikke), `UPS_FOR_MIN` =
`ups_lo` + 0,01 = 0,86 og `UPS_FOR_MAKS` = 0,98 (tillatt utnyttelse før økningen), `RADER` (månedene i tabellen).
`forlop.py` har en egen kopi av regnestegene i `simulate_endo` (`simuler`, bare `koord` og `sched`) og kontrollerer i
hver kjøring at den gir bit for bit samme svar som `simulate_endo` når restansen ikke legges inn. Endres
`simulate_endo`, må `simuler` endres likt.
## (c) Ligning → funksjon → status
Fra notatets vedlegg C (tabell 12). Av de 39 nummererte ligningene er 18 implementert, 12 forenklet og 9 ikke
implementert. *Implementert*: koden regner ligningen slik den står, i aggregert form (n = 1). *Forenklet*: koden regner
et spesialtilfelle eller en enklere form. *Ikke implementert*: ligningen hører til rammeverket, men ingen simulering
bruker den.
| Ligning | Avsnitt | Hva | Kode (`sim.py`) | Status |
|---|---|---|---|---|
| (1) | 1 | naiv beslutningsregel T ← f(K, O) | `simulate`, l. 66–86; regelen l. 73–75 | forenklet: f er proporsjonalregelen (11), O er K forsinket med τ |
| (2) | 2.1 | vektet objektiv kriminalitet K_obj | `simulate_chain2`, l. 369–428 (K = K_A + K_B, l. 395) | forenklet: to kategorier, allerede alvorlighetsvektet; ellers n = 1 |
| (3) | 2.3 | effektivt kriminalitetspress K̃ | – | ikke implementert: reglene svarer på K_obj |
| (4) | 2.4 | måleligningen | – | ikke implementert: feilfritt estimat |
| (5) | 3 | makrovektor E | – | ikke implementert |
| (6) | 3 | strukturelt pådrag Ω | `Omega`, l. 45–46; `simulate_soc`, l. 466 | forenklet: eksogent, Ω₀ = 0,12, +30 % fra måned 12 (+60 % i månedene 12–36 i figur 8) |
| (7) | 4.1 | tiltaksvektoren v | `simulate_endo`, l. 564–653 | forenklet: (T, ξ_D, Z_D, q), én kategori, bare domstolsleddet |
| (8) | 4.1 | observasjonene O | `simulate_endo`, l. 582–588 og 609–611 | forenklet: K forsinket med τ, kjedestatistikk med 3 mnd, tillit årlig med 3 mnd |
| (9) | 4.1 | beslutningsregelen Ψ | `simulate_endo`, l. 590–641 | forenklet: reglene i 8.5; tilstanden er den sanne, forsinket |
| (10) | 4.2 | forsinkelsen τ | `simulate`, l. 70, og tilsvarende | forenklet: én parameter (3, 6 eller 11 mnd) |
| (11) | 4.2 | styringsregelen (PID) | `simulate`, l. 75; `simulate_chain`, l. 218; `simulate_chain2`, l. 397; `simulate_soc`, l. 463; `predict_F`, l. 557; `simulate_endo`, l. 583 | forenklet: bare det reaktive leddet og metningen (k_i = k_d = 0, T_max = 3) |
| (12) | 4.3 | kriminalitetsdynamikken | `deriv`, l. 57–58, med `removal`, l. 49–54; Euler-steget l. 82 | implementert |
| (12′) | 4.3 | fjerning med metning F_sat | `removal`, l. 49–54 | implementert (γ′ = γ(1 + 1/K_sat)); Z_E regnes ikke ut særskilt |
| (13) | 4.4 | dempning a og reaktivitet b | l. 686–688; l. 827–831 | implementert: a = 0,12, b = 0,30 |
| (14) | 4.4 | kritisk forsinkelse τ_c | `critical_delay`, l. 128–132; største stabile k_p, l. 694–695 | implementert: τ_c = 7,2 mnd; k_p ≈ 2,3 ved τ = 11 |
| (15) | 4.4 | tommelfingerregelen | l. 696; l. 724–726 | implementert: k_p < 1,4 ved τ = 11 |
| (13′) | 4.4 | a og b med metning | l. 839–848; l. 874–876 | implementert |
| (16) | 5.1 | forventet nytte | – | ikke implementert |
| (17) | 5.1 | oppdagelsesrisiko | – | ikke implementert (fjerningsraten svarer til intensiteten h, l. 399) |
| (18) | 5.1 | deltakelse | – | ikke implementert: pådraget er eksogent |
| (19) | 5.2 | forskyvning mellom kategorier | – | ikke implementert |
| (20) | 6.1 | trygghet U | `deriv`, l. 59–60, og tilsvarende | implementert |
| (21) | 6.1 | tillit Λ | `deriv`, l. 61–62; μ₃q i `deriv_chain_xz`, l. 543–544 | implementert; μ₃ = 0 utenom kvalitetssløyfen |
| (22) | 6.2 | samfunnsøkonomisk målfunksjon | – | ikke implementert: MPC minimerer et udiskontert kvadratisk tap over 24 mnd (l. 119–120) |
| (23) | 6.3 | skranker | metningen i regelen; MPC, l. 120 og 123 | forenklet: bare 0 ≤ T ≤ T_max og Λ ≥ 0,75 (myk) |
| (24) | 6.3 | MPC | `mpc_step`, l. 89–125; `mpc_step_chain`, l. 240–265 | forenklet: ett konstant innsatsnivå over H = 24, ingen sluttkostnad |
| (25) | 7.1 | lovgivers handlingsrom | – | ikke implementert: T_max er fast |
| (26) | 7.2 | utnyttelse og køtid per ledd | `court`, l. 167–178; utskrift l. 732–738 og 783–786 | forenklet: bare domstolsleddet |
| (27) | 7.2 | J_D = ξ_D F | `deriv_chain`, l. 182–184; `deriv_chain_xz`, l. 535–536; `simulate_chain2`, l. 407–408 | implementert |
| (28) | 7.3 | domstolskøen R_D, τ_D | `court`, l. 167–178; `init_chain`, l. 195–203; m_D l. 154–155 | implementert: m_D = 0,233, τ_D^ref = 3 |
| (29) | 7.3 | K med domstol | `deriv_chain`, l. 187 | implementert |
| (30) | 7.3 | tilbakekoblingene g, Ω^eff, Λ₀ − μ₄g | `court`, l. 176–177; `deriv_chain`, l. 186 og 191 | implementert |
| (31) | 7.3 | a og b med mettet domstol | l. 826–834 | implementert (sluttilstanden i scenario 2) |
| (32) | 7.5 | kapasitetsskranker i kjeden | `simulate_chain`, l. 226–230; `simulate_chain2`, l. 400–406 | forenklet: bare J_D ≤ 0,95 Z_D, håndhevet ved å begrense T |
| (33) | 8.3 | prioritert kø med to sakstyper | `court2`, l. 329–344; `capfun`, l. 320–326; `simulate_chain2` | implementert; i tillegg FIFO og c = 10 spor |
| (34) | 8.4 | rekruttering | `hill`, l. 442–443; `simulate_soc`, l. 451–476; `soc_equilibria`, l. 479–491 | implementert |
| (35) | 8.5 | påtalemyndighetens regel for ξ | `simulate_endo`, l. 598–604 og 640 | implementert |
| (36) | 8.5 | budsjettregelen for Z | `simulate_endo`, l. 614–621 og 628–639 | implementert |
| (37) | 8.5 | den koordinerte regelen | `simulate_endo`, l. 605–608 og 622–634; `predict_F`, l. 548–561 | implementert |
| – | 8.5 | sløyfen for q | `simulate_endo`, l. 609–612 og 641 | implementert |
Merknadene i vedlegg C sier mer om hvert punkt, blant annet hvor koden avviker fra teksten i små ting (grensen på
3 k_ξ per måned i (35), at nedbyggingsmålet i (36) står til ny kapasitet bestilles, og at q også justeres ned).
## (d) De fem simulatorene
Alle integreres med eksplisitt Euler, `DT` = 0,05. Alle tar parameterne som `p` (standard `P`), så en endring gjøres
med `dict(P, navn=verdi)`. `simulate`, `simulate_chain`, `simulate_chain2` og `simulate_soc` bruker den globale `TEND`;
`simulate_endo` har argumentet `tend`, med standardverdien `TEND` slik den var da `sim.py` ble lest inn.
| Funksjon | Dekker | Styring | Datafiler i notatets kjøring | Figur / tabell |
|---|---|---|---|---|
| `simulate(controller, tau, p, kp)` | grunnmodellen uten kjede: K, U, Λ, T | `"P"` eller `"MPC"` | `p3`, `p6`, `p11`, `mpc11`, `p11d`; `sat_B`, `sat_C` (med `ksat` 3 og 1,5) | figur 4 (regime A–E); figur 7 venstre (`sat_C`); tabell 5 |
| `simulate_chain(controller, tau, ch, p, kp, mpc_knows_chain)` | domstolen som ledd med kø, med tidsplaner (`Zfun`, `xifun`) og trommel–buffer–tau (`dbr`) | `"P"` eller `"MPC"` | `kjede_s1`–`kjede_s5` | figur 6; tabell 4 |
| `simulate_chain2(tau, ch2, p, kp)` | domstol med to sakstyper, forrang eller FIFO, c spor | proporsjonal regel | `prio_s2`, `prio_s3`, `prio_s5` | figur 7 høyre; tabell 6 |
| `simulate_soc(controller, tau, p, s, kp, shock, t_on, t_off)` | rekruttering og vippepunkt, forbigående sjokk | `"P"`, ellers fast T = T₀ | `vippe` | figur 8 |
| `simulate_endo(policy, tau, p, ch, e, kp, tend, xi_sched, Z_sched)` | endogene tiltak: ξ_D, Z_D og q bestemt av regler | politiet: proporsjonal regel; kjeden: `"sched"`, `"desentral"`, `"desentral_prog"`, `"koord"` | `endo_e5`, `endo_des`, `endo_desp`, `endo_ko` | figur 9; tabell 7 og 10 |
Regimene i figur 4: A = `p3` (k_p = 3, τ = 3), B = `p6` (τ = 6), C = `p11` (τ = 11), D = `mpc11` (MPC, τ = 11), E =
`p11d` (k_p = 1,2, τ = 11). `stab.dat` og `thumb.dat` (figur 5) kommer fra `critical_delay` og tommelfingerregelen, ikke
fra en simulering. `sat_B` og `prio_s5` skrives, men brukes ikke i figurene. Det er 22 datafiler i alt.
Kolonner: `p*`, `p11d`: `t K U L T`; `kjede_s*`: `t K U L T Q tauD`; `sat_*`: `t K Ks3 Ks15`; `prio_s*`: `t K KA KB tauA
tauB tauF KF KAF`; `vippe`: `t fast p3 p6 p3cap p6cap`; `endo_*`: `t K L T Z xi tauD q` (Z relativt til `ZD0`);
`stab`, `thumb`: `kp tauc`. Tidsseriene skrives med hver tiende rad (`write_csv`, hver halve måned).
I tillegg: `pure_capacity_loop` (ren kapasitetssløyfe, merknad 4; bare utskrift), `predict_F` (prognosen den
koordinerte regelen bruker) og `soc_equilibria` (likevektene i avsnitt 8.4).
## (e) Grensetilfellene koden skriver ut
Regelen i notatet: hver utvidelse har et grensetilfelle som gjenskaper grunnmodellen. `sim.py` skriver ut avviket.
Tallene under er fra en kjøring av `modell/kjerne/sim.py` med notatets låste versjoner (numpy 2.5.4, scipy 1.18.1), der
alle 22 datafilene ble byte-like notatets.
| Kontroll | Utskrift | Største avvik |
|---|---|---|
| `simulate_chain` med Z_D = ∞ gjenskaper regime A–D (`p3`, `p6`, `p11`, `mpc11`) | Del 2, «grensetilfelle: reproduksjon av regime A-D» | 0 for `p3`; høyst 3,8·10⁻¹⁵ i K og 2,9·10⁻¹⁴ i T |
| `simulate_chain` med endelig Z_D og ϑ = χ_D = μ₄ = 0 gjenskaper regime A (køen regnes, men virker ikke tilbake) | samme sted | 0 |
| `simulate_chain` med stor, endelig Z_D (1 og 10) nærmer seg regime A | samme sted | 4,7·10⁻³ og 3,6·10⁻³ i K (ikke et eksakt grensetilfelle) |
| `simulate` med K_sat = ∞ gjenskaper regime A–C; `simulate_chain` gjenskaper scenario 2 | Del 3 (a) | 0 |
| `simulate_chain2` med FIFO, ϑ_A = ϑ_B = 0,5 og c = 1 gjenskaper scenario 2 | Del 3 (b), «kontrolltall» | 2,2·10⁻¹⁵ i K, 2,8·10⁻¹³ i τ |
| `calibrate_m` med c = 1 gir `MD` | samme sted | 0,2330 mot 0,2330 |
| `simulate_endo("sched")` gjenskaper scenario 2, og med tidsplanene scenario 5 | Del 4, «faste tidsplaner gjenskaper scenario 2 og 5» | 0 |
`simulate_soc` har ingen utskrevet grensetilfelle. `forlop.py` kontrollerer sin egen kopi mot `simulate_endo` i hver
kjøring (bit for bit, se over). Den som endrer kjernen, kjører kontrollene på nytt og ser at avvikene fortsatt er 0
eller på avrundingsnivå, og at de 22 datafilene er byte-like med mindre endringen skal endre resultatene.