static HouseCreationAndCalculationJob PrepareHousejob(Simulator sim)
            {
                var hj = new HouseCreationAndCalculationJob();

                hj.CalcSpec                        = JsonCalcSpecification.MakeDefaultsForTesting();
                hj.CalcSpec.StartDate              = new DateTime(2020, 1, 1);
                hj.CalcSpec.EndDate                = new DateTime(2020, 1, 3);
                hj.CalcSpec.DeleteDAT              = false;
                hj.CalcSpec.DefaultForOutputFiles  = OutputFileDefault.Reasonable;
                hj.CalcSpec.DeleteSqlite           = false;
                hj.CalcSpec.ExternalTimeResolution = "00:15:00";
                hj.CalcSpec.EnableTransportation   = true;
                if (hj.CalcSpec.CalcOptions == null)
                {
                    throw new LPGException("calcoptions was null");
                }

                hj.CalcSpec.CalcOptions.Add(CalcOption.TotalsPerLoadtype);
                hj.House            = new HouseData(StrGuid.FromString("houseguid"), "HT01", 1000, 100, "housename");
                hj.House.Households = new List <HouseholdData>();
                var chargingstationSet = sim.ChargingStationSets.FindFirstByName("car electricity", FindMode.Partial);
                var hhd = new HouseholdData("householdid", "householdname", chargingstationSet.GetJsonReference(),
                                            sim.TransportationDeviceSets[0].GetJsonReference(), sim.TravelRouteSets[0].GetJsonReference(), null,
                                            HouseholdDataSpecificationType.ByHouseholdName);
                var hh = sim.ModularHouseholds.FindFirstByName("CHR01", FindMode.StartsWith);

                hhd.HouseholdNameSpec = new HouseholdNameSpecification(hh.GetJsonReference());
                hj.House.Households.Add(hhd);
                return(hj);
            }
        private static JsonCalcSpecification MakeCalcSpec([NotNull] ScenarioSliceParameters parameters, DateTime endtime)
        {
            DateTime      startTime     = new DateTime(parameters.DstYear, 1, 1);
            JsonReference geoloc        = new JsonReference("(Germany) Chemnitz", "eddeb22c-fbd4-44c1-bf2d-fbde3342f1bd");
            JsonReference tempReference = new JsonReference("Berlin, Germany 1996 from Deutscher Wetterdienst DWD (www.dwd.de)",
                                                            "ec337ba6-60a1-404b-9db0-9be52c9e5702");
            JsonCalcSpecification jcs = new JsonCalcSpecification(null,
                                                                  null,
                                                                  false,
                                                                  null,
                                                                  false,
                                                                  endtime,
                                                                  "00:15:00",
                                                                  "00:01:00",
                                                                  geoloc,
                                                                  LoadTypePriority.RecommendedForHouses,
                                                                  null,
                                                                  false,
                                                                  startTime,
                                                                  tempReference,
                                                                  null,
                                                                  null)
            {
                DeleteDAT             = true,
                DefaultForOutputFiles = OutputFileDefault.None, SkipExisting = true
            };

            jcs.CalcOptions.Add(CalcOption.SumProfileExternalIndividualHouseholdsAsJson);
            jcs.LoadtypesForPostprocessing.Add("Electricity");
            jcs.LoadtypesForPostprocessing.Add("Car Charging Electricity");
            jcs.OutputDirectory = "Results";
            jcs.IgnorePreviousActivitiesWhenNeeded = true;
            return(jcs);
        }
        public void ExecuteCalcJob([NotNull] MessageFromServerToClient job, [NotNull] CalcExecutor calcExecutor, [NotNull] RequestSocket client)
        {
            var cdp = new CalcDirectoryPreparer(_mySettings, _logger, _threadId);

            cdp.Run();
            HouseCreationAndCalculationJob hcj = null;

            if (!string.IsNullOrWhiteSpace(job.HouseJobStr))
            {
                hcj = JsonConvert.DeserializeObject <HouseCreationAndCalculationJob>(job.HouseJobStr);
                if (hcj.CalcSpec == null)
                {
                    hcj.CalcSpec = JsonCalcSpecification.MakeDefaultsForProduction();
                }

                hcj.CalcSpec.OutputDirectory = "Results";
                string jsonFileName = Path.Combine(_mySettings.ClientSettings.LPGCalcDirectory, "calcjob.json");
                string correctedJob = JsonConvert.SerializeObject(hcj, Formatting.Indented);
                File.WriteAllText(jsonFileName, correctedJob);
                calcExecutor.Run(hcj);
            }
            else
            {
                _logger.Info("Client #" + _threadId + ": Got a task with an exe, not real, waiting 5s", _threadId);
                Thread.Sleep(5000);
            }

            ReportFinishedCalcJob(job, client, hcj);
        }
        public void TestParallelLaunch()
        {
            WorkingDir wd = new WorkingDir(Utili.GetCurrentMethodAndClass());

            ParallelJsonLauncher.CopyAll(DatabaseSetup.AssemblyDirectory, wd.WorkingDirectory);
            using (DatabaseSetup db = new DatabaseSetup(Utili.GetCurrentMethodAndClass()))
            {
                Logger.Info("Assembly directory: " + DatabaseSetup.AssemblyDirectory);
                Directory.SetCurrentDirectory(wd.WorkingDirectory);
                HouseCreationAndCalculationJob hcj = new HouseCreationAndCalculationJob();
                Simulator             sim          = new Simulator(db.ConnectionString);
                JsonCalcSpecification cspec        = JsonCalcSpecification.MakeDefaultsForTesting();
                cspec.DefaultForOutputFiles = OutputFileDefault.OnlySums;
                cspec.CalcOptions           = new List <CalcOption>();
                cspec.CalcOptions.Add(CalcOption.SumProfileExternalEntireHouse);
                hcj.CalcSpec = cspec;

                MakeSingleHouse(cspec, wd, hcj, sim.Houses[0], "house1");
                MakeSingleHouse(cspec, wd, hcj, sim.Houses[1], "house2");
                var fn = wd.Combine("profilegenerator.db3");
                hcj.PathToDatabase = fn;
                HouseJobSerializer.WriteJsonToFile(wd.Combine("hj2.json"), hcj);
                File.Copy(db.FileName, fn, true);
            }
            ParallelJsonLauncher.ThrowOnInvalidFile = true;
            ParallelJsonLauncher.ParallelJsonLauncherOptions options = new ParallelJsonLauncher.ParallelJsonLauncherOptions();
            options.JsonDirectory = wd.WorkingDirectory;
            ParallelJsonLauncher.LaunchParallel(options);
            //wd.CleanUp(1);
        }
        public static HouseCreationAndCalculationJob PrepareNewHouseForHousetypeTesting(Simulator sim, string guid)
        {
            var hj = new HouseCreationAndCalculationJob();

            hj.CalcSpec                        = JsonCalcSpecification.MakeDefaultsForTesting();
            hj.CalcSpec.StartDate              = new DateTime(2020, 1, 1);
            hj.CalcSpec.EndDate                = new DateTime(2020, 1, 3);
            hj.CalcSpec.DeleteDAT              = false;
            hj.CalcSpec.DefaultForOutputFiles  = OutputFileDefault.NoFiles;
            hj.CalcSpec.DeleteSqlite           = false;
            hj.CalcSpec.ExternalTimeResolution = "00:15:00";
            hj.CalcSpec.EnableTransportation   = false;
            var ht = sim.HouseTypes.FindByGuid(guid.ToStrGuid());

            hj.House            = new HouseData(StrGuid.FromString("houseguid"), ht.HouseTypeCode, 1000, 100, "housename");
            hj.House.Households = new List <HouseholdData>();
            var hhd = new HouseholdData("householdid",
                                        "householdname", sim.ChargingStationSets[0].GetJsonReference(),
                                        sim.TransportationDeviceSets[0].GetJsonReference(),
                                        sim.TravelRouteSets[0].GetJsonReference(), null,
                                        HouseholdDataSpecificationType.ByHouseholdName);
            var hh = sim.ModularHouseholds[0];

            hhd.HouseholdNameSpec = new HouseholdNameSpecification(hh.GetJsonReference());
            hj.House.Households.Add(hhd);
            return(hj);
        }
 public void RunJsonCalculatorTestForExternalTimeResolutionJsonFile()
 {
     Logger.Get().StartCollectingAllMessages();
     using (WorkingDir wd = new WorkingDir(Utili.GetCurrentMethodAndClass()))
     {
         Directory.SetCurrentDirectory(wd.WorkingDirectory);
         using (DatabaseSetup db = new DatabaseSetup(Utili.GetCurrentMethodAndClass()))
         {
             string dbPath = wd.Combine("my.db3");
             File.Copy(db.FileName, dbPath);
             Logger.Info("DB File Path: " + dbPath);
             JsonCalcSpecification jcs = new JsonCalcSpecification();
             if (jcs.CalcOptions == null)
             {
                 throw new LPGException("Calcoptions was null");
             }
             jcs.DefaultForOutputFiles = OutputFileDefault.NoFiles;
             jcs.CalcOptions.Add(CalcOption.SumProfileExternalIndividualHouseholdsAsJson);
             jcs.StartDate = new DateTime(2019, 1, 1);
             jcs.EndDate   = new DateTime(2019, 1, 3);
             jcs.ExternalTimeResolution = "00:15:00";
             jcs.LoadTypePriority       = LoadTypePriority.RecommendedForHouses;
             Simulator      sim = new Simulator(db.ConnectionString);
             JsonCalculator jc  = new JsonCalculator();
             jc.StartHousehold(sim, jcs, sim.Houses[0].GetJsonReference(), null);
         }
         Directory.SetCurrentDirectory(wd.PreviousCurrentDir);
         wd.CleanUp();
     }
 }
        public static HouseCreationAndCalculationJob PrepareExistingHouseForTesting([JetBrains.Annotations.NotNull] House house)
        {
            var hj = new HouseCreationAndCalculationJob();

            hj.CalcSpec            = JsonCalcSpecification.MakeDefaultsForTesting();
            hj.HouseDefinitionType = HouseDefinitionType.HouseName;
            hj.HouseRef            = new HouseReference(house.GetJsonReference());
            return(hj);
        }
        private static void SetCalcSpec([NotNull] HouseCreationAndCalculationJob hj, [NotNull] Simulator sim)
        {
            hj.CalcSpec = JsonCalcSpecification.MakeDefaultsForProduction();
            hj.CalcSpec.OutputDirectory = "Results";
            hj.CalcSpec.CalcOptions     = new List <CalcOption>();
            hj.CalcSpec.CalcOptions.Add(CalcOption.SumProfileExternalIndividualHouseholdsAsJson);
            hj.CalcSpec.DefaultForOutputFiles  = OutputFileDefault.NoFiles;
            hj.CalcSpec.ExternalTimeResolution = "00:15:00";
            hj.CalcSpec.StartDate          = new DateTime(2019, 1, 1);
            hj.CalcSpec.EndDate            = new DateTime(2019, 12, 31);
            hj.CalcSpec.TemperatureProfile = sim.TemperatureProfiles[0].GetJsonReference();
            var geoloc = sim.GeographicLocations.FindFirstByName("Chemnitz", FindMode.Partial) ?? throw new LPGException("Chemnitz not found");

            hj.CalcSpec.GeographicLocation = geoloc.GetJsonReference();
        }
        private static void WriteHousejobsToDirectory([NotNull] string directory,
                                                      [NotNull][ItemNotNull] List <HouseCreationAndCalculationJob> filteredHouses,
                                                      [NotNull] JsonCalcSpecification calcSpec,
                                                      [NotNull] ILogger logger)
        {
            Stopwatch     stopwatch = Stopwatch.StartNew();
            DirectoryInfo subdir    = new DirectoryInfo(directory);

            if (!subdir.Exists)
            {
                subdir.Create();
                Thread.Sleep(250);
            }

            var files = subdir.GetFiles("*.json");

            foreach (var file in files)
            {
                file.Delete();
            }

            int housejobCount = 0;

            foreach (HouseCreationAndCalculationJob houseJob in filteredHouses)
            {
                foreach (var hhj in houseJob.House.Households)
                {
                    if (hhj.HouseholdDataPersonSpecification.Persons.Count == 0)
                    {
                        throw new FlaException("No persons were defined?");
                    }
                }

                houseJob.CalcSpec = calcSpec;
                var filename = Path.Combine(directory, "HouseJob." + houseJob.House.Name + ".json");
                var sw       = new StreamWriter(filename);
                sw.WriteLine(JsonConvert.SerializeObject(houseJob, Formatting.Indented));
                sw.Close();
                housejobCount++;
            }

            stopwatch.Stop();
            logger.Info("wrote " + housejobCount + " house jobs to disc in " + stopwatch.Elapsed.TotalSeconds.ToString("F1") + " seconds",
                        Stage.ProfileGeneration,
                        nameof(HouseProcessor));
        }
        private static void MakeSingleHouse([JetBrains.Annotations.NotNull] JsonCalcSpecification cspec, [JetBrains.Annotations.NotNull] WorkingDir wd, [JetBrains.Annotations.NotNull] HouseCreationAndCalculationJob hcj,
                                            [JetBrains.Annotations.NotNull] House house1, string housename)
        {
            cspec.OutputDirectory = housename;
            if (cspec.OutputDirectory == null)
            {
                throw new LPGException("Output directory was null");
            }
            var dirtodelete = wd.Combine(cspec.OutputDirectory);

            if (Directory.Exists(dirtodelete))
            {
                Directory.Delete(dirtodelete, true);
            }

            hcj.House = house1.MakeHouseData();
            HouseJobSerializer.WriteJsonToFile(wd.Combine(housename + ".json"), hcj);
        }
        public void SaveToDatabaseTest()
        {
            using (var db = new DatabaseSetup(Utili.GetCurrentMethodAndClass()))
            {
                ObservableCollection <TraitTag> traitTags = db.LoadTraitTags();
                var timeprofiles = db.LoadTimeBasedProfiles();
                var realDevices  = db.LoadRealDevices(out var deviceCategories, out var loadtypes, timeprofiles);
                var locations    = db.LoadLocations(realDevices, deviceCategories, loadtypes);
                db.LoadTransportation(locations, out var transportationDeviceSets,
                                      out var travelRouteSets, out var _,
                                      out var _, loadtypes,
                                      out var chargingStationSets);
                db.LoadHouseholdsAndHouses(out var modularHouseholds,
                                           out var houses, out var timeLimits, traitTags,
                                           chargingStationSets, travelRouteSets, transportationDeviceSets);
                var settlements        = new ObservableCollection <Settlement>();
                var geoloc             = db.LoadGeographicLocations(out _, timeLimits);
                var temperaturProfiles = db.LoadTemperatureProfiles();
                Settlement.LoadFromDatabase(settlements, db.ConnectionString, temperaturProfiles, geoloc,
                                            modularHouseholds, houses, false);
                settlements.Clear();
                db.ClearTable(Settlement.TableName);
                db.ClearTable(SettlementHH.TableName);
                JsonCalcSpecification jcs = JsonCalcSpecification.MakeDefaultsForTesting();
                jcs.EnergyIntensityType = EnergyIntensityType.EnergySaving;
                var se = new Settlement("blub", null, "blub",
                                        "fdasdf", "blub", "blub", "asdf", db.ConnectionString, geoloc[0], temperaturProfiles[0], "Testing",
                                        CreationType.ManuallyCreated, Guid.NewGuid().ToStrGuid(), jcs);
                se.SaveToDB();

                se.AddHousehold(modularHouseholds[0], 10);
                Settlement.LoadFromDatabase(settlements, db.ConnectionString, temperaturProfiles, geoloc,
                                            modularHouseholds, houses, false);
                (settlements.Count).Should().Be(1);
                (settlements[0].Households.Count).Should().Be(1);
                (geoloc[0]).Should().Be(settlements[0].GeographicLocation);
                (temperaturProfiles[0]).Should().Be(settlements[0].TemperatureProfile);
                (EnergyIntensityType.EnergySaving).Should().Be(settlements[0].EnergyIntensityType);
                db.Cleanup();
            }
        }
        public static HouseCreationAndCalculationJob PrepareNewHouseForOutputFileTesting(Simulator sim)
        {
            var hj = new HouseCreationAndCalculationJob();

            hj.CalcSpec                        = JsonCalcSpecification.MakeDefaultsForTesting();
            hj.CalcSpec.StartDate              = new DateTime(2020, 1, 1);
            hj.CalcSpec.EndDate                = new DateTime(2020, 1, 3);
            hj.CalcSpec.DeleteDAT              = false;
            hj.CalcSpec.DefaultForOutputFiles  = OutputFileDefault.NoFiles;
            hj.CalcSpec.DeleteSqlite           = false;
            hj.CalcSpec.ExternalTimeResolution = "00:15:00";
            hj.House            = new HouseData(StrGuid.FromString("houseguid"), "HT01", 1000, 100, "housename");
            hj.House.Households = new List <HouseholdData>();
            var hhd = new HouseholdData("householdid",
                                        "householdname", null, null, null, null,
                                        HouseholdDataSpecificationType.ByHouseholdName);
            var hh = sim.ModularHouseholds.FindFirstByName("CHR01", FindMode.StartsWith);

            hhd.HouseholdNameSpec = new HouseholdNameSpecification(hh.GetJsonReference());
            hj.House.Households.Add(hhd);
            return(hj);
        }
        /*
         * public bool Calculate([NotNull] JsonDirectoryOptions calcDirectoryOptions)
         * {
         *  _calculationProfiler.StartPart(Utili.GetCurrentMethodAndClass());
         *  string jsonFileName = calcDirectoryOptions.Input;
         *  if (jsonFileName == null) {
         *      Logger.Error("No file was set.");
         *      return false;
         *  }
         *
         *  var fi = new FileInfo(jsonFileName);
         *  if (!fi.Exists) {
         *      Logger.Error("File not found: " + fi.FullName);
         *  }
         *
         *  string jsonContent = File.ReadAllText(fi.FullName);
         *  JsonCalcSpecification jcs = JsonConvert.DeserializeObject<JsonCalcSpecification>(jsonContent);
         *
         *
         *  if (!CheckBasicSettingsForLoadingDatabase(jcs)) {
         *      Logger.Error("Could not load the database ");
         *      return false;
         *  }
         *
         *  //Logger.Info("Using the following configuration: \n" + JsonConvert.SerializeObject(jcs,Formatting.Indented)  );
         *  var myConnectionString = "Data Source=" + jcs.PathToDatabase;
         *  string targetDirectory = jcs.OutputDirectory;
         *  if (string.IsNullOrWhiteSpace(targetDirectory)) {
         *      targetDirectory = Directory.GetCurrentDirectory();
         *  }
         *
         *  if (!Directory.Exists(targetDirectory)) {
         *      Directory.CreateDirectory(targetDirectory);
         *      Thread.Sleep(500);
         *  }
         *
         *  //Logger.LogFilePath = Path.Combine(targetDirectory, "mylog.txt");
         *  //Logger.LogToFile = true;
         *  //Config.ResetLogfileAtCalculationStart = false;
         *  Logger.Info("Loading...");
         *  var sim = new Simulator(myConnectionString);
         *  Logger.Info("Loading finished.");
         *  if (!CheckSimulator(jcs, sim)) {
         *      Logger.Error("Due to incorrect settings, calculation can not start.");
         *      return false;
         *  }
         *
         *  StartHousehold(sim, jcs);
         *  _calculationProfiler.StopPart(Utili.GetCurrentMethodAndClass());
         *  return true;
         * }*/

        //public bool CheckBasicSettingsForLoadingDatabase([NotNull] JsonCalcSpecification jcs)
        //{
        //    if (!string.IsNullOrWhiteSpace(jcs.PathToDatabase)) {
        //        var fi = new FileInfo(jcs.PathToDatabase);
        //        if (!fi.Exists) {
        //            throw new LPGException("Database was not found. Path supplied:" + fi.FullName);
        //        }
        //    }
        //    return true;
        //}

        public bool CheckSimulator([NotNull] JsonCalcSpecification jcs, [NotNull] Simulator sim)
        {
            if (jcs.TemperatureProfile == null)
            {
                jcs.TemperatureProfile = sim.TemperatureProfiles[0].GetJsonReference();
            }

            if (jcs.GeographicLocation == null)
            {
                jcs.GeographicLocation = sim.GeographicLocations[0].GetJsonReference();
            }
            if (jcs.StartDate == null)
            {
                jcs.StartDate = new DateTime(DateTime.Now.Year, 1, 1);
            }

            if (jcs.EndDate == null)
            {
                jcs.EndDate = new DateTime(DateTime.Now.Year, 12, 31);
            }
            //jcs.LoadTypePriorityEnum = GetLoadtypePriority(jcs.LoadTypePriority,calcObject);

            return(true);
        }
        private static GeographicLocation FindGeographicLocation([NotNull] Simulator sim, [NotNull] JsonCalcSpecification calcSpecification)
        {
            GeographicLocation geoloc = sim.GeographicLocations[0];

            if (calcSpecification.GeographicLocation != null)
            {
                geoloc = sim.GeographicLocations.FindByJsonReference(calcSpecification.GeographicLocation);
            }

            return(geoloc);
        }
        private static TemperatureProfile FindTemperatureProfile([NotNull] Simulator sim, [NotNull] JsonCalcSpecification calcSpecification)
        {
            TemperatureProfile temperatureProfile = sim.TemperatureProfiles[0];

            if (calcSpecification.TemperatureProfile != null)
            {
                temperatureProfile = sim.TemperatureProfiles.FindByJsonReference(calcSpecification.TemperatureProfile);
            }

            return(temperatureProfile);
        }
        public static void CreateExampleHouseJob([NotNull] string connectionString)
        {
            const string  relativePathHousejobs = "Example\\HouseJobs";
            DirectoryInfo diHouseJobs           = new DirectoryInfo(relativePathHousejobs);

            if (!diHouseJobs.Exists)
            {
                diHouseJobs.Create();
            }
            const string  relativePathGuids = "Example\\GuidLists";
            DirectoryInfo diGuids           = new DirectoryInfo(relativePathGuids);

            if (!diGuids.Exists)
            {
                diGuids.Create();
            }

            Simulator sim        = new Simulator(connectionString);
            HouseData houseData1 = new HouseData(Guid.NewGuid().ToStrGuid(), "HT01", 20000, 10000, "MyFirstHouse");

            HouseholdData hhd1 = new HouseholdData(Guid.NewGuid().ToString(), "My First Household, template randomly chosen based on persons", null, null,
                                                   null, new List <TransportationDistanceModifier>(), HouseholdDataSpecificationType.ByPersons);
            HouseholdDataPersonSpecification personSpec = new HouseholdDataPersonSpecification(new List <PersonData>()
            {
                new PersonData(25, Gender.Male)
            });

            hhd1.HouseholdDataPersonSpec = personSpec;
            houseData1.Households.Add(hhd1);
            HouseholdData hhd2 = new HouseholdData(Guid.NewGuid().ToString(),
                                                   "My Second Household (with transportation, template defined by name )",
                                                   sim.ChargingStationSets[0].GetJsonReference(),
                                                   sim.TransportationDeviceSets[0].GetJsonReference(),
                                                   sim.TravelRouteSets[0].GetJsonReference(),
                                                   null, HouseholdDataSpecificationType.ByTemplateName);

            hhd2.HouseholdTemplateSpec = new HouseholdTemplateSpecification("CHR01");
            houseData1.Households.Add(hhd2);
            HouseData     houseData2 = new HouseData(Guid.NewGuid().ToStrGuid(), "HT02", 20000, 10000, "MySecondHouse");
            HouseholdData hhd3       = new HouseholdData(Guid.NewGuid().ToString(),
                                                         "My Third Household, using predefined household",
                                                         null, null, null, null, HouseholdDataSpecificationType.ByHouseholdName);

            hhd3.HouseholdNameSpec = new HouseholdNameSpecification(sim.ModularHouseholds[0].GetJsonReference());
            houseData2.Households.Add(hhd3);
            HouseholdData hhd4 = new HouseholdData(Guid.NewGuid().ToString(), "My Fourth Household", null, null, null, null, HouseholdDataSpecificationType.ByPersons);

            hhd4.HouseholdDataPersonSpec = new HouseholdDataPersonSpecification(new List <PersonData>()
            {
                new PersonData(75, Gender.Male),
                new PersonData(74, Gender.Female)
            });
            houseData2.Households.Add(hhd4);
            var calculationSettings = new JsonCalcSpecification {
                StartDate             = new DateTime(2019, 1, 1),
                EndDate               = new DateTime(2019, 1, 3),
                DeleteDAT             = true,
                DefaultForOutputFiles = OutputFileDefault.OnlySums
            };

            if (calculationSettings.CalcOptions == null)
            {
                throw new LPGException("error");
            }

            calculationSettings.CalcOptions.Add(CalcOption.HouseSumProfilesFromDetailedDats);
            //calculationSettings.CalcOptions.Add(CalcOption.OverallSum.ToString());
            calculationSettings.CalcOptions.Add(CalcOption.SumProfileExternalEntireHouse);
            calculationSettings.CalcOptions.Add(CalcOption.SumProfileExternalIndividualHouseholds);
            calculationSettings.LoadtypesForPostprocessing?.Add("Electricity");
            calculationSettings.CalculationName        = "My Comment";
            calculationSettings.ExternalTimeResolution = "00:15:00";
            calculationSettings.InternalTimeResolution = "00:01:00";
            calculationSettings.LoadTypePriority       = LoadTypePriority.RecommendedForHouses;
            calculationSettings.TemperatureProfile     = sim.TemperatureProfiles[0].GetJsonReference();
            calculationSettings.GeographicLocation     = sim.GeographicLocations[0].GetJsonReference();
            Logger.Info("--------");
            Logger.Info("Writing example file and additional data file that you might need.");
            HouseCreationAndCalculationJob hj = new HouseCreationAndCalculationJob("scenario", "year", "districtname", HouseDefinitionType.HouseData);

            hj.House    = houseData1;
            hj.CalcSpec = calculationSettings;
            hj.CalcSpec.OutputDirectory = "Example1-Results";
            HouseJobSerializer.WriteJsonToFile(Path.Combine(diHouseJobs.FullName, "ExampleHouseJob-1.json"), hj);
            hj.House = houseData2;
            hj.CalcSpec.OutputDirectory = "Example2-Results";
            HouseJobSerializer.WriteJsonToFile(Path.Combine(diHouseJobs.FullName, "ExampleHouseJob-2.json"), hj);
            Logger.Info("Finished writing example house jobs...");
            WriteGuidList("GuidsForAllHouseholds.csv", sim.ModularHouseholds.It.Select(x => (DBBase)x).ToList(), diGuids);
            WriteGuidList("GuidsForAllHouses.csv", sim.Houses.It.Select(x => (DBBase)x).ToList(), diGuids);
            WriteGuidList("GuidsForAllChargingStationSets.csv", sim.ChargingStationSets.It.Select(x => (DBBase)x).ToList(), diGuids);
            WriteGuidList("GuidsForAllDeviceSelections.csv", sim.DeviceSelections.It.Select(x => (DBBase)x).ToList(), diGuids);
            WriteGuidList("GuidsForAllGeographicLocations.csv", sim.GeographicLocations.It.Select(x => (DBBase)x).ToList(), diGuids);
            WriteGuidList("GuidsForAllTemperatureProfiles.csv", sim.TemperatureProfiles.It.Select(x => (DBBase)x).ToList(), diGuids);
            WriteGuidList("GuidsForAllTransportationDeviceSets.csv", sim.TransportationDeviceSets.It.Select(x => (DBBase)x).ToList(), diGuids);
            WriteGuidList("GuidsForAllTravelRouteSets.csv", sim.TravelRouteSets.It.Select(x => (DBBase)x).ToList(), diGuids);
        }
        public void StartHousehold([NotNull] Simulator sim, [NotNull] JsonCalcSpecification jcs, [NotNull] JsonReference calcObjectReference, [CanBeNull] Action <CalculationProfiler, string> makeAllCharts)
        {
            if (!CheckSimulator(jcs, sim))
            {
                throw new LPGPBadParameterException("Invalid simulation state");
            }

            var calcObject = GetCalcObject(sim, calcObjectReference);

            if (jcs.OutputDirectory == null)
            {
                jcs.OutputDirectory = AutomationUtili.CleanFileName(calcObject.Name) + " - " + calcObject;
            }
            _calculationProfiler.StartPart(Utili.GetCurrentMethodAndClass());
            if (calcObjectReference == null)
            {
                throw new LPGException("No calculation object was selected.");
            }
            var calculationStartTime = DateTime.Now;

            if (calcObject == null)
            {
                throw new LPGException("Could not find the Calc Object with the guid " + calcObjectReference.Guid);
            }

            var generalResultsDirectory = new DirectoryInfo(jcs.OutputDirectory ?? throw new LPGException("Output directory was null."));
            var finishedFile            = Path.Combine(generalResultsDirectory.FullName, Constants.FinishedFileFlag);

            if (Directory.Exists(generalResultsDirectory.FullName))
            {
                if (jcs.SkipExisting)
                {
                    if (File.Exists(finishedFile))
                    {
                        Logger.Error("Directory already exists and calculation is finished. Exiting.");
                        _calculationProfiler.StopPart(Utili.GetCurrentMethodAndClass());
                        return;
                    }
                }

                Logger.Warning("Directory already exists, but calculation is not finished or skip existing is not specified. Deleting folder.");
                var files = generalResultsDirectory.GetFiles();
                foreach (FileInfo file in files)
                {
                    if (file.Name.StartsWith("Log.", StringComparison.OrdinalIgnoreCase))
                    {
                        continue;
                    }
                    if (file.Name.EndsWith(".db3", StringComparison.OrdinalIgnoreCase))
                    {
                        continue;
                    }
                    file.Delete();
                }

                var directories = generalResultsDirectory.GetDirectories();
                foreach (DirectoryInfo info in directories)
                {
                    info.Delete(true);
                }

                Thread.Sleep(1000);
            }

            generalResultsDirectory.Create();
            Thread.Sleep(500);
            Logger.SetLogFilePath(Path.Combine(generalResultsDirectory.FullName, "Log.CommandlineCalculation.txt"));
            Logger.LogToFile = true;
            Logger.Get().FlushExistingMessages();
            Logger.Info("---------------------------");
            Logger.Info("Used calculation specification:");
            Logger.Info(JsonConvert.SerializeObject(jcs, Formatting.Indented), true);
            Logger.Info("---------------------------");
            Logger.Info("Directory: " + generalResultsDirectory.FullName);
            sim.MyGeneralConfig.StartDateUIString      = jcs.StartDate.ToString();
            sim.MyGeneralConfig.EndDateUIString        = jcs.EndDate.ToString();
            sim.MyGeneralConfig.InternalTimeResolution = "00:01:00";
            sim.MyGeneralConfig.DestinationPath        = generalResultsDirectory.FullName;
            sim.MyGeneralConfig.ApplyOptionDefault(jcs.DefaultForOutputFiles);
            if (jcs.CalcOptions != null)
            {
                foreach (var option in jcs.CalcOptions)
                {
                    //var option = option;

                    /*if (option == null) {
                     *  throw  new LPGException("Could not identify Calc Option " + option + ". Stopping.");
                     * }*/
                    Logger.Info("Enabling option " + option);
                    sim.MyGeneralConfig.Enable(option);
                }
            }

            if (jcs.DeleteDAT)
            {
                sim.MyGeneralConfig.DeleteDatFiles = "TRUE";
            }
            else
            {
                sim.MyGeneralConfig.DeleteDatFiles = "FALSE";
            }

            if (jcs.ExternalTimeResolution == null)
            {
                sim.MyGeneralConfig.ExternalTimeResolution = sim.MyGeneralConfig.InternalTimeResolution;
            }
            else
            {
                sim.MyGeneralConfig.ExternalTimeResolution = jcs.ExternalTimeResolution;
            }

            sim.MyGeneralConfig.RandomSeed = jcs.RandomSeed;
            var eit = jcs.EnergyIntensityType;

            if (eit == EnergyIntensityType.AsOriginal)
            {
                eit = calcObject.EnergyIntensityType;
            }

            var cs = new CalcStarter(sim);
            var temperatureProfile = sim.TemperatureProfiles.FindByJsonReference(jcs.TemperatureProfile);

            if (temperatureProfile == null)
            {
                throw new LPGException("Temperature Profile not found.");
            }

            if (jcs.GeographicLocation == null)
            {
                throw new LPGPBadParameterException("No geographic location was set in the calculation request");
            }
            var geographicLocation = sim.GeographicLocations.FindByJsonReference(jcs.GeographicLocation);

            if (geographicLocation == null)
            {
                throw new LPGException("Geographic location not found.");
            }


            DeviceSelection deviceSelection = null;

            if (jcs.DeviceSelection != null)
            {
                deviceSelection = sim.DeviceSelections.FindByJsonReference(jcs.DeviceSelection);
                if (deviceSelection == null)
                {
                    throw new LPGException("Unknown device selection \"" + jcs.DeviceSelection.Guid + "\"");
                }
            }



            if (jcs.EnableTransportation)
            {
            }

            if (jcs.LoadTypePriority == LoadTypePriority.Undefined)
            {
                if (calcObject.CalcObjectType == CalcObjectType.ModularHousehold)
                {
                    jcs.LoadTypePriority = LoadTypePriority.RecommendedForHouseholds;
                }
                else
                {
                    jcs.LoadTypePriority = LoadTypePriority.RecommendedForHouses;
                }
            }

            var options = sim.MyGeneralConfig.AllEnabledOptions();
            //options.Add(CalcOption.OverallDats);
            var calcStartParameterSet = new CalcStartParameterSet(ReportFinishFuncForHouseAndSettlement,
                                                                  ReportFinishFuncForHousehold,
                                                                  OpenTabFunc,
                                                                  null,
                                                                  geographicLocation,
                                                                  temperatureProfile,
                                                                  calcObject,
                                                                  eit,
                                                                  ReportCancelFunc,
                                                                  false,
                                                                  deviceSelection,
                                                                  jcs.LoadTypePriority,
                                                                  null,
                                                                  null,
                                                                  options,
                                                                  sim.MyGeneralConfig.StartDateDateTime,
                                                                  sim.MyGeneralConfig.EndDateDateTime,
                                                                  sim.MyGeneralConfig.InternalStepSize,
                                                                  sim.MyGeneralConfig.CSVCharacter,
                                                                  jcs.RandomSeed,
                                                                  sim.MyGeneralConfig.ExternalStepSize,
                                                                  sim.MyGeneralConfig.DeleteDatFilesBool,
                                                                  sim.MyGeneralConfig.WriteExcelColumnBool,
                                                                  sim.MyGeneralConfig.ShowSettlingPeriodBool,
                                                                  3,
                                                                  sim.MyGeneralConfig.RepetitionCount,
                                                                  _calculationProfiler,
                                                                  null,
                                                                  jcs.LoadtypesForPostprocessing,
                                                                  sim.MyGeneralConfig.DeviceProfileHeaderMode,
                                                                  jcs.IgnorePreviousActivitiesWhenNeeded, jcs.OutputDirectory, jcs.EnableTransportation);

            calcStartParameterSet.PreserveLogfileWhileClearingFolder = true;
            cs.Start(calcStartParameterSet);
            if (jcs.CalcOptions != null && jcs.CalcOptions.Contains(CalcOption.CalculationFlameChart))
            {
                string targetfile = Path.Combine(generalResultsDirectory.FullName, Constants.CalculationProfilerJson);
                using (StreamWriter sw = new StreamWriter(targetfile))
                {
                    _calculationProfiler.WriteJson(sw);
                }
            }
            _calculationProfiler.StopPart(Utili.GetCurrentMethodAndClass());
            if (makeAllCharts != null)
            {
                makeAllCharts(_calculationProfiler, calcStartParameterSet.ResultPath);
            }

            var duration = DateTime.Now - calculationStartTime;

            if (jcs.DeleteAllButPDF)
            {
                var allFileInfos = generalResultsDirectory.GetFiles("*.*", SearchOption.AllDirectories);
                foreach (var fi in allFileInfos)
                {
                    if (fi.Name.ToUpperInvariant().EndsWith(".PDF", StringComparison.Ordinal))
                    {
                        continue;
                    }

                    if (fi.Name.ToUpperInvariant().StartsWith("SUMPROFILES.", StringComparison.Ordinal))
                    {
                        continue;
                    }

                    if (fi.Name.ToUpperInvariant().StartsWith("HOUSEHOLDNAME.", StringComparison.Ordinal))
                    {
                        continue;
                    }

                    fi.Delete();
                }
            }

            if (jcs.DeleteSqlite)
            {
                var allFileInfos = generalResultsDirectory.GetFiles("*.sqlite", SearchOption.AllDirectories);
                GC.Collect();
                GC.WaitForPendingFinalizers();
                foreach (var fi in allFileInfos)
                {
                    try {
                        fi.Delete();
                    }
                    catch (Exception ex) {
                        Logger.Exception(ex);
                    }
                }
            }

            Logger.ImportantInfo("Calculation duration:" + duration);

            //cleanup empty directories
            var subdirs = generalResultsDirectory.GetDirectories();

            foreach (var subdir in subdirs)
            {
                var files      = subdir.GetFiles();
                var subsubdirs = subdir.GetDirectories();
                if (files.Length == 0 && subsubdirs.Length == 0)
                {
                    subdir.Delete();
                }
            }

            using (var sw = new StreamWriter(finishedFile)) {
                sw.WriteLine("Finished at " + DateTime.Now);
                sw.WriteLine("Duration in seconds:");
                sw.WriteLine(duration.TotalSeconds);
            }
        }
        public void OnlyExternalTest()
        {
            Logger.Get().StartCollectingAllMessages();
            Logger.Info(Utili.GetCurrentAssemblyVersion());
            Config.SkipFreeSpaceCheckForCalculation = true;
            using (WorkingDir wd = new WorkingDir(Utili.GetCurrentMethodAndClass()))
            {
                DirectoryInfo simengine = new DirectoryInfo(@"V:\Dropbox\LPG\SimulationEngine\bin\Debug\net472");
                foreach (FileInfo srcFile in simengine.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    string relative = srcFile.FullName.Substring(simengine.FullName.Length);
                    while (relative.StartsWith("\\"))
                    {
                        relative = relative.Substring(1);
                    }

                    string   dstPath = Path.Combine(wd.WorkingDirectory, relative);
                    FileInfo dstFile = new FileInfo(dstPath);
                    if (dstFile.Directory != null && !(dstFile.Directory.Exists))
                    {
                        dstFile.Directory.Create();
                    }
                    srcFile.CopyTo(dstPath);
                }
                Directory.SetCurrentDirectory(wd.WorkingDirectory);
                using (DatabaseSetup db = new DatabaseSetup(Utili.GetCurrentMethodAndClass()))
                {
                    Simulator sim   = new Simulator(db.ConnectionString);
                    var       house = sim.Houses.FindFirstByName("CHR07 in HT04 with Car, 05 km to work, 3.7 kW Charging at home");
                    if (house == null)
                    {
                        throw new LPGException("house not found");
                    }

                    JsonCalcSpecification jcs = JsonCalcSpecification.MakeDefaultsForTesting();
                    jcs.OutputDirectory = Path.Combine(wd.WorkingDirectory, "Results");
                    jcs.DeleteSqlite    = true;
                    jcs.StartDate       = new DateTime(2019, 1, 1);
                    jcs.EndDate         = new DateTime(2019, 1, 7);
                    if (jcs.LoadtypesForPostprocessing == null)
                    {
                        jcs.LoadtypesForPostprocessing = new List <string>();
                    }
                    jcs.LoadtypesForPostprocessing.Add("Electricity");

                    jcs.DefaultForOutputFiles = OutputFileDefault.NoFiles;
                    if (jcs.CalcOptions == null)
                    {
                        jcs.CalcOptions = new List <CalcOption>();
                    }
                    jcs.CalcOptions.Add(CalcOption.SumProfileExternalEntireHouse);

                    JsonCalculator jc = new JsonCalculator();
                    jc.StartHousehold(sim, jcs, house.GetJsonReference(), null);
                    const string sqliteanalyizer = @"v:\dropbox\lpg\sqlite3_analyzer.exe";
                    if (File.Exists(sqliteanalyizer))
                    {
                        StreamWriter  sw       = new StreamWriter(Path.Combine(jcs.OutputDirectory, "analyzesqlite.cmd"));
                        DirectoryInfo resultDi = new DirectoryInfo(jcs.OutputDirectory);
                        var           fis      = resultDi.GetFiles("*.sqlite");
                        foreach (var fi in fis)
                        {
                            sw.WriteLine(sqliteanalyizer + " \"" + fi.FullName + "\" > " + fi.Name + ".analysis.txt");
                        }
                        sw.Close();
                    }
                    else
                    {
                        throw new LPGException("analyzer not found");
                    }
                }
            }
            // db.Cleanup();
        }