Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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);
                }

                //}
            }
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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!");
            }
        }
Exemplo n.º 5
0
        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.");
                }
            }
        }
Exemplo n.º 7
0
        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;
            }
        }
Exemplo n.º 9
0
        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();
            }
        }