Skip to content

Commit

Permalink
Flip DEFINE definitions so source analysis is better with no DEFINEs …
Browse files Browse the repository at this point in the history
…enabled
  • Loading branch information
joelverhagen committed Dec 14, 2023
1 parent d6001a1 commit fc119e3
Show file tree
Hide file tree
Showing 15 changed files with 171 additions and 247 deletions.
24 changes: 8 additions & 16 deletions src/FactorioTools/FactorioTools.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,19 @@
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UseObjectPooling>false</UseObjectPooling>
<UseSharedInstances>true</UseSharedInstances>
<NoSharedInstances>false</NoSharedInstances>
<EnableVisualizer Condition="'$(EnableVisualizer)' == '' and '$(Configuration)' == 'Debug'">true</EnableVisualizer>
<EnableVisualizer Condition="'$(EnableVisualizer)' == '' and '$(Configuration)' != 'Debug'">false</EnableVisualizer>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>

<PropertyGroup Condition="$(UseObjectPooling) == 'true'">
<DefineConstants>$(DefineConstants);USE_OBJECT_POOLING</DefineConstants>
<PropertyGroup Condition="$(NoSharedInstances) == 'true'">
<DefineConstants>$(DefineConstants);NO_SHARED_INSTANCES</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition="$(UseSharedInstances) == 'true'">
<DefineConstants>$(DefineConstants);USE_SHARED_INSTANCES</DefineConstants>
<PropertyGroup Condition="$(EnableVisualizer) == 'true'">
<DefineConstants>$(DefineConstants);ENABLE_VISUALIZER</DefineConstants>
</PropertyGroup>

<PropertyGroup>
Expand All @@ -32,20 +33,11 @@
<PackageReference Include="Knapcode.FluteSharp" Version="0.4.0" GeneratePathProperty="true" ExcludeAssets="contentFiles" />
</ItemGroup>

<ItemGroup Condition="'$(UseObjectPooling)' == 'true'">
<PackageReference Include="Microsoft.Extensions.ObjectPool" Version="7.0.2" />
<Using Include="Microsoft.Extensions.ObjectPool" />
</ItemGroup>

<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<ItemGroup Condition="'$(EnableVisualizer)' == 'true'">
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta15" />
</ItemGroup>

<ItemGroup Condition="'$(Configuration)' != 'Debug'">
<Compile Remove="OilField\Visualizer.cs" />
</ItemGroup>

<ItemGroup>
<EmbeddedResource Include="$(PkgKnapcode_FluteSharp)\contentFiles\any\netstandard2.1\POWV6.dat" LinkBase="OilField" />
<EmbeddedResource Include="$(PkgKnapcode_FluteSharp)\contentFiles\any\netstandard2.1\POST6.dat" LinkBase="OilField" />
Expand Down
66 changes: 13 additions & 53 deletions src/FactorioTools/OilField/Algorithms/AStar.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
using System.Numerics;
using Knapcode.FactorioTools.OilField.Grid;
using static Knapcode.FactorioTools.OilField.Steps.Helpers;
#if USE_OBJECT_POOLING
using System.Buffers;
using Microsoft.Extensions.ObjectPool;
#endif

namespace Knapcode.FactorioTools.OilField.Algorithms;

