/// <summary> /// Read the configuration of a simple RCQueues model from CSV files /// </summary> /// <param name="dir">The directory of CSV files, i.e., Resource.csv and Activities.csv</param> public static Statics ReadFromCSVs(string dir) { var simpleRCQs = new Statics(); #region Read Resources foreach (var r in ReadDataDictFromCSV(string.Format("{0}\\{1}.csv", dir, Key.Resources))) { simpleRCQs.AddResource(r[Key.Id], Convert.ToDouble(r[Key.Capacity]), r[Key.Description]); } #endregion #region Read Activities var data_activities = ReadDataDictFromCSV(string.Format("{0}\\{1}.csv", dir, Key.Activities)); foreach (var r in data_activities) { #region Get range of batch size int? minBatchSize = null, maxBatchSize = null; BatchSizeRange batchSizeRange = new BatchSizeRange(); if (r.ContainsKey(Key.BatchSize_Min) && r[Key.BatchSize_Min] != null && r[Key.BatchSize_Min].Length > 0) { minBatchSize = int.Parse(r[Key.BatchSize_Min]); } if (r.ContainsKey(Key.BatchSize_Max) && r[Key.BatchSize_Max] != null && r[Key.BatchSize_Max].Length > 0) { maxBatchSize = int.Parse(r[Key.BatchSize_Max]); } if (minBatchSize != null && maxBatchSize != null) { batchSizeRange = new BatchSizeRange(minBatchSize.Value, maxBatchSize.Value); } else if (minBatchSize != null) { batchSizeRange = new BatchSizeRange(minBatchSize.Value, int.MaxValue); } else if (maxBatchSize != null) { batchSizeRange = new BatchSizeRange(1, maxBatchSize.Value); } #endregion simpleRCQs.AddActivity( id: r[Key.Id], duration: rs => TimeSpan.FromMinutes( Gamma.Sample(rs, Convert.ToDouble(r[Key.Duration_MeanInMinutes]), Convert.ToDouble(r[Key.Duration_CV]))), batchSizeRange: batchSizeRange, requirements: r[Key.Requirements].Split(';').Where(str => str.Length > 0).Select(str => { var splits = str.Split(':'); return(splits[0], splits.Length > 1 ? Convert.ToDouble(splits[1]) : 1.0); }).ToList(), description: r[Key.Description] ); } foreach (var r in data_activities) { if (r[Key.Succeedings].Length > 0) { foreach (var succStr in r[Key.Succeedings].Split(';')) { var splits = succStr.Split(':'); if (splits.Length > 1) { simpleRCQs.AddSucceeding(r[Key.Id], splits[1], Convert.ToDouble(splits[0])); } else { simpleRCQs.AddSucceeding(r[Key.Id], splits[0], 1); } } } } #endregion #region Read Arrivals foreach (var r in File.ReadAllLines(string.Format("{0}\\{1}.csv", dir, Key.Arrivals))) { var line = r.Split(',').Where(s => s != null && s.Length > 0).ToList(); switch (line[0]) { case Key.MeanHourlyRate: simpleRCQs.Generator.MeanHourlyRate = double.Parse(line[1]); break; case Key.SeasonalFactors_HoursOfDay: simpleRCQs.Generator.SeasonalFactors_HoursOfDay = line.GetRange(1, line.Count - 1) .Select(str => double.Parse(str)).ToList(); break; case Key.SeasonalFactors_DaysOfWeek: simpleRCQs.Generator.SeasonalFactors_DaysOfWeek = line.GetRange(1, line.Count - 1) .Select(str => double.Parse(str)).ToList(); break; case Key.SeasonalFactors_DaysOfMonth: simpleRCQs.Generator.SeasonalFactors_DaysOfMonth = line.GetRange(1, line.Count - 1) .Select(str => double.Parse(str)).ToList(); break; case Key.SeasonalFactors_MonthsOfYear: simpleRCQs.Generator.SeasonalFactors_MonthsOfYear = line.GetRange(1, line.Count - 1) .Select(str => double.Parse(str)).ToList(); break; case Key.SeasonalFactors_Years: simpleRCQs.Generator.SeasonalFactors_Years = line.GetRange(1, line.Count - 1) .Select(str => double.Parse(str)).ToList(); break; } } #endregion return(simpleRCQs); }