From b92a2ba115b90b47206a29404dea3249fe074b71 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sat, 31 Jul 2021 01:53:40 +0200 Subject: [PATCH] Remove GraphWalkSolver It's not worth maintaining and if anybody cares the code is in git history. --- Content.Server/Power/Pow3r/GraphWalkSolver.cs | 181 ------------------ Pow3r/Program.Simulation.cs | 2 - 2 files changed, 183 deletions(-) delete mode 100644 Content.Server/Power/Pow3r/GraphWalkSolver.cs diff --git a/Content.Server/Power/Pow3r/GraphWalkSolver.cs b/Content.Server/Power/Pow3r/GraphWalkSolver.cs deleted file mode 100644 index 981aad8120..0000000000 --- a/Content.Server/Power/Pow3r/GraphWalkSolver.cs +++ /dev/null @@ -1,181 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using static Content.Server.Power.Pow3r.PowerState; - -namespace Content.Server.Power.Pow3r -{ - /// - /// Partial implementation of full-graph-walking power solving under pow3r. - /// Concept described at https://hackmd.io/@ss14/lowpower - /// - /// - /// Many features like batteries, cycle detection, join handling, etc... are not implemented at all. - /// Seriously, this implementation barely works. Ah well. - /// is better. - /// - public class GraphWalkSolver : IPowerSolver - { - public void Tick(float frameTime, PowerState state) - { - foreach (var load in state.Loads.Values) - { - load.ReceivingPower = 0; - } - - foreach (var supply in state.Supplies.Values) - { - supply.CurrentSupply = 0; - } - - foreach (var network in state.Networks.Values) - { - // Clear some stuff. - network.LocalDemandMet = 0; - - // Add up demands in network. - network.LocalDemandTotal = network.Loads - .Select(l => state.Loads[l]) - .Where(c => c.Enabled) - .Sum(c => c.DesiredPower); - - // Add up supplies in network. - var availableSupplySum = 0f; - var maxSupplySum = 0f; - foreach (var supplyId in network.Supplies) - { - var supply = state.Supplies[supplyId]; - if (!supply.Enabled) - continue; - - var rampMax = supply.SupplyRampPosition + supply.SupplyRampTolerance; - var effectiveSupply = Math.Min(rampMax, supply.MaxSupply); - supply.EffectiveMaxSupply = effectiveSupply; - availableSupplySum += effectiveSupply; - maxSupplySum += supply.MaxSupply; - } - - network.AvailableSupplyTotal = availableSupplySum; - network.TheoreticalSupplyTotal = maxSupplySum; - } - - // Sort networks by tree height so that suppliers that have less possible loads go FIRST. - // Idea being that a backup generator on a small subnet should do more work - // so that a larger generator that covers more networks can put its power elsewhere. - var sortedByHeight = state.Networks.Values.OrderBy(v => TotalSubLoadCount(state, v)).ToArray(); - - // Go over every network with supply to send power. - foreach (var network in sortedByHeight) - { - // Find all loads recursively, and sum them up. - var subNets = new List(); - var totalDemand = 0f; - GetLoadingNetworksRecursively(state, network, subNets, ref totalDemand); - - if (totalDemand == 0) - continue; - - // Calculate power delivered. - var power = Math.Min(totalDemand, network.AvailableSupplyTotal); - - // Distribute load across supplies in network. - foreach (var supplyId in network.Supplies) - { - var supply = state.Supplies[supplyId]; - if (!supply.Enabled) - continue; - - if (supply.EffectiveMaxSupply != 0) - { - var ratio = supply.EffectiveMaxSupply / network.AvailableSupplyTotal; - - supply.CurrentSupply = ratio * power; - } - else - { - supply.CurrentSupply = 0; - } - - if (supply.MaxSupply != 0) - { - var ratio = supply.MaxSupply / network.TheoreticalSupplyTotal; - - supply.SupplyRampTarget = ratio * totalDemand; - } - else - { - supply.SupplyRampTarget = 0; - } - } - - // Distribute supply across subnet loads. - foreach (var subNet in subNets) - { - var rem = subNet.RemainingDemand; - var ratio = rem / totalDemand; - - subNet.LocalDemandMet += ratio * power; - } - } - - // Distribute power across loads in networks. - foreach (var network in state.Networks.Values) - { - if (network.LocalDemandMet == 0) - continue; - - foreach (var loadId in network.Loads) - { - var load = state.Loads[loadId]; - if (!load.Enabled) - continue; - - var ratio = load.DesiredPower / network.LocalDemandTotal; - load.ReceivingPower = ratio * network.LocalDemandMet; - } - } - - PowerSolverShared.UpdateRampPositions(frameTime, state); - } - - private int TotalSubLoadCount(PowerState state, Network network) - { - // TODO: Cycle detection. - var height = network.Loads.Count; - - foreach (var batteryId in network.BatteriesCharging) - { - var battery = state.Batteries[batteryId]; - if (battery.LinkedNetworkDischarging != default) - { - height += TotalSubLoadCount(state, state.Networks[battery.LinkedNetworkDischarging]); - } - } - - return height; - } - - private void GetLoadingNetworksRecursively( - PowerState state, - Network network, - List networks, - ref float totalDemand) - { - networks.Add(network); - totalDemand += network.LocalDemandTotal - network.LocalDemandMet; - - foreach (var batteryId in network.BatteriesCharging) - { - var battery = state.Batteries[batteryId]; - if (battery.LinkedNetworkDischarging != default) - { - GetLoadingNetworksRecursively( - state, - state.Networks[battery.LinkedNetworkDischarging], - networks, - ref totalDemand); - } - } - } - } -} diff --git a/Pow3r/Program.Simulation.cs b/Pow3r/Program.Simulation.cs index 440e262f83..2c8072e3e8 100644 --- a/Pow3r/Program.Simulation.cs +++ b/Pow3r/Program.Simulation.cs @@ -18,13 +18,11 @@ namespace Pow3r private readonly string[] _solverNames = { - nameof(GraphWalkSolver), nameof(BatteryRampPegSolver), nameof(NoOpSolver) }; private readonly IPowerSolver[] _solvers = { - new GraphWalkSolver(), new BatteryRampPegSolver(), new NoOpSolver() };