Skip to content

feat: edit marginal costs and dispatch of biomass/biogas generators in CBA - #719

Merged
measrainsey merged 34 commits into
masterfrom
feat/bio-dispatch
Jul 10, 2026
Merged

feat: edit marginal costs and dispatch of biomass/biogas generators in CBA#719
measrainsey merged 34 commits into
masterfrom
feat/bio-dispatch

Conversation

@measrainsey

@measrainsey measrainsey commented May 28, 2026

Copy link
Copy Markdown
Member

Closes:

Changes proposed in this Pull Request

Tasks

  • Extract marginal price for biomass and biogas generators
  • Use the marginal prices as marginal costs of generators
  • [x] Add slack to e_sum_min of dispatch of biomass/biogas generators

Workflow

  • scripts/cba/prepare_rolling_horizon.py: added function apply_biomass_biogas_bus_marginal_prices() takes a list of carriers, finds the generators with these carriers, takes the marginal prices of buses attached to those generators, and set the corresponding bus' marginal prices as the generator's marginal costs.
  • scripts/cba/solve_cba_network.py: removed the e_sum_min and e_sum_max constraint on biomass and biogas generators
  • config files and rules/cba.smk: added a config option called cba.biomass_biogas_slack that is passed through to scripts/cba/solve_cba_network.py. Currently the slack is set at 40%.
  • scripts/cba/solve_cba_network.py: use the specified cba.biomass_biogas_slack for the biomass and biogas generators' e_sum_min. Previously, both e_sum_min and e_sum_max follow the same exact value (window_energy) which causes infeasibilities at the last rolling horizon. This slack relaxes the constraint so infeasibilities are less likely to happen.

Notes

Testing the changes to the marginal costs

Using the debugger and the following networks on my local machine:

n = '/Users/meas/oet/open-tyndp/resources/tyndp/NT/cba/networks/reference_2030.nc'
n_msv = '/Users/meas/oet/open-tyndp/resources/tyndp/NT/cba/networks/msv_2030.nc'

Before apply_biomass_biogas_bus_marginal_prices() is run, this is what the marginal costs and prices look like:

n.generators.at['EU biogas', "marginal_cost"]: 78.82328873107923
n.generators.at['EU solid biomass', "marginal_cost"]: 17.34118238096195
n_msv.buses_t.marginal_price['EU biogas'].values: array([44.95509179, 44.95509179, 44.95509179, ..., 44.95509179,
       44.95509179, 44.95509179])
n_msv.buses_t.marginal_price['EU solid biomass'].values: array([17.33346478, 17.33346478, 17.33346478, ..., 17.33346478,
       17.33346478, 17.33346478])
n.generators_t.marginal_cost['EU biogas'].values: KeyError: 'EU biogas'
n.generators_t.marginal_cost['EU solid biomass'].values: KeyError: 'EU solid biomass'

Note that before apply_biomass_biogas_bus_marginal_prices() is run, there is no time series of marginal costs for the 'EU biogas' and 'EU solid biomass' generators, only static marginal costs of 78.82 and 17.34, respectively. There are, however, time series of marginal prices for the EU biogas and EU biomass buses.

After apply_biomass_biogas_bus_marginal_prices() is applied, the marginal costs look like:

n.generators.at['EU biogas', "marginal_cost"]: 78.82328873107923
n.generators.at['EU solid biomass', "marginal_cost"]: 17.34118238096195
n_msv.buses_t.marginal_price['EU biogas'].values: array([44.95509179, 44.95509179, 44.95509179, ..., 44.95509179,
       44.95509179, 44.95509179])
n_msv.buses_t.marginal_price['EU solid biomass'].values: array([17.33346478, 17.33346478, 17.33346478, ..., 17.33346478,
       17.33346478, 17.33346478])
n.generators_t.marginal_cost['EU biogas'].values: array([44.95509179, 44.95509179, 44.95509179, ..., 44.95509179,
       44.95509179, 44.95509179])
n.generators_t.marginal_cost['EU solid biomass'].values: array([17.33346478, 17.33346478, 17.33346478, ..., 17.33346478,
       17.33346478, 17.33346478])

After apply_biomass_biogas_bus_marginal_prices() is applied, the 'EU biogas' and EU solid biomass generators have time series marginal costs (n.generators_t.marginal_cost) have been set as the n_msv.buses_t.marginal_price of the corresponding buses (44.95509179 and 17.33346478, respectively).

Testing the changes in infeasibilities using the slack

NOTE: this is no longer relevant - this was written during the development of this PR but this was not used in the end. I am keeping this here for tracking this information, but see this comment and the subsequent conversation for why the constraint was removed completely.

Details

On master

The following config (called config/config.bio.yaml) is used (note that the soc_boundary_carriers: [] has to be set because otherwise there is an issue with hydro boundary conditions when using a lower resolution MSV):

run:
  name: "NT"

cba:
  planning_horizons:
  - 2030
  cba_scenario_input:
    use_presolved: true
    sb_version: latest
  projects: 
  - t16

  storage:
    cyclic_carriers:
    - battery
    soc_boundary_carriers: []

  msv_extraction:
    resolution: 6H
    solving:
      solver:
        name: gurobi
        options: gurobi-default

  solving:
    horizon: 168
    overlap: 1

    solver:
      name: gurobi
      options: gurobi-simplex

    solver_options:
      gurobi-simplex:
        FeasibilityTol: 1.0e-08
        OptimalityTol: 1.0e-08

With the following command:

snakemake -call cba --configfile config/config.tyndp.yaml config/config.bio.yaml

On the master branch, the project solve optimization would fail due to infeasibilities, around the 50th rolling horizon window:

 94%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████▎      | 50/53 [09:46<00:35, 11.85s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-12-14 22:00:00:2009-12-21 21:00:00] (51/53).
  568162    1.2874134e+10   1.321550e+09   0.000000e+00     20s
