De vervaldatum PlancapaciteitGeldigTotEnMet werkt sinds #682 op de hele zeef. De trede valt daarbuiten, en daar weegt plancapaciteit zwaarder dan in de zeef.
Waar het zit
De trede-assen worden in cfg/main/Templates/VariantData_T/Trede.dms:63-113 opgebouwd, in VariantData en dus zichtjaaronafhankelijk. De ladders staan in cfg/main/VariantParameters/Tredes/Wonen.dms:27 en :94 en in cfg/main/VariantParameters/Tredes/Werken.dms:31, :89 en :124. Ze worden verzilverd in cfg/main/Templates/Allocatie/IterSubsector_T.dms:80-83 en cfg/main/Templates/Allocatie/IterSubsector_T_Wonen.dms:86. Daarnaast staat er een tweede, losse plancapaciteitsvoorrang in IterSubsector_T.dms:68-73, in de keuze tussen werksubsectoren die dezelfde cel boven hun zaaglijn hebben.
Hoe zwaar de as weegt
Drie dingen bepalen dat samen, en ik heb ze alle drie nagelopen.
Ten eerste de volgorde binnen de ladder. Trede_T.dms:82 kiest met ArgMin de laagst genummerde klasse die waar is, dus de rijvolgorde van de combine-unit is de voorrangsvolgorde.
Ten tweede welke as het zwaarst weegt. In combine(A, B) varieert het eerste argument het langzaamst. Gemeten met een losse dms op GeoDms20.17.0.m, drie bij twee:
rij 0: a0_b0 rij 2: a1_b0 rij 4: a2_b0
rij 1: a0_b1 rij 3: a1_b1 rij 5: a2_b1
Het eerste argument is dus het zwaarste cijfer. PlancapaciteitPlusStimuli staat bij wonen vooraan, en bij nijverheid en logistiek ook.
Ten derde hoe hard de trede de geschiktheid overstemt. IterSubsector_T.dms:83 maakt er een strikt lexicografische ordening van, met TredeScore * Geschiktheid_Ordered_range + Geschiktheid_Ordered en Geschiktheid_Ordered_range = max(Geschiktheid_Ordered) + 100. Een cel in een hogere trede gaat dus altijd voor op elke cel in een lagere trede, ongeacht de geschiktheid.
Per subsector:
| subsector |
ladder |
positie plancapaciteit |
| wonen, alle vier de varianten |
Tredes/Wonen.dms:27 en :94 |
eerste as |
| nijverheid en logistiek |
Tredes/Werken.dms:124 |
eerste as, en de ladder heeft er maar twee |
| de drie verzorgende subsectoren |
Tredes/Werken.dms:31 |
tweede as, onder WoongebiedK |
| zakelijke dienstverlening |
Tredes/Werken.dms:89 |
tweede as, onder BestaandKantoorK |
De as zelf is een union_unit van vier klassen op volgorde: binnen hard plan, binnen zacht plan, binnen stimuli, daarbuiten (Tredes.dms:100). Voor wonen telt de ladder 144 treden, en 216 in NbSGenuanceerd omdat BBGK daar vervangen is door BBGPlusKansrijkWoningbouw. Harde plannen bezetten daarmee de bovenste 36 respectievelijk 54 treden.
Waarom dit niet klopt
Een hard plan is een onherroepelijk bestemmingsplan of een verleende vergunning. Dat is een uitspraak met een looptijd van jaren, niet van een eeuw. Het model kiest in 2120 nog steeds bij voorrang een locatie omdat een gemeente daar in 2023 een plan had liggen, en dat is een patroon dat geen enkele provincie of gemeente terugkent. Sinds #682 vervalt de restrictievrijstelling wel vanaf Y2060, dus de twee mechanismen die op dezelfde plankaart leunen spreken elkaar nu tegen.
De bovenste trede eet zichzelf ook niet leeg. Afgelezen op de bestaande BAU-uitdraai van Y2050 uit de productiereeks, niet vanavond opnieuw gedraaid: van de 24.369 ha harde wonen-plancapaciteit was aan het eind van Y2050 ongeveer 9.658 ha gealloceerd en ruim 14.700 ha nog niet. Een vervaljaar zet de rangorde daar dus echt om.
Het grotere punt eronder
De hele ladder staat op het basisjaar stil, niet alleen de plancapaciteit-as. Trede.dms:141 leest BBG uit BaseData, :158-173 de OV-bereikbaarheid, :133-139 het eigendom en :180 het bouwterrein. Geen van die assen wordt bijgewerkt met wat het model zelf bouwt. Een wijk die het model in 2040 neerzet is in 2050 nog steeds geen bestaand bebouwd gebied en telt daar dus nog steeds als uitbreiding.
Alleen de plancapaciteit-as laten vervallen repareert een van de vijf assen. Dat is wel de as met de grootste sprong, want hij staat vooraan, maar het betekent dat de ladder vanaf 2060 volledig op de wereld van 2023 blijft rusten.
Wat ik ga doen
De basisjaarzeef kreeg bij #682 een tweede uitkomst naast de eerste, en de zichtjaarzeef kiest er per zichtjaar een van. Voor de trede kan hetzelfde: een tweede trede-container waarin de plancapaciteitsvlaggen in Trede/src op FALSE staan, en IterSubsector_T die er per zichtjaar een van kiest via het meta-item TredeK op :37. Ik heb het idioom container src_zonder := src { <overschrijvende items> } los getoetst en dat werkt: het overschreven item volgt de nieuwe definitie, de rest wordt geerfd.
De cellen zakken dan binnen dezelfde BBG-, OV-, eigendoms- en grondgebruikcombinatie naar de stimuli-trede of de restcategorie. Bij wonen is dat een sprong van trede 0 tot 35 naar 72 tot 143. Bij nijverheid en logistiek blijft er van de ladder vrijwel niets over, want daar is plancapaciteit de enige inhoudelijke as; de plek van nieuwe bedrijventerreinen wordt dan volledig door de empirische geschiktheid bepaald. Dat laatste is een grotere ingreep dan bij wonen en zet ik daarom achter dezelfde vervaldatum maar met een aparte schakelaar.
Openstaande punten
- moet de trede-voorrang met dezelfde vervaldatum uitfaseren als de restrictievrijstelling, of met een eigen jaartal?
- geldt dat ook voor nijverheid en logistiek, waar de ladder daarmee tot twee treden terugvalt?
- moet de tweede voorrang in
IterSubsector_T.dms:68-73, de keuze tussen werksubsectoren, dezelfde vervaldatum krijgen?
- moeten de vier andere trede-assen dynamisch worden gemaakt, te beginnen bij BBG? Dat is een eigen verbouwing en niet in dit issue meegenomen.
De vervaldatum
PlancapaciteitGeldigTotEnMetwerkt sinds #682 op de hele zeef. De trede valt daarbuiten, en daar weegt plancapaciteit zwaarder dan in de zeef.Waar het zit
De trede-assen worden in
cfg/main/Templates/VariantData_T/Trede.dms:63-113opgebouwd, in VariantData en dus zichtjaaronafhankelijk. De ladders staan incfg/main/VariantParameters/Tredes/Wonen.dms:27en:94en incfg/main/VariantParameters/Tredes/Werken.dms:31,:89en:124. Ze worden verzilverd incfg/main/Templates/Allocatie/IterSubsector_T.dms:80-83encfg/main/Templates/Allocatie/IterSubsector_T_Wonen.dms:86. Daarnaast staat er een tweede, losse plancapaciteitsvoorrang inIterSubsector_T.dms:68-73, in de keuze tussen werksubsectoren die dezelfde cel boven hun zaaglijn hebben.Hoe zwaar de as weegt
Drie dingen bepalen dat samen, en ik heb ze alle drie nagelopen.
Ten eerste de volgorde binnen de ladder.
Trede_T.dms:82kiest metArgMinde laagst genummerde klasse die waar is, dus de rijvolgorde van de combine-unit is de voorrangsvolgorde.Ten tweede welke as het zwaarst weegt. In
combine(A, B)varieert het eerste argument het langzaamst. Gemeten met een losse dms op GeoDms20.17.0.m, drie bij twee:Het eerste argument is dus het zwaarste cijfer.
PlancapaciteitPlusStimulistaat bij wonen vooraan, en bij nijverheid en logistiek ook.Ten derde hoe hard de trede de geschiktheid overstemt.
IterSubsector_T.dms:83maakt er een strikt lexicografische ordening van, metTredeScore * Geschiktheid_Ordered_range + Geschiktheid_OrderedenGeschiktheid_Ordered_range = max(Geschiktheid_Ordered) + 100. Een cel in een hogere trede gaat dus altijd voor op elke cel in een lagere trede, ongeacht de geschiktheid.Per subsector:
Tredes/Wonen.dms:27en:94Tredes/Werken.dms:124Tredes/Werken.dms:31WoongebiedKTredes/Werken.dms:89BestaandKantoorKDe as zelf is een
union_unitvan vier klassen op volgorde: binnen hard plan, binnen zacht plan, binnen stimuli, daarbuiten (Tredes.dms:100). Voor wonen telt de ladder 144 treden, en 216 in NbSGenuanceerd omdatBBGKdaar vervangen is doorBBGPlusKansrijkWoningbouw. Harde plannen bezetten daarmee de bovenste 36 respectievelijk 54 treden.Waarom dit niet klopt
Een hard plan is een onherroepelijk bestemmingsplan of een verleende vergunning. Dat is een uitspraak met een looptijd van jaren, niet van een eeuw. Het model kiest in 2120 nog steeds bij voorrang een locatie omdat een gemeente daar in 2023 een plan had liggen, en dat is een patroon dat geen enkele provincie of gemeente terugkent. Sinds #682 vervalt de restrictievrijstelling wel vanaf Y2060, dus de twee mechanismen die op dezelfde plankaart leunen spreken elkaar nu tegen.
De bovenste trede eet zichzelf ook niet leeg. Afgelezen op de bestaande BAU-uitdraai van Y2050 uit de productiereeks, niet vanavond opnieuw gedraaid: van de 24.369 ha harde wonen-plancapaciteit was aan het eind van Y2050 ongeveer 9.658 ha gealloceerd en ruim 14.700 ha nog niet. Een vervaljaar zet de rangorde daar dus echt om.
Het grotere punt eronder
De hele ladder staat op het basisjaar stil, niet alleen de plancapaciteit-as.
Trede.dms:141leestBBGuit BaseData,:158-173de OV-bereikbaarheid,:133-139het eigendom en:180het bouwterrein. Geen van die assen wordt bijgewerkt met wat het model zelf bouwt. Een wijk die het model in 2040 neerzet is in 2050 nog steeds geen bestaand bebouwd gebied en telt daar dus nog steeds als uitbreiding.Alleen de plancapaciteit-as laten vervallen repareert een van de vijf assen. Dat is wel de as met de grootste sprong, want hij staat vooraan, maar het betekent dat de ladder vanaf 2060 volledig op de wereld van 2023 blijft rusten.
Wat ik ga doen
De basisjaarzeef kreeg bij #682 een tweede uitkomst naast de eerste, en de zichtjaarzeef kiest er per zichtjaar een van. Voor de trede kan hetzelfde: een tweede trede-container waarin de plancapaciteitsvlaggen in
Trede/srcop FALSE staan, enIterSubsector_Tdie er per zichtjaar een van kiest via het meta-itemTredeKop:37. Ik heb het idioomcontainer src_zonder := src { <overschrijvende items> }los getoetst en dat werkt: het overschreven item volgt de nieuwe definitie, de rest wordt geerfd.De cellen zakken dan binnen dezelfde BBG-, OV-, eigendoms- en grondgebruikcombinatie naar de stimuli-trede of de restcategorie. Bij wonen is dat een sprong van trede 0 tot 35 naar 72 tot 143. Bij nijverheid en logistiek blijft er van de ladder vrijwel niets over, want daar is plancapaciteit de enige inhoudelijke as; de plek van nieuwe bedrijventerreinen wordt dan volledig door de empirische geschiktheid bepaald. Dat laatste is een grotere ingreep dan bij wonen en zet ik daarom achter dezelfde vervaldatum maar met een aparte schakelaar.
Openstaande punten
IterSubsector_T.dms:68-73, de keuze tussen werksubsectoren, dezelfde vervaldatum krijgen?