public static void Save(Madingley.Common.FunctionalGroupDefinitions c, string filename) { var definitionHeaders = c.Definitions.Select(k => String.Format("DEFINITION_{0}", k)); var propertyHeaders = c.Properties.Select(k => String.Format("PROPERTY_{0}", k)); var cohortRows = c.Data.Select(data => { var definitionsElements = c.Definitions.Select(definition => data.Definitions.ContainsKey(definition) ? data.Definitions[definition] : ""); var propertyElements = c.Properties.Select(property => data.Properties.ContainsKey(property) ? data.Properties[property].ToString("G17") : ""); var allElements = definitionsElements.Concat(propertyElements); return(System.String.Join(",", allElements)); }); var allHeaders = definitionHeaders.Concat(propertyHeaders); var header = System.String.Join(",", allHeaders); using (var writer = new StreamWriter(filename)) { writer.WriteLine(header); cohortRows.ToList().ForEach(line => writer.WriteLine(line)); } }
public static FunctionalGroupDefinitions ConvertFunctionalGroupDefinitions(Madingley.Common.FunctionalGroupDefinitions data) { // Initialise the lists var length = data.Data.Count(); var IndexLookupFromTrait = new SortedDictionary <string, SortedDictionary <string, int[]> >(); var FunctionalGroupProperties = new SortedList <string, double[]>(); var TraitLookupFromIndex = new SortedDictionary <string, string[]>(); var AllFunctionalGroupsIndex = new int[length]; // Loop over columns in the functional group definitions file foreach (var traitName in data.Definitions) { var traitValues = data.Data.Select(d => d.Definitions.First(kv => kv.Key == traitName).Value).ToArray(); // Declare a sorted dictionary to hold the index values for each unique trait value SortedDictionary <string, int[]> TraitIndexValuesList = new SortedDictionary <string, int[]>(); // Create a string array with the values of this trait for (int nn = 0; nn < length; nn++) { // Add the functional group index to the list of all indices AllFunctionalGroupsIndex[nn] = nn; } // Add the trait values to the trait-value lookup list TraitLookupFromIndex.Add(traitName, traitValues); // Get the unique values for this trait var DistinctValues = traitValues.Distinct().ToArray(); //Loop over the unique values for this trait and list all the functional group indices with the value foreach (string DistinctTraitValue in DistinctValues.ToArray()) { List <int> FunctionalGroupIndex = new List <int>(); //Loop over the string array associated with this trait and add the index values of matching string to a list for (int kk = 0; kk < traitValues.Length; kk++) { if (traitValues[kk].Equals(DistinctTraitValue)) { FunctionalGroupIndex.Add(kk); } } //Add the unique trait value and the functional group indices to the temporary list TraitIndexValuesList.Add(DistinctTraitValue, FunctionalGroupIndex.ToArray()); } // Add the unique trait values and corresponding functional group indices to the functional group index lookup IndexLookupFromTrait.Add(traitName, TraitIndexValuesList); } // For functional group properties foreach (var traitName in data.Properties) { var traitValues = data.Data.Select(d => d.Properties.First(kv => kv.Key == traitName).Value).ToArray(); // Get the values for this property double[] TempDouble = new double[length]; for (int nn = 0; nn < length; nn++) { TempDouble[nn] = Convert.ToDouble(traitValues.GetValue(nn)); } // Add the values to the list of functional group properties FunctionalGroupProperties.Add(traitName, TempDouble); } return(new FunctionalGroupDefinitions( IndexLookupFromTrait, FunctionalGroupProperties, TraitLookupFromIndex, AllFunctionalGroupsIndex)); }
public static Madingley.Common.Configuration Deserialize(TextReader sr) { Func <Newtonsoft.Json.JsonTextReader, Madingley.Common.FunctionalGroupDefinition> JsonReadFunctionalGroupDefinition = (reader) => { var ret = new Madingley.Common.FunctionalGroupDefinition(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "Definitions": ret.Definitions = Common.Reader.ReadKeyValuePairs(reader, Common.Reader.ReadString); break; case "Properties": ret.Properties = Common.Reader.ReadKeyValuePairs(reader, Common.Reader.ReadDouble); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return(ret); }; Func <Newtonsoft.Json.JsonTextReader, Madingley.Common.FunctionalGroupDefinitions> JsonReadFunctionalGroupDefinitions = (reader) => { var ret = new Madingley.Common.FunctionalGroupDefinitions(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "Data": ret.Data = Common.Reader.ReadArray(reader, JsonReadFunctionalGroupDefinition); break; case "Definitions": ret.Definitions = Common.Reader.ReadArray(reader, Common.Reader.ReadString); break; case "Properties": ret.Properties = Common.Reader.ReadArray(reader, Common.Reader.ReadString); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return(ret); }; Func <Newtonsoft.Json.JsonTextReader, Madingley.Common.ScenarioParameter> JsonReadScenarioParameter = (reader) => { var ret = new Madingley.Common.ScenarioParameter(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "ParamString": ret.ParamString = Common.Reader.ReadString(reader); break; case "ParamDouble1": ret.ParamDouble1 = Common.Reader.ReadDouble(reader); break; case "ParamDouble2": ret.ParamDouble2 = Common.Reader.ReadDouble(reader); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return(ret); }; Func <Newtonsoft.Json.JsonTextReader, IDictionary <string, Madingley.Common.ScenarioParameter> > JsonReadKVPScenarioParameter = (reader) => { var ret = new Dictionary <string, Madingley.Common.ScenarioParameter>(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var key = Convert.ToString(reader.Value); reader.Read(); var value = JsonReadScenarioParameter(reader); ret.Add(key, value); } return(ret); }; Func <Newtonsoft.Json.JsonTextReader, Madingley.Common.ScenarioParameters> JsonReadScenarioParameters = (reader) => { var ret = new Madingley.Common.ScenarioParameters(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "Label": ret.Label = Common.Reader.ReadString(reader); break; case "SimulationNumber": ret.SimulationNumber = Common.Reader.ReadInt(reader); break; case "Parameters": ret.Parameters = JsonReadKVPScenarioParameter(reader); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return(ret); }; Func <Newtonsoft.Json.JsonTextReader, Madingley.Common.EcologicalParameters> JsonReadEcologicalParameters = (reader) => { var ret = new Madingley.Common.EcologicalParameters(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "Parameters": ret.Parameters = Common.Reader.ReadKeyValuePairs(reader, Common.Reader.ReadDouble); break; case "TimeUnits": ret.TimeUnits = Common.Reader.ReadArray(reader, Common.Reader.ReadString); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return(ret); }; var configuration = new Madingley.Common.Configuration(); using (var reader = new Newtonsoft.Json.JsonTextReader(sr)) { reader.Read(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "GlobalModelTimeStepUnit": configuration.GlobalModelTimeStepUnit = Common.Reader.ReadString(reader); break; case "NumTimeSteps": configuration.NumTimeSteps = Common.Reader.ReadInt(reader); break; case "BurninTimeSteps": configuration.BurninTimeSteps = Common.Reader.ReadInt(reader); break; case "ImpactTimeSteps": configuration.ImpactTimeSteps = Common.Reader.ReadInt(reader); break; case "RecoveryTimeSteps": configuration.RecoveryTimeSteps = Common.Reader.ReadInt(reader); break; case "RunCellsInParallel": configuration.RunCellsInParallel = Common.Reader.ReadBoolean(reader); break; case "RunSimulationsInParallel": configuration.RunSimulationsInParallel = Common.Reader.ReadBoolean(reader); break; case "RunRealm": configuration.RunRealm = Common.Reader.ReadString(reader); break; case "DrawRandomly": configuration.DrawRandomly = Common.Reader.ReadBoolean(reader); break; case "ExtinctionThreshold": configuration.ExtinctionThreshold = Common.Reader.ReadDouble(reader); break; case "MaxNumberOfCohorts": configuration.MaxNumberOfCohorts = Common.Reader.ReadInt(reader); break; case "DispersalOnly": configuration.DispersalOnly = Common.Reader.ReadBoolean(reader); break; case "DispersalOnlyType": configuration.DispersalOnlyType = Common.Reader.ReadString(reader); break; case "PlanktonDispersalThreshold": configuration.PlanktonDispersalThreshold = Common.Reader.ReadDouble(reader); break; case "CohortFunctionalGroupDefinitions": configuration.CohortFunctionalGroupDefinitions = JsonReadFunctionalGroupDefinitions(reader); break; case "StockFunctionalGroupDefinitions": configuration.StockFunctionalGroupDefinitions = JsonReadFunctionalGroupDefinitions(reader); break; case "ImpactCellIndices": configuration.ImpactCellIndices = Common.Reader.ReadArray(reader, Common.Reader.ReadInt); break; case "ImpactAll": configuration.ImpactAll = Common.Reader.ReadBoolean(reader); break; case "ScenarioParameters": configuration.ScenarioParameters = Common.Reader.ReadArray(reader, JsonReadScenarioParameters).ToList(); break; case "ScenarioIndex": configuration.ScenarioIndex = Common.Reader.ReadInt(reader); break; case "Simulation": configuration.Simulation = Common.Reader.ReadInt(reader); break; case "EcologicalParameters": configuration.EcologicalParameters = JsonReadEcologicalParameters(reader); break; case "FileNames": configuration.FileNames = Common.Reader.ReadArray(reader, Common.Reader.ReadString).ToList(); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } } return(configuration); }
public static Madingley.Common.Configuration Deserialize(TextReader sr) { Func<Newtonsoft.Json.JsonTextReader, Madingley.Common.FunctionalGroupDefinition> JsonReadFunctionalGroupDefinition = (reader) => { var ret = new Madingley.Common.FunctionalGroupDefinition(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "Definitions": ret.Definitions = Common.Reader.ReadKeyValuePairs(reader, Common.Reader.ReadString); break; case "Properties": ret.Properties = Common.Reader.ReadKeyValuePairs(reader, Common.Reader.ReadDouble); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return ret; }; Func<Newtonsoft.Json.JsonTextReader, Madingley.Common.FunctionalGroupDefinitions> JsonReadFunctionalGroupDefinitions = (reader) => { var ret = new Madingley.Common.FunctionalGroupDefinitions(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "Data": ret.Data = Common.Reader.ReadArray(reader, JsonReadFunctionalGroupDefinition); break; case "Definitions": ret.Definitions = Common.Reader.ReadArray(reader, Common.Reader.ReadString); break; case "Properties": ret.Properties = Common.Reader.ReadArray(reader, Common.Reader.ReadString); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return ret; }; Func<Newtonsoft.Json.JsonTextReader, Madingley.Common.ScenarioParameter> JsonReadScenarioParameter = (reader) => { var ret = new Madingley.Common.ScenarioParameter(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "ParamString": ret.ParamString = Common.Reader.ReadString(reader); break; case "ParamDouble1": ret.ParamDouble1 = Common.Reader.ReadDouble(reader); break; case "ParamDouble2": ret.ParamDouble2 = Common.Reader.ReadDouble(reader); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return ret; }; Func<Newtonsoft.Json.JsonTextReader, IDictionary<string, Madingley.Common.ScenarioParameter>> JsonReadKVPScenarioParameter = (reader) => { var ret = new Dictionary<string, Madingley.Common.ScenarioParameter>(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var key = Convert.ToString(reader.Value); reader.Read(); var value = JsonReadScenarioParameter(reader); ret.Add(key, value); } return ret; }; Func<Newtonsoft.Json.JsonTextReader, Madingley.Common.ScenarioParameters> JsonReadScenarioParameters = (reader) => { var ret = new Madingley.Common.ScenarioParameters(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "Label": ret.Label = Common.Reader.ReadString(reader); break; case "SimulationNumber": ret.SimulationNumber = Common.Reader.ReadInt(reader); break; case "Parameters": ret.Parameters = JsonReadKVPScenarioParameter(reader); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return ret; }; Func<Newtonsoft.Json.JsonTextReader, Madingley.Common.EcologicalParameters> JsonReadEcologicalParameters = (reader) => { var ret = new Madingley.Common.EcologicalParameters(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "Parameters": ret.Parameters = Common.Reader.ReadKeyValuePairs(reader, Common.Reader.ReadDouble); break; case "TimeUnits": ret.TimeUnits = Common.Reader.ReadArray(reader, Common.Reader.ReadString); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } return ret; }; var configuration = new Madingley.Common.Configuration(); using (var reader = new Newtonsoft.Json.JsonTextReader(sr)) { reader.Read(); Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.StartObject); while (reader.Read() && reader.TokenType != Newtonsoft.Json.JsonToken.EndObject) { Debug.Assert(reader.TokenType == Newtonsoft.Json.JsonToken.PropertyName); Debug.Assert(reader.ValueType == typeof(string)); var property = Convert.ToString(reader.Value); reader.Read(); switch (property) { case "GlobalModelTimeStepUnit": configuration.GlobalModelTimeStepUnit = Common.Reader.ReadString(reader); break; case "NumTimeSteps": configuration.NumTimeSteps = Common.Reader.ReadInt(reader); break; case "BurninTimeSteps": configuration.BurninTimeSteps = Common.Reader.ReadInt(reader); break; case "ImpactTimeSteps": configuration.ImpactTimeSteps = Common.Reader.ReadInt(reader); break; case "RecoveryTimeSteps": configuration.RecoveryTimeSteps = Common.Reader.ReadInt(reader); break; case "RunCellsInParallel": configuration.RunCellsInParallel = Common.Reader.ReadBoolean(reader); break; case "RunSimulationsInParallel": configuration.RunSimulationsInParallel = Common.Reader.ReadBoolean(reader); break; case "RunRealm": configuration.RunRealm = Common.Reader.ReadString(reader); break; case "DrawRandomly": configuration.DrawRandomly = Common.Reader.ReadBoolean(reader); break; case "ExtinctionThreshold": configuration.ExtinctionThreshold = Common.Reader.ReadDouble(reader); break; case "MaxNumberOfCohorts": configuration.MaxNumberOfCohorts = Common.Reader.ReadInt(reader); break; case "DispersalOnly": configuration.DispersalOnly = Common.Reader.ReadBoolean(reader); break; case "DispersalOnlyType": configuration.DispersalOnlyType = Common.Reader.ReadString(reader); break; case "PlanktonDispersalThreshold": configuration.PlanktonDispersalThreshold = Common.Reader.ReadDouble(reader); break; case "CohortFunctionalGroupDefinitions": configuration.CohortFunctionalGroupDefinitions = JsonReadFunctionalGroupDefinitions(reader); break; case "StockFunctionalGroupDefinitions": configuration.StockFunctionalGroupDefinitions = JsonReadFunctionalGroupDefinitions(reader); break; case "ImpactCellIndices": configuration.ImpactCellIndices = Common.Reader.ReadArray(reader, Common.Reader.ReadInt); break; case "ImpactAll": configuration.ImpactAll = Common.Reader.ReadBoolean(reader); break; case "ScenarioParameters": configuration.ScenarioParameters = Common.Reader.ReadArray(reader, JsonReadScenarioParameters).ToList(); break; case "ScenarioIndex": configuration.ScenarioIndex = Common.Reader.ReadInt(reader); break; case "Simulation": configuration.Simulation = Common.Reader.ReadInt(reader); break; case "EcologicalParameters": configuration.EcologicalParameters = JsonReadEcologicalParameters(reader); break; case "FileNames": configuration.FileNames = Common.Reader.ReadArray(reader, Common.Reader.ReadString).ToList(); break; default: throw new Exception(string.Format("Unexpected property: {0}", property)); } } } return configuration; }