Full discrete alloc script

allocation-functions full script example

The discrete allocation is used to allocate land use types to grid cells with the allocation-functions.

The example presents how to configure all arguments and the function itself.

script


container Allocation
{
	unit<fpoint>  TestCoords : Range = "[{100, 0}, {600, 600})";
	unit<float32> Meter      := BaseUnit('m', float32);
	unit<float32> Meter2     := Meter * Meter;
	unit<float32> Ha         := 10000.0 * Meter2;
	parameter<Float32> gridsize := 500f;
	
	unit<spoint> DomainGrid :=
			range(
			  gridset(
				fpoint, 
				point_yx(-gridsize, gridsize, TestCoords), 
				point_yx(625000f, 10000f, TestCoords), 
				SPoint
			  ),
			  point_yx(int16(0), int16(0))
			, point_yx(int16(6), int16(6))
			),
		DialogType = "Map" 
	{
		parameter<meter2> NrMeter2PerCell := gridsize[meter] * gridsize[meter];
		parameter<ha>     NrHaPerCell     := convert(NrMeter2PerCell, ha);
	}
	container source
	{
		unit<float32> EurM2;
		
		unit <uint8> lu_type: nrofrows = 3
		{
			attribute<string>  Name:           [ 'Living', 'Working', 'Nature' ], DialogType = "LabelText";
			attribute<string>  PartioningName: [ 'Living', 'Working', 'Nature' ];
			attribute<lu_type> partioning := id(lu_type);
			attribute<uint32>  BrushColor: [rgb(200,0,0),rgb(100,100,100),rgb(0,200,0)], DialogType = "BrushColor";
		}
		container SuitabilityMaps
		{
			attribute<EurM2> Living  (DomainGrid):
			[
			 1,  2,  5, 4,  3, -1,
			 2,  5,  8, 9,  7, 3,
			 4, 10, 12,13, 12, 6,
			 5, 11, 13,14, 12, 6,
			 4,  9,  9, 5,  3, 2,
			 2,  2,  4, 3,  1, 1
			];
			attribute<EurM2> Working (DomainGrid):
			[
			 1, 1, 2, 3,  4, -6,
			 2, 3, 4, 6,  8, 9,
			 2, 4, 9,11, 12,10,
			 1, 3, 5, 9, 10, 6,
			 2, 4, 5, 5,  3, 2,
			 1, 1, 2, 1,  1, 1
			];
			attribute<EurM2> Nature  (DomainGrid):
			[
			 3, 3, 3, 2, 2, -2,
			 3, 3, 2, 2, 2, 2,
			 3, 2, 1, 1, 1, 1,
			 3, 2, 1, 1 ,1, 2,
			 3, 3, 2, 1, 2, 2,
			 3, 3, 3, 3, 3, 3
			];
		}
		container regMaps
		{
			unit <uint8> p1: nrofrows = 1;
			unit <uint8> p2: nrofrows = 2;

			attribute<p1> p1Map (DomainGrid) := const(0, DomainGrid, p1);
			attribute<p2> p2Map (DomainGrid) := pointRow(ID(DomainGrid)) < int16(4) ? value(0,p2) : value(1,p2);
		}
		container claim_sources
		{
			container p1
			{
				attribute<Ha> Nature_min (regMaps/p1): [12];
				attribute<Ha> Nature_max (regMaps/p1): [20];
				attribute<Ha> Living_min (regMaps/p1): [5];
				attribute<Ha> Living_max (regMaps/p1): [9];
			}
			container p2
			{
				attribute<Ha> Working_min (regMaps/p2): [6,2];
				attribute<Ha> Working_max (regMaps/p2): [10,4];
			}
		}
		container claims_min
		{
			attribute<uint32> Living (regMaps/p1) := uint32(claim_sources/p1/Living_min  / DomainGrid/NrHaPerCell);
			attribute<uint32> Working(regMaps/p2) := uint32(claim_sources/p2/Working_min / DomainGrid/NrHaPerCell);
			attribute<uint32> Nature (regMaps/p1) := uint32(claim_sources/p1/Nature_min  / DomainGrid/NrHaPerCell);
		}
		container aggr_claims_min
		{
			parameter<uint32> Living := sum(claims_min/Living);
			parameter<uint32> Working:= sum(claims_min/Working);
			parameter<uint32> Nature := sum(claims_min/Nature);
		}
		container claims_max
		{
			attribute<uint32> Living (regMaps/p1) := uint32(claim_sources/p1/Living_max  / DomainGrid/NrHaPerCell);
			attribute<uint32> Working(regMaps/p2) := uint32(claim_sources/p2/Working_max / DomainGrid/NrHaPerCell);
			attribute<uint32> Nature (regMaps/p1) := uint32(claim_sources/p1/Nature_max  / DomainGrid/NrHaPerCell);
		}
		container claims_max2
		{
			attribute<uint32> Living (regMaps/p1) := claims_max/Living + claims_max/Living;
			attribute<uint32> Nature (regMaps/p1) := claims_max/Nature + claims_max/Nature;
		}
		container aggr_claims_max
		{
			parameter<uint32> Living := sum(claims_max/Living);
			parameter<uint32> Working:= sum(claims_max/Working);
			parameter<uint32> Nature := sum(claims_max/Nature);
		}
		container regionSets
		{
			attribute<regMaps/p1> Nature (DomainGrid) := regMaps/p1Map;
			attribute<regMaps/p1> Living (DomainGrid) := regMaps/p1Map;
			attribute<regMaps/p2> Working(DomainGrid) := regMaps/p2Map;
		}
		unit<uint16> AtomicRegions := overlay(lu_type/PartioningName, DomainGrid, regionSets);

		attribute<Bool> InRegio (DomainGrid):
		[
		 True, True, True,True,False,True,
		 True, True, True,True,False,True,
		 True, True, True,True,True,True,
		 True, True, True,True,True,True,
		 True, True, True,True,False,True,
		 True, True, True,True,True,True
		];
		attribute<Bool> FreeLand (DomainGrid) := InRegio;

		container Compacted
		{
			unit <uint32>      ADomain := select_with_org_rel(FreeLand = True),
				label = "allocation domain";
			attribute<ADomain> BaseGrid (DomainGrid) :=invert(ADomain/org_rel);
			
			container SuitabilityMaps
			{
				attribute<int32> Living  (ADomain) := int32(source/SuitabilityMaps/Living)[ADomain/org_rel]  * int32(1000);
				attribute<int32> Working (ADomain) := int32(source/SuitabilityMaps/Working)[ADomain/org_rel] * int32(1000);
				attribute<int32> Nature  (ADomain) := int32(source/SuitabilityMaps/Nature)[ADomain/org_rel]  * int32(1000);
			}
			container SuitabilityMapsDiv
			{
				attribute<int32> Living  (ADomain) := int32(source/SuitabilityMaps/Living  * float32(1000) / float32(12.46220836))[ADomain/org_rel];
				attribute<int32> Working (ADomain) := int32(source/SuitabilityMaps/Working * float32(1000) / float32(12.46220836))[ADomain/org_rel];
				attribute<int32> Nature  (ADomain) := int32(source/SuitabilityMaps/Nature  * float32(1000) / float32(12.46220836))[ADomain/org_rel];
			}
			attribute<AtomicRegions> AtomicRegionMap(ADomain) := AtomicRegions/UnionData[ADomain/org_rel];
		}
		parameter<int32> treshold := int32(0);
		container FeasibleSolution;
	}

	container allocate_discrete := 
		discrete_alloc(
			source/lu_type/name, 
			source/Compacted/ADomain, 
			source/Compacted/SuitabilityMaps, 
			source/lu_type/partioning,
			source/lu_type/PartioningName,
			source/AtomicRegions,
			source/Compacted/AtomicRegionMap, 
			source/claims_min, 
			source/claims_max, 
			source/treshold, 
			source/FeasibleSolution
		)
	{
		attribute<Source/lu_type> Alloc       (DomainGrid) := landuse[Source/Compacted/BaseGrid];
	}
}