Ejemplo n.º 1
0
        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
            }
        }
Ejemplo n.º 2
0
 //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);
 }
Ejemplo n.º 3
0
        //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, "");
        }
Ejemplo n.º 4
0
        /**
         * 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);
        }
Ejemplo n.º 5
0
        //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);
        }
Ejemplo n.º 6
0
        //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);
        }
Ejemplo n.º 7
0
        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]);
                }
            }
        }
Ejemplo n.º 8
0
        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));
        }
Ejemplo n.º 9
0
        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();
        }
Ejemplo n.º 10
0
        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();
            }
        }