public static void WriteInstanceToFile(FlowlineConfiguration flc, string path) { var lines = new List <string>(); void AddLine(int v) { lines.Add(v.ToString()); } void AddLineF(float v) { lines.Add(v.ToString(CultureInfo.InvariantCulture)); } AddLineF(flc.RequiredRelativeMarginOfError); AddLine(flc.NumMachines); AddLine(flc.NumBuffers); AddLine(flc.MilkRunCycleLength); for (var i = 0; i < flc.NumMachines; i++) { lines.Add(MachineToLine(flc.Machines[i])); } for (var i = 0; i < flc.NumBuffers; i++) { lines.Add(BufferToLine(flc.Buffers[i])); } lines.Add("\n0\n"); File.WriteAllLines(path, lines); }
public BaseEvaluator(MilkrunBufferAllocationProblem problem) { Flc = InstanceGenerator.Generate(1); for (var i = 0; i < Flc.NumMachines; i++) { Flc.Machines[i].ProcessingRate = problem.ProcessingRates[i]; } }
private static Sample SampleForLineWithRate(FlowlineConfiguration flc, float rate) { var sample = new Sample { BufferSizes = flc.Buffers.Select(buf => buf.Size).ToList(), ProcessingRates = flc.Machines.Select(machine => machine.ProcessingRate).ToList(), OrderUpToLevels = flc.Machines.Select(machine => machine.OrderUpToMilkLevel).ToList(), MilkrunCycleLength = flc.MilkRunCycleLength, ProductionRate = rate }; return(sample); }
public static float ProductionRateForConfiguration(FlowlineConfiguration flc) { var tmpFilenameBase = $"temp_hash_{flc.GetHashCode()}"; InstanceWriter.WriteInstanceToFile(flc, tmpFilenameBase + ".mrn"); RunSimulationExecutable(tmpFilenameBase); var productionRate = ResultParser.ProductionRateFromResultFile(tmpFilenameBase + ".stb"); var extensions = new List <string> { ".mrn", ".stb" }; extensions.ForEach(ext => RetryDelete(tmpFilenameBase + ext)); return(productionRate); }
public static FlowlineConfiguration ReadInstanceFromFile(string path) { var lines = File.ReadAllLines(path); void FillWithFloatFromLine(out float field, int lineIx) { field = float.Parse(lines[lineIx]); } void FillWithIntFromLine(out int field, int lineIx) { field = int.Parse(lines[lineIx]); } var flc = new FlowlineConfiguration(); // Global data FillWithFloatFromLine(out flc.RequiredRelativeMarginOfError, 0); FillWithIntFromLine(out flc.NumMachines, 1); FillWithIntFromLine(out flc.NumBuffers, 2); FillWithIntFromLine(out flc.MilkRunCycleLength, 3); // Machine related flc.Machines = new List <Machine>(); const int firstMachineLineIx = 4; for (var i = 0; i < flc.NumMachines; i++) { var lineIx = firstMachineLineIx + i; var parts = lines[lineIx].Split(" ", StringSplitOptions.RemoveEmptyEntries); flc.Machines.Add(MachineFromParts(parts)); } // Buffer related flc.Buffers = new List <Buffer>(); var firstBufferLineIx = firstMachineLineIx + flc.NumMachines; for (var i = 0; i < flc.NumBuffers; i++) { var lineIx = firstBufferLineIx + i; var parts = lines[lineIx].Split(" ", StringSplitOptions.RemoveEmptyEntries); flc.Buffers.Add(BufferFromParts(parts)); } return(flc); }
public static FlowlineConfiguration Generate(int seed) { var rand = new Random(seed); var flc = new FlowlineConfiguration { RequiredRelativeMarginOfError = 0.005f, NumMachines = 4, NumBuffers = 3, // add 1 since Random.Next the ub is non inclusive! MilkRunCycleLength = rand.Next(30, 120 + 1) }; var variationMue = Utils.Uniform(rand, 0.0f, 0.2f); Machine GenerateMachine(int i) { return(Machine.ConstructDefaultMachine( Utils.Uniform(rand, 1.0f - variationMue, 1.0f + variationMue), (int)Math.Round(Utils.Uniform(rand, 0.5f, 1.5f) * flc.MilkRunCycleLength))); } var bufferMean = Utils.Uniform(rand, 0.0f, 40.0f); var bufferFactor = (float)rand.NextDouble(); Buffer GenerateBuffer(int i) { return(Buffer.ConstructDefaultBuffer( (int)Math.Round(Utils.Uniform(rand, bufferMean * (1 - bufferFactor), bufferMean * (1 + bufferFactor))), i)); } flc.Machines = Enumerable.Range(0, flc.NumMachines).Select(GenerateMachine).ToList(); flc.Buffers = Enumerable.Range(0, flc.NumBuffers).Select(GenerateBuffer).ToList(); return(flc); }
public static void ToJson(FlowlineConfiguration flc, string path) { Utils.SaveObjectAsJson(flc, path); }
public float PredictConfig(FlowlineConfiguration config) { return(Predict(config.ToSample())); }