public void addVariable(sinter_IVariable var) { o_AllIVariable.Add(var, var.name); if (var.isTable) { o_Tables.Add(var, var.name); return; } sinter_Variable vVar = (sinter_Variable)var; addVariablePath(vVar); o_VariablesAndSettings.Add(vVar, var.name); if (vVar.isDynamicVariable) { o_DynamicVariables.Add(vVar, vVar.name); } if (vVar.isSetting) { o_Settings.Add(vVar, var.name); } else { o_Variables.Add(vVar, vVar.name); //o_Variables doesn't include settings or tables } }
//Used to write setting values, would be better to do as a set automatically private string getSettingWithDefault(string key, string def) { if (o_setupFile.Settings.Contains(key)) { sinter_IVariable ivar = (sinter_IVariable)o_setupFile.Settings[key]; if (sinter_Variable.sinter_IOType.si_STRING == ivar.type) { sinter_Variable svar = (sinter_Variable)ivar; return(svar.Value.ToString()); } } return(def); }
//Puts a single input value from a Version 0.1 input file into SimSinter. public virtual void putInputIntoSinter_1(JObject inputDict, String name) { JToken value = inputDict[name]; int row = -1; int column = -1; string varName = sinter_SetupFile.parseVariable(name, ref row, ref column); sinter_IVariable inputVal = this.getIOByName(varName); if (inputVal == null) { runStatus = sinter_AppError.si_INPUT_ERROR; throw new System.IO.IOException(string.Format("Input Variable {0} is unknown. Please check that you have the correct inputs and sinter config for this simulation.", varName)); } inputVal.setInput(varName, row, column, value, ""); }
/** * bool checkAllInputs(JObject inputDict) * * Checks to make sure every input in the sinter configuration is represented in the input dictionary * Mostly useful with sinter config file format 0.1, where there were seperate defaults and input files, * neither of which was guarnateed to have all the variables. **/ public bool checkAllInputs(JObject inputDict) { //If we didn't get any defaults, just return if (inputDict == null) { return(false); } for (int ii = 1; ii <= this.countIO; ++ii) { sinter_IVariable inputVal = this.getIOByIndex(ii); if (inputVal.isInput) { if (inputVal.isTable) { sinter_Table thisInput = (sinter_Table)inputVal; string varName = inputVal.name; int rowMax = (int)thisInput.MNRows; int colMax = (int)thisInput.MNCols; for (int row = 0; row <= rowMax; ++row) { for (int col = 0; col <= colMax; ++col) { string indexedVarName = string.Format("{0}[{1},{2}]", varName, row, col); if (inputDict[indexedVarName] == null) { throw new System.IO.IOException(string.Format("Required Input varaible {0} is not represented in the input dictionary!", indexedVarName)); } } } } else { if (inputDict[inputVal.name] == null) { throw new System.IO.IOException(string.Format("Required Input varaible {0} is not represented in the input dictionary!", inputVal.name)); } } } } return(true); }
//old fashioned output, deprecated. public JObject getOutputsToJSON_1() { JObject outputDict = new JObject(); for (int ii = 1; ii <= this.countIO; ++ii) { sinter_IVariable outputVal = this.getIOByIndex(ii); string varname = outputVal.name; if (outputVal.isTable) { sinter_Table outputTable = (sinter_Table)outputVal; int nrows = (int)outputTable.MNRows; int ncols = (int)outputTable.MNCols; for (int irow = 0; irow <= nrows; ++irow) { for (int icol = 0; icol <= ncols; ++icol) { outputDict.Add(varname + "[" + irow + "," + icol + "]", sinter_HelperFunctions.convertSinterValueToJToken(outputTable.getVariable(irow, icol))); } } } else if (outputVal.isVec) { sinter_Variable outputVar = (sinter_Variable)outputVal; Newtonsoft.Json.Linq.JArray jsonArray = new Newtonsoft.Json.Linq.JArray(outputVar.Value); outputDict.Add(varname, jsonArray); } else { sinter_Variable outputVar = (sinter_Variable)outputVal; outputDict.Add(varname, sinter_HelperFunctions.convertSinterValueToJToken(outputVar)); } } //Special case, Always put the run Status put the status in the outputs as "status". outputDict.Add("status", (int)runStatus); return(outputDict); }
//Puts a single input value from a Version 0.2 input file into SimSinter. public virtual void putInputIntoSinter_2(JObject inputDict, String name) { int row = -1; int column = -1; string varName = sinter_SetupFile.parseVariable(name, ref row, ref column); JObject varData = (JObject)inputDict[name]; string units = (string)varData["units"]; if (units == null) { units = ""; //We prefer the empty string to a null value } sinter_IVariable inputVal = this.getIOByName(varName); if (inputVal == null) { runStatus = sinter_AppError.si_INPUT_ERROR; throw new System.IO.IOException(string.Format("Input Variable {0} is unknown. Please check that you have the correct inputs and sinter config for this simulation.", varName)); } inputVal.setInput(varName, row, column, varData["value"], units); }
private void processLabels(string type, string[] fields, sinter_IVariable thisIVar) { string[] labels = new string[fields.Length - 2]; int labelLen = labels.Length; int ii = 0; for (ii = 0; ii <= labelLen - 1; ii++) { labels[ii] = fields[ii + 2]; } if (type == "r") { if (thisIVar.isTable) { sinter_Table thisTable = (sinter_Table)thisIVar; thisTable.rowLabelCount = labelLen; for (ii = 0; ii <= labelLen - 1; ii++) { thisTable.setRowLabel(ii, labels[ii]); } } else { sinter_Vector thisVar = (sinter_Vector)thisIVar; thisVar.rowLabelCount = labelLen; for (ii = 0; ii <= labelLen - 1; ii++) { thisVar.setRowLabel(ii, labels[ii]); } } } if ((type == "c")) { sinter_Table thisTable = (sinter_Table)thisIVar; thisTable.colLabelCount = labelLen; for (ii = 0; ii <= labelLen - 1; ii++) { thisTable.setColLabel(ii, labels[ii]); } } if ((type == "rs")) { if (thisIVar.isTable) { sinter_Table thisTable = (sinter_Table)thisIVar; thisTable.rowStringCount = labelLen; for (ii = 0; ii <= labelLen - 1; ii++) { thisTable.setRowString(ii, labels[ii]); } } else { sinter_Vector thisVar = (sinter_Vector)thisIVar; thisVar.rowStringCount = labelLen; for (ii = 0; ii <= labelLen - 1; ii++) { thisVar.setRowString(ii, labels[ii]); } } } if ((type == "cs")) { sinter_Table thisTable = (sinter_Table)thisIVar; thisTable.colStringCount = labelLen; for (ii = 0; ii <= labelLen - 1; ii++) { thisTable.setColString(ii, labels[ii]); } } }
private sinter.sinter_AppError processLine(string l) { string[] fields = null; sinter_Variable.sinter_IOType type = default(sinter_Variable.sinter_IOType); sinter_Variable.sinter_IOMode mode = default(sinter_Variable.sinter_IOMode); // // Split line using a bar // if (l.Length < 1) { return(sinter.sinter_AppError.si_OKAY); } fields = l.Split('|'); if (fields.Length == 0) { return(sinter.sinter_AppError.si_OKAY); } for (int i = 0; i <= fields.Length - 1; i++) { fields[i] = fields[i].Trim();// Strings.Trim(fields[i]); char tab = '\u0009'; fields[i] = fields[i].Replace(tab.ToString(), ""); } // // Check for special key words // if (fields[0].Length == 0) { return(sinter.sinter_AppError.si_OKAY); //Blank or invalid line, ignore it } if (fields[0][0] == '#') //If first char in line is a # { return(sinter.sinter_AppError.si_OKAY); //it is a comment ignore line } else if (fields[0] == "file" & fields.Length == 2) { o_aspenFilename = fields[1]; //e = sim.openSim(); //open sim so can inspect IO //return e; return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "dir" & fields.Length == 2) { // o_workingDir = fields[1]; return(sinter.sinter_AppError.si_UNKNOWN_FIELD); } else if (fields[0] == "title" & fields.Length == 2) { o_title = fields[1]; return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "author" & fields.Length == 2) { o_author = fields[1]; return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "date" & fields.Length == 2) { o_dateString = fields[1]; return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "description" & fields.Length == 2) { o_simDesc = fields[1]; return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "min") { processMin(fields); return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "max") { processMax(fields); return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "default") { processDefault(fields); return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "limits") { if (getIOByName(fields[1]) == null) { throw new System.IO.IOException("Cannot apply labels, Object " + fields[1] + " not found. (Settings not allowed)"); //return sinter.sinter_AppError.si_OKAY; } else if (!(getIOByName(fields[1]).isScalar)) { throw new System.IO.IOException("Cannot use limits on non scalar"); //return sinter.sinter_AppError.si_OKAY; } else if (fields.Length != 4) { throw new System.IO.IOException("Limits on " + fields[1] + " too few arguments"); //return sinter.sinter_AppError.si_OKAY; } if (getIOByName(fields[1]).type == sinter_Variable.sinter_IOType.si_DOUBLE) { sinter_Variable thisVar = (sinter_Variable)getIOByName(fields[1]); thisVar.minimum = Convert.ToDouble(fields[2]); thisVar.maximum = Convert.ToDouble(fields[3]); } else if (getIOByName(fields[1]).type == sinter_Variable.sinter_IOType.si_INTEGER) { sinter_Variable thisVar = (sinter_Variable)getIOByName(fields[1]); thisVar.minimum = Convert.ToInt32(fields[2]); thisVar.maximum = Convert.ToInt32(fields[3]); } return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "cLabels" | fields[0] == "clabels") { if (getIOByName(fields[1]) == null) { throw new System.IO.IOException("Cannot apply labels, Object " + fields[1] + " not found"); } processLabels("c", fields, getIOByName(fields[1])); return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "rLabels" | fields[0] == "rlabels") { if (getIOByName(fields[1]) == null) { throw new System.IO.IOException("Cannot apply labels, Object " + fields[1] + " not found"); } processLabels("r", fields, getIOByName(fields[1])); return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "cStrings" | fields[0] == "cstrings") { if (getIOByName(fields[1]) == null) { throw new System.IO.IOException("Cannot apply strings, Object " + fields[1] + " not found"); } processLabels("cs", fields, getIOByName(fields[1])); sinter_IVariable io = getIOByName(fields[1]); return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "rStrings" | fields[0] == "rstrings") { if (getIOByName(fields[1]) == null) { throw new System.IO.IOException("Cannot apply strings, Object " + fields[1] + " not found"); } processLabels("rs", fields, getIOByName(fields[1])); return(sinter.sinter_AppError.si_OKAY); } else if (fields[0] == "rStrings_ForEach" | fields[0] == "rstrings_ForEach") { throw new System.IO.IOException("No Foreach allowed with this version of sinter."); } // // Check lines that add input and output // if (fields.Length >= 5) { //assume if a line isn't a keyword line and it has 5 or more fields // it is adding an input or output // // 0-name | 1-iomode | 2-iotype | 3-description | 4-addess-string ... (There may be multiple address strings) if ((fields[1] == "input")) { mode = sinter_Variable.sinter_IOMode.si_IN; } else { mode = sinter_Variable.sinter_IOMode.si_OUT; } int[] bounds = null; sinter_Variable.string2Type(fields[2], ref type, ref bounds); string[] addresses = new string[fields.Length - 4]; Array.Copy(fields, 4, addresses, 0, fields.Length - 4); //Copy all address strings for this line addIO(mode, type, fields[0], fields[3], addresses, bounds); return(sinter.sinter_AppError.si_OKAY); } throw new System.IO.IOException(String.Format("Sinter Config Line unknown: {0}", l)); }
private void processDefault(string[] fields) { int i = 0; string line = null; string[] n = null; int j = 0; sinter_IVariable thisIVar = (sinter_IVariable)getIOByName(fields[1]); if (thisIVar == null) { throw new System.IO.IOException("Cannot apply labels, Object " + fields[1] + " not found"); } if (thisIVar.isScalar) { sinter_Variable thisVar = (sinter_Variable)thisIVar; if (thisVar.type == sinter_Variable.sinter_IOType.si_DOUBLE) { thisVar.dfault = Convert.ToDouble(fields[2]); } else if (thisVar.type == sinter_Variable.sinter_IOType.si_INTEGER) { thisVar.dfault = Convert.ToInt32(fields[2]); } else if (thisVar.type == sinter_Variable.sinter_IOType.si_STRING) { thisVar.dfault = Convert.ToString(fields[2]); } } else if (thisIVar.isVec) { sinter_Vector thisVar = (sinter_Vector)thisIVar; if (thisVar.type == sinter_Variable.sinter_IOType.si_DOUBLE_VEC) { thisVar.setElementDefault(0, Convert.ToDouble(fields[2])); } else if (thisVar.type == sinter_Variable.sinter_IOType.si_INTEGER_VEC) { thisVar.setElementDefault(0, Convert.ToInt32(fields[2])); } for (i = 1; i <= thisVar.size - 1; i++) { line = inFileStream.ReadLine(); n = line.Split('|'); if (n.Length == 0) { return; } for (j = 0; j <= n.Length - 1; j++) { n[j] = n[j].Trim(); } if (thisVar.type == sinter_Variable.sinter_IOType.si_DOUBLE_VEC) { thisVar.setElementDefault(i, Convert.ToDouble(n[0])); } else if (thisVar.type == sinter_Variable.sinter_IOType.si_INTEGER_VEC) { thisVar.setElementDefault(i, Convert.ToInt32(n[0])); } } } else if (thisIVar.isTable) { sinter_Table thisTable = (sinter_Table)thisIVar; for (j = 2; j <= fields.Length - 1; j++) { sinter_Variable thisVar = (sinter_Variable)thisTable.getElement(0, j - 2); if (thisVar.type == sinter_Variable.sinter_IOType.si_DOUBLE) { thisVar.dfault = Convert.ToDouble(fields[j]); } else if (thisVar.type == sinter_Variable.sinter_IOType.si_INTEGER) { thisVar.dfault = Convert.ToInt32(fields[j]); } else { throw new System.IO.IOException("Cannot apply minimum on " + thisVar.name + ". Bad type"); } } for (i = 1; i <= thisTable.MNRows; i++) { line = inFileStream.ReadLine(); n = line.Split('|'); if (n.Length == 0) { return; } for (j = 0; j <= n.Length - 1; j++) { n[j] = n[j].Trim(); } for (j = 0; j <= n.Length - 1; j++) { sinter_Variable thisVar = (sinter_Variable)thisTable.getElement(0, j); if (thisVar.type == sinter_Variable.sinter_IOType.si_DOUBLE) { thisVar.dfault = Convert.ToDouble(fields[j]); } else if (thisVar.type == sinter_Variable.sinter_IOType.si_INTEGER) { thisVar.dfault = Convert.ToInt32(fields[j]); } else { throw new System.IO.IOException("Cannot apply maximum on " + thisVar.name + ". Bad type"); } } } } //////////////////////////////////////////////////////////////// //Now that we've set all the defaults, make them the basic value //////////////////////////////////////////////////////////////// thisIVar.resetToDefault(); }
public void sendDefaults(JObject inputDict) { //If we didn't get any defaults, just return if (inputDict == null || inputDict.Count <= 0) { return; } checkAllInputs(inputDict); foreach (KeyValuePair <String, JToken> entry in inputDict) { int row = -1; int column = -1; string varName = sinter_SetupFile.parseVariable(entry.Key, ref row, ref column); sinter_IVariable inputVal = this.getIOByName(varName); if (inputVal == null) { Console.WriteLine("Ignoring non-var: " + varName); } else if (inputVal.isOutput) { throw new System.IO.IOException(string.Format("Variable {0} is an output varaible. It should not be in the input list.", varName)); } else { if (inputVal.isScalar) { ((sinter_Variable)inputVal).dfault = sinter_HelperFunctions.convertJTokenToNative(entry.Value); } else if (inputVal.isVec) { //Check that the indexes are valid sinter_Vector thisVar = (sinter_Vector)inputVal; if (row >= 0) //Editing a single entry of a vector { thisVar.setElementDefault(row, sinter_HelperFunctions.convertJTokenToNative(entry.Value)); } else { //copying in an entire vector at once Newtonsoft.Json.Linq.JArray jsonArray = (Newtonsoft.Json.Linq.JArray)entry.Value; if (thisVar.size != jsonArray.Count) { throw new System.IO.IOException(string.Format("Variable {0} has an index out of range. Upper bound: {1}, bad index: {2}", varName, (int)thisVar.size - 1, row)); } //Annoyingly, a jsonArray is not a C# Array, so I have to copy element by element, rather than just copying the array for (int ii = 0; ii < thisVar.size; ++ii) { thisVar.setElementDefault(ii, sinter_HelperFunctions.convertJTokenToNative(jsonArray[ii])); } } } else if (inputVal.isTable) { sinter_Table thisTable = (sinter_Table)inputVal; //Check that the indexes are valid if (row >= 0 && row <= (int)thisTable.MNRows && column >= 0 && column <= (int)thisTable.MNCols) { thisTable.setElementDefault(row, column, sinter_HelperFunctions.convertJTokenToNative(entry.Value)); } else { throw new System.IO.IOException(string.Format("Variable {0} has an index out of range. Range: {1},{2} Index: {3},{4}", varName, (int)thisTable.MNRows, (int)thisTable.MNCols, row, column)); } } } //Now, make the default the current real value inputVal.resetToDefault(); } }