private void SetAffordances([NotNull] CalcHousehold chh) { foreach (CalcLocation location in chh.Locations) { foreach (var aff in location.PureAffordances) { //replace with affordance decorator if (chh.TransportationHandler == null) { throw new LPGException("no transportation handler"); } var sites = chh.TransportationHandler.CalcSites.Where(x => x.Locations.Contains(location)).ToList(); if (sites.Count == 0) { throw new DataIntegrityException("No calc site has the location " + location.Name + ". To make the transportation work, every site needs one location."); } if (sites.Count > 1) { throw new DataIntegrityException("More than one calc site has the location " + location.Name); } AffordanceBaseTransportDecorator abtd = new AffordanceBaseTransportDecorator( aff, sites[0], chh.TransportationHandler, aff.Name, chh.HouseholdKey, Guid.NewGuid().ToStrGuid(), _calcRepo); location.AddTransportationAffordance(abtd); } } }
private void MakeTravelRoutes([NotNull][ItemNotNull] List <CalcTravelRouteDto> travelRouteDtos, [NotNull] CalcHousehold chh, [NotNull][ItemNotNull] List <CalcSite> sites, [NotNull] TransportationHandler th) { foreach (CalcTravelRouteDto travelRouteDto in travelRouteDtos) { CalcSite siteA = sites.Single(x => x.Guid == travelRouteDto.SiteAGuid); CalcSite siteB = sites.Single(x => x.Guid == travelRouteDto.SiteBGuid); //if (siteA != null && siteB != null) { //if either site is null, the travel route is not usable for this household CalcTravelRoute travelRoute = new CalcTravelRoute(travelRouteDto.Name, siteA, siteB, th.VehicleDepot, th.LocationUnlimitedDevices, chh.HouseholdKey, travelRouteDto.Guid, _calcRepo); foreach (var step in travelRouteDto.Steps) { CalcTransportationDeviceCategory category = th.GetCategory(step.TransportationDeviceCategory); travelRoute.AddTravelRouteStep(step.Name, category, step.StepNumber, step.DistanceInM, step.Guid); } if (siteA != siteB) { th.TravelRoutes.Add(travelRoute); } else { th.SameSiteRoutes.Add(siteA, travelRoute); } //} } }
private void MakeTransportationDevice([NotNull] CalcHousehold chh, [NotNull][ItemNotNull] List <CalcTransportationDeviceDto> transportationDevices) { foreach (var transportationDevice in transportationDevices) { var loads = new List <CalcDeviceLoad>(); foreach (var load in transportationDevice.Loads) { CalcLoadType clt = _loadTypeDict.GetLoadtypeByGuid(load.LoadTypeGuid); loads.Add(new CalcDeviceLoad(load.Name, load.MaxPower, clt, 0, 0)); } double distanceToEnergyFactor = transportationDevice.EnergyToDistanceFactor; CalcLoadType chargingLoadType = null; if (transportationDevice.ChargingCalcLoadTypeGuid.HasValue) { chargingLoadType = _loadTypeDict.GetLoadtypeByGuid(transportationDevice.ChargingCalcLoadTypeGuid.Value); } if (chh.TransportationHandler == null) { throw new LPGException("no transportation handler"); } CalcDeviceDto cdd = new CalcDeviceDto(transportationDevice.Name, transportationDevice.Category.Guid, chh.HouseholdKey, OefcDeviceType.Transportation, transportationDevice.Category.Name, string.Empty, transportationDevice.Guid, StrGuid.Empty, string.Empty); var category = chh.TransportationHandler.GetCategory(transportationDevice.Category); CalcTransportationDevice cd = new CalcTransportationDevice( category, transportationDevice.AverageSpeedInMPerS, loads, transportationDevice.FullRangeInMeters, distanceToEnergyFactor, transportationDevice.MaxChargingPower, chargingLoadType, chh.TransportationHandler.CalcSites, cdd, _calcRepo); if (category.IsLimitedToSingleLocation) { chh.TransportationHandler.AddVehicleDepotDevice(cd); } else { chh.TransportationHandler.LocationUnlimitedDevices.Add(cd); } } }
public static void CheckConsistency([NotNull] CalcHousehold chh, [NotNull] CalcParameters calcParameters) { CheckTimeResolution(calcParameters); // check for the same device twice foreach (CalcLocation location in chh.Locations) { foreach (var calcAffordanceBase in location.Affordances) { ICalcAffordanceBase affordance = calcAffordanceBase; if (affordance.AreThereDuplicateEnergyProfiles()) { throw new DataIntegrityException( "Same device twice in one Affordance: " + location.Name + " - " + affordance.Name); } } } // check for timeprofiles without values foreach (CalcLocation calcLocation in chh.Locations) { foreach (var calcAffordanceBase in calcLocation.Affordances) { ICalcAffordanceBase calcAffordance = calcAffordanceBase; if (calcAffordance.AreDeviceProfilesEmpty() != null) { throw new DataIntegrityException("Timeprofile without values: " + calcAffordance.AreDeviceProfilesEmpty()); } } } // persons without desires foreach (CalcPerson calcPerson in chh.Persons) { if (calcPerson.DesireCount == 0) { throw new DataIntegrityException("Person without desires: " + calcPerson.Name); } } if (calcParameters.InternalStepsize.TotalSeconds < 1) { throw new DataIntegrityException("Time resolution too small!"); } }
public void MakeTransportation([NotNull] CalcHouseholdDto household, [NotNull] DtoCalcLocationDict locDict, [NotNull] CalcHousehold chh) { if (household.CalcTravelRoutes == null || household.CalcSites == null || household.CalcTransportationDevices == null) { Logger.Info("Missing something for the transportation"); if (household.CalcTravelRoutes == null) { Logger.Info("No travel routes are set"); } if (household.CalcSites == null) { Logger.Info("No sites are set"); } if (household.CalcTransportationDevices == null) { Logger.Info("No Transportation devices are set"); } return; } TransportationHandler th = new TransportationHandler(); chh.TransportationHandler = th; Logger.Info("Making Calc Sites"); var sites = MakeCalcSites(household, locDict, _loadTypeDict, th); foreach (var site in sites) { th.AddSite(site); } Logger.Info("Making travel routes"); MakeTravelRoutes(household.CalcTravelRoutes, chh, sites, th); Logger.Info("Making Transportation devices"); MakeTransportationDevice(chh, household.CalcTransportationDevices); Logger.Info("Setting affordances"); SetAffordances(chh); Logger.Info("Finished initalizing the transportation"); }
private static void CheckCalcAffordancesForExecutability([NotNull] CalcHousehold calcHousehold) { var calcAffordances = calcHousehold.Locations.SelectMany(x => x.Affordances).ToList(); foreach (var calcAffordanceBase in calcAffordances) { var calcAffordance = (CalcAffordance)calcAffordanceBase; bool found = false; foreach (var person in calcHousehold.Persons) { bool isvalidforsick = person.NewIsBasicallyValidAffordance(calcAffordance, true, false); bool isvalidforhealth = person.NewIsBasicallyValidAffordance(calcAffordance, false, false); if (isvalidforsick || isvalidforhealth) { found = true; break; } } if (!found) { Logger.Debug("The affordance " + calcAffordance.Name + " from the trait " + calcAffordance.SourceTrait + " seems to not be executable " + " by any person in the household " + calcHousehold.Name + "."); foreach (var person in calcHousehold.Persons) { Logger.Info("Details for the person: " + person.Name); person.NewIsBasicallyValidAffordance(calcAffordance, true, true); person.NewIsBasicallyValidAffordance(calcAffordance, false, true); } throw new DataIntegrityException("The affordance " + calcAffordance.Name + " from the trait " + calcAffordance.SourceTrait + " seems to not be executable " + " by any person in the household " + calcHousehold.Name + ". Please fix."); } } }
public void MatchAutonomousDevicesWithNormalDevicesTest() { // make different devices at different locations // only a single one should be matched. var startdate = new DateTime(2018, 1, 1); var enddate = startdate.AddMinutes(100); var calcParameters = CalcParametersFactory.MakeGoodDefaults().SetStartDate(startdate).SetEndDate(enddate); //_calcParameters.InitializeTimeSteps(startdate, enddate, new TimeSpan(0, 1, 0), 3, false); Config.IsInUnitTesting = true; var cloc1 = new CalcLocation("loc1", Guid.NewGuid().ToStrGuid()); var cloc2 = new CalcLocation("loc1", Guid.NewGuid().ToStrGuid()); var cdevload = new List <CalcDeviceLoad>(); var clt = new CalcLoadType("calcloadtype", "power", "sum", 1, true, Guid.NewGuid().ToStrGuid()); cdevload.Add(new CalcDeviceLoad("load", 100, clt, 0, 0)); var devCategoryGuid = Guid.NewGuid().ToStrGuid(); IMock <IOnlineDeviceActivationProcessor> iodap = new Mock <IOnlineDeviceActivationProcessor>(); using (var calcRepo = new CalcRepo(iodap.Object, calcParameters: calcParameters)) { var cdd1 = new CalcDeviceDto("cdevice1", devCategoryGuid, new HouseholdKey("HH1"), OefcDeviceType.Device, "category", "", Guid.NewGuid().ToStrGuid(), cloc1.Guid, cloc1.Name); var cdLoc1 = new CalcDevice(new List <CalcDeviceLoad>(), cloc1, cdd1, calcRepo); var cdd2 = new CalcDeviceDto("cdevice1", devCategoryGuid, new HouseholdKey("HH1"), OefcDeviceType.Device, "category", "", Guid.NewGuid().ToStrGuid(), cloc1.Guid, cloc1.Name); var cdLoc1B = new CalcDevice(new List <CalcDeviceLoad>(), cloc1, cdd2, calcRepo); var cdd3 = new CalcDeviceDto("cdevice1", devCategoryGuid, new HouseholdKey("HH1"), OefcDeviceType.Device, "category", "", Guid.NewGuid().ToStrGuid(), cloc2.Guid, cloc2.Name); var cdLoc2 = new CalcDevice(new List <CalcDeviceLoad>(), cloc2, cdd3, calcRepo); var cp = new CalcProfile("cp1", Guid.NewGuid().ToStrGuid(), TimeSpan.FromMilliseconds(1), ProfileType.Absolute, "blub"); //CalcVariableRepository crv = new CalcVariableRepository(); //VariableRequirement vr = new VariableRequirement(""); var requirements = new List <VariableRequirement>(); var cdd4 = new CalcDeviceDto("cdevice1", devCategoryGuid, new HouseholdKey("HH1"), OefcDeviceType.Device, "category", "", Guid.NewGuid().ToStrGuid(), cloc1.Guid, cloc1.Name); var cadLoc1 = new CalcAutoDev(cp, clt, cdevload, 0, 1, cloc1, requirements, cdd4, calcRepo); var autodevs = new List <CalcAutoDev> { cadLoc1 }; var normalDevices = new List <CalcDevice> { cdLoc1, cdLoc1B, cdLoc2 }; CalcHousehold.MatchAutonomousDevicesWithNormalDevices(autodevs, normalDevices); //var totalmatchcount = 0; foreach (var device in normalDevices) { Logger.Info(device.Name); foreach (var matchingAutoDev in device.MatchingAutoDevs) { // totalmatchcount++; Logger.Info("\t" + matchingAutoDev.Name); } } cdLoc1.MatchingAutoDevs.Count.Should().Be(1); } //(totalmatchcount).Should().Be(1); }
public CalcHousehold MakeCalcModularHousehold([NotNull] CalcHouseholdDto householdDto, [NotNull] out DtoCalcLocationDict dtoCalcLocationDict, [CanBeNull] string houseName, [CanBeNull] string houseDescription, [NotNull] CalcRepo calcRepo) { CalcHousehold chh = null; _calcRepo.FileFactoryAndTracker.RegisterHousehold(householdDto.HouseholdKey, householdDto.Name, HouseholdKeyType.Household, householdDto.Description, houseName, houseDescription); string name = householdDto.Name + " " + householdDto.HouseholdKey; try { dtoCalcLocationDict = new DtoCalcLocationDict(); var calcLocations = _clf.MakeCalcLocations(householdDto.LocationDtos, dtoCalcLocationDict, calcRepo); if (calcLocations.Count == 0) { throw new LPGException("Not a single location could be created. Something in this household is wrong. Please fix."); } // devices var calcDevices = new List <CalcDevice>(); _cdf.MakeCalcDevices(calcLocations, householdDto.DeviceDtos, calcDevices, householdDto.HouseholdKey, _ltDict, calcRepo); var autodevs = _cdf.MakeCalcAutoDevs(householdDto.AutoDevices, dtoCalcLocationDict); //affordances /*if (householdDto.Vacation == null) * { * throw new LPGException("Vacation was null"); * }*/ //_cdf.MakeCalcDevices(calcLocations, householdDto.DeviceDtos, calcDevices,householdDto.HouseholdKey, _ltDict); var calcpersons = _cpf.MakeCalcPersons(householdDto.Persons, calcLocations[0], householdDto.Name); chh = new CalcHousehold(name, householdDto.GeographicLocationName, householdDto.TemperatureprofileName, householdDto.HouseholdKey, householdDto.Guid, _calcVariableRepository, calcLocations, calcpersons, householdDto.Description, _calcRepo); HashSet <StrGuid> deviceGuids = new HashSet <StrGuid>(); foreach (CalcDevice device in calcDevices) { if (!deviceGuids.Add(device.Guid)) { throw new LPGException("Tried to add the same device guid twice"); } } chh.SetDevices(calcDevices); chh.SetAutoDevs(autodevs); //chh.BridgeDays = householdDto.BridgeDays; _caf.SetAllAffordaces(householdDto.Affordances, dtoCalcLocationDict, _calcVariableRepository, calcDevices); CheckCalcAffordancesForExecutability(chh); if (householdDto.CalcTravelRoutes != null) { Logger.Info("Starting to initialize transportation for household " + householdDto.Name + "..."); _ctf.MakeTransportation(householdDto, dtoCalcLocationDict, chh); } else { Logger.Info("No travel route was set for for household " + householdDto.Name + ", skipping transportation"); } return(chh); } catch { chh?.Dispose(); throw; } }
public void OnlineDeviceActivationProcessorSetToZeroTest() { var rnd = new Random(1); var nr = new NormalRandom(0, 1, rnd); var startdate = new DateTime(2018, 1, 1); var enddate = startdate.AddMinutes(100); var calcParameters = CalcParametersFactory.MakeGoodDefaults().SetStartDate(startdate).SetEndDate(enddate).EnableShowSettlingPeriod(); using (var wd = new WorkingDir(Utili.GetCurrentMethodAndClass())) { wd.InputDataLogger.AddSaver(new ColumnEntryLogger(wd.SqlResultLoggingService)); wd.InputDataLogger.AddSaver(new HouseholdKeyLogger(wd.SqlResultLoggingService)); wd.InputDataLogger.AddSaver(new ResultFileEntryLogger(wd.SqlResultLoggingService)); //calcParameters.Enable(CalcOption.ActionsLogfile); calcParameters.Enable(CalcOption.DeviceProfilesIndividualHouseholds); Config.ExtraUnitTestChecking = true; // calcProfile var profileWith100 = new CalcProfile("calcProfile", Guid.NewGuid().ToStrGuid(), new TimeSpan(0, 1, 0), ProfileType.Absolute, "blub"); profileWith100.AddNewTimepoint(new TimeSpan(0), 100); profileWith100.AddNewTimepoint(new TimeSpan(0, 5, 0), 100); profileWith100.ConvertToTimesteps(); var profileWith50 = new CalcProfile("calcProfile2", Guid.NewGuid().ToStrGuid(), new TimeSpan(0, 1, 0), ProfileType.Absolute, "blub"); profileWith50.AddNewTimepoint(new TimeSpan(0), 50); profileWith50.AddNewTimepoint(new TimeSpan(0, 3, 0), 50); profileWith50.ConvertToTimesteps(); // Loadtype var clt = new CalcLoadType("lt1", "W", "kWh", 1, true, Guid.NewGuid().ToStrGuid()); // Location var cloc = new CalcLocation("Location", Guid.NewGuid().ToStrGuid()); // devices var cdl = new CalcDeviceLoad("lt1", 100, clt, 100, 0); var loads = new List <CalcDeviceLoad>(); var results = new List <string> { "100;0;", "100;0;", "100;0;", "100;0;", "100;0;", "100;0;", "0;50;", "0;50;", "0;50;", "100;0;", "100;0;", "100;0;", "100;0;", "100;0;", "100;0;" }; loads.Add(cdl); using (var fft = new FileFactoryAndTracker(wd.WorkingDirectory, "hh1", wd.InputDataLogger)) { fft.RegisterHousehold(Constants.GeneralHouseholdKey, "general", HouseholdKeyType.General, "desc", null, null); //SqlResultLoggingService srls = new SqlResultLoggingService(Path.Combine(wd.WorkingDirectory,"results.sqlite")); var dsc = new DateStampCreator(calcParameters); using (IOnlineLoggingData old = new OnlineLoggingData(dsc, wd.InputDataLogger, calcParameters)) { { var odap = new OnlineDeviceActivationProcessor(old, calcParameters, fft); using (var calcRepo = new CalcRepo(calcParameters: calcParameters, odap: odap, rnd: rnd, normalRandom: nr)) { var requirements = new List <VariableRequirement>(); var devCatGuid = Guid.NewGuid().ToStrGuid(); var key = new HouseholdKey("HH1"); var cddauto = new CalcDeviceDto("devicename", devCatGuid, key, OefcDeviceType.Device, "device category", " (autonomous)", Guid.NewGuid().ToStrGuid(), cloc.Guid, cloc.Name); var autodev = new CalcAutoDev(profileWith100, clt, loads, 0, 1, cloc, requirements, cddauto, calcRepo); var cdd = new CalcDeviceDto("devicename", devCatGuid, key, OefcDeviceType.Device, "device category", "", Guid.NewGuid().ToStrGuid(), cloc.Guid, cloc.Name); var device = new CalcDevice(loads, cloc, cdd, calcRepo); var autoDevs = new List <CalcAutoDev> { autodev }; var devices = new List <CalcDevice> { device }; CalcHousehold.MatchAutonomousDevicesWithNormalDevices(autoDevs, devices); if (device.MatchingAutoDevs.Count == 0) { throw new LPGException("Matching devices didn't work"); } foreach (var pair in odap.Oefc.ColumnEntriesByLoadTypeByDeviceKey) { Logger.Info(pair.Key.Name); foreach (var entry in pair.Value) { Logger.Info(entry.Key + " - " + entry.Value.Name); } } for (var i = 0; i < 15; i++) { var ts = new TimeStep(i, 0, true); if (!autodev.IsBusyDuringTimespan(ts, 1, 1, clt)) { autodev.Activate(ts); } if (i == 6) { device.SetTimeprofile(profileWith50, ts, clt, "blub", "Person", 1, false); } var filerows = odap.ProcessOneTimestep(ts); filerows.Count.Should().Be(1); filerows[0].EnergyEntries.Count.Should().Be(2); var entries = string.Empty; foreach (var d in filerows[0].EnergyEntries) { entries += d.ToString(CultureInfo.CurrentCulture) + ";"; } Logger.Info(entries); results[i].Should().Be(entries); } } } } } wd.CleanUp(); } }