@@ -546,3 +546,65 @@ def ensure_overlapping_bucket_request_fails() -> None:
546546 expected = 20.0 ,
547547 batteries = overlapping_batteries ,
548548 )
549+
550+
551+ async def test_matryoshka_shifting_limiting () -> None :
552+ """Tests for the power managing actor.
553+
554+ With the following scenario:
555+
556+ | Actor | System Limits | Specified Limits | Desired | Adjusted | Aggregate |
557+ | Prio | | | Power | Power | Power |
558+ |-------|-------------------|------------------|---------|----------|-----------|
559+ | 7 | -100 kW .. 100 kW | None | 10 kW | 10 kW | 10 kW |
560+ | 6 | -110 kW .. 90 kW | -110 kW .. 80 kW | 10 kW | 10 kW | 20 kW |
561+ | 5 | -120 kW .. 70 kW | -100 kW .. 80 kW | 80 kW | 70 kW | 90 kW |
562+ | 4 | -170 kW .. 0 kW | None | -120 kW | -120 kW | -30 kW |
563+ | 3 | -50 kW .. 120 kW | None | 60 kW | 60 kW | 30 kW |
564+ | 2 | -110 kW .. 60 kW | -40 kW .. 30 kW | 20 kW | 20 kW | 50 kW |
565+ | 1 | -60 kW .. 10 kW | -50 kW .. 40 kW | 25 kW | 10 kW | 60 kW |
566+ | 0 | -60 kW .. 0 kW | None | 12 kW | 0 kW | 60 kW |
567+ | -1 | -60 kW .. 0 kW | -40 kW .. -10 kW | -10 kW | -10 kW | 50 kW |
568+ |-------|-------------------|------------------|---------|----------|-----------|
569+ | | | | | Power | |
570+ | | | | | Setpoint | 50 kW |
571+ """
572+ batteries = frozenset ({2 , 5 })
573+
574+ system_bounds = _base_types .SystemBounds (
575+ timestamp = datetime .now (tz = timezone .utc ),
576+ inclusion_bounds = timeseries .Bounds (
577+ lower = Power .from_watts (- 100.0 ), upper = Power .from_watts (100.0 )
578+ ),
579+ exclusion_bounds = timeseries .Bounds (
580+ lower = Power .from_watts (- 0.0 ), upper = Power .from_watts (0.0 )
581+ ),
582+ )
583+
584+ tester = StatefulTester (batteries , system_bounds )
585+ tester .tgt_power (priority = 7 , power = 10.0 , bounds = (None , None ), expected = 10.0 )
586+ tester .bounds (priority = 7 , expected_power = 10.0 , expected_bounds = (- 100.0 , 100.0 ))
587+ tester .bounds (priority = 6 , expected_power = 10.0 , expected_bounds = (- 110.0 , 90.0 ))
588+
589+ tester .tgt_power (priority = 6 , power = 10.0 , bounds = (- 110.0 , 80.0 ), expected = 20.0 )
590+ tester .bounds (priority = 5 , expected_power = 20.0 , expected_bounds = (- 120.0 , 70.0 ))
591+
592+ tester .tgt_power (priority = 5 , power = 80.0 , bounds = (- 100.0 , 80.0 ), expected = 90.0 )
593+ tester .bounds (priority = 4 , expected_power = 90.0 , expected_bounds = (- 170.0 , 0.0 ))
594+
595+ tester .tgt_power (priority = 4 , power = - 120.0 , bounds = (None , None ), expected = - 30.0 )
596+ tester .bounds (priority = 3 , expected_power = - 30.0 , expected_bounds = (- 50.0 , 120.0 ))
597+
598+ tester .tgt_power (priority = 3 , power = 60.0 , bounds = (None , None ), expected = 30.0 )
599+ tester .bounds (priority = 2 , expected_power = 30.0 , expected_bounds = (- 110.0 , 60.0 ))
600+
601+ tester .tgt_power (priority = 2 , power = 20.0 , bounds = (- 40.0 , 30.0 ), expected = 50.0 )
602+ tester .bounds (priority = 1 , expected_power = 50.0 , expected_bounds = (- 60.0 , 10.0 ))
603+
604+ tester .tgt_power (priority = 1 , power = 25.0 , bounds = (- 50.0 , 40.0 ), expected = 60.0 )
605+ tester .bounds (priority = 0 , expected_power = 60.0 , expected_bounds = (- 60.0 , 0.0 ))
606+
607+ tester .tgt_power (priority = 0 , power = 12.0 , bounds = (None , None ), expected = None )
608+ tester .bounds (priority = - 1 , expected_power = 60.0 , expected_bounds = (- 60.0 , 0.0 ))
609+
610+ tester .tgt_power (priority = - 1 , power = - 10.0 , bounds = (- 40.0 , - 10.0 ), expected = 50.0 )
0 commit comments