WARNING:pypsa.optimization.constraints:Stores ['ES00 battery', 'FR00 battery', 'ITCA battery', 'ITS1 battery', 'ITSI battery', 'RO00 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/Users/meas/oet/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
  m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/projects/project_t16_2030_solver.log`.
INFO:linopy.model:Solver options:
 - threads: 32
 - method: 1
 - NodeMethod: 1
 - Seed: 123
 - AggFill: 0
 - PreDual: 0
 - FeasibilityTol: 1e-08
 - OptimalityTol: 1e-08
 - ScaleFlag: -1
Set parameter Username
Set parameter LicenseID to value 2778846
Academic license - for non-commercial use only - expires 2027-02-13
Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored
Set parameter Threads to value 32
Set parameter Method to value 1
Set parameter NodeMethod to value 1
Set parameter Seed to value 123
Set parameter AggFill to value 0
Set parameter PreDual to value 0
Set parameter FeasibilityTol to value 1e-08
Set parameter OptimalityTol to value 1e-08
Set parameter ScaleFlag to value -1
Set parameter LogFile to value "/Users/meas/oet/open-tyndp/results/tyndp/NT/logs/cba/projects/project_t16_2030_solver.log"
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (mac64[arm] - Darwin 24.6.0 24G84)

CPU model: Apple M4 Pro
Thread count: 12 physical cores, 12 logical processors, using up to 32 threads

Warning: Thread count (32) is larger than processor count (12)
         Reduce the value of the Threads parameter to improve performance


Non-default parameters:
FeasibilityTol  1e-08
OptimalityTol  1e-08
Method  1
NodeMethod  1
AggFill  0
PreDual  0
Seed  123
Threads  32

Optimize a model with 783028 rows, 397320 columns and 1391444 nonzeros (Min)
Model fingerprint: 0x4cb698d5
Model has 360528 linear objective coefficients
Coefficient statistics:
  Matrix range     [1e-02, 1e+00]
  Objective range  [9e-03, 1e+05]
  Bounds range     [2e+00, 4e+03]
  RHS range        [2e-02, 2e+09]
Warning: Model contains large rhs
         Consider reformulating model or setting NumericFocus parameter
         to avoid numerical issues.

Presolve time: 0.32s

Solved in 0 iterations and 0.32 seconds (0.76 work units)
Infeasible or unbounded model
WARNING:linopy.constants:Optimization potentially failed: 
Status: warning
Termination condition: infeasible_or_unbounded
Solution: 0 primals, 0 duals
Objective: nan
Solver model: available
Solver message: 4

WARNING:__main__:Optimization failed with status warning and condition infeasible_or_unbounded
WARNING:__main__:Fallback also failed: warning / infeasible_or_unbounded
 94%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████▎      | 50/53 [09:51<00:35, 11.83s/it]
WARNING:__main__:Solving status 'warning' with termination condition 'infeasible_or_unbounded'
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (mac64[arm] - Darwin 24.6.0 24G84)

CPU model: Apple M4 Pro
Thread count: 12 physical cores, 12 logical processors, using up to 32 threads

Warning: Thread count (32) is larger than processor count (12)
         Reduce the value of the Threads parameter to improve performance


Non-default parameters:
FeasibilityTol  1e-08
OptimalityTol  1e-08
Method  1
NodeMethod  1
AggFill  0
PreDual  0
Seed  123
Threads  32

Iteration    Objective       Primal Inf.    Dual Inf.      Time
       0      handle free variables                          0s

IIS computed: 8643 constraints and 0 bounds
IIS runtime: 25.09 seconds (55.47 work units)
INFO:__main__:Labels:
[517, 518, 562, 1432, 1433, 1477, 2347, 2348, 2392, 3262, 3263, 3307, 4177, 4178, 4222, 5092, 5093, 5137, 6007, 6008, 6052, 6922, 6923, 6967, 7837, 7838, 7882, 8752, 8753, 8797, 9667, 9668, 9712, 10582, 10583, 10627, 11497, 11498, 11542, 12412, 12413, 12457, 13327, 13328, 13372, 14242, 14243, 14287, 15157, 15158, 15202, 16072, 16073, 16117, 16987, 16988, 17032, 17902, 17903, 17947, 18817, 18818, 18862, 19732, 19733, 19777, 20647, 20648, 20692, 21562, 21563, 21607, 22477, 22478, 22522, 23392, 23393, 23437, 24307, 24308, 24352, 25222, 25223, 25267, 26137, 26138, 26182, 27052, 27053, 27097, 27967, 27968, 28012, 28882, 28883, 28927, 29797, 29798, 29842, 30712, 30713, 30757, 31627, 31628, 31672, 32542, 32543, 32587, 33457, 33458, 33502, 34372, 34373, 34417, 35287, 35288, 35332, 36202, 36203, 36247, 37117, 37118, 37162, 38032, 38033, 38077, 38947, 38948, 38992, 39862, 39863, 39907, 40777, 40778, 40822, 41692, 41693, 41737, 42607, 42608, 42652, 43522, 43523, 43567, 44437, 44438, 44482, 45352, 45353, 45397, 46267, 46268, 46312, 47182, 47183, 47227, 48097, 48098, 48142, 49012, 49013, 49057, 49927, 49928, 49972, 50842, 50843, 50887, 51757, 51758, 51802, 52672, 52673, 52717, 53587, 53588, 53632, 54502, 54503, 54547, 55417, 55418, 55462, 56332, 56333, 56377, 57247, 57248, 57292, 58162, 58163, 58207, 59077, 59078, 59122, 59992, 59993, 60037, 60907, 60908, 60952, 61822, 61823, 61867, 62737, 62738, 62782, 63652, 63653, 63697, 64567, 64568, 64612, 65482, 65483, 65527, 66397, 66398, 66442, 67312, 67313, 67357, 68227, 68228, 68272, 69142, 69143, 69187, 70057, 70058, 70102, 70972, 70973, 71017, 71887, 71888, 71932, 72802, 72803, 72847, 73717, 73718, 73762, 74632, 74633, 74677, 75547, 75548, 75592, 76462, 76463, 76507, 77377, 77378, 77422, 78292, 78293, 78337, 79207, 79208, 79252, 80122, 80123, 80167, 81082, 81997, 82912, 83827, 84742, 85657, 86572, 87487, 88402, 89317, 90232, 91147, 92062, 92977, 93892, 94807, 95722, 96637, 97552, 98467, 99382, 100297, 101212, 102127, 103042, 103957, 104872, 105787, 106702, 107617, 108532, 109447, 110362, 111277, 112192, 113107, 114022, 114937, 115852, 116767, 117682, 118597, 119512, 120427, 121342, 122257, 123172, 124087, 125002, 125917, 126832, 127747, 128662, 129577, 130492, 131407, 132322, 133237, 134152, 135067, 135982, 136897, 137812, 138727, 139642, 140557, 141472, 142387, 143302, 144217, 145132, 146047, 146962, 147877, 148792, 149707, 150622, 151537, 152452, 153367, 461456, 461633, 461646, 461807, 461808, 461809, 461810, 461811, 461812, 461813, 461814, 461815, 461816, 462552, 462729, 462742, 462903, 462904, 462905, 462906, 462907, 462908, 462909, 462910, 462911, 462912, 463648, 463825, 463838, 463999, 464000, 464001, 464002, 464003, 464004, 464005, 464006, 464007, 464008, 464744, 464921, 464934, 465095, 465096, 465097, 465098, 465099, 465100, 465101, 465102, 465103, 465104, 465840, 466017, 466030, 466191, 466192, 466193, 466194, 466195, 466196, 466197, 466198, 466199, 466200, 466936, 467113, 467126, 467287, 467288, 467289, 467290, 467291, 467292, 467293, 467294, 467295, 467296, 468032, 468209, 468222, 468383, 468384, 468385, 468386, 468387, 468388, 468389, 468390, 468391, 468392, 469128, 469305, 469318, 469479, 469480, 469481, 469482, 469483, 469484, 469485, 469486, 469487, 469488, 470224, 470401, 470414, 470575, 470576, 470577, 470578, 470579, 470580, 470581, 470582, 470583, 470584, 471320, 471497, 471510, 471671, 471672, 471673, 471674, 471675, 471676, 471677, 471678, 471679, 471680, 472416, 472593, 472606, 472767, 472768, 472769, 472770, 472771, 472772, 472773, 472774, 472775, 472776, 473512, 473689, 473702, 473863, 473864, 473865, 473866, 473867, 473868, 473869, 473870, 473871, 473872, 474608, 474785, 474798, 474959, 474960, 474961, 474962, 474963, 474964, 474965, 474966, 474967, 474968, 475704, 475881, 475894, 476055, 476056, 476057, 476058, 476059, 476060, 476061, 476062, 476063, 476064, 476800, 476977, 476990, 477151, 477152, 477153, 477154, 477155, 477156, 477157, 477158, 477159, 477160, 477896, 478073, 478086, 478247, 478248, 478249, 478250, 478251, 478252, 478253, 478254, 478255, 478256, 478992, 479169, 479182, 479343, 479344, 479345, 479346, 479347, 479348, 479349, 479350, 479351, 479352, 480088, 480265, 480278, 480439, 480440, 480441, 480442, 480443, 480444, 480445, 480446, 480447, 480448, 481184, 481361, 481374, 481535, 481536, 481537, 481538, 481539, 481540, 481541, 481542, 481543, 481544, 482280, 482457, 482470, 482631, 482632, 482633, 482634, 482635, 482636, 482637, 482638, 482639, 482640, 483376, 483553, 483566, 483727, 483728, 483729, 483730, 483731, 483732, 483733, 483734, 483735, 483736, 484472, 484649, 484662, 484823, 484824, 484825, 484826, 484827, 484828, 484829, 484830, 484831, 484832, 485568, 485745, 485758, 485919, 485920, 485921, 485922, 485923, 485924, 485925, 485926, 485927, 485928, 486664, 486841, 486854, 487015, 487016, 487017, 487018, 487019, 487020, 487021, 487022, 487023, 487024, 487760, 487937, 487950, 488111, 488112, 488113, 488114, 488115, 488116, 488117, 488118, 488119, 488120, 488856, 489033, 489046, 489207, 489208, 489209, 489210, 489211, 489212, 489213, 489214, 489215, 489216, 489952, 490129, 490142, 490303, 490304, 490305, 490306, 490307, 490308, 490309, 490310, 490311, 490312, 491048, 491225, 491238, 491399, 491400, 491401, 491402, 491403, 491404, 491405, 491406, 491407, 491408, 492144, 492321, 492334, 492495, 492496, 492497, 492498, 492499, 492500, 492501, 492502, 492503, 492504, 493240, 493417, 493430, 493591, 493592, 493593, 493594, 493595, 493596, 493597, 493598, 493599, 493600, 494336, 494513, 494526, 494687, 494688, 494689, 494690, 494691, 494692, 494693, 494694, 494695, 494696, 495432, 495609, 495622, 495783, 495784, 495785, 495786, 495787, 495788, 495789, 495790, 495791, 495792, 496528, 496705, 496718, 496879, 496880, 496881, 496882, 496883, 496884, 496885, 496886, 496887, 496888, 497624, 497801, 497814, 497975, 497976, 497977, 497978, 497979, 497980, 497981, 497982, 497983, 497984, 498720, 498897, 498910, 499071, 499072, 499073, 499074, 499075, 499076, 499077, 499078, 499079, 499080, 499816, 499993, 500006, 500167, 500168, 500169, 500170, 500171, 500172, 500173, 500174, 500175, 500176, 500912, 501089, 501102, 501263, 501264, 501265, 501266, 501267, 501268, 501269, 501270, 501271, 501272, 502008, 502185, 502198, 502359, 502360, 502361, 502362, 502363, 502364, 502365, 502366, 502367, 502368, 503104, 503281, 503294, 503455, 503456, 503457, 503458, 503459, 503460, 503461, 503462, 503463, 503464, 504200, 504377, 504390, 504551, 504552, 504553, 504554, 504555, 504556, 504557, 504558, 504559, 504560, 505296, 505473, 505486, 505647, 505648, 505649, 505650, 505651, 505652, 505653, 505654, 505655, 505656, 506392, 506569, 506582, 506743, 506744, 506745, 506746, 506747, 506748, 506749, 506750, 506751, 506752, 507488, 507665, 507678, 507839, 507840, 507841, 507842, 507843, 507844, 507845, 507846, 507847, 507848, 508584, 508761, 508774, 508935, 508936, 508937, 508938, 508939, 508940, 508941, 508942, 508943, 508944, 509680, 509857, 509870, 510031, 510032, 510033, 510034, 510035, 510036, 510037, 510038, 510039, 510040, 510776, 510953, 510966, 511127, 511128, 511129, 511130, 511131, 511132, 511133, 511134, 511135, 511136, 511872, 512049, 512062, 512223, 512224, 512225, 512226, 512227, 512228, 512229, 512230, 512231, 512232, 512968, 513145, 513158, 513319, 513320, 513321, 513322, 513323, 513324, 513325, 513326, 513327, 513328, 514064, 514241, 514254, 514415, 514416, 514417, 514418, 514419, 514420, 514421, 514422, 514423, 514424, 515160, 515337, 515350, 515511, 515512, 515513, 515514, 515515, 515516, 515517, 515518, 515519, 515520, 516256, 516433, 516446, 516607, 516608, 516609, 516610, 516611, 516612, 516613, 516614, 516615, 516616, 517352, 517529, 517542, 517703, 517704, 517705, 517706, 517707, 517708, 517709, 517710, 517711, 517712, 518448, 518625, 518638, 518799, 518800, 518801, 518802, 518803, 518804, 518805, 518806, 518807, 518808, 519544, 519721, 519734, 519895, 519896, 519897, 519898, 519899, 519900, 519901, 519902, 519903, 519904, 520640, 520817, 520830, 520991, 520992, 520993, 520994, 520995, 520996, 520997, 520998, 520999, 521000, 521736, 521913, 521926, 522087, 522088, 522089, 522090, 522091, 522092, 522093, 522094, 522095, 522096, 522832, 523009, 523022, 523183, 523184, 523185, 523186, 523187, 523188, 523189, 523190, 523191, 523192, 523928, 524105, 524118, 524279, 524280, 524281, 524282, 524283, 524284, 524285, 524286, 524287, 524288, 525024, 525201, 525214, 525375, 525376, 525377, 525378, 525379, 525380, 525381, 525382, 525383, 525384, 526120, 526297, 526310, 526471, 526472, 526473, 526474, 526475, 526476, 526477, 526478, 526479, 526480, 527216, 527393, 527406, 527567, 527568, 527569, 527570, 527571, 527572, 527573, 527574, 527575, 527576, 528312, 528489, 528502, 528663, 528664, 528665, 528666, 528667, 528668, 528669, 528670, 528671, 528672, 529408, 529585, 529598, 529759, 529760, 529761, 529762, 529763, 529764, 529765, 529766, 529767, 529768, 530504, 530681, 530694, 530855, 530856, 530857, 530858, 530859, 530860, 530861, 530862, 530863, 530864, 531600, 531777, 531790, 531951, 531952, 531953, 531954, 531955, 531956, 531957, 531958, 531959, 531960, 532696, 532873, 532886, 533047, 533048, 533049, 533050, 533051, 533052, 533053, 533054, 533055, 533056, 533792, 533969, 533982, 534143, 534144, 534145, 534146, 534147, 534148, 534149, 534150, 534151, 534152, 534888, 535065, 535078, 535239, 535240, 535241, 535242, 535243, 535244, 535245, 535246, 535247, 535248, 535984, 536161, 536174, 536335, 536336, 536337, 536338, 536339, 536340, 536341, 536342, 536343, 536344, 537080, 537257, 537270, 537431, 537432, 537433, 537434, 537435, 537436, 537437, 537438, 537439, 537440, 538176, 538353, 538366, 538527, 538528, 538529, 538530, 538531, 538532, 538533, 538534, 538535, 538536, 539272, 539449, 539462, 539623, 539624, 539625, 539626, 539627, 539628, 539629, 539630, 539631, 539632, 540368, 540545, 540558, 540719, 540720, 540721, 540722, 540723, 540724, 540725, 540726, 540727, 540728, 541464, 541641, 541654, 541815, 541816, 541817, 541818, 541819, 541820, 541821, 541822, 541823, 541824, 542560, 542737, 542750, 542911, 542912, 542913, 542914, 542915, 542916, 542917, 542918, 542919, 542920, 543656, 543833, 543846, 544007, 544008, 544009, 544010, 544011, 544012, 544013, 544014, 544015, 544016, 544752, 544929, 544942, 545103, 545104, 545105, 545106, 545107, 545108, 545109, 545110, 545111, 545112, 545848, 546025, 546038, 546199, 546200, 546201, 546202, 546203, 546204, 546205, 546206, 546207, 546208, 546944, 547121, 547134, 547295, 547296, 547297, 547298, 547299, 547300, 547301, 547302, 547303, 547304, 548040, 548217, 548230, 548391, 548392, 548393, 548394, 548395, 548396, 548397, 548398, 548399, 548400, 549136, 549313, 549326, 549487, 549488, 549489, 549490, 549491, 549492, 549493, 549494, 549495, 549496, 550232, 550409, 550422, 550583, 550584, 550585, 550586, 550587, 550588, 550589, 550590, 550591, 550592, 551328, 551505, 551518, 551679, 551680, 551681, 551682, 551683, 551684, 551685, 551686, 551687, 551688, 552424, 552601, 552614, 552775, 552776, 552777, 552778, 552779, 552780, 552781, 552782, 552783, 552784, 553520, 553697, 553710, 553871, 553872, 553873, 553874, 553875, 553876, 553877, 553878, 553879, 553880, 554616, 554793, 554806, 554967, 554968, 554969, 554970, 554971, 554972, 554973, 554974, 554975, 554976, 555712, 555889, 555902, 556063, 556064, 556065, 556066, 556067, 556068, 556069, 556070, 556071, 556072, 556808, 556985, 556998, 557159, 557160, 557161, 557162, 557163, 557164, 557165, 557166, 557167, 557168, 646193, 647289, 648385, 649481, 650577, 651673, 652769, 653865, 654961, 656057, 657153, 658249, 659345, 660441, 661537, 662633, 663729, 664825, 665921, 667017, 668113, 669209, 670305, 671401, 672497, 673593, 674689, 675785, 676881, 677977, 679073, 680169, 681265, 682361, 683457, 684553, 685649, 686745, 687841, 688937, 690033, 691129, 692225, 693321, 694417, 695513, 696609, 697705, 698801, 699897, 700993, 702089, 703185, 704281, 705377, 706473, 707569, 708665, 709761, 710857, 711953, 713049, 714145, 715241, 716337, 717433, 718529, 719625, 720721, 721817, 722913, 724009, 725105, 726201, 727297, 728393, 729489, 730585, 731681, 732777, 733873, 734969, 736065, 737161, 738257, 739353, 740449, 741545, 742641, 742642, 743737, 743738, 744833, 744834, 745929, 745930, 747025, 747026, 748121, 748122, 749217, 749218, 750313, 750314, 751409, 751410, 752505, 752506, 753601, 753602, 754697, 754698, 755793, 755794, 756889, 756890, 757985, 757986, 759081, 759082, 760177, 760178, 761273, 761274, 762369, 762370, 763465, 763466, 764561, 764562, 765657, 765658, 766753, 766754, 767849, 767850, 768945, 768946, 770041, 770042, 771137, 771138, 772233, 772234, 773329, 773330, 774425, 774426, 775521, 775522, 776617, 776618, 777713, 777714, 778809, 778810, 779905, 779906, 781001, 781002, 782097, 782098, 783193, 783194, 784289, 784290, 785385, 785386, 786481, 786482, 787577, 787578, 788673, 788674, 789769, 789770, 790865, 790866, 791961, 791962, 793057, 793058, 794153, 794154, 795249, 795250, 796345, 796346, 797441, 797442, 798537, 798538, 799633, 799634, 800729, 800730, 801825, 801826, 802921, 802922, 804017, 804018, 805113, 805114, 806209, 806210, 807305, 807306, 808401, 808402, 809497, 809498, 810593, 810594, 811689, 811690, 812785, 812786, 813881, 813882, 814977, 814978, 816073, 816074, 817169, 817170, 818265, 818266, 819361, 819362, 820457, 820458, 821553, 821554, 822649, 822650, 823745, 823746, 824841, 824842, 825937, 825938, 827033, 827034, 828129, 828130, 829225, 829226, 829991, 829992, 829993, 829994, 829995, 829996, 829997, 829998, 829999, 830000, 830001, 830002, 830003, 830004, 830005, 830006, 830007, 830008, 830009, 830010, 830011, 830012, 830013, 830014, 830015, 830016, 830017, 830018, 830019, 830020, 830021, 830022, 830023, 830024, 830025, 830026, 830027, 830028, 831087, 831088, 831089, 831090, 831091, 831092, 831093, 831094, 831095, 831096, 831097, 831098, 831099, 831100, 831101, 831102, 831103, 831104, 831105, 831106, 831107, 831108, 831109, 831110, 831111, 831112, 831113, 831114, 831115, 831116, 831117, 831118, 831119, 831120, 831121, 831122, 831123, 831124, 832183, 832184, 832185, 832186, 832187, 832188, 832189, 832190, 832191, 832192, 832193, 832194, 832195, 832196, 832197, 832198, 832199, 832200, 832201, 832202, 832203, 832204, 832205, 832206, 832207, 832208, 832209, 832210, 832211, 832212, 832213, 832214, 832215, 832216, 832217, 832218, 832219, 832220, 833279, 833280, 833281, 833282, 833283, 833284, 833285, 833286, 833287, 833288, 833289, 833290, 833291, 833292, 833293, 833294, 833295, 833296, 833297, 833298, 833299, 833300, 833301, 833302, 833303, 833304, 833305, 833306, 833307, 833308, 833309, 833310, 833311, 833312, 833313, 833314, 833315, 833316, 834375, 834376, 834377, 834378, 834379, 834380, 834381, 834382, 834383, 834384, 834385, 834386, 834387, 834388, 834389, 834390, 834391, 834392, 834393, 834394, 834395, 834396, 834397, 834398, 834399, 834400, 834401, 834402, 834403, 834404, 834405, 834406, 834407, 834408, 834409, 834410, 834411, 834412, 835471, 835472, 835473, 835474, 835475, 835476, 835477, 835478, 835479, 835480, 835481, 835482, 835483, 835484, 835485, 835486, 835487, 835488, 835489, 835490, 835491, 835492, 835493, 835494, 835495, 835496, 835497, 835498, 835499, 835500, 835501, 835502, 835503, 835504, 835505, 835506, 835507, 835508, 836567, 836568, 836569, 836570, 836571, 836572, 836573, 836574, 836575, 836576, 836577, 836578, 836579, 836580, 836581, 836582, 836583, 836584, 836585, 836586, 836587, 836588, 836589, 836590, 836591, 836592, 836593, 836594, 836595, 836596, 836597, 836598, 836599, 836600, 836601, 836602, 836603, 836604, 837663, 837664, 837665, 837666, 837667, 837668, 837669, 837670, 837671, 837672, 837673, 837674, 837675, 837676, 837677, 837678, 837679, 837680, 837681, 837682, 837683, 837684, 837685, 837686, 837687, 837688, 837689, 837690, 837691, 837692, 837693, 837694, 837695, 837696, 837697, 837698, 837699, 837700, 838759, 838760, 838761, 838762, 838763, 838764, 838765, 838766, 838767, 838768, 838769, 838770, 838771, 838772, 838773, 838774, 838775, 838776, 838777, 838778, 838779, 838780, 838781, 838782, 838783, 838784, 838785, 838786, 838787, 838788, 838789, 838790, 838791, 838792, 838793, 838794, 838795, 838796, 839855, 839856, 839857, 839858, 839859, 839860, 839861, 839862, 839863, 839864, 839865, 839866, 839867, 839868, 839869, 839870, 839871, 839872, 839873, 839874, 839875, 839876, 839877, 839878, 839879, 839880, 839881, 839882, 839883, 839884, 839885, 839886, 839887, 839888, 839889, 839890, 839891, 839892, 840951, 840952, 840953, 840954, 840955, 840956, 840957, 840958, 840959, 840960, 840961, 840962, 840963, 840964, 840965, 840966, 840967, 840968, 840969, 840970, 840971, 840972, 840973, 840974, 840975, 840976, 840977, 840978, 840979, 840980, 840981, 840982, 840983, 840984, 840985, 840986, 840987, 840988, 842047, 842048, 842049, 842050, 842051, 842052, 842053, 842054, 842055, 842056, 842057, 842058, 842059, 842060, 842061, 842062, 842063, 842064, 842065, 842066, 842067, 842068, 842069, 842070, 842071, 842072, 842073, 842074, 842075, 842076, 842077, 842078, 842079, 842080, 842081, 842082, 842083, 842084, 843143, 843144, 843145, 843146, 843147, 843148, 843149, 843150, 843151, 843152, 843153, 843154, 843155, 843156, 843157, 843158, 843159, 843160, 843161, 843162, 843163, 843164, 843165, 843166, 843167, 843168, 843169, 843170, 843171, 843172, 843173, 843174, 843175, 843176, 843177, 843178, 843179, 843180, 844239, 844240, 844241, 844242, 844243, 844244, 844245, 844246, 844247, 844248, 844249, 844250, 844251, 844252, 844253, 844254, 844255, 844256, 844257, 844258, 844259, 844260, 844261, 844262, 844263, 844264, 844265, 844266, 844267, 844268, 844269, 844270, 844271, 844272, 844273, 844274, 844275, 844276, 845335, 845336, 845337, 845338, 845339, 845340, 845341, 845342, 845343, 845344, 845345, 845346, 845347, 845348, 845349, 845350, 845351, 845352, 845353, 845354, 845355, 845356, 845357, 845358, 845359, 845360, 845361, 845362, 845363, 845364, 845365, 845366, 845367, 845368, 845369, 845370, 845371, 845372, 846431, 846432, 846433, 846434, 846435, 846436, 846437, 846438, 846439, 846440, 846441, 846442, 846443, 846444, 846445, 846446, 846447, 846448, 846449, 846450, 846451, 846452, 846453, 846454, 846455, 846456, 846457, 846458, 846459, 846460, 846461, 846462, 846463, 846464, 846465, 846466, 846467, 846468, 847527, 847528, 847529, 847530, 847531, 847532, 847533, 847534, 847535, 847536, 847537, 847538, 847539, 847540, 847541, 847542, 847543, 847544, 847545, 847546, 847547, 847548, 847549, 847550, 847551, 847552, 847553, 847554, 847555, 847556, 847557, 847558, 847559, 847560, 847561, 847562, 847563, 847564, 848623, 848624, 848625, 848626, 848627, 848628, 848629, 848630, 848631, 848632, 848633, 848634, 848635, 848636, 848637, 848638, 848639, 848640, 848641, 848642, 848643, 848644, 848645, 848646, 848647, 848648, 848649, 848650, 848651, 848652, 848653, 848654, 848655, 848656, 848657, 848658, 848659, 848660, 849719, 849720, 849721, 849722, 849723, 849724, 849725, 849726, 849727, 849728, 849729, 849730, 849731, 849732, 849733, 849734, 849735, 849736, 849737, 849738, 849739, 849740, 849741, 849742, 849743, 849744, 849745, 849746, 849747, 849748, 849749, 849750, 849751, 849752, 849753, 849754, 849755, 849756, 850815, 850816, 850817, 850818, 850819, 850820, 850821, 850822, 850823, 850824, 850825, 850826, 850827, 850828, 850829, 850830, 850831, 850832, 850833, 850834, 850835, 850836, 850837, 850838, 850839, 850840, 850841, 850842, 850843, 850844, 850845, 850846, 850847, 850848, 850849, 850850, 850851, 850852, 851911, 851912, 851913, 851914, 851915, 851916, 851917, 851918, 851919, 851920, 851921, 851922, 851923, 851924, 851925, 851926, 851927, 851928, 851929, 851930, 851931, 851932, 851933, 851934, 851935, 851936, 851937, 851938, 851939, 851940, 851941, 851942, 851943, 851944, 851945, 851946, 851947, 851948, 853007, 853008, 853009, 853010, 853011, 853012, 853013, 853014, 853015, 853016, 853017, 853018, 853019, 853020, 853021, 853022, 853023, 853024, 853025, 853026, 853027, 853028, 853029, 853030, 853031, 853032, 853033, 853034, 853035, 853036, 853037, 853038, 853039, 853040, 853041, 853042, 853043, 853044, 854103, 854104, 854105, 854106, 854107, 854108, 854109, 854110, 854111, 854112, 854113, 854114, 854115, 854116, 854117, 854118, 854119, 854120, 854121, 854122, 854123, 854124, 854125, 854126, 854127, 854128, 854129, 854130, 854131, 854132, 854133, 854134, 854135, 854136, 854137, 854138, 854139, 854140, 855199, 855200, 855201, 855202, 855203, 855204, 855205, 855206, 855207, 855208, 855209, 855210, 855211, 855212, 855213, 855214, 855215, 855216, 855217, 855218, 855219, 855220, 855221, 855222, 855223, 855224, 855225, 855226, 855227, 855228, 855229, 855230, 855231, 855232, 855233, 855234, 855235, 855236, 856295, 856296, 856297, 856298, 856299, 856300, 856301, 856302, 856303, 856304, 856305, 856306, 856307, 856308, 856309, 856310, 856311, 856312, 856313, 856314, 856315, 856316, 856317, 856318, 856319, 856320, 856321, 856322, 856323, 856324, 856325, 856326, 856327, 856328, 856329, 856330, 856331, 856332, 857391, 857392, 857393, 857394, 857395, 857396, 857397, 857398, 857399, 857400, 857401, 857402, 857403, 857404, 857405, 857406, 857407, 857408, 857409, 857410, 857411, 857412, 857413, 857414, 857415, 857416, 857417, 857418, 857419, 857420, 857421, 857422, 857423, 857424, 857425, 857426, 857427, 857428, 858487, 858488, 858489, 858490, 858491, 858492, 858493, 858494, 858495, 858496, 858497, 858498, 858499, 858500, 858501, 858502, 858503, 858504, 858505, 858506, 858507, 858508, 858509, 858510, 858511, 858512, 858513, 858514, 858515, 858516, 858517, 858518, 858519, 858520, 858521, 858522, 858523, 858524, 859583, 859584, 859585, 859586, 859587, 859588, 859589, 859590, 859591, 859592, 859593, 859594, 859595, 859596, 859597, 859598, 859599, 859600, 859601, 859602, 859603, 859604, 859605, 859606, 859607, 859608, 859609, 859610, 859611, 859612, 859613, 859614, 859615, 859616, 859617, 859618, 859619, 859620, 860679, 860680, 860681, 860682, 860683, 860684, 860685, 860686, 860687, 860688, 860689, 860690, 860691, 860692, 860693, 860694, 860695, 860696, 860697, 860698, 860699, 860700, 860701, 860702, 860703, 860704, 860705, 860706, 860707, 860708, 860709, 860710, 860711, 860712, 860713, 860714, 860715, 860716, 861775, 861776, 861777, 861778, 861779, 861780, 861781, 861782, 861783, 861784, 861785, 861786, 861787, 861788, 861789, 861790, 861791, 861792, 861793, 861794, 861795, 861796, 861797, 861798, 861799, 861800, 861801, 861802, 861803, 861804, 861805, 861806, 861807, 861808, 861809, 861810, 861811, 861812, 862871, 862872, 862873, 862874, 862875, 862876, 862877, 862878, 862879, 862880, 862881, 862882, 862883, 862884, 862885, 862886, 862887, 862888, 862889, 862890, 862891, 862892, 862893, 862894, 862895, 862896, 862897, 862898, 862899, 862900, 862901, 862902, 862903, 862904, 862905, 862906, 862907, 862908, 863967, 863968, 863969, 863970, 863971, 863972, 863973, 863974, 863975, 863976, 863977, 863978, 863979, 863980, 863981, 863982, 863983, 863984, 863985, 863986, 863987, 863988, 863989, 863990, 863991, 863992, 863993, 863994, 863995, 863996, 863997, 863998, 863999, 864000, 864001, 864002, 864003, 864004, 865063, 865064, 865065, 865066, 865067, 865068, 865069, 865070, 865071, 865072, 865073, 865074, 865075, 865076, 865077, 865078, 865079, 865080, 865081, 865082, 865083, 865084, 865085, 865086, 865087, 865088, 865089, 865090, 865091, 865092, 865093, 865094, 865095, 865096, 865097, 865098, 865099, 865100, 866159, 866160, 866161, 866162, 866163, 866164, 866165, 866166, 866167, 866168, 866169, 866170, 866171, 866172, 866173, 866174, 866175, 866176, 866177, 866178, 866179, 866180, 866181, 866182, 866183, 866184, 866185, 866186, 866187, 866188, 866189, 866190, 866191, 866192, 866193, 866194, 866195, 866196, 867255, 867256, 867257, 867258, 867259, 867260, 867261, 867262, 867263, 867264, 867265, 867266, 867267, 867268, 867269, 867270, 867271, 867272, 867273, 867274, 867275, 867276, 867277, 867278, 867279, 867280, 867281, 867282, 867283, 867284, 867285, 867286, 867287, 867288, 867289, 867290, 867291, 867292, 868351, 868352, 868353, 868354, 868355, 868356, 868357, 868358, 868359, 868360, 868361, 868362, 868363, 868364, 868365, 868366, 868367, 868368, 868369, 868370, 868371, 868372, 868373, 868374, 868375, 868376, 868377, 868378, 868379, 868380, 868381, 868382, 868383, 868384, 868385, 868386, 868387, 868388, 869447, 869448, 869449, 869450, 869451, 869452, 869453, 869454, 869455, 869456, 869457, 869458, 869459, 869460, 869461, 869462, 869463, 869464, 869465, 869466, 869467, 869468, 869469, 869470, 869471, 869472, 869473, 869474, 869475, 869476, 869477, 869478, 869479, 869480, 869481, 869482, 869483, 869484, 870543, 870544, 870545, 870546, 870547, 870548, 870549, 870550, 870551, 870552, 870553, 870554, 870555, 870556, 870557, 870558, 870559, 870560, 870561, 870562, 870563, 870564, 870565, 870566, 870567, 870568, 870569, 870570, 870571, 870572, 870573, 870574, 870575, 870576, 870577, 870578, 870579, 870580, 871639, 871640, 871641, 871642, 871643, 871644, 871645, 871646, 871647, 871648, 871649, 871650, 871651, 871652, 871653, 871654, 871655, 871656, 871657, 871658, 871659, 871660, 871661, 871662, 871663, 871664, 871665, 871666, 871667, 871668, 871669, 871670, 871671, 871672, 871673, 871674, 871675, 871676, 872735, 872736, 872737, 872738, 872739, 872740, 872741, 872742, 872743, 872744, 872745, 872746, 872747, 872748, 872749, 872750, 872751, 872752, 872753, 872754, 872755, 872756, 872757, 872758, 872759, 872760, 872761, 872762, 872763, 872764, 872765, 872766, 872767, 872768, 872769, 872770, 872771, 872772, 873831, 873832, 873833, 873834, 873835, 873836, 873837, 873838, 873839, 873840, 873841, 873842, 873843, 873844, 873845, 873846, 873847, 873848, 873849, 873850, 873851, 873852, 873853, 873854, 873855, 873856, 873857, 873858, 873859, 873860, 873861, 873862, 873863, 873864, 873865, 873866, 873867, 873868, 874927, 874928, 874929, 874930, 874931, 874932, 874933, 874934, 874935, 874936, 874937, 874938, 874939, 874940, 874941, 874942, 874943, 874944, 874945, 874946, 874947, 874948, 874949, 874950, 874951, 874952, 874953, 874954, 874955, 874956, 874957, 874958, 874959, 874960, 874961, 874962, 874963, 874964, 876023, 876024, 876025, 876026, 876027, 876028, 876029, 876030, 876031, 876032, 876033, 876034, 876035, 876036, 876037, 876038, 876039, 876040, 876041, 876042, 876043, 876044, 876045, 876046, 876047, 876048, 876049, 876050, 876051, 876052, 876053, 876054, 876055, 876056, 876057, 876058, 876059, 876060, 877119, 877120, 877121, 877122, 877123, 877124, 877125, 877126, 877127, 877128, 877129, 877130, 877131, 877132, 877133, 877134, 877135, 877136, 877137, 877138, 877139, 877140, 877141, 877142, 877143, 877144, 877145, 877146, 877147, 877148, 877149, 877150, 877151, 877152, 877153, 877154, 877155, 877156, 878215, 878216, 878217, 878218, 878219, 878220, 878221, 878222, 878223, 878224, 878225, 878226, 878227, 878228, 878229, 878230, 878231, 878232, 878233, 878234, 878235, 878236, 878237, 878238, 878239, 878240, 878241, 878242, 878243, 878244, 878245, 878246, 878247, 878248, 878249, 878250, 878251, 878252, 879311, 879312, 879313, 879314, 879315, 879316, 879317, 879318, 879319, 879320, 879321, 879322, 879323, 879324, 879325, 879326, 879327, 879328, 879329, 879330, 879331, 879332, 879333, 879334, 879335, 879336, 879337, 879338, 879339, 879340, 879341, 879342, 879343, 879344, 879345, 879346, 879347, 879348, 880407, 880408, 880409, 880410, 880411, 880412, 880413, 880414, 880415, 880416, 880417, 880418, 880419, 880420, 880421, 880422, 880423, 880424, 880425, 880426, 880427, 880428, 880429, 880430, 880431, 880432, 880433, 880434, 880435, 880436, 880437, 880438, 880439, 880440, 880441, 880442, 880443, 880444, 881503, 881504, 881505, 881506, 881507, 881508, 881509, 881510, 881511, 881512, 881513, 881514, 881515, 881516, 881517, 881518, 881519, 881520, 881521, 881522, 881523, 881524, 881525, 881526, 881527, 881528, 881529, 881530, 881531, 881532, 881533, 881534, 881535, 881536, 881537, 881538, 881539, 881540, 882599, 882600, 882601, 882602, 882603, 882604, 882605, 882606, 882607, 882608, 882609, 882610, 882611, 882612, 882613, 882614, 882615, 882616, 882617, 882618, 882619, 882620, 882621, 882622, 882623, 882624, 882625, 882626, 882627, 882628, 882629, 882630, 882631, 882632, 882633, 882634, 882635, 882636, 883695, 883696, 883697, 883698, 883699, 883700, 883701, 883702, 883703, 883704, 883705, 883706, 883707, 883708, 883709, 883710, 883711, 883712, 883713, 883714, 883715, 883716, 883717, 883718, 883719, 883720, 883721, 883722, 883723, 883724, 883725, 883726, 883727, 883728, 883729, 883730, 883731, 883732, 884791, 884792, 884793, 884794, 884795, 884796, 884797, 884798, 884799, 884800, 884801, 884802, 884803, 884804, 884805, 884806, 884807, 884808, 884809, 884810, 884811, 884812, 884813, 884814, 884815, 884816, 884817, 884818, 884819, 884820, 884821, 884822, 884823, 884824, 884825, 884826, 884827, 884828, 885887, 885888, 885889, 885890, 885891, 885892, 885893, 885894, 885895, 885896, 885897, 885898, 885899, 885900, 885901, 885902, 885903, 885904, 885905, 885906, 885907, 885908, 885909, 885910, 885911, 885912, 885913, 885914, 885915, 885916, 885917, 885918, 885919, 885920, 885921, 885922, 885923, 885924, 886983, 886984, 886985, 886986, 886987, 886988, 886989, 886990, 886991, 886992, 886993, 886994, 886995, 886996, 886997, 886998, 886999, 887000, 887001, 887002, 887003, 887004, 887005, 887006, 887007, 887008, 887009, 887010, 887011, 887012, 887013, 887014, 887015, 887016, 887017, 887018, 887019, 887020, 888079, 888080, 888081, 888082, 888083, 888084, 888085, 888086, 888087, 888088, 888089, 888090, 888091, 888092, 888093, 888094, 888095, 888096, 888097, 888098, 888099, 888100, 888101, 888102, 888103, 888104, 888105, 888106, 888107, 888108, 888109, 888110, 888111, 888112, 888113, 888114, 888115, 888116, 889175, 889176, 889177, 889178, 889179, 889180, 889181, 889182, 889183, 889184, 889185, 889186, 889187, 889188, 889189, 889190, 889191, 889192, 889193, 889194, 889195, 889196, 889197, 889198, 889199, 889200, 889201, 889202, 889203, 889204, 889205, 889206, 889207, 889208, 889209, 889210, 889211, 889212, 890271, 890272, 890273, 890274, 890275, 890276, 890277, 890278, 890279, 890280, 890281, 890282, 890283, 890284, 890285, 890286, 890287, 890288, 890289, 890290, 890291, 890292, 890293, 890294, 890295, 890296, 890297, 890298, 890299, 890300, 890301, 890302, 890303, 890304, 890305, 890306, 890307, 890308, 891367, 891368, 891369, 891370, 891371, 891372, 891373, 891374, 891375, 891376, 891377, 891378, 891379, 891380, 891381, 891382, 891383, 891384, 891385, 891386, 891387, 891388, 891389, 891390, 891391, 891392, 891393, 891394, 891395, 891396, 891397, 891398, 891399, 891400, 891401, 891402, 891403, 891404, 892463, 892464, 892465, 892466, 892467, 892468, 892469, 892470, 892471, 892472, 892473, 892474, 892475, 892476, 892477, 892478, 892479, 892480, 892481, 892482, 892483, 892484, 892485, 892486, 892487, 892488, 892489, 892490, 892491, 892492, 892493, 892494, 892495, 892496, 892497, 892498, 892499, 892500, 893559, 893560, 893561, 893562, 893563, 893564, 893565, 893566, 893567, 893568, 893569, 893570, 893571, 893572, 893573, 893574, 893575, 893576, 893577, 893578, 893579, 893580, 893581, 893582, 893583, 893584, 893585, 893586, 893587, 893588, 893589, 893590, 893591, 893592, 893593, 893594, 893595, 893596, 894655, 894656, 894657, 894658, 894659, 894660, 894661, 894662, 894663, 894664, 894665, 894666, 894667, 894668, 894669, 894670, 894671, 894672, 894673, 894674, 894675, 894676, 894677, 894678, 894679, 894680, 894681, 894682, 894683, 894684, 894685, 894686, 894687, 894688, 894689, 894690, 894691, 894692, 895751, 895752, 895753, 895754, 895755, 895756, 895757, 895758, 895759, 895760, 895761, 895762, 895763, 895764, 895765, 895766, 895767, 895768, 895769, 895770, 895771, 895772, 895773, 895774, 895775, 895776, 895777, 895778, 895779, 895780, 895781, 895782, 895783, 895784, 895785, 895786, 895787, 895788, 896847, 896848, 896849, 896850, 896851, 896852, 896853, 896854, 896855, 896856, 896857, 896858, 896859, 896860, 896861, 896862, 896863, 896864, 896865, 896866, 896867, 896868, 896869, 896870, 896871, 896872, 896873, 896874, 896875, 896876, 896877, 896878, 896879, 896880, 896881, 896882, 896883, 896884, 897943, 897944, 897945, 897946, 897947, 897948, 897949, 897950, 897951, 897952, 897953, 897954, 897955, 897956, 897957, 897958, 897959, 897960, 897961, 897962, 897963, 897964, 897965, 897966, 897967, 897968, 897969, 897970, 897971, 897972, 897973, 897974, 897975, 897976, 897977, 897978, 897979, 897980, 899039, 899040, 899041, 899042, 899043, 899044, 899045, 899046, 899047, 899048, 899049, 899050, 899051, 899052, 899053, 899054, 899055, 899056, 899057, 899058, 899059, 899060, 899061, 899062, 899063, 899064, 899065, 899066, 899067, 899068, 899069, 899070, 899071, 899072, 899073, 899074, 899075, 899076, 900135, 900136, 900137, 900138, 900139, 900140, 900141, 900142, 900143, 900144, 900145, 900146, 900147, 900148, 900149, 900150, 900151, 900152, 900153, 900154, 900155, 900156, 900157, 900158, 900159, 900160, 900161, 900162, 900163, 900164, 900165, 900166, 900167, 900168, 900169, 900170, 900171, 900172, 901231, 901232, 901233, 901234, 901235, 901236, 901237, 901238, 901239, 901240, 901241, 901242, 901243, 901244, 901245, 901246, 901247, 901248, 901249, 901250, 901251, 901252, 901253, 901254, 901255, 901256, 901257, 901258, 901259, 901260, 901261, 901262, 901263, 901264, 901265, 901266, 901267, 901268, 902327, 902328, 902329, 902330, 902331, 902332, 902333, 902334, 902335, 902336, 902337, 902338, 902339, 902340, 902341, 902342, 902343, 902344, 902345, 902346, 902347, 902348, 902349, 902350, 902351, 902352, 902353, 902354, 902355, 902356, 902357, 902358, 902359, 902360, 902361, 902362, 902363, 902364, 903423, 903424, 903425, 903426, 903427, 903428, 903429, 903430, 903431, 903432, 903433, 903434, 903435, 903436, 903437, 903438, 903439, 903440, 903441, 903442, 903443, 903444, 903445, 903446, 903447, 903448, 903449, 903450, 903451, 903452, 903453, 903454, 903455, 903456, 903457, 903458, 903459, 903460, 904519, 904520, 904521, 904522, 904523, 904524, 904525, 904526, 904527, 904528, 904529, 904530, 904531, 904532, 904533, 904534, 904535, 904536, 904537, 904538, 904539, 904540, 904541, 904542, 904543, 904544, 904545, 904546, 904547, 904548, 904549, 904550, 904551, 904552, 904553, 904554, 904555, 904556, 905615, 905616, 905617, 905618, 905619, 905620, 905621, 905622, 905623, 905624, 905625, 905626, 905627, 905628, 905629, 905630, 905631, 905632, 905633, 905634, 905635, 905636, 905637, 905638, 905639, 905640, 905641, 905642, 905643, 905644, 905645, 905646, 905647, 905648, 905649, 905650, 905651, 905652, 906711, 906712, 906713, 906714, 906715, 906716, 906717, 906718, 906719, 906720, 906721, 906722, 906723, 906724, 906725, 906726, 906727, 906728, 906729, 906730, 906731, 906732, 906733, 906734, 906735, 906736, 906737, 906738, 906739, 906740, 906741, 906742, 906743, 906744, 906745, 906746, 906747, 906748, 907807, 907808, 907809, 907810, 907811, 907812, 907813, 907814, 907815, 907816, 907817, 907818, 907819, 907820, 907821, 907822, 907823, 907824, 907825, 907826, 907827, 907828, 907829, 907830, 907831, 907832, 907833, 907834, 907835, 907836, 907837, 907838, 907839, 907840, 907841, 907842, 907843, 907844, 908903, 908904, 908905, 908906, 908907, 908908, 908909, 908910, 908911, 908912, 908913, 908914, 908915, 908916, 908917, 908918, 908919, 908920, 908921, 908922, 908923, 908924, 908925, 908926, 908927, 908928, 908929, 908930, 908931, 908932, 908933, 908934, 908935, 908936, 908937, 908938, 908939, 908940, 909999, 910000, 910001, 910002, 910003, 910004, 910005, 910006, 910007, 910008, 910009, 910010, 910011, 910012, 910013, 910014, 910015, 910016, 910017, 910018, 910019, 910020, 910021, 910022, 910023, 910024, 910025, 910026, 910027, 910028, 910029, 910030, 910031, 910032, 910033, 910034, 910035, 910036, 911095, 911096, 911097, 911098, 911099, 911100, 911101, 911102, 911103, 911104, 911105, 911106, 911107, 911108, 911109, 911110, 911111, 911112, 911113, 911114, 911115, 911116, 911117, 911118, 911119, 911120, 911121, 911122, 911123, 911124, 911125, 911126, 911127, 911128, 911129, 911130, 911131, 911132, 912191, 912192, 912193, 912194, 912195, 912196, 912197, 912198, 912199, 912200, 912201, 912202, 912203, 912204, 912205, 912206, 912207, 912208, 912209, 912210, 912211, 912212, 912213, 912214, 912215, 912216, 912217, 912218, 912219, 912220, 912221, 912222, 912223, 912224, 912225, 912226, 912227, 912228, 913287, 913288, 913289, 913290, 913291, 913292, 913293, 913294, 913295, 913296, 913297, 913298, 913299, 913300, 913301, 913302, 913303, 913304, 913305, 913306, 913307, 913308, 913309, 913310, 913311, 913312, 913313, 913314, 913315, 913316, 913317, 913318, 913319, 913320, 913321, 913322, 913323, 913324, 914383, 914384, 914385, 914386, 914387, 914388, 914389, 914390, 914391, 914392, 914393, 914394, 914395, 914396, 914397, 914398, 914399, 914400, 914401, 914402, 914403, 914404, 914405, 914406, 914407, 914408, 914409, 914410, 914411, 914412, 914413, 914414, 914415, 914416, 914417, 914418, 914419, 914420, 915479, 915480, 915481, 915482, 915483, 915484, 915485, 915486, 915487, 915488, 915489, 915490, 915491, 915492, 915493, 915494, 915495, 915496, 915497, 915498, 915499, 915500, 915501, 915502, 915503, 915504, 915505, 915506, 915507, 915508, 915509, 915510, 915511, 915512, 915513, 915514, 915515, 915516, 916575, 916576, 916577, 916578, 916579, 916580, 916581, 916582, 916583, 916584, 916585, 916586, 916587, 916588, 916589, 916590, 916591, 916592, 916593, 916594, 916595, 916596, 916597, 916598, 916599, 916600, 916601, 916602, 916603, 916604, 916605, 916606, 916607, 916608, 916609, 916610, 916611, 916612, 917671, 917672, 917673, 917674, 917675, 917676, 917677, 917678, 917679, 917680, 917681, 917682, 917683, 917684, 917685, 917686, 917687, 917688, 917689, 917690, 917691, 917692, 917693, 917694, 917695, 917696, 917697, 917698, 917699, 917700, 917701, 917702, 917703, 917704, 917705, 917706, 917707, 917708, 918767, 918768, 918769, 918770, 918771, 918772, 918773, 918774, 918775, 918776, 918777, 918778, 918779, 918780, 918781, 918782, 918783, 918784, 918785, 918786, 918787, 918788, 918789, 918790, 918791, 918792, 918793, 918794, 918795, 918796, 918797, 918798, 918799, 918800, 918801, 918802, 918803, 918804, 919863, 919864, 919865, 919866, 919867, 919868, 919869, 919870, 919871, 919872, 919873, 919874, 919875, 919876, 919877, 919878, 919879, 919880, 919881, 919882, 919883, 919884, 919885, 919886, 919887, 919888, 919889, 919890, 919891, 919892, 919893, 919894, 919895, 919896, 919897, 919898, 919899, 919900, 920959, 920960, 920961, 920962, 920963, 920964, 920965, 920966, 920967, 920968, 920969, 920970, 920971, 920972, 920973, 920974, 920975, 920976, 920977, 920978, 920979, 920980, 920981, 920982, 920983, 920984, 920985, 920986, 920987, 920988, 920989, 920990, 920991, 920992, 920993, 920994, 920995, 920996, 922055, 922056, 922057, 922058, 922059, 922060, 922061, 922062, 922063, 922064, 922065, 922066, 922067, 922068, 922069, 922070, 922071, 922072, 922073, 922074, 922075, 922076, 922077, 922078, 922079, 922080, 922081, 922082, 922083, 922084, 922085, 922086, 922087, 922088, 922089, 922090, 922091, 922092, 923151, 923152, 923153, 923154, 923155, 923156, 923157, 923158, 923159, 923160, 923161, 923162, 923163, 923164, 923165, 923166, 923167, 923168, 923169, 923170, 923171, 923172, 923173, 923174, 923175, 923176, 923177, 923178, 923179, 923180, 923181, 923182, 923183, 923184, 923185, 923186, 923187, 923188, 924247, 924248, 924249, 924250, 924251, 924252, 924253, 924254, 924255, 924256, 924257, 924258, 924259, 924260, 924261, 924262, 924263, 924264, 924265, 924266, 924267, 924268, 924269, 924270, 924271, 924272, 924273, 924274, 924275, 924276, 924277, 924278, 924279, 924280, 924281, 924282, 924283, 924284, 925343, 925344, 925345, 925346, 925347, 925348, 925349, 925350, 925351, 925352, 925353, 925354, 925355, 925356, 925357, 925358, 925359, 925360, 925361, 925362, 925363, 925364, 925365, 925366, 925367, 925368, 925369, 925370, 925371, 925372, 925373, 925374, 925375, 925376, 925377, 925378, 925379, 925380, 926439, 926440, 926441, 926442, 926443, 926444, 926445, 926446, 926447, 926448, 926449, 926450, 926451, 926452, 926453, 926454, 926455, 926456, 926457, 926458, 926459, 926460, 926461, 926462, 926463, 926464, 926465, 926466, 926467, 926468, 926469, 926470, 926471, 926472, 926473, 926474, 926475, 926476, 927535, 927536, 927537, 927538, 927539, 927540, 927541, 927542, 927543, 927544, 927545, 927546, 927547, 927548, 927549, 927550, 927551, 927552, 927553, 927554, 927555, 927556, 927557, 927558, 927559, 927560, 927561, 927562, 927563, 927564, 927565, 927566, 927567, 927568, 927569, 927570, 927571, 927572, 928631, 928632, 928633, 928634, 928635, 928636, 928637, 928638, 928639, 928640, 928641, 928642, 928643, 928644, 928645, 928646, 928647, 928648, 928649, 928650, 928651, 928652, 928653, 928654, 928655, 928656, 928657, 928658, 928659, 928660, 928661, 928662, 928663, 928664, 928665, 928666, 928667, 928668, 929727, 929728, 929729, 929730, 929731, 929732, 929733, 929734, 929735, 929736, 929737, 929738, 929739, 929740, 929741, 929742, 929743, 929744, 929745, 929746, 929747, 929748, 929749, 929750, 929751, 929752, 929753, 929754, 929755, 929756, 929757, 929758, 929759, 929760, 929761, 929762, 929763, 929764, 930823, 930824, 930825, 930826, 930827, 930828, 930829, 930830, 930831, 930832, 930833, 930834, 930835, 930836, 930837, 930838, 930839, 930840, 930841, 930842, 930843, 930844, 930845, 930846, 930847, 930848, 930849, 930850, 930851, 930852, 930853, 930854, 930855, 930856, 930857, 930858, 930859, 930860, 931919, 931920, 931921, 931922, 931923, 931924, 931925, 931926, 931927, 931928, 931929, 931930, 931931, 931932, 931933, 931934, 931935, 931936, 931937, 931938, 931939, 931940, 931941, 931942, 931943, 931944, 931945, 931946, 931947, 931948, 931949, 931950, 931951, 931952, 931953, 931954, 931955, 931956, 933015, 933016, 933017, 933018, 933019, 933020, 933021, 933022, 933023, 933024, 933025, 933026, 933027, 933028, 933029, 933030, 933031, 933032, 933033, 933034, 933035, 933036, 933037, 933038, 933039, 933040, 933041, 933042, 933043, 933044, 933045, 933046, 933047, 933048, 933049, 933050, 933051, 933052, 934111, 934112, 934113, 934114, 934115, 934116, 934117, 934118, 934119, 934120, 934121, 934122, 934123, 934124, 934125, 934126, 934127, 934128, 934129, 934130, 934131, 934132, 934133, 934134, 934135, 934136, 934137, 934138, 934139, 934140, 934141, 934142, 934143, 934144, 934145, 934146, 934147, 934148, 935207, 935208, 935209, 935210, 935211, 935212, 935213, 935214, 935215, 935216, 935217, 935218, 935219, 935220, 935221, 935222, 935223, 935224, 935225, 935226, 935227, 935228, 935229, 935230, 935231, 935232, 935233, 935234, 935235, 935236, 935237, 935238, 935239, 935240, 935241, 935242, 935243, 935244, 936303, 936304, 936305, 936306, 936307, 936308, 936309, 936310, 936311, 936312, 936313, 936314, 936315, 936316, 936317, 936318, 936319, 936320, 936321, 936322, 936323, 936324, 936325, 936326, 936327, 936328, 936329, 936330, 936331, 936332, 936333, 936334, 936335, 936336, 936337, 936338, 936339, 936340, 937399, 937400, 937401, 937402, 937403, 937404, 937405, 937406, 937407, 937408, 937409, 937410, 937411, 937412, 937413, 937414, 937415, 937416, 937417, 937418, 937419, 937420, 937421, 937422, 937423, 937424, 937425, 937426, 937427, 937428, 937429, 937430, 937431, 937432, 937433, 937434, 937435, 937436, 938495, 938496, 938497, 938498, 938499, 938500, 938501, 938502, 938503, 938504, 938505, 938506, 938507, 938508, 938509, 938510, 938511, 938512, 938513, 938514, 938515, 938516, 938517, 938518, 938519, 938520, 938521, 938522, 938523, 938524, 938525, 938526, 938527, 938528, 938529, 938530, 938531, 938532, 939591, 939592, 939593, 939594, 939595, 939596, 939597, 939598, 939599, 939600, 939601, 939602, 939603, 939604, 939605, 939606, 939607, 939608, 939609, 939610, 939611, 939612, 939613, 939614, 939615, 939616, 939617, 939618, 939619, 939620, 939621, 939622, 939623, 939624, 939625, 939626, 939627, 939628, 940687, 940688, 940689, 940690, 940691, 940692, 940693, 940694, 940695, 940696, 940697, 940698, 940699, 940700, 940701, 940702, 940703, 940704, 940705, 940706, 940707, 940708, 940709, 940710, 940711, 940712, 940713, 940714, 940715, 940716, 940717, 940718, 940719, 940720, 940721, 940722, 940723, 940724, 941783, 941784, 941785, 941786, 941787, 941788, 941789, 941790, 941791, 941792, 941793, 941794, 941795, 941796, 941797, 941798, 941799, 941800, 941801, 941802, 941803, 941804, 941805, 941806, 941807, 941808, 941809, 941810, 941811, 941812, 941813, 941814, 941815, 941816, 941817, 941818, 941819, 941820, 942879, 942880, 942881, 942882, 942883, 942884, 942885, 942886, 942887, 942888, 942889, 942890, 942891, 942892, 942893, 942894, 942895, 942896, 942897, 942898, 942899, 942900, 942901, 942902, 942903, 942904, 942905, 942906, 942907, 942908, 942909, 942910, 942911, 942912, 942913, 942914, 942915, 942916, 943975, 943976, 943977, 943978, 943979, 943980, 943981, 943982, 943983, 943984, 943985, 943986, 943987, 943988, 943989, 943990, 943991, 943992, 943993, 943994, 943995, 943996, 943997, 943998, 943999, 944000, 944001, 944002, 944003, 944004, 944005, 944006, 944007, 944008, 944009, 944010, 944011, 944012, 945071, 945072, 945073, 945074, 945075, 945076, 945077, 945078, 945079, 945080, 945081, 945082, 945083, 945084, 945085, 945086, 945087, 945088, 945089, 945090, 945091, 945092, 945093, 945094, 945095, 945096, 945097, 945098, 945099, 945100, 945101, 945102, 945103, 945104, 945105, 945106, 945107, 945108, 946167, 946168, 946169, 946170, 946171, 946172, 946173, 946174, 946175, 946176, 946177, 946178, 946179, 946180, 946181, 946182, 946183, 946184, 946185, 946186, 946187, 946188, 946189, 946190, 946191, 946192, 946193, 946194, 946195, 946196, 946197, 946198, 946199, 946200, 946201, 946202, 946203, 946204, 947263, 947264, 947265, 947266, 947267, 947268, 947269, 947270, 947271, 947272, 947273, 947274, 947275, 947276, 947277, 947278, 947279, 947280, 947281, 947282, 947283, 947284, 947285, 947286, 947287, 947288, 947289, 947290, 947291, 947292, 947293, 947294, 947295, 947296, 947297, 947298, 947299, 947300, 948359, 948360, 948361, 948362, 948363, 948364, 948365, 948366, 948367, 948368, 948369, 948370, 948371, 948372, 948373, 948374, 948375, 948376, 948377, 948378, 948379, 948380, 948381, 948382, 948383, 948384, 948385, 948386, 948387, 948388, 948389, 948390, 948391, 948392, 948393, 948394, 948395, 948396, 949455, 949456, 949457, 949458, 949459, 949460, 949461, 949462, 949463, 949464, 949465, 949466, 949467, 949468, 949469, 949470, 949471, 949472, 949473, 949474, 949475, 949476, 949477, 949478, 949479, 949480, 949481, 949482, 949483, 949484, 949485, 949486, 949487, 949488, 949489, 949490, 949491, 949492, 950551, 950552, 950553, 950554, 950555, 950556, 950557, 950558, 950559, 950560, 950561, 950562, 950563, 950564, 950565, 950566, 950567, 950568, 950569, 950570, 950571, 950572, 950573, 950574, 950575, 950576, 950577, 950578, 950579, 950580, 950581, 950582, 950583, 950584, 950585, 950586, 950587, 950588, 951647, 951648, 951649, 951650, 951651, 951652, 951653, 951654, 951655, 951656, 951657, 951658, 951659, 951660, 951661, 951662, 951663, 951664, 951665, 951666, 951667, 951668, 951669, 951670, 951671, 951672, 951673, 951674, 951675, 951676, 951677, 951678, 951679, 951680, 951681, 951682, 951683, 951684, 952743, 952744, 952745, 952746, 952747, 952748, 952749, 952750, 952751, 952752, 952753, 952754, 952755, 952756, 952757, 952758, 952759, 952760, 952761, 952762, 952763, 952764, 952765, 952766, 952767, 952768, 952769, 952770, 952771, 952772, 952773, 952774, 952775, 952776, 952777, 952778, 952779, 952780, 953839, 953840, 953841, 953842, 953843, 953844, 953845, 953846, 953847, 953848, 953849, 953850, 953851, 953852, 953853, 953854, 953855, 953856, 953857, 953858, 953859, 953860, 953861, 953862, 953863, 953864, 953865, 953866, 953867, 953868, 953869, 953870, 953871, 953872, 953873, 953874, 953875, 953876, 954935, 954936, 954937, 954938, 954939, 954940, 954941, 954942, 954943, 954944, 954945, 954946, 954947, 954948, 954949, 954950, 954951, 954952, 954953, 954954, 954955, 954956, 954957, 954958, 954959, 954960, 954961, 954962, 954963, 954964, 954965, 954966, 954967, 954968, 954969, 954970, 954971, 954972, 956031, 956032, 956033, 956034, 956035, 956036, 956037, 956038, 956039, 956040, 956041, 956042, 956043, 956044, 956045, 956046, 956047, 956048, 956049, 956050, 956051, 956052, 956053, 956054, 956055, 956056, 956057, 956058, 956059, 956060, 956061, 956062, 956063, 956064, 956065, 956066, 956067, 956068, 957127, 957128, 957129, 957130, 957131, 957132, 957133, 957134, 957135, 957136, 957137, 957138, 957139, 957140, 957141, 957142, 957143, 957144, 957145, 957146, 957147, 957148, 957149, 957150, 957151, 957152, 957153, 957154, 957155, 957156, 957157, 957158, 957159, 957160, 957161, 957162, 957163, 957164, 958223, 958224, 958225, 958226, 958227, 958228, 958229, 958230, 958231, 958232, 958233, 958234, 958235, 958236, 958237, 958238, 958239, 958240, 958241, 958242, 958243, 958244, 958245, 958246, 958247, 958248, 958249, 958250, 958251, 958252, 958253, 958254, 958255, 958256, 958257, 958258, 958259, 958260, 959319, 959320, 959321, 959322, 959323, 959324, 959325, 959326, 959327, 959328, 959329, 959330, 959331, 959332, 959333, 959334, 959335, 959336, 959337, 959338, 959339, 959340, 959341, 959342, 959343, 959344, 959345, 959346, 959347, 959348, 959349, 959350, 959351, 959352, 959353, 959354, 959355, 959356, 960415, 960416, 960417, 960418, 960419, 960420, 960421, 960422, 960423, 960424, 960425, 960426, 960427, 960428, 960429, 960430, 960431, 960432, 960433, 960434, 960435, 960436, 960437, 960438, 960439, 960440, 960441, 960442, 960443, 960444, 960445, 960446, 960447, 960448, 960449, 960450, 960451, 960452, 961511, 961512, 961513, 961514, 961515, 961516, 961517, 961518, 961519, 961520, 961521, 961522, 961523, 961524, 961525, 961526, 961527, 961528, 961529, 961530, 961531, 961532, 961533, 961534, 961535, 961536, 961537, 961538, 961539, 961540, 961541, 961542, 961543, 961544, 961545, 961546, 961547, 961548, 962607, 962608, 962609, 962610, 962611, 962612, 962613, 962614, 962615, 962616, 962617, 962618, 962619, 962620, 962621, 962622, 962623, 962624, 962625, 962626, 962627, 962628, 962629, 962630, 962631, 962632, 962633, 962634, 962635, 962636, 962637, 962638, 962639, 962640, 962641, 962642, 962643, 962644, 963703, 963704, 963705, 963706, 963707, 963708, 963709, 963710, 963711, 963712, 963713, 963714, 963715, 963716, 963717, 963718, 963719, 963720, 963721, 963722, 963723, 963724, 963725, 963726, 963727, 963728, 963729, 963730, 963731, 963732, 963733, 963734, 963735, 963736, 963737, 963738, 963739, 963740, 964799, 964800, 964801, 964802, 964803, 964804, 964805, 964806, 964807, 964808, 964809, 964810, 964811, 964812, 964813, 964814, 964815, 964816, 964817, 964818, 964819, 964820, 964821, 964822, 964823, 964824, 964825, 964826, 964827, 964828, 964829, 964830, 964831, 964832, 964833, 964834, 964835, 964836, 965895, 965896, 965897, 965898, 965899, 965900, 965901, 965902, 965903, 965904, 965905, 965906, 965907, 965908, 965909, 965910, 965911, 965912, 965913, 965914, 965915, 965916, 965917, 965918, 965919, 965920, 965921, 965922, 965923, 965924, 965925, 965926, 965927, 965928, 965929, 965930, 965931, 965932, 966991, 966992, 966993, 966994, 966995, 966996, 966997, 966998, 966999, 967000, 967001, 967002, 967003, 967004, 967005, 967006, 967007, 967008, 967009, 967010, 967011, 967012, 967013, 967014, 967015, 967016, 967017, 967018, 967019, 967020, 967021, 967022, 967023, 967024, 967025, 967026, 967027, 967028, 968087, 968088, 968089, 968090, 968091, 968092, 968093, 968094, 968095, 968096, 968097, 968098, 968099, 968100, 968101, 968102, 968103, 968104, 968105, 968106, 968107, 968108, 968109, 968110, 968111, 968112, 968113, 968114, 968115, 968116, 968117, 968118, 968119, 968120, 968121, 968122, 968123, 968124, 969183, 969184, 969185, 969186, 969187, 969188, 969189, 969190, 969191, 969192, 969193, 969194, 969195, 969196, 969197, 969198, 969199, 969200, 969201, 969202, 969203, 969204, 969205, 969206, 969207, 969208, 969209, 969210, 969211, 969212, 969213, 969214, 969215, 969216, 969217, 969218, 969219, 969220, 970279, 970280, 970281, 970282, 970283, 970284, 970285, 970286, 970287, 970288, 970289, 970290, 970291, 970292, 970293, 970294, 970295, 970296, 970297, 970298, 970299, 970300, 970301, 970302, 970303, 970304, 970305, 970306, 970307, 970308, 970309, 970310, 970311, 970312, 970313, 970314, 970315, 970316, 971375, 971376, 971377, 971378, 971379, 971380, 971381, 971382, 971383, 971384, 971385, 971386, 971387, 971388, 971389, 971390, 971391, 971392, 971393, 971394, 971395, 971396, 971397, 971398, 971399, 971400, 971401, 971402, 971403, 971404, 971405, 971406, 971407, 971408, 971409, 971410, 971411, 971412, 972471, 972472, 972473, 972474, 972475, 972476, 972477, 972478, 972479, 972480, 972481, 972482, 972483, 972484, 972485, 972486, 972487, 972488, 972489, 972490, 972491, 972492, 972493, 972494, 972495, 972496, 972497, 972498, 972499, 972500, 972501, 972502, 972503, 972504, 972505, 972506, 972507, 972508, 973567, 973568, 973569, 973570, 973571, 973572, 973573, 973574, 973575, 973576, 973577, 973578, 973579, 973580, 973581, 973582, 973583, 973584, 973585, 973586, 973587, 973588, 973589, 973590, 973591, 973592, 973593, 973594, 973595, 973596, 973597, 973598, 973599, 973600, 973601, 973602, 973603, 973604, 974663, 974664, 974665, 974666, 974667, 974668, 974669, 974670, 974671, 974672, 974673, 974674, 974675, 974676, 974677, 974678, 974679, 974680, 974681, 974682, 974683, 974684, 974685, 974686, 974687, 974688, 974689, 974690, 974691, 974692, 974693, 974694, 974695, 974696, 974697, 974698, 974699, 974700, 975759, 975760, 975761, 975762, 975763, 975764, 975765, 975766, 975767, 975768, 975769, 975770, 975771, 975772, 975773, 975774, 975775, 975776, 975777, 975778, 975779, 975780, 975781, 975782, 975783, 975784, 975785, 975786, 975787, 975788, 975789, 975790, 975791, 975792, 975793, 975794, 975795, 975796, 976855, 976856, 976857, 976858, 976859, 976860, 976861, 976862, 976863, 976864, 976865, 976866, 976867, 976868, 976869, 976870, 976871, 976872, 976873, 976874, 976875, 976876, 976877, 976878, 976879, 976880, 976881, 976882, 976883, 976884, 976885, 976886, 976887, 976888, 976889, 976890, 976891, 976892, 977951, 977952, 977953, 977954, 977955, 977956, 977957, 977958, 977959, 977960, 977961, 977962, 977963, 977964, 977965, 977966, 977967, 977968, 977969, 977970, 977971, 977972, 977973, 977974, 977975, 977976, 977977, 977978, 977979, 977980, 977981, 977982, 977983, 977984, 977985, 977986, 977987, 977988, 979047, 979048, 979049, 979050, 979051, 979052, 979053, 979054, 979055, 979056, 979057, 979058, 979059, 979060, 979061, 979062, 979063, 979064, 979065, 979066, 979067, 979068, 979069, 979070, 979071, 979072, 979073, 979074, 979075, 979076, 979077, 979078, 979079, 979080, 979081, 979082, 979083, 979084, 980143, 980144, 980145, 980146, 980147, 980148, 980149, 980150, 980151, 980152, 980153, 980154, 980155, 980156, 980157, 980158, 980159, 980160, 980161, 980162, 980163, 980164, 980165, 980166, 980167, 980168, 980169, 980170, 980171, 980172, 980173, 980174, 980175, 980176, 980177, 980178, 980179, 980180, 981239, 981240, 981241, 981242, 981243, 981244, 981245, 981246, 981247, 981248, 981249, 981250, 981251, 981252, 981253, 981254, 981255, 981256, 981257, 981258, 981259, 981260, 981261, 981262, 981263, 981264, 981265, 981266, 981267, 981268, 981269, 981270, 981271, 981272, 981273, 981274, 981275, 981276, 982335, 982336, 982337, 982338, 982339, 982340, 982341, 982342, 982343, 982344, 982345, 982346, 982347, 982348, 982349, 982350, 982351, 982352, 982353, 982354, 982355, 982356, 982357, 982358, 982359, 982360, 982361, 982362, 982363, 982364, 982365, 982366, 982367, 982368, 982369, 982370, 982371, 982372, 983431, 983432, 983433, 983434, 983435, 983436, 983437, 983438, 983439, 983440, 983441, 983442, 983443, 983444, 983445, 983446, 983447, 983448, 983449, 983450, 983451, 983452, 983453, 983454, 983455, 983456, 983457, 983458, 983459, 983460, 983461, 983462, 983463, 983464, 983465, 983466, 983467, 983468, 984527, 984528, 984529, 984530, 984531, 984532, 984533, 984534, 984535, 984536, 984537, 984538, 984539, 984540, 984541, 984542, 984543, 984544, 984545, 984546, 984547, 984548, 984549, 984550, 984551, 984552, 984553, 984554, 984555, 984556, 984557, 984558, 984559, 984560, 984561, 984562, 984563, 984564, 985623, 985624, 985625, 985626, 985627, 985628, 985629, 985630, 985631, 985632, 985633, 985634, 985635, 985636, 985637, 985638, 985639, 985640, 985641, 985642, 985643, 985644, 985645, 985646, 985647, 985648, 985649, 985650, 985651, 985652, 985653, 985654, 985655, 985656, 985657, 985658, 985659, 985660, 986719, 986720, 986721, 986722, 986723, 986724, 986725, 986726, 986727, 986728, 986729, 986730, 986731, 986732, 986733, 986734, 986735, 986736, 986737, 986738, 986739, 986740, 986741, 986742, 986743, 986744, 986745, 986746, 986747, 986748, 986749, 986750, 986751, 986752, 986753, 986754, 986755, 986756, 987815, 987816, 987817, 987818, 987819, 987820, 987821, 987822, 987823, 987824, 987825, 987826, 987827, 987828, 987829, 987830, 987831, 987832, 987833, 987834, 987835, 987836, 987837, 987838, 987839, 987840, 987841, 987842, 987843, 987844, 987845, 987846, 987847, 987848, 987849, 987850, 987851, 987852, 988911, 988912, 988913, 988914, 988915, 988916, 988917, 988918, 988919, 988920, 988921, 988922, 988923, 988924, 988925, 988926, 988927, 988928, 988929, 988930, 988931, 988932, 988933, 988934, 988935, 988936, 988937, 988938, 988939, 988940, 988941, 988942, 988943, 988944, 988945, 988946, 988947, 988948, 990007, 990008, 990009, 990010, 990011, 990012, 990013, 990014, 990015, 990016, 990017, 990018, 990019, 990020, 990021, 990022, 990023, 990024, 990025, 990026, 990027, 990028, 990029, 990030, 990031, 990032, 990033, 990034, 990035, 990036, 990037, 990038, 990039, 990040, 990041, 990042, 990043, 990044, 991103, 991104, 991105, 991106, 991107, 991108, 991109, 991110, 991111, 991112, 991113, 991114, 991115, 991116, 991117, 991118, 991119, 991120, 991121, 991122, 991123, 991124, 991125, 991126, 991127, 991128, 991129, 991130, 991131, 991132, 991133, 991134, 991135, 991136, 991137, 991138, 991139, 991140, 992199, 992200, 992201, 992202, 992203, 992204, 992205, 992206, 992207, 992208, 992209, 992210, 992211, 992212, 992213, 992214, 992215, 992216, 992217, 992218, 992219, 992220, 992221, 992222, 992223, 992224, 992225, 992226, 992227, 992228, 992229, 992230, 992231, 992232, 992233, 992234, 992235, 992236, 993295, 993296, 993297, 993298, 993299, 993300, 993301, 993302, 993303, 993304, 993305, 993306, 993307, 993308, 993309, 993310, 993311, 993312, 993313, 993314, 993315, 993316, 993317, 993318, 993319, 993320, 993321, 993322, 993323, 993324, 993325, 993326, 993327, 993328, 993329, 993330, 993331, 993332, 994391, 994392, 994393, 994394, 994395, 994396, 994397, 994398, 994399, 994400, 994401, 994402, 994403, 994404, 994405, 994406, 994407, 994408, 994409, 994410, 994411, 994412, 994413, 994414, 994415, 994416, 994417, 994418, 994419, 994420, 994421, 994422, 994423, 994424, 994425, 994426, 994427, 994428, 995487, 995488, 995489, 995490, 995491, 995492, 995493, 995494, 995495, 995496, 995497, 995498, 995499, 995500, 995501, 995502, 995503, 995504, 995505, 995506, 995507, 995508, 995509, 995510, 995511, 995512, 995513, 995514, 995515, 995516, 995517, 995518, 995519, 995520, 995521, 995522, 995523, 995524, 996583, 996584, 996585, 996586, 996587, 996588, 996589, 996590, 996591, 996592, 996593, 996594, 996595, 996596, 996597, 996598, 996599, 996600, 996601, 996602, 996603, 996604, 996605, 996606, 996607, 996608, 996609, 996610, 996611, 996612, 996613, 996614, 996615, 996616, 996617, 996618, 996619, 996620, 997679, 997680, 997681, 997682, 997683, 997684, 997685, 997686, 997687, 997688, 997689, 997690, 997691, 997692, 997693, 997694, 997695, 997696, 997697, 997698, 997699, 997700, 997701, 997702, 997703, 997704, 997705, 997706, 997707, 997708, 997709, 997710, 997711, 997712, 997713, 997714, 997715, 997716, 998775, 998776, 998777, 998778, 998779, 998780, 998781, 998782, 998783, 998784, 998785, 998786, 998787, 998788, 998789, 998790, 998791, 998792, 998793, 998794, 998795, 998796, 998797, 998798, 998799, 998800, 998801, 998802, 998803, 998804, 998805, 998806, 998807, 998808, 998809, 998810, 998811, 998812, 999871, 999872, 999873, 999874, 999875, 999876, 999877, 999878, 999879, 999880, 999881, 999882, 999883, 999884, 999885, 999886, 999887, 999888, 999889, 999890, 999891, 999892, 999893, 999894, 999895, 999896, 999897, 999898, 999899, 999900, 999901, 999902, 999903, 999904, 999905, 999906, 999907, 999908, 1000967, 1000968, 1000969, 1000970, 1000971, 1000972, 1000973, 1000974, 1000975, 1000976, 1000977, 1000978, 1000979, 1000980, 1000981, 1000982, 1000983, 1000984, 1000985, 1000986, 1000987, 1000988, 1000989, 1000990, 1000991, 1000992, 1000993, 1000994, 1000995, 1000996, 1000997, 1000998, 1000999, 1001000, 1001001, 1001002, 1001003, 1001004, 1002063, 1002064, 1002065, 1002066, 1002067, 1002068, 1002069, 1002070, 1002071, 1002072, 1002073, 1002074, 1002075, 1002076, 1002077, 1002078, 1002079, 1002080, 1002081, 1002082, 1002083, 1002084, 1002085, 1002086, 1002087, 1002088, 1002089, 1002090, 1002091, 1002092, 1002093, 1002094, 1002095, 1002096, 1002097, 1002098, 1002099, 1002100, 1003159, 1003160, 1003161, 1003162, 1003163, 1003164, 1003165, 1003166, 1003167, 1003168, 1003169, 1003170, 1003171, 1003172, 1003173, 1003174, 1003175, 1003176, 1003177, 1003178, 1003179, 1003180, 1003181, 1003182, 1003183, 1003184, 1003185, 1003186, 1003187, 1003188, 1003189, 1003190, 1003191, 1003192, 1003193, 1003194, 1003195, 1003196, 1004255, 1004256, 1004257, 1004258, 1004259, 1004260, 1004261, 1004262, 1004263, 1004264, 1004265, 1004266, 1004267, 1004268, 1004269, 1004270, 1004271, 1004272, 1004273, 1004274, 1004275, 1004276, 1004277, 1004278, 1004279, 1004280, 1004281, 1004282, 1004283, 1004284, 1004285, 1004286, 1004287, 1004288, 1004289, 1004290, 1004291, 1004292, 1005351, 1005352, 1005353, 1005354, 1005355, 1005356, 1005357, 1005358, 1005359, 1005360, 1005361, 1005362, 1005363, 1005364, 1005365, 1005366, 1005367, 1005368, 1005369, 1005370, 1005371, 1005372, 1005373, 1005374, 1005375, 1005376, 1005377, 1005378, 1005379, 1005380, 1005381, 1005382, 1005383, 1005384, 1005385, 1005386, 1005387, 1005388, 1006447, 1006448, 1006449, 1006450, 1006451, 1006452, 1006453, 1006454, 1006455, 1006456, 1006457, 1006458, 1006459, 1006460, 1006461, 1006462, 1006463, 1006464, 1006465, 1006466, 1006467, 1006468, 1006469, 1006470, 1006471, 1006472, 1006473, 1006474, 1006475, 1006476, 1006477, 1006478, 1006479, 1006480, 1006481, 1006482, 1006483, 1006484, 1007543, 1007544, 1007545, 1007546, 1007547, 1007548, 1007549, 1007550, 1007551, 1007552, 1007553, 1007554, 1007555, 1007556, 1007557, 1007558, 1007559, 1007560, 1007561, 1007562, 1007563, 1007564, 1007565, 1007566, 1007567, 1007568, 1007569, 1007570, 1007571, 1007572, 1007573, 1007574, 1007575, 1007576, 1007577, 1007578, 1007579, 1007580, 1008639, 1008640, 1008641, 1008642, 1008643, 1008644, 1008645, 1008646, 1008647, 1008648, 1008649, 1008650, 1008651, 1008652, 1008653, 1008654, 1008655, 1008656, 1008657, 1008658, 1008659, 1008660, 1008661, 1008662, 1008663, 1008664, 1008665, 1008666, 1008667, 1008668, 1008669, 1008670, 1008671, 1008672, 1008673, 1008674, 1008675, 1008676, 1009735, 1009736, 1009737, 1009738, 1009739, 1009740, 1009741, 1009742, 1009743, 1009744, 1009745, 1009746, 1009747, 1009748, 1009749, 1009750, 1009751, 1009752, 1009753, 1009754, 1009755, 1009756, 1009757, 1009758, 1009759, 1009760, 1009761, 1009762, 1009763, 1009764, 1009765, 1009766, 1009767, 1009768, 1009769, 1009770, 1009771, 1009772, 1010831, 1010832, 1010833, 1010834, 1010835, 1010836, 1010837, 1010838, 1010839, 1010840, 1010841, 1010842, 1010843, 1010844, 1010845, 1010846, 1010847, 1010848, 1010849, 1010850, 1010851, 1010852, 1010853, 1010854, 1010855, 1010856, 1010857, 1010858, 1010859, 1010860, 1010861, 1010862, 1010863, 1010864, 1010865, 1010866, 1010867, 1010868, 1011927, 1011928, 1011929, 1011930, 1011931, 1011932, 1011933, 1011934, 1011935, 1011936, 1011937, 1011938, 1011939, 1011940, 1011941, 1011942, 1011943, 1011944, 1011945, 1011946, 1011947, 1011948, 1011949, 1011950, 1011951, 1011952, 1011953, 1011954, 1011955, 1011956, 1011957, 1011958, 1011959, 1011960, 1011961, 1011962, 1011963, 1011964, 1013023, 1013024, 1013025, 1013026, 1013027, 1013028, 1013029, 1013030, 1013031, 1013032, 1013033, 1013034, 1013035, 1013036, 1013037, 1013038, 1013039, 1013040, 1013041, 1013042, 1013043, 1013044, 1013045, 1013046, 1013047, 1013048, 1013049, 1013050, 1013051, 1013052, 1013053, 1013054, 1013055, 1013056, 1013057, 1013058, 1013059, 1013060, 1037009, 1037010, 1095024, 1095025, 1095026, 1095027, 1095028, 1095029, 1095030, 1095031, 1095032, 1095033, 1095034, 1095035, 1095036, 1095037, 1095038, 1095039, 1095040, 1095041, 1095042, 1095043, 1095044, 1095045, 1095046, 1095047, 1095048, 1095049, 1095050, 1095051, 1095052, 1095053, 1095054, 1095055, 1095056, 1095057, 1095058, 1095059, 1095060, 1095061, 1095062, 1095063, 1095064, 1095065, 1095066, 1095067, 1095068, 1095069, 1095070, 1095071, 1095072, 1095073, 1095074, 1095075, 1095076, 1095077, 1095078, 1095079, 1095080, 1095081, 1095082, 1095083, 1095084, 1095085, 1095086, 1095087, 1095088, 1095089, 1095090, 1095091, 1095092, 1095093, 1095094, 1095095, 1095096, 1095097, 1095098, 1095099, 1095100, 1095101, 1095102, 1095103, 1095104, 1095105, 1095106, 1095107, 1095108, 1095109, 1095110, 1095111, 1095192, 1095193, 1095194, 1095195, 1095196, 1095197, 1095198, 1095199, 1095200, 1095201, 1095202, 1095203, 1095204, 1095205, 1095206, 1095207, 1095208, 1095209, 1095210, 1095211, 1095212, 1095213, 1095214, 1095215, 1095216, 1095217, 1095218, 1095219, 1095220, 1095221, 1095222, 1095223, 1095224, 1095225, 1095226, 1095227, 1095228, 1095229, 1095230, 1095231, 1095232, 1095233, 1095234, 1095235, 1095236, 1095237, 1095238, 1095239, 1095240, 1095241, 1095242, 1095243, 1095244, 1095245, 1095246, 1095247, 1095248, 1095249, 1095250, 1095251, 1095252, 1095253, 1095254, 1095255, 1095256, 1095257, 1095258, 1095259, 1095260, 1095261, 1095262, 1095263, 1095264, 1095265, 1095266, 1095267, 1095268, 1095269, 1095270, 1095271, 1095272, 1095273, 1095274, 1095275, 1095276, 1095277, 1095278, 1095279, 1170624, 1170625, 1170626, 1170627, 1170628, 1170629, 1170630, 1170631, 1170632, 1170633, 1170634, 1170635, 1170636, 1170637, 1170638, 1170639, 1170640, 1170641, 1170642, 1170643, 1170644, 1170645, 1170646, 1170647, 1170648, 1170649, 1170650, 1170651, 1170652, 1170653, 1170654, 1170655, 1170656, 1170657, 1170658, 1170659, 1170660, 1170661, 1170662, 1170663, 1170664, 1170665, 1170666, 1170667, 1170668, 1170669, 1170670, 1170671, 1170672, 1170673, 1170674, 1170675, 1170676, 1170677, 1170678, 1170679, 1170680, 1170681, 1170682, 1170683, 1170684, 1170685, 1170686, 1170687, 1170688, 1170689, 1170690, 1170691, 1170692, 1170693, 1170694, 1170695, 1170696, 1170697, 1170698, 1170699, 1170700, 1170701, 1170702, 1170703, 1170704, 1170705, 1170706, 1170707, 1170708, 1170709, 1170710, 1170711, 1170712, 1170713, 1170714, 1170715, 1170716, 1170717, 1170718, 1170719, 1170720, 1170721, 1170722, 1170723, 1170724, 1170725, 1170726, 1170727, 1170728, 1170729, 1170730, 1170731, 1170732, 1170733, 1170734, 1170735, 1170736, 1170737, 1170738, 1170739, 1170740, 1170741, 1170742, 1170743, 1170744, 1170745, 1170746, 1170747, 1170748, 1170749, 1170750, 1170751, 1170752, 1170753, 1170754, 1170755, 1170756, 1170757, 1170758, 1170759, 1170760, 1170761, 1170762, 1170763, 1170764, 1170765, 1170766, 1170767, 1170768, 1170769, 1170770, 1170771, 1170772, 1170773, 1170774, 1170775, 1170776, 1170777, 1170778, 1170779, 1170780, 1170781, 1170782, 1170783, 1170784, 1170785, 1170786, 1170787, 1170788, 1170789, 1170790, 1170791, 1178525, 1178526, 1178617, 1178618, 1178709, 1178710, 1178801, 1178802, 1178893, 1178894, 1178985, 1178986, 1179077, 1179078, 1179169, 1179170, 1179261, 1179262, 1179353, 1179354, 1179445, 1179446, 1179537, 1179538, 1179629, 1179630, 1179721, 1179722, 1179813, 1179814, 1179905, 1179906, 1179997, 1179998, 1180089, 1180090, 1180181, 1180182, 1180273, 1180274, 1180365, 1180366, 1180457, 1180458, 1180549, 1180550, 1180641, 1180642, 1180733, 1180734, 1180825, 1180826, 1180917, 1180918, 1181009, 1181010, 1181101, 1181102, 1181193, 1181194, 1181285, 1181286, 1181377, 1181378, 1181469, 1181470, 1181561, 1181562, 1181653, 1181654, 1181745, 1181746, 1181837, 1181838, 1181929, 1181930, 1182021, 1182022, 1182113, 1182114, 1182205, 1182206, 1182297, 1182298, 1182389, 1182390, 1182481, 1182482, 1182573, 1182574, 1182665, 1182666, 1182757, 1182758, 1182849, 1182850, 1182941, 1182942, 1183033, 1183034, 1183125, 1183126, 1183217, 1183218, 1183309, 1183310, 1183401, 1183402, 1183493, 1183494, 1183585, 1183586, 1183677, 1183678, 1183769, 1183770, 1183861, 1183862, 1183953, 1183954, 1184045, 1184046, 1184137, 1184138, 1184229, 1184230, 1184321, 1184322, 1184413, 1184414, 1184505, 1184506, 1184597, 1184598, 1184689, 1184690, 1184781, 1184782, 1184873, 1184874, 1184965, 1184966, 1185057, 1185058, 1185149, 1185150, 1185241, 1185242, 1185333, 1185334, 1185425, 1185426, 1185517, 1185518, 1185609, 1185610, 1185701, 1185702, 1185793, 1185794, 1185885, 1185886, 1185977, 1185978, 1186069, 1186070, 1186161, 1186162, 1186253, 1186254, 1186345, 1186346, 1186437, 1186438, 1186529, 1186530, 1193977]
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (mac64[arm] - Darwin 24.6.0 24G84)

CPU model: Apple M4 Pro
Thread count: 12 physical cores, 12 logical processors, using up to 32 threads

Warning: Thread count (32) is larger than processor count (12)
         Reduce the value of the Threads parameter to improve performance


Non-default parameters:
FeasibilityTol  1e-08
OptimalityTol  1e-08
Method  1
NodeMethod  1
AggFill  0
PreDual  0
Seed  123
Threads  32

The IIS computes the cause of infeasibility as related to the biomass constraint:

Store-energy_balance[2009-12-18 19:00:00, co2 sequestered-2030]: -1 Store-e[2009-12-18 19:00:00, co2 sequestered-2030] - 1 Store-p[2009-12-18 19:00:00, co2 sequestered-2030] + 1 Store-e[2009-12-18 18:00:00, co2 sequestered-2030] = -0
Store-energy_balance[2009-12-18 20:00:00, co2 stored]: -1 Store-e[2009-12-18 20:00:00, co2 stored] - 1 Store-p[2009-12-18 20:00:00, co2 stored] + 1 Store-e[2009-12-18 19:00:00, co2 stored] = -0
Store-energy_balance[2009-12-18 20:00:00, co2 sequestered-2030]: -1 Store-e[2009-12-18 20:00:00, co2 sequestered-2030] - 1 Store-p[2009-12-18 20:00:00, co2 sequestered-2030] + 1 Store-e[2009-12-18 19:00:00, co2 sequestered-2030] = -0
Store-energy_balance[2009-12-18 21:00:00, co2 stored]: -1 Store-e[2009-12-18 21:00:00, co2 stored] - 1 Store-p[2009-12-18 21:00:00, co2 stored] + 1 Store-e[2009-12-18 20:00:00, co2 stored] = -0
Store-energy_balance[2009-12-18 21:00:00, co2 sequestered-2030]: -1 Store-e[2009-12-18 21:00:00, co2 sequestered-2030] - 1 Store-p[2009-12-18 21:00:00, co2 sequestered-2030] + 1 Store-e[2009-12-18 20:00:00, co2 sequestered-2030] = -0
Store-energy_balance[2009-12-18 22:00:00, co2 stored]: -1 Store-e[2009-12-18 22:00:00, co2 stored] - 1 Store-p[2009-12-18 22:00:00, co2 stored] + 1 Store-e[2009-12-18 21:00:00, co2 stored] = -0
Store-energy_balance[2009-12-18 22:00:00, co2 sequestered-2030]: -1 Store-e[2009-12-18 22:00:00, co2 sequestered-2030] - 1 Store-p[2009-12-18 22:00:00, co2 sequestered-2030] + 1 Store-e[2009-12-18 21:00:00, co2 sequestered-2030] = -0
Store-energy_balance[2009-12-18 23:00:00, co2 stored]: -1 Store-e[2009-12-18 23:00:00, co2 stored] - 1 Store-p[2009-12-18 23:00:00, co2 stored] + 1 Store-e[2009-12-18 22:00:00, co2 stored] = -0
Store-energy_balance[2009-12-18 23:00:00, co2 sequestered-2030]: -1 Store-e[2009-12-18 23:00:00, co2 sequestered-2030] - 1 Store-p[2009-12-18 23:00:00, co2 sequestered-2030] + 1 Store-e[2009-12-18 22:00:00, co2 sequestered-2030] = -0
Store-energy_balance[2009-12-19 00:00:00, co2 stored]: -1 Store-e[2009-12-19 00:00:00, co2 stored] - 1 Store-p[2009-12-19 00:00:00, co2 stored] + 1 Store-e[2009-12-18 23:00:00, co2 stored] = -0
Store-energy_balance[2009-12-19 00:00:00, co2 sequestered-2030]: -1 Store-e[2009-12-19 00:00:00, co2 sequestered-2030] - 1 Store-p[2009-12-19 00:00:00, co2 sequestered-2030] + 1 Store-e[2009-12-18 23:00:00, co2 sequestered-2030] = -0
Store-energy_balance[2009-12-19 01:00:00, co2 stored]: -1 Store-e[2009-12-19 01:00:00, co2 stored] - 1 Store-p[2009-12-19 01:00:00, co2 stored] + 1 Store-e[2009-12-19 00:00:00, co2 stored] = -0
Store-energy_balance[2009-12-19 01:00:00, co2 sequestered-2030]: -1 Store-e[2009-12-19 01:00:00, co2 sequestered-2030] - 1 Store-p[2009-12-19 01:00:00, co2 sequestered-2030] + 1 Store-e[2009-12-19 00:00:00, co2 sequestered-2030] = -0
Store-energy_balance[2009-12-19 02:00:00, co2 stored]: -1 Store-e[2009-12-19 02:00:00, co2 stored] - 1 Store-p[2009-12-19 02:00:00, co2 stored] + 1 Store-e[2009-12-19 01:00:00, co2 stored] = -0
Store-energy_balance[2009-12-19 02:00:00, co2 sequestered-2030]: -1 Store-e[2009-12-19 02:00:00, co2 sequestered-2030] - 1 Store-p[2009-12-19 02:00:00, co2 sequestered-2030] + 1 Store-e[2009-12-19 01:00:00, co2 sequestered-2030] = -0
Generator-e_sum_min[EU solid biomass]: +1 Generator-p[2009-12-14 22:00:00, EU solid biomass] + 1 Generator-p[2009-12-14 23:00:00, EU solid biomass] + 1 Generator-p[2009-12-15 00:00:00, EU solid biomass] ... +1 Generator-p[2009-12-21 19:00:00, EU solid biomass] + 1 Generator-p[2009-12-21 20:00:00, EU solid biomass] + 1 Generator-p[2009-12-21 21:00:00, EU solid biomass] ≥ 41188489.0679

On PR branch

On this feat/bio-dispatch branch, the YAML file used has been changed slightly, to include the cba.biomass_biogas_slack config option:

run:
  name: "NT"

cba:
  planning_horizons:
  - 2030
  cba_scenario_input:
    use_presolved: true
    sb_version: latest
  projects: 
  - t16
  biomass_biogas_slack: 0.4

  storage:
    cyclic_carriers:
    - battery
    soc_boundary_carriers: []

  msv_extraction:
    resolution: 6H
    solving:
      solver:
        name: gurobi
        options: gurobi-default

  solving:
    horizon: 168
    overlap: 1

    solver:
      name: gurobi
      options: gurobi-simplex

    solver_options:
      gurobi-simplex:
        FeasibilityTol: 1.0e-08
        OptimalityTol: 1.0e-08

The same snakemake command is used:

snakemake -call cba --configfile config/config.tyndp.yaml config/config.bio.yaml

In this branch, all rolling horizon windows solve optimally:

 94%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████▎      | 50/53 [09:45<00:34, 11.44s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-12-14 22:00:00:2009-12-21 21:00:00] (51/53).
INFO:linopy.constants: Optimization successful: 
Status: ok
Termination condition: optimal
Solution: 397320 primals, 783024 duals
Objective: 1.41e+10
Solver model: available
Solver message: 2

WARNING:pypsa.optimization.constraints:Stores ['BG00 battery', 'ES00 battery', 'FR00 battery', 'GR03 battery', 'ITCA battery', 'ITS1 battery', 'ITSI battery', 'RO00 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/Users/meas/oet/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
  m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/reference/reference_2030_solver.log`.
INFO:linopy.model:Solver options:
 - threads: 32
 - method: 1
 - NodeMethod: 1
 - Seed: 123
 - AggFill: 0
 - PreDual: 0
 - FeasibilityTol: 1e-08
 - OptimalityTol: 1e-08
 - ScaleFlag: -1
Set parameter Username
Set parameter LicenseID to value 2778846
Academic license - for non-commercial use only - expires 2027-02-13
INFO:pypsa.optimization.optimize:The shadow-prices of the constraints Generator-fix-p-lower, Generator-fix-p-upper, Generator-p_set, Link-fix-p-lower, Link-fix-p-upper, Link-p_set, Store-fix-e-lower, Store-fix-e-upper, StorageUnit-fix-p_dispatch-lower, StorageUnit-fix-p_dispatch-upper, StorageUnit-fix-p_store-lower, StorageUnit-fix-p_store-upper, StorageUnit-fix-state_of_charge-lower, StorageUnit-fix-state_of_charge-upper, StorageUnit-energy_balance, Store-energy_balance were not assigned to the network.
Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored
Set parameter Threads to value 32
Set parameter Method to value 1
Set parameter NodeMethod to value 1
Set parameter Seed to value 123
Set parameter AggFill to value 0
Set parameter PreDual to value 0
Set parameter FeasibilityTol to value 1e-08
Set parameter OptimalityTol to value 1e-08
Set parameter ScaleFlag to value -1
Set parameter LogFile to value "/Users/meas/oet/open-tyndp/results/tyndp/NT/logs/cba/reference/reference_2030_solver.log"
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (mac64[arm] - Darwin 24.6.0 24G84)

CPU model: Apple M4 Pro
Thread count: 12 physical cores, 12 logical processors, using up to 32 threads

Warning: Thread count (32) is larger than processor count (12)
         Reduce the value of the Threads parameter to improve performance


Non-default parameters:
FeasibilityTol  1e-08
OptimalityTol  1e-08
Method  1
NodeMethod  1
AggFill  0
PreDual  0
Seed  123
Threads  32

Optimize a model with 783024 rows, 397320 columns and 1390772 nonzeros (Min)
Model fingerprint: 0xd0ee9162
Model has 360528 linear objective coefficients
Coefficient statistics:
  Matrix range     [1e-02, 1e+00]
  Objective range  [9e-03, 1e+05]
  Bounds range     [2e+00, 4e+03]
  RHS range        [2e-02, 2e+09]
Warning: Model contains large rhs
         Consider reformulating model or setting NumericFocus parameter
         to avoid numerical issues.

Presolve time: 0.37s
Presolved: 35620 rows, 236695 columns, 395876 nonzeros

Iteration    Objective       Primal Inf.    Dual Inf.      Time
       0    5.7455390e+09   1.131120e+08   0.000000e+00      0s
 96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌    | 51/53 [09:50<00:22, 11.40s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-12-21 21:00:00:2009-12-28 20:00:00] (52/53).

Extra simplex iterations after uncrush: 168
   62756    1.4018235e+10   0.000000e+00   0.000000e+00      2s

Solved in 62756 iterations and 1.92 seconds (3.74 work units)
Optimal objective  1.401823504e+10
WARNING:pypsa.optimization.constraints:Stores ['AT00 battery', 'BE00 battery', 'BG00 battery', 'CZ00 battery', 'DE00 battery', 'DKW1 battery', 'FI00 battery', 'FR00 battery', 'GBNI battery', 'GR03 battery', 'HR00 battery', 'IE00 battery', 'ITCA battery', 'ITCS battery', 'ITS1 battery', 'ITSA battery', 'ITSI battery', 'LT00 battery', 'LUG1 battery', 'LV00 battery', 'NL00 battery', 'RO00 battery', 'SE01 battery', 'SE02 battery', 'SE03 battery', 'SE04 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/Users/meas/oet/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
  m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/projects/project_t16_2030_solver.log`.
INFO:linopy.model:Solver options:
 - threads: 32
 - method: 1
 - NodeMethod: 1
 - Seed: 123
 - AggFill: 0
 - PreDual: 0
 - FeasibilityTol: 1e-08
 - OptimalityTol: 1e-08
 - ScaleFlag: -1
Set parameter Username
Set parameter LicenseID to value 2778846
Academic license - for non-commercial use only - expires 2027-02-13
INFO:linopy.constants: Optimization successful: 
Status: ok
Termination condition: optimal
Solution: 397320 primals, 783024 duals
Objective: 1.40e+10
Solver model: available
Solver message: 2

Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored
Set parameter Threads to value 32
Set parameter Method to value 1
Set parameter NodeMethod to value 1
Set parameter Seed to value 123
Set parameter AggFill to value 0
Set parameter PreDual to value 0
Set parameter FeasibilityTol to value 1e-08
Set parameter OptimalityTol to value 1e-08
Set parameter ScaleFlag to value -1
Set parameter LogFile to value "/Users/meas/oet/open-tyndp/results/tyndp/NT/logs/cba/projects/project_t16_2030_solver.log"
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (mac64[arm] - Darwin 24.6.0 24G84)

CPU model: Apple M4 Pro
Thread count: 12 physical cores, 12 logical processors, using up to 32 threads

Warning: Thread count (32) is larger than processor count (12)
         Reduce the value of the Threads parameter to improve performance


Non-default parameters:
FeasibilityTol  1e-08
OptimalityTol  1e-08
Method  1
NodeMethod  1
AggFill  0
PreDual  0
Seed  123
Threads  32

Optimize a model with 783024 rows, 397320 columns and 1390772 nonzeros (Min)
Model fingerprint: 0xcae31616
Model has 360528 linear objective coefficients
Coefficient statistics:
  Matrix range     [1e-02, 1e+00]
  Objective range  [9e-03, 1e+05]
  Bounds range     [2e+00, 4e+03]
  RHS range        [5e-02, 2e+09]
Warning: Model contains large rhs
         Consider reformulating model or setting NumericFocus parameter
         to avoid numerical issues.

INFO:pypsa.optimization.optimize:The shadow-prices of the constraints Generator-fix-p-lower, Generator-fix-p-upper, Generator-p_set, Link-fix-p-lower, Link-fix-p-upper, Link-p_set, Store-fix-e-lower, Store-fix-e-upper, StorageUnit-fix-p_dispatch-lower, StorageUnit-fix-p_dispatch-upper, StorageUnit-fix-p_store-lower, StorageUnit-fix-p_store-upper, StorageUnit-fix-state_of_charge-lower, StorageUnit-fix-state_of_charge-upper, StorageUnit-energy_balance, Store-energy_balance were not assigned to the network.
Presolve time: 0.36s
Presolved: 34796 rows, 232243 columns, 385790 nonzeros

Iteration    Objective       Primal Inf.    Dual Inf.      Time
       0    5.7500993e+09   7.019224e+07   0.000000e+00      0s

Extra simplex iterations after uncrush: 195
   55861    1.1201512e+10   0.000000e+00   0.000000e+00      1s

Solved in 55861 iterations and 1.45 seconds (2.99 work units)
Optimal objective  1.120151181e+10
 96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌    | 51/53 [09:57<00:23, 11.57s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-12-21 21:00:00:2009-12-28 20:00:00] (52/53).
INFO:linopy.constants: Optimization successful: 
Status: ok
Termination condition: optimal
Solution: 397320 primals, 783024 duals
Objective: 1.12e+10
Solver model: available
Solver message: 2

WARNING:pypsa.optimization.constraints:Stores ['AT00 battery', 'BE00 battery', 'BG00 battery', 'CZ00 battery', 'DE00 battery', 'DKW1 battery', 'FI00 battery', 'FR00 battery', 'GBNI battery', 'GR00 battery', 'GR03 battery', 'HR00 battery', 'IE00 battery', 'ITCA battery', 'ITCS battery', 'ITS1 battery', 'ITSA battery', 'ITSI battery', 'LT00 battery', 'LUG1 battery', 'LV00 battery', 'NL00 battery', 'RO00 battery', 'SE01 battery', 'SE02 battery', 'SE03 battery', 'SE04 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/Users/meas/oet/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
  m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/reference/reference_2030_solver.log`.
INFO:linopy.model:Solver options:
 - threads: 32
 - method: 1
 - NodeMethod: 1
 - Seed: 123
 - AggFill: 0
 - PreDual: 0
 - FeasibilityTol: 1e-08
 - OptimalityTol: 1e-08
 - ScaleFlag: -1
Set parameter Username
Set parameter LicenseID to value 2778846
Academic license - for non-commercial use only - expires 2027-02-13
INFO:pypsa.optimization.optimize:The shadow-prices of the constraints Generator-fix-p-lower, Generator-fix-p-upper, Generator-p_set, Link-fix-p-lower, Link-fix-p-upper, Link-p_set, Store-fix-e-lower, Store-fix-e-upper, StorageUnit-fix-p_dispatch-lower, StorageUnit-fix-p_dispatch-upper, StorageUnit-fix-p_store-lower, StorageUnit-fix-p_store-upper, StorageUnit-fix-state_of_charge-lower, StorageUnit-fix-state_of_charge-upper, StorageUnit-energy_balance, Store-energy_balance were not assigned to the network.
Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored
Set parameter Threads to value 32
Set parameter Method to value 1
Set parameter NodeMethod to value 1
Set parameter Seed to value 123
Set parameter AggFill to value 0
Set parameter PreDual to value 0
Set parameter FeasibilityTol to value 1e-08
Set parameter OptimalityTol to value 1e-08
Set parameter ScaleFlag to value -1
Set parameter LogFile to value "/Users/meas/oet/open-tyndp/results/tyndp/NT/logs/cba/reference/reference_2030_solver.log"
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (mac64[arm] - Darwin 24.6.0 24G84)

CPU model: Apple M4 Pro
Thread count: 12 physical cores, 12 logical processors, using up to 32 threads

Warning: Thread count (32) is larger than processor count (12)
         Reduce the value of the Threads parameter to improve performance


Non-default parameters:
FeasibilityTol  1e-08
OptimalityTol  1e-08
Method  1
NodeMethod  1
AggFill  0
PreDual  0
Seed  123
Threads  32

Optimize a model with 783024 rows, 397320 columns and 1390772 nonzeros (Min)
Model fingerprint: 0x35cc21b2
Model has 360528 linear objective coefficients
Coefficient statistics:
  Matrix range     [1e-02, 1e+00]
  Objective range  [9e-03, 1e+05]
  Bounds range     [2e+00, 4e+03]
  RHS range        [5e-02, 2e+09]
Warning: Model contains large rhs
         Consider reformulating model or setting NumericFocus parameter
         to avoid numerical issues.

 98%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊  | 52/53 [10:01<00:11, 11.34s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-12-28 20:00:00:2009-12-30 23:00:00] (53/53).
Presolve time: 0.36s
Presolved: 34964 rows, 232576 columns, 386458 nonzeros

Iteration    Objective       Primal Inf.    Dual Inf.      Time
       0    5.7527013e+09   1.637028e+08   0.000000e+00      0s

Extra simplex iterations after uncrush: 195
   51482    1.1187628e+10   0.000000e+00   0.000000e+00      1s

Solved in 51482 iterations and 1.48 seconds (3.00 work units)
Optimal objective  1.118762771e+10
WARNING:pypsa.optimization.constraints:Stores ['AT00 battery', 'BE00 battery', 'BG00 battery', 'CH00 battery', 'DKW1 battery', 'ES00 battery', 'FI00 battery', 'FR00 battery', 'GBNI battery', 'GR00 battery', 'GR03 battery', 'HR00 battery', 'HU00 battery', 'IE00 battery', 'ITCA battery', 'ITCN battery', 'ITCS battery', 'ITN1 battery', 'ITS1 battery', 'ITSA battery', 'ITSI battery', 'LT00 battery', 'LV00 battery', 'NL00 battery', 'RO00 battery', 'SE03 battery', 'SE04 battery', 'SI00 battery', 'SK00 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/Users/meas/oet/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
  m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/projects/project_t16_2030_solver.log`.
INFO:linopy.model:Solver options:
 - threads: 32
 - method: 1
 - NodeMethod: 1
 - Seed: 123
 - AggFill: 0
 - PreDual: 0
 - FeasibilityTol: 1e-08
 - OptimalityTol: 1e-08
 - ScaleFlag: -1
Set parameter Username
Set parameter LicenseID to value 2778846
Academic license - for non-commercial use only - expires 2027-02-13
Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored
Set parameter Threads to value 32
Set parameter Method to value 1
Set parameter NodeMethod to value 1
Set parameter Seed to value 123
Set parameter AggFill to value 0
Set parameter PreDual to value 0
Set parameter FeasibilityTol to value 1e-08
Set parameter OptimalityTol to value 1e-08
Set parameter ScaleFlag to value -1
Set parameter LogFile to value "/Users/meas/oet/open-tyndp/results/tyndp/NT/logs/cba/projects/project_t16_2030_solver.log"
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (mac64[arm] - Darwin 24.6.0 24G84)

CPU model: Apple M4 Pro
Thread count: 12 physical cores, 12 logical processors, using up to 32 threads

Warning: Thread count (32) is larger than processor count (12)
         Reduce the value of the Threads parameter to improve performance


Non-default parameters:
FeasibilityTol  1e-08
OptimalityTol  1e-08
Method  1
NodeMethod  1
AggFill  0
PreDual  0
Seed  123
Threads  32

Optimize a model with 242400 rows, 122980 columns and 430408 nonzeros (Min)
Model fingerprint: 0x9a1f578a
Model has 111592 linear objective coefficients
Coefficient statistics:
  Matrix range     [1e-02, 1e+00]
  Objective range  [9e-03, 1e+05]
  Bounds range     [2e+00, 4e+03]
  RHS range        [1e-01, 2e+09]
Warning: Model contains large rhs
         Consider reformulating model or setting NumericFocus parameter
         to avoid numerical issues.

INFO:linopy.constants: Optimization successful: 
Status: ok
Termination condition: optimal
Solution: 397320 primals, 783024 duals
Objective: 1.12e+10
Solver model: available
Solver message: 2

Presolve time: 0.10s
Presolved: 10705 rows, 71410 columns, 118649 nonzeros

Iteration    Objective       Primal Inf.    Dual Inf.      Time
       0    8.7190657e+08   2.514645e+07   0.000000e+00      0s

Extra simplex iterations after uncrush: 52
   16618    3.7833307e+09   0.000000e+00   0.000000e+00      0s

Solved in 16618 iterations and 0.29 seconds (0.69 work units)
Optimal objective  3.783330713e+09
INFO:linopy.constants: Optimization successful: 
Status: ok
Termination condition: optimal
Solution: 122980 primals, 242400 duals
Objective: 3.78e+09
Solver model: available
Solver message: 2

INFO:pypsa.optimization.optimize:The shadow-prices of the constraints Generator-fix-p-lower, Generator-fix-p-upper, Generator-p_set, Link-fix-p-lower, Link-fix-p-upper, Link-p_set, Store-fix-e-lower, Store-fix-e-upper, StorageUnit-fix-p_dispatch-lower, StorageUnit-fix-p_dispatch-upper, StorageUnit-fix-p_store-lower, StorageUnit-fix-p_store-upper, StorageUnit-fix-state_of_charge-lower, StorageUnit-fix-state_of_charge-upper, StorageUnit-energy_balance, Store-energy_balance were not assigned to the network.
INFO:pypsa.optimization.optimize:The shadow-prices of the constraints Generator-fix-p-lower, Generator-fix-p-upper, Generator-p_set, Link-fix-p-lower, Link-fix-p-upper, Link-p_set, Store-fix-e-lower, Store-fix-e-upper, StorageUnit-fix-p_dispatch-lower, StorageUnit-fix-p_dispatch-upper, StorageUnit-fix-p_store-lower, StorageUnit-fix-p_store-upper, StorageUnit-fix-state_of_charge-lower, StorageUnit-fix-state_of_charge-upper, StorageUnit-energy_balance, Store-energy_balance were not assigned to the network.
 98%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊  | 52/53 [10:08<00:11, 11.52s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-12-28 20:00:00:2009-12-30 23:00:00] (53/53).
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 53/53 [10:08<00:00, 10.18s/it]100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 53/53 [10:08<00:00, 11.49s/it]
INFO:__main__:Maximum memory usage: (5934.109375, 1783066109.1607301)
WARNING:pypsa.optimization.constraints:Stores ['AT00 battery', 'BG00 battery', 'CH00 battery', 'CZ00 battery', 'DKW1 battery', 'ES00 battery', 'FI00 battery', 'FR00 battery', 'GBNI battery', 'GR00 battery', 'GR03 battery', 'HR00 battery', 'HU00 battery', 'IE00 battery', 'ITCA battery', 'ITCN battery', 'ITCS battery', 'ITN1 battery', 'ITS1 battery', 'ITSA battery', 'ITSI battery', 'LT00 battery', 'LV00 battery', 'NL00 battery', 'RO00 battery', 'SE01 battery', 'SE02 battery', 'SE03 battery', 'SE04 battery', 'SI00 battery', 'SK00 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/Users/meas/oet/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
  m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/reference/reference_2030_solver.log`.
INFO:linopy.model:Solver options:
 - threads: 32
 - method: 1
 - NodeMethod: 1
 - Seed: 123
 - AggFill: 0
 - PreDual: 0
 - FeasibilityTol: 1e-08
 - OptimalityTol: 1e-08
 - ScaleFlag: -1
Set parameter Username
Set parameter LicenseID to value 2778846
Academic license - for non-commercial use only - expires 2027-02-13
Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored
Set parameter Threads to value 32
Set parameter Method to value 1
Set parameter NodeMethod to value 1
Set parameter Seed to value 123
Set parameter AggFill to value 0
Set parameter PreDual to value 0
Set parameter FeasibilityTol to value 1e-08
Set parameter OptimalityTol to value 1e-08
Set parameter ScaleFlag to value -1
Set parameter LogFile to value "/Users/meas/oet/open-tyndp/results/tyndp/NT/logs/cba/reference/reference_2030_solver.log"
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (mac64[arm] - Darwin 24.6.0 24G84)

CPU model: Apple M4 Pro
Thread count: 12 physical cores, 12 logical processors, using up to 32 threads

Warning: Thread count (32) is larger than processor count (12)
         Reduce the value of the Threads parameter to improve performance


Non-default parameters:
FeasibilityTol  1e-08
OptimalityTol  1e-08
Method  1
NodeMethod  1
AggFill  0
PreDual  0
Seed  123
Threads  32

Optimize a model with 242400 rows, 122980 columns and 430408 nonzeros (Min)
Model fingerprint: 0x821022d4
Model has 111592 linear objective coefficients
Coefficient statistics:
  Matrix range     [1e-02, 1e+00]
  Objective range  [9e-03, 1e+05]
  Bounds range     [2e+00, 4e+03]
  RHS range        [1e-01, 2e+09]
Warning: Model contains large rhs
         Consider reformulating model or setting NumericFocus parameter
         to avoid numerical issues.

Presolve time: 0.11s
Presolved: 10757 rows, 71511 columns, 118853 nonzeros

Iteration    Objective       Primal Inf.    Dual Inf.      Time
       0    8.7195324e+08   3.372046e+07   0.000000e+00      0s

Extra simplex iterations after uncrush: 52
   16451    3.7798213e+09   0.000000e+00   0.000000e+00      0s

Solved in 16451 iterations and 0.30 seconds (0.68 work units)
Optimal objective  3.779821323e+09
INFO:linopy.constants: Optimization successful: 
Status: ok
Termination condition: optimal
Solution: 122980 primals, 242400 duals
Objective: 3.78e+09
Solver model: available
Solver message: 2

INFO:pypsa.optimization.optimize:The shadow-prices of the constraints Generator-fix-p-lower, Generator-fix-p-upper, Generator-p_set, Link-fix-p-lower, Link-fix-p-upper, Link-p_set, Store-fix-e-lower, Store-fix-e-upper, StorageUnit-fix-p_dispatch-lower, StorageUnit-fix-p_dispatch-upper, StorageUnit-fix-p_store-lower, StorageUnit-fix-p_store-upper, StorageUnit-fix-state_of_charge-lower, StorageUnit-fix-state_of_charge-upper, StorageUnit-energy_balance, Store-energy_balance were not assigned to the network.
INFO:pypsa.network.io:Exported network 'PyPSA-Eur (tyndp)' saved to 'results/tyndp/NT/cba/networks/project_t16_2030.nc contains: storage_units, links, loads, stores, sub_networks, generators, buses, global_constraints, shapes, carriers
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 53/53 [10:16<00:00, 10.41s/it]100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 53/53 [10:16<00:00, 11.63s/it]
INFO:__main__:Maximum memory usage: (6153.40625, 1783066139.184525)
INFO:pypsa.network.io:Exported network 'PyPSA-Eur (tyndp)' saved to 'results/tyndp/NT/cba/networks/reference_2030.nc contains: storage_units, shapes, loads, stores, carriers, global_constraints, buses, links, sub_networks, generators

Testing amount of slack needed

To determine the amount of slack used in the default (in this case, 40%), I ran the high-res (1H) CBA workflows on ZIB, under different slack values.

To do so, I first added the following scenarios to config/scenarios.tyndp.yaml:

bio-1h-slack00:
  tyndp_scenario: NT

  cba:
    biomass_biogas_slack: 0

bio-1h-slack10:
  tyndp_scenario: NT

  cba:
    biomass_biogas_slack: 0.1

bio-1h-slack20:
  tyndp_scenario: NT

  cba:
    biomass_biogas_slack: 0.2

bio-1h-slack30:
  tyndp_scenario: NT

  cba:
    biomass_biogas_slack: 0.3

bio-1h-slack40:
  tyndp_scenario: NT

  cba:
    biomass_biogas_slack: 0.4

Then, I created a config file called config/config.zib.yaml to run the scenarios:

run:
  name: ["bio-1h-slack00", "bio-1h-slack10", "bio-1h-slack20", "bio-1h-slack30", "bio-1h-slack40"]

clustering:
  temporal:
    resolution_sector: 1H

solving:
  options:
    assign_all_duals: true
    include_objective_constant: false
  solver:
    name: gurobi
    options: gurobi-default
  partition: big
  mem_mb: 40000
  runtime: 1h

cba:
  projects: 
  - t1-t200
  msv_extraction:
    solving:
      options:
        include_objective_constant: false
      solver:
        name: gurobi
        options: gurobi-default
      solver_options:
        gurobi-default:
          BarConvTol: 1.0e-08
      partition: big
      mem_mb: 40000
      runtime: 1h

  # Rolling horizon solving settings
  solving:
    options:
      include_objective_constant: false
    partition: big
    mem_mb: 40000
    runtime: 1h
    
    solver:
      name: highs
      options: highs-simplex

    solver_options:
      highs-simplex:
        primal_feasibility_tolerance: 1.0e-08
        dual_feasibility_tolerance: 1.0e-08

Note that here I am only testing on projects t1-t200.

Then, to run the workflow, I ran:

snakemake --profile profiles/slurm -call --configfile config/config.tyndp.yaml config/config.zib.yaml #SB workflow

snakemake --profile profiles/slurm -call cba --configfile config/config.tyndp.yaml config/config.zib.yaml # CBA workflow

Up until 30% percent, there is at least one project that will still fail due to biomass related infeasibilities. t16 in 2040 is one particular case. For example, with a slack of 30%, the t16-2040 rolling horizon optimization is infeasible in the 52nd window.

Checking for files with 30% that end up infeasible:

grep -l "infeasible\|unbounded" *solve_cba_network*slack30*.out 2>/dev/null

project=open-tyndp_smk-solve_cba_network-cba_project=t16,planning_horizons=2040,run=bio-1h-slack30-1645669.out

The log file shows the infeasibility in the 52nd window:

 98%|█████████▊| 52/53 [45:13<00:51, 51.86s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-12-28 20:00:00:2009-12-30 23:00:00] (53/53).
WARNING:pypsa.optimization.constraints:Stores ['AT00 battery', 'BG00 battery', 'CH00 battery', 'CY00 battery', 'DE00 battery', 'DKW1 battery', 'FI00 battery', 'FR00 battery', 'GBNI battery', 'GR00 battery', 'GR03 battery', 'HU00 battery', 'IE00 battery', 'ITCS battery', 'ITN1 battery', 'ITS1 battery', 'ITSA battery', 'ITSI battery', 'LUG1 battery', 'LV00 battery', 'NL00 battery', 'RO00 battery', 'SK00 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
  m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Highs solver
INFO:linopy.model:Solver logs written to `results/tyndp/bio-1h-slack30/logs/cba/projects/project_t16_2040_solver.log`.
INFO:linopy.model:Solver options:
 - solver: simplex
 - parallel: off
 - primal_feasibility_tolerance: 1e-08
 - dual_feasibility_tolerance: 1e-08
 - random_seed: 123
Running HiGHS 1.14.0 (git hash: n/a): Copyright (c) 2026 under MIT licence terms
INFO:linopy.solvers:Log file at /scratch/htc-panfs/mmeng/open-tyndp/results/tyndp/bio-1h-slack30/logs/cba/projects/project_t16_2040_solver.log
LP has 249858 rows; 126984 cols; 440197 nonzeros
Coefficient ranges:
  Matrix  [1e-02, 1e+00]
  Cost    [9e-03, 1e+05]
  Bound   [2e+00, 4e+03]
  RHS     [2e-07, 2e+09]
WARNING: Problem has some excessively small row bounds
WARNING: Problem has some excessively large row bounds
WARNING:    Consider scaling the    bounds by 1e-4, or setting the user_bound_scale option to -11
Presolving model
21714 rows, 99326 cols, 180299 nonzeros 0s
13711 rows, 81470 cols, 133987 nonzeros 1s
Dependent equations search running on 12675 equations with time limit of 1000.00s
Dependent equations search removed 0 rows and 0 nonzeros in 0.00s (limit = 1000.00s)
12756 rows, 79295 cols, 130589 nonzeros 3s
Presolve reductions: rows 12756(-237102); columns 79295(-47689); nonzeros 130589(-309608) 
Solving the presolved LP
Using dual simplex solver
  Iteration        Objective     Infeasibilities num(sum)
          0     0.0000000000e+00 Ph1: 0(0) 3.3s
       5651     4.1434223332e+09 3.4s
Model status        : Infeasible
Simplex   iterations: 5651
Objective value     :  4.1575890120e+09
HiGHS run time      :          3.42
WARNING:linopy.constants:Optimization potentially failed: 
Status: warning
Termination condition: infeasible
Solution: 0 primals, 0 duals
Objective: nan
Solver model: available
Solver message: Infeasible

WARNING:__main__:Optimization failed with status warning and condition infeasible
WARNING:__main__:Fallback also failed: warning / infeasible

With a slack of 40%, though, the t16-2040 optimization is successful:

 98%|█████████▊| 52/53 [43:39<00:49, 49.51s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-12-28 20:00:00:2009-12-30 23:00:00] (53/53).
WARNING:pypsa.optimization.constraints:Stores ['AT00 battery', 'BG00 battery', 'CY00 battery', 'DE00 battery', 'DKW1 battery', 'FI00 battery', 'GB00 battery', 'GBNI battery', 'GR00 battery', 'GR03 battery', 'HU00 battery', 'IE00 battery', 'ITCS battery', 'ITN1 battery', 'ITS1 battery', 'ITSA battery', 'ITSI battery', 'LV00 battery', 'NL00 battery', 'RO00 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
  m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Highs solver
INFO:linopy.model:Solver logs written to `results/tyndp/bio-1h-slack40/logs/cba/projects/project_t16_2040_solver.log`.
INFO:linopy.model:Solver options:
 - solver: simplex
 - parallel: off
 - primal_feasibility_tolerance: 1e-08
 - dual_feasibility_tolerance: 1e-08
 - random_seed: 123
Running HiGHS 1.14.0 (git hash: n/a): Copyright (c) 2026 under MIT licence terms
INFO:linopy.solvers:Log file at /scratch/htc-panfs/mmeng/open-tyndp/results/tyndp/bio-1h-slack40/logs/cba/projects/project_t16_2040_solver.log
LP has 249858 rows; 126984 cols; 440197 nonzeros
Coefficient ranges:
  Matrix  [1e-02, 1e+00]
  Cost    [9e-03, 1e+05]
  Bound   [2e+00, 4e+03]
  RHS     [5e-10, 2e+09]
WARNING: Problem has some excessively small row bounds
WARNING: Problem has some excessively large row bounds
WARNING:    Consider scaling the    bounds by 1e-4, or setting the user_bound_scale option to -11
Presolving model
21714 rows, 99328 cols, 180301 nonzeros 0s
13710 rows, 81470 cols, 133986 nonzeros 1s
Dependent equations search running on 12672 equations with time limit of 1000.00s
Dependent equations search removed 0 rows and 0 nonzeros in 0.00s (limit = 1000.00s)
12753 rows, 79190 cols, 130380 nonzeros 3s
Presolve reductions: rows 12753(-237105); columns 79190(-47794); nonzeros 130380(-309817) 
Solving the presolved LP
Using dual simplex solver
  Iteration        Objective     Infeasibilities num(sum)
          0     0.0000000000e+00 Ph1: 0(0) 3.4s
      20460     3.2931103454e+09 Pr: 0(0); Du: 0(5.13164e-08) 4.1s
      20460     3.2931103454e+09 Pr: 0(0); Du: 0(5.13164e-08) 4.1s

Performed postsolve
Solving the original LP from the solution after postsolve

Model status        : Optimal
Simplex   iterations: 20460
Objective value     :  3.2931103454e+09
P-D objective error :  3.0255628795e-13
HiGHS run time      :          4.27
INFO:linopy.constants: Optimization successful: 
Status: ok
Termination condition: optimal
Solution: 126984 primals, 249858 duals
Objective: 3.29e+09
Solver model: available
Solver message: Optimal


100%|██████████| 53/53 [44:07<00:00, 43.19s/it]
100%|██████████| 53/53 [44:07<00:00, 49.96s/it]
INFO:__main__:Maximum memory usage: (9340.9765625, 1783293629.1475432)
INFO:pypsa.network.io:Exported network 'PyPSA-Eur (tyndp)' saved to 'results/tyndp/bio-1h-slack40/cba/networks/project_t16_2040.nc contains: storage_units, carriers, stores, shapes, global_constraints, buses, links, sub_networks, generators, loads

Then, with 40% slack, I ran the 1H CBA workflow for all projects (except t339, as this is still failing in this branch and is being addressed with #751).

The YAML used was:

run:
  name: "bio-1h-slack40"

clustering:
  temporal:
    resolution_sector: 1H

solving:
  options:
    assign_all_duals: true
    include_objective_constant: false
  solver:
    name: gurobi
    options: gurobi-default
  partition: big
  mem_mb: 40000
  runtime: 1h

cba:
  projects: [-t339]
  msv_extraction:
    solving:
      options:
        include_objective_constant: false
      solver:
        name: gurobi
        options: gurobi-default
      solver_options:
        gurobi-default:
          BarConvTol: 1.0e-08
      partition: big
      mem_mb: 40000
      runtime: 1h

  # Rolling horizon solving settings
  solving:
    options:
      include_objective_constant: false
    partition: big
    mem_mb: 40000
    runtime: 1h
    
    solver:
      name: highs
      options: highs-simplex

    solver_options:
      highs-simplex:
        primal_feasibility_tolerance: 1.0e-08
        dual_feasibility_tolerance: 1.0e-08

In this case, no files show infeasible/unbounded (checked using grep -l "infeasible\|unbounded" logs/slurm/*solve_cba_network*slack40*.out 2>/dev/null).

Thus, I would suggest we keep 40% as the default slack, with the caveat that we can reduce the default slack in the future as we continue to improve our CBA methodology.

Checklist

  • I tested my contribution locally and it works as intended.
  • Code and workflow changes are sufficiently documented.
  • [ ] Changed dependencies are added to pixi.toml (using pixi add <dependency-name>).
  • [ ] Changes in configuration options are added in config/config.default.yaml.
  • [ ] Changes in configuration options are documented in doc/configtables/*.csv.
  • [ ] Changes in configuration options are added in config/test/*.yaml.
  • The multiple weather/climate years test is passing locally (using pixi run -e open-tyndp tyndp-cyears-test).
  • [ ] Open-TYNDP SPDX license header added to all touched files.
  • [ ] For new data sources or versions, these instructions have been followed.
  • [ ] New rules are documented in the appropriate doc/*.rst files.
  • A release note doc/release_notes.rst is added.
  • [ ] Major features are documented with up-to-date information in doc/index.rst.
  • [ ] Module docstrings added to new Python scripts.

@measrainsey measrainsey linked an issue Jun 15, 2026 that may be closed by this pull request
2 tasks
@measrainsey measrainsey changed the title (DNMY) feat: add marginal prices of biomass/biogas buses to marginal costs of generators in CBA feat: add marginal prices of biomass/biogas buses to marginal costs of generators in CBA Jun 15, 2026
@measrainsey measrainsey changed the title feat: add marginal prices of biomass/biogas buses to marginal costs of generators in CBA feat: edit marginal costs and dispatch of biomass/biogas generators in CBA Jun 17, 2026
@measrainsey
measrainsey marked this pull request as ready for review June 17, 2026 13:25
@measrainsey measrainsey added enhancement New feature or request CBA Cost Benefit Analysis labels Jun 17, 2026
@tgilon
tgilon self-requested a review July 1, 2026 08:58

@tgilon tgilon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @measrainsey for this PR!

I agree with your open issue on the methodology. I would recommend using a methodology similar to apply_msv_to_network where the marginal prices defines the marginal costs. Here, adding the two values together seems inappropriate. For your information, I ran my test with this fix.

To test this PR, I had to set cba.storage.soc_boundary_carriers = [] (see my config below). This relaxes the constraint on the reservoir state of charge at rolling horizon boundaries.

cba:
  planning_horizons:
  - 2030
  cba_scenario_input:
    use_presolved: true
    sb_version: latest
  projects:
  - t130

  storage:
    cyclic_carriers:
    - battery
    soc_boundary_carriers: []

  msv_extraction:
    resolution: 6H

  solving:
    horizon: 168
    overlap: 1

With this in mind, I tested four setups:

  • one with the current branch (including the fix mentioned in the first paragraph), which gave optimal results ;
  • one with a slack of 0 and apply_biomass_biogas_bus_marginal_prices commented out, which gave infeasibility at the 49th iteration ;
  • one with the slack set to 0 only, which also gave infeasibility at the 49th iteration ;
  • one with only the apply_biomass_biogas_bus_marginal_prices commented out, which give optimal results.

I cannot therefore conclude that the introduction of apply_biomass_biogas_bus_marginal_prices is strictly necessary at low resolution. However, it's a nice feature and probably worth keeping.

Finally, I would argue that setting the slack to 40% is arbitrary. I would recommend documenting the results that justified this, at least. It would also be good to define this as a config too.

Comment thread scripts/cba/prepare_rolling_horizon.py Outdated
Comment thread scripts/cba/prepare_rolling_horizon.py Outdated
Comment thread scripts/cba/prepare_rolling_horizon.py Outdated
Comment thread scripts/cba/solve_cba_network.py Outdated
Comment thread scripts/cba/solve_cba_network.py Outdated
Comment thread scripts/cba/prepare_rolling_horizon.py
Comment thread scripts/cba/prepare_rolling_horizon.py Outdated
@measrainsey

Copy link
Copy Markdown
Member Author

Thank you @tgilon for your thorough testing and review!

I think I've addressed your comments, which has led to some changes in the code, so please take another look to see if any additional improvements are needed :)

I also updated the PR description quite a bit with more details about my tests, including how I landed on the 40% slack. I hope that is sufficient, but let me know if you think this information should be documented further/elsewhere.

@measrainsey
measrainsey requested a review from tgilon July 7, 2026 07:44

@tgilon tgilon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, @measrainsey, for improving this PR! The features look good now and are well documented. I'm still wondering how / when we will be able to refine the CBA enough to tighten the slack. Nevertheless, this is beyond the scope of this PR. Should we track this somewhere so that we can revisit it at some point?

I also made some minor suggestions in the comments.

Comment thread config/test/config.tyndp.yaml Outdated
Comment thread doc/release_notes.md Outdated
Comment thread scripts/cba/solve_cba_network.py Outdated
Comment thread scripts/cba/solve_cba_network.py Outdated
Comment thread scripts/cba/solve_cba_network.py Outdated
@tgilon

tgilon commented Jul 7, 2026

Copy link
Copy Markdown
Member

cc @lisazeyen

measrainsey and others added 3 commits July 8, 2026 10:02
Co-authored-by: Thomas Gilon <thomas.gilon@openenergytransition.org>
Co-authored-by: Thomas Gilon <thomas.gilon@openenergytransition.org>
@measrainsey

Copy link
Copy Markdown
Member Author

Thanks @tgilon for your feedback! I know you already approved the PR, but I made a small change to the has_volume_limit based on your suggestion, so if you want to review that as well let me know :) Otherwise I will wait for @lisazeyen 's feedback before moving forward!

@lisazeyen lisazeyen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@measrainsey thanks for preparing the PR! From my understanding of the water values / applying the marginal prices we do not need / want to include the e_sum_min / e_sum_max anymore, this was only needed since we did not have the marginal prices in place. I think these parts as well as the slack can be removed. Can we do one test run before merging where we compare the dispatch of the biomass / biogas generators with rolling horizon from this PR with

  • master dispatch in rolling horizon
  • dispatch in MSV with perfect foresight (from master or this PR should be the same)
    for one project?

Comment thread config/test/config.cyears.yaml Outdated
area: tyndp # options: tyndp (TODO: entso-e, eu27)
remove_noisy_costs: true # Use pre-noise costs for indicators while keeping noisy costs in the solve
negative_toot_capacity: zero
# Slack on rolling-horizon biomass and biogas e_sum_min volume limits

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

from my understanding of the water value approach we should remove the limits on e_sum_min and e_sum_max, this should be covered by the introduced marginal prices

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha, you're probably right. These are now redundant.

@tgilon

tgilon commented Jul 8, 2026

Copy link
Copy Markdown
Member

Thanks @tgilon for your feedback! I know you already approved the PR, but I made a small change to the has_volume_limit based on your suggestion, so if you want to review that as well let me know :) Otherwise I will wait for @lisazeyen 's feedback before moving forward!

No more comments from my side, except the point made by Lisa

@measrainsey

Copy link
Copy Markdown
Member Author

@measrainsey thanks for preparing the PR! From my understanding of the water values / applying the marginal prices we do not need / want to include the e_sum_min / e_sum_max anymore, this was only needed since we did not have the marginal prices in place. I think these parts as well as the slack can be removed. Can we do one test run before merging where we compare the dispatch of the biomass / biogas generators with rolling horizon from this PR with

  • master dispatch in rolling horizon
  • dispatch in MSV with perfect foresight (from master or this PR should be the same)
    for one project?

Thanks @lisazeyen for your review and suggestion! You're probably right. I ran three tests:

  1. one test on master (technically on the fix/gurobi-license-env from PR fix: make CBA workflow release Gurobi license after each rolling horizon optimization and fail if optimization is infeasible when using HiGHS #756 before it was merged)
  2. one test on this PR branch, with the constraints on e_sum min and max, and 40% slack on e_sum_min
  3. one test on this PR branch, with the following lines of code removed:
    # Set per-window energy budgets for biomass/biogas components
    # based on PF dispatch stored in generators_t.p
    for c_name in ["Generator", "Link"]:
    c = n.c[c_name]
    vol_idx = get_components_with_volume_limits(
    n, c_name, ["solid biomass", "biogas"]
    )
    if vol_idx.empty:
    continue
    p_col = "p" if c_name == "Generator" else "p0"
    pf_p = c.dynamic[p_col]
    for comp in vol_idx:
    if comp not in pf_p.columns:
    continue
    window_energy = pf_p.loc[sns, comp].sum()
    c.static.loc[comp, "e_sum_min"] = (
    1 - biomass_biogas_slack
    ) * window_energy
    c.static.loc[comp, "e_sum_max"] = window_energy

All tests were run on 1H resolution, on just the t16 project in 2040.

For run 1, I used the following config (note that running on master requires having co2 sequestration sinks for the rolling horizon solve, or else it will fail due to infeasibilities):

Details
run:
  name: "NT"

clustering:
  temporal:
    resolution_sector: 1H

solving:
  options:
    assign_all_duals: true
    include_objective_constant: false
  solver:
    name: gurobi
    options: gurobi-default

cba:
  planning_horizons:
  - 2040

  projects: [t16]

  msv_extraction:
    solving:
      options:
        include_objective_constant: false
      solver:
        name: gurobi
        options: gurobi-default
      solver_options:
        gurobi-default:
          BarConvTol: 1.0e-08
      partition: big
      mem_mb: 40000
      runtime: 1h

  # Rolling horizon solving settings
  solving:
    options:
      include_objective_constant: false
      load_sinks:
        enable: true
        all_carriers: false
        carriers:
          "co2 sequestered": 3000
    partition: big
    mem_mb: 40000
    runtime: 1h

    solver:
      name: gurobi
      options: gurobi-simplex

    solver_options:
      gurobi-simplex:
        FeasibilityTol: 1.0e-08
        OptimalityTol: 1.0e-08

For runs 2-3, I used the following config:

Details
run:
  name: "NT"

clustering:
  temporal:
    resolution_sector: 1H

solving:
  options:
    assign_all_duals: true
    include_objective_constant: false
  solver:
    name: gurobi
    options: gurobi-default

cba:
  planning_horizons:
  - 2040
  biomass_biogas_slack: 0.4

  projects: [t16]

  msv_extraction:
    solving:
      options:
        include_objective_constant: false
      solver:
        name: gurobi
        options: gurobi-default
      solver_options:
        gurobi-default:
          BarConvTol: 1.0e-08
      partition: big
      mem_mb: 40000
      runtime: 1h

  # Rolling horizon solving settings
  solving:
    options:
      include_objective_constant: false
    partition: big
    mem_mb: 40000
    runtime: 1h

    solver:
      name: gurobi
      options: gurobi-simplex

    solver_options:
      gurobi-simplex:
        FeasibilityTol: 1.0e-08
        OptimalityTol: 1.0e-08

Comparing the dispatch of the EU solid biomass and EU biogas generators in the MSV and project (rolling horizon) networks across all 3 runs:

dispatch_eu_solid_biomass dispatch_eu_biogas

I used the following code to generate the plots:

Details
from __future__ import annotations

import matplotlib.pyplot as plt
import pypsa

# load paths
path_results = "/Users/meas/oet/open-tyndp/results/tyndp"
path_resources = "/Users/meas/oet/open-tyndp/resources/tyndp/NT/cba"

path_master = "NT-gurobi-license-env"
path_pr_with_esum = "NT-pr-with-esum"
path_pr_without_esum = "NT-pr-without-esum"

path_proj_network = "cba/networks/project_t16_2040.nc"
path_msv_network = "msv_2040.nc"

# load project networks
n_proj_master = pypsa.Network(f"{path_results}/{path_master}/{path_proj_network}")
n_proj_pr_with_esum = pypsa.Network(
    f"{path_results}/{path_pr_with_esum}/{path_proj_network}"
)
n_proj_pr_without_esum = pypsa.Network(
    f"{path_results}/{path_pr_without_esum}/{path_proj_network}"
)

# load MSV networks
n_msv_master = pypsa.Network(f"{path_resources}/{path_master}/{path_msv_network}")
n_msv_pr_with_esum = pypsa.Network(
    f"{path_resources}/{path_pr_with_esum}/{path_msv_network}"
)
n_msv_pr_without_esum = pypsa.Network(
    f"{path_resources}/{path_pr_without_esum}/{path_msv_network}"
)

# for each network, plot the dispatch of "EU solid biomass" and "EU biogas" generators over time
generator_names = ["EU solid biomass", "EU biogas"]

# define networks dictionary
networks = {
    "Master": {"proj": n_proj_master, "msv": n_msv_master},
    "PR with esum constraint (with 40% slack)": {
        "proj": n_proj_pr_with_esum,
        "msv": n_msv_pr_with_esum,
    },
    "PR without esum constraint": {
        "proj": n_proj_pr_without_esum,
        "msv": n_msv_pr_without_esum,
    },
}

# set runs as colors
colors = {
    "Master": "C0",
    "PR with esum constraint (with 40% slack)": "C1",
    "PR without esum constraint": "C2",
}

# set network types as line styles
line_styles = {
    "proj": "-",  # solid line for rolling horizon
    "msv": "--",  # dashed line for MSV
}

# create plots
for generator_name in generator_names:
    fig, axes = plt.subplots(3, 1, figsize=(12, 10), sharex=True, sharey=True)

    for idx, (run_label, run_networks) in enumerate(networks.items()):
        ax = axes[idx]

        for net_type, network in run_networks.items():
            dispatch = network.generators_t.p[generator_name]
            label = "rolling horizon" if net_type == "proj" else "msv"
            ax.plot(
                dispatch.index,
                dispatch.values,
                label=label,
                color=colors[run_label],
                linestyle=line_styles[net_type],
            )

        ax.set_title(f"{run_label}")
        ax.set_ylabel("Dispatch (MW)")
        ax.legend()

    # Only set xlabel on the bottom subplot
    axes[-1].set_xlabel("Snapshot")

    # Add overall title
    fig.suptitle(generator_name, fontsize=14, y=0.995)

    fig.tight_layout()
    filename = f"dispatch_{generator_name.lower().replace(' ', '_')}.png"
    plt.savefig(filename, dpi=300, bbox_inches="tight")
    print(f"Plot saved as {filename}")
    plt.close(fig)

 Conflicts:
	scripts/cba/solve_cba_network.py
@lisazeyen

Copy link
Copy Markdown
Collaborator

@measrainsey that looks great! Ready to be merged from my side!

@measrainsey

Copy link
Copy Markdown
Member Author

Thanks @lisazeyen !

In my latest commits I removed the energy budget constraints on the biomass/biogas generators, in addition to the get_components_with_volume_limits() function and cba.biomass_biogas_slack config option that were added earlier in this PR, since they are no longer needed.

I've updated the release note and the PR description to reflect the final decision we've made to remove the energy budget constraint as well.

@measrainsey
measrainsey merged commit 25cf9e2 into master Jul 10, 2026
7 checks passed
@measrainsey
measrainsey deleted the feat/bio-dispatch branch July 10, 2026 08:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CBA Cost Benefit Analysis enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[SUB] Update biogas and biomass dispatch in CBA

3 participants