public IEnumerable <PowerPlantInputDto> Compute(PayLoadDto dto) { var payload = _payLoadConverter.ToModel(dto); var powerPlantByMeritOrder = payload.PowerPlants.OrderBy(p => p.ComputePricePerMwh()).ThenBy(p => p.Pmin); var load = payload.Load; GenericPowerPlant prec = null; foreach (var p in powerPlantByMeritOrder) { if (load == 0) { p.Power = 0; continue; } var delta = load - p.Power; if (delta == 0) { load = 0; } if (delta > 0) { load = delta; prec = p; } if (delta < 0) { if (load >= p.Pmin && load <= p.Pmax) { p.Power = (float)Math.Round(load, 1); load = 0; } else if (prec != null) { prec.Power = p.Power + load - p.Pmin; p.Power = p.Pmin; prec = null; load = 0; } } } var dtos = _converter.ToDtos(powerPlantByMeritOrder); return(dtos); }
public IActionResult ProductionPlan(PayLoadDto payload) { try { var dtos = _service.Compute(payload); var responses = (from dto in dtos select new { name = dto.Name, p = dto.Power }).ToArray(); return(Ok(responses)); } catch (Exception ex) { return(BadRequest(ex.Message)); } }
public void CanComputeSamePriceButDiffrentPminLowPlan() { /**** * setup * */ IPowerPlantConverter converter = new PowerPlantConverter(); IFuelConverter fuelconverter = new FuelConverter(); IPayLoadConverter payLoadConverter = new PayLoadConverter(converter, fuelconverter); var service = new PowerPlantService(converter, payLoadConverter); //fuel Dictionnary var fuelsDict = new Dictionary <string, float> { { "gas(euro/MWh)", 13.4f }, { "kerosine(euro/MWh)", 50.8f }, { "co2(euro/ton)", 20f }, { "wind(%)", 60f } }; var pw1 = new PowerPlantInputDto { Name = "gasfirebig1", Type = "gasfired", Efficiency = 0.53f, Pmax = 460, Pmin = 100 }; var pw2 = new PowerPlantInputDto { Name = "gasfirebig2", Type = "gasfired", Efficiency = 0.53f, Pmax = 460, Pmin = 100 }; var pw3 = new PowerPlantInputDto { Name = "gasfiredsomewhatsmaller", Type = "gasfired", Efficiency = 0.53f, Pmax = 210, Pmin = 40 }; var pw4 = new PowerPlantInputDto { Name = "tj1", Type = "turbojet", Efficiency = 0.3f, Pmax = 16, Pmin = 0, }; var pw5 = new PowerPlantInputDto { Name = "windpark1", Type = "windturbine", Efficiency = 1f, Pmax = 150, Pmin = 0 }; var pw6 = new PowerPlantInputDto { Name = "windpark2", Type = "windturbine", Efficiency = 1f, Pmax = 36, Pmin = 0 }; var powerPlants = new List <PowerPlantInputDto> { pw1, pw2, pw3, pw4, pw5, pw6 }.ToArray(); //3 the payload var payload = new PayLoadDto { Load = 190, Fuels = fuelsDict, PowerPlants = powerPlants }; //act var result = service.Compute(payload); var exceptedResult = new[] { new PowerPlantInputDto { Name = "windpark1", Power = 90 }, new PowerPlantInputDto { Name = "windpark2", Power = 21.6f }, new PowerPlantInputDto { Name = "gasfirebig1", Power = 0 }, new PowerPlantInputDto { Name = "gasfirebig2", Power = 0 }, new PowerPlantInputDto { Name = "gasfiredsomewhatsmaller", Power = 78.4f }, new PowerPlantInputDto { Name = "tj1", Power = 0 } }; var hashet = new HashSet <PowerPlantInputDto>(result); Assert.IsTrue(hashet.SetEquals(exceptedResult)); }