Expand All @@ -13,12 +9,6 @@ namespace Knapcode.FactorioTools.OilField.Algorithms;
/// </summary>
public static class AStar
{
#if USE_OBJECT_POOLING
public static readonly ObjectPool<Dictionary<Location, Location>> CameFromPool = ObjectPool.Create<Dictionary<Location, Location>>();
public static readonly ObjectPool<Dictionary<Location, double>> CostSoFarPool = ObjectPool.Create<Dictionary<Location, double>>();
public static readonly ObjectPool<PriorityQueue<Location, double>> FrontierPool = ObjectPool.Create<PriorityQueue<Location, double>>();
#endif

#if DEBUG
public static int CameFromPoolCount;
public static int CostSoFarPoolCount;
Expand All @@ -43,12 +33,10 @@ public static AStarResult GetShortestPath(SharedInstances sharedInstances, Squar
}

var useVector = Vector.IsHardwareAccelerated && goals.Count >= Vector<int>.Count;
#if USE_OBJECT_POOLING
var goalsArray = ArrayPool<Location>.Shared.Rent(goals.Count);
#elif USE_SHARED_INSTANCES
var goalsArray = sharedInstances.GetArray(ref sharedInstances.LocationArray, goals.Count);
#else
#if NO_SHARED_INSTANCES
var goalsArray = new Location[goals.Count];
#else
var goalsArray = sharedInstances.GetArray(ref sharedInstances.LocationArray, goals.Count);
#endif
#if DEBUG
Interlocked.Increment(ref ArrayPoolCount);
Expand All @@ -59,15 +47,12 @@ public static AStarResult GetShortestPath(SharedInstances sharedInstances, Squar
int[]? ys = null;
if (useVector)
{
#if USE_OBJECT_POOLING
xs = ArrayPool<int>.Shared.Rent(goals.Count);
ys = ArrayPool<int>.Shared.Rent(goals.Count);
#elif USE_SHARED_INSTANCES
xs = sharedInstances.GetArray(ref sharedInstances.IntArrayX, goals.Count);
ys = sharedInstances.GetArray(ref sharedInstances.IntArrayY, goals.Count);
#else
#if NO_SHARED_INSTANCES
xs = new int[goals.Count];
ys = new int[goals.Count];
#else
xs = sharedInstances.GetArray(ref sharedInstances.IntArrayX, goals.Count);
ys = sharedInstances.GetArray(ref sharedInstances.IntArrayY, goals.Count);
#endif
#if DEBUG
Interlocked.Increment(ref ArrayPoolCount);
Expand All @@ -79,26 +64,19 @@ public static AStarResult GetShortestPath(SharedInstances sharedInstances, Squar
ys[i] = goalsArray[i].Y;
}

#if USE_OBJECT_POOLING
ArrayPool<Location>.Shared.Return(goalsArray);
#endif
#if DEBUG
Interlocked.Decrement(ref ArrayPoolCount);
#endif
}

#if USE_OBJECT_POOLING
var cameFrom = CameFromPool.Get();
var costSoFar = CostSoFarPool.Get();
var frontier = FrontierPool.Get();
#elif USE_SHARED_INSTANCES
var cameFrom = sharedInstances.LocationToLocation;
var costSoFar = sharedInstances.LocationToDouble;
var frontier = sharedInstances.LocationPriorityQueue;
#else
#if NO_SHARED_INSTANCES
var cameFrom = new Dictionary<Location, Location>();
var costSoFar = new Dictionary<Location, double>();
var frontier = new PriorityQueue<Location, double>();
#else
var cameFrom = sharedInstances.LocationToLocation;
var costSoFar = sharedInstances.LocationToDouble;
var frontier = sharedInstances.LocationPriorityQueue;
#endif
#if DEBUG
Interlocked.Increment(ref CostSoFarPoolCount);
Expand Down Expand Up @@ -182,16 +160,7 @@ public static AStarResult GetShortestPath(SharedInstances sharedInstances, Squar
}
finally
{
#if USE_OBJECT_POOLING
cameFrom.Clear();
CameFromPool.Return(cameFrom);

costSoFar.Clear();
CostSoFarPool.Return(costSoFar);

frontier.Clear();
FrontierPool.Return(frontier);
#elif USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
cameFrom.Clear();
costSoFar.Clear();
frontier.Clear();
Expand All @@ -205,22 +174,13 @@ public static AStarResult GetShortestPath(SharedInstances sharedInstances, Squar

if (useVector)
{
#if USE_OBJECT_POOLING
ArrayPool<int>.Shared.Return(xs!);
ArrayPool<int>.Shared.Return(ys!);
#endif

#if DEBUG
Interlocked.Decrement(ref ArrayPoolCount);
Interlocked.Decrement(ref ArrayPoolCount);
#endif
}
else
{
#if USE_OBJECT_POOLING
ArrayPool<Location>.Shared.Return(goalsArray);
#endif

#if DEBUG
Interlocked.Decrement(ref ArrayPoolCount);
#endif
Expand Down
12 changes: 6 additions & 6 deletions src/FactorioTools/OilField/Algorithms/BreadthFirstFinder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ public static class BreadthFirstFinder
{
public static List<Location>? GetShortestPath(SharedInstances sharedInstances, SquareGrid grid, Location start, Location goal)
{
#if USE_SHARED_INSTANCES
var toExplore = sharedInstances.LocationQueue;
var parents = sharedInstances.LocationToLocation;
var visited = sharedInstances.LocationSetA;
#else
#if NO_SHARED_INSTANCES
var toExplore = new Queue<Location>();
var parents = new Dictionary<Location, Location>();
var visited = new HashSet<Location>();
#else
var toExplore = sharedInstances.LocationQueue;
var parents = sharedInstances.LocationToLocation;
var visited = sharedInstances.LocationSetA;
#endif
try
{
Expand Down Expand Up @@ -61,7 +61,7 @@ public static class BreadthFirstFinder
}
finally
{
#if USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
toExplore.Clear();
parents.Clear();
visited.Clear();
Expand Down
12 changes: 6 additions & 6 deletions src/FactorioTools/OilField/Algorithms/Dijkstras.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ public static DijkstrasResult GetShortestPaths(SharedInstances sharedInstances,
cameFrom[start] = new HashSet<Location>();
var remainingGoals = new HashSet<Location>(goals);

#if USE_SHARED_INSTANCES
var priorityQueue = sharedInstances.LocationPriorityQueue;
var costSoFar = sharedInstances.LocationToDouble;
var inQueue = sharedInstances.LocationSetB;
#else
#if NO_SHARED_INSTANCES
var priorityQueue = new PriorityQueue<Location, double>();
var costSoFar = new Dictionary<Location, double>();
var inQueue = new HashSet<Location>();
#else
var priorityQueue = sharedInstances.LocationPriorityQueue;
var costSoFar = sharedInstances.LocationToDouble;
var inQueue = sharedInstances.LocationSetB;
#endif

var reachedGoals = new HashSet<Location>();
Expand Down Expand Up @@ -80,7 +80,7 @@ public static DijkstrasResult GetShortestPaths(SharedInstances sharedInstances,
}
finally
{
#if USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
priorityQueue.Clear();
costSoFar.Clear();
inQueue.Clear();
Expand Down
8 changes: 4 additions & 4 deletions src/FactorioTools/OilField/Algorithms/Prims.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ public static Dictionary<Location, HashSet<Location>> GetMinimumSpanningTree(
Location firstNode,
bool digraph)
{
#if USE_SHARED_INSTANCES
var visited = sharedInstances.LocationSetA;
#else
#if NO_SHARED_INSTANCES
var visited = new HashSet<Location>();
#else
var visited = sharedInstances.LocationSetA;
#endif
var priority = new PriorityQueue<(Location NodeA, Location NodeB), int>();
var mst = new Dictionary<Location, HashSet<Location>>();
Expand Down Expand Up @@ -75,7 +75,7 @@ public static Dictionary<Location, HashSet<Location>> GetMinimumSpanningTree(
}
finally
{
#if USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
visited.Clear();
#endif
}
Expand Down
4 changes: 2 additions & 2 deletions src/FactorioTools/OilField/SharedInstances.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ public SharedInstances() : this(new())

public SharedInstances(HashSet<Location> locationSetA)
{
#if USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
LocationSetA = locationSetA;
#endif
}

#if USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
public Queue<Location> LocationQueue = new();
public Location[] LocationArray = Array.Empty<Location>();
public int[] IntArrayX = Array.Empty<int>();
Expand Down
10 changes: 5 additions & 5 deletions src/FactorioTools/OilField/Steps/AddElectricPoles.cs
Original file line number Diff line number Diff line change
Expand Up @@ -611,12 +611,12 @@ private static void AddSinglePoleForConnection(Context context, Dictionary<Locat
}
var idealPoint = idealLine[idealIndex];

#if USE_SHARED_INSTANCES
var candidates = context.SharedInstances.LocationQueue;
var attempted = context.SharedInstances.LocationSetA;
#else
#if NO_SHARED_INSTANCES
var candidates = new Queue<Location>();
var attempted = new HashSet<Location>();
#else
var candidates = context.SharedInstances.LocationQueue;
var attempted = context.SharedInstances.LocationSetA;
#endif

Location? selectedPoint = null;
Expand Down Expand Up @@ -650,7 +650,7 @@ private static void AddSinglePoleForConnection(Context context, Dictionary<Locat
}
finally
{
#if USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
candidates.Clear();
attempted.Clear();
#endif
Expand Down
8 changes: 4 additions & 4 deletions src/FactorioTools/OilField/Steps/AddPipeEntities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ public static void Execute(
Dictionary<Location, Direction>? undergroundPipes = null,
bool allowMultipleTerminals = false)
{
#if USE_SHARED_INSTANCES
var addedPipes = sharedInstances.LocationSetA;
#else
#if NO_SHARED_INSTANCES
var addedPipes = new HashSet<Location>();
#else
var addedPipes = sharedInstances.LocationSetA;
#endif

try
Expand Down Expand Up @@ -68,7 +68,7 @@ public static void Execute(
}
finally
{
#if USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
addedPipes.Clear();
#endif
}
Expand Down
18 changes: 9 additions & 9 deletions src/FactorioTools/OilField/Steps/AddPipes.2.ConnectedCenters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -190,12 +190,12 @@ private static List<Location> GetShortestPathToGroup(Context context, TerminalLo
{
try
{
#if USE_SHARED_INSTANCES
var aStarResultV = AStar.GetShortestPath(context.SharedInstances, context.Grid, terminal.Terminal, group.Pipes, xWeight: 2, outputList: context.SharedInstances.LocationListA);
var aStarResultH = AStar.GetShortestPath(context.SharedInstances, context.Grid, terminal.Terminal, group.Pipes, yWeight: 2, outputList: context.SharedInstances.LocationListB);
#else
#if NO_SHARED_INSTANCES
var aStarResultV = AStar.GetShortestPath(context.SharedInstances, context.Grid, terminal.Terminal, group.Pipes, xWeight: 2);
var aStarResultH = AStar.GetShortestPath(context.SharedInstances, context.Grid, terminal.Terminal, group.Pipes, yWeight: 2);
#else
var aStarResultV = AStar.GetShortestPath(context.SharedInstances, context.Grid, terminal.Terminal, group.Pipes, xWeight: 2, outputList: context.SharedInstances.LocationListA);
var aStarResultH = AStar.GetShortestPath(context.SharedInstances, context.Grid, terminal.Terminal, group.Pipes, yWeight: 2, outputList: context.SharedInstances.LocationListB);
#endif

if (aStarResultV.ReachedGoal is null)
Expand All @@ -216,10 +216,10 @@ private static List<Location> GetShortestPathToGroup(Context context, TerminalLo

var sizeEstimate = aStarResultV.Path.Count + aStarResultH.Path.Count;

#if USE_SHARED_INSTANCES
var locationToCentroidDistanceSquared = context.SharedInstances.LocationToDouble;
#else
#if NO_SHARED_INSTANCES
var locationToCentroidDistanceSquared = new Dictionary<Location, double>(sizeEstimate);
#else
var locationToCentroidDistanceSquared = context.SharedInstances.LocationToDouble;
#endif

try
Expand Down Expand Up @@ -251,7 +251,7 @@ private static List<Location> GetShortestPathToGroup(Context context, TerminalLo
}
finally
{
#if USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
locationToCentroidDistanceSquared.Clear();
#endif
}
Expand All @@ -275,7 +275,7 @@ private static List<Location> GetShortestPathToGroup(Context context, TerminalLo
}
finally
{
#if USE_SHARED_INSTANCES
#if !NO_SHARED_INSTANCES
context.SharedInstances.LocationListA.Clear();
context.SharedInstances.LocationListB.Clear();
#endif
Expand Down
Loading

0 comments on commit fc119e3

Please sign in to comment.