Ejemplo n.º 1
0
 public Observation(int id, bool[] inputVals, bool[] outputVals, SystemModel model)
 {
     Id            = id;
     TheModel      = model;
     InputValues   = inputVals;
     OutputValues  = outputVals;
     CorrectValues = new Dictionary <Wire, bool>();
     SetCorrectValuesDictionary();
 }
Ejemplo n.º 2
0
        private DiagnosisSet findAbstractDiag(Observation observation)
        {
            DiagnosisSet abstractDiag;

            if (observation.TheModel.cones.Count == 0)
            {
                observation.TheModel.createCones();
            }
            List <Cone> cones  = observation.TheModel.cones;
            SystemModel toTest = new SystemModel(observation.TheModel.Id, observation.TheModel.Input, observation.TheModel.Output);

            foreach (Cone c in cones)
            {
                toTest.AddComponent(c);
            }
            Observation obs = new Observation(observation.Id, observation.InputValues, observation.OutputValues);

            obs.TheModel = toTest;
            abstractDiag = searchAlgorithm.FindDiagnoses(obs);
            return(abstractDiag);
        }
Ejemplo n.º 3
0
        public void CalcProbabilityMass(string fileModel, string fileObs)
        {
            createNewDiagnoser();
            ConesAlgorithm         conesAlgo        = (ConesAlgorithm)Diagnoser;
            List <Observation>     observationsList = parser.ReadObsModelFiles(fileModel, fileObs);
            CSVExport              myExport         = new CSVExport();
            SystemModel            model            = observationsList[0].TheModel;
            Dictionary <int, Gate> compDic          = model.CreateCompDic();
            string diagnosesFilesPath   = "diagnoses/";
            string tldiagnosesFilesPath = "tldiagnoses/";

            model.createCones();
            Dictionary <int, Cone> conesDic = new Dictionary <int, Cone>();

            foreach (Cone c in model.Cones)
            {
                if (!conesDic.ContainsKey(c.Id))
                {
                    conesDic.Add(c.Id, c);
                }
            }
            foreach (Observation obs in observationsList)
            {
                string       diagFileName     = diagnosesFilesPath + model.Id + "_" + obs.Id + "_Diag.txt";
                DiagnosisSet allDiagnoses     = parser.ReadDiagnosisFile(diagFileName, compDic);
                string       tldFileName      = tldiagnosesFilesPath + model.Id + "_iscas85_" + obs.Id + ".tld"; //!!! txt?
                DiagnosisSet tlDiagnoses      = parser.ReadTLDiagnosisFile(tldFileName, conesDic);
                DiagnosisSet minCardDiagnoses = conesAlgo.AbstractDiagGrounding(obs, tlDiagnoses);
                myExport.AddRow();
                myExport["Observation"]                    = obs.Id;
                myExport["# all diagnoses"]                = allDiagnoses.Count;
                myExport["all diagnoses probability"]      = allDiagnoses.SetProbability;
                myExport["# min card diagnoses"]           = minCardDiagnoses.Count;
                myExport["min card diagnoses probability"] = minCardDiagnoses.SetProbability;
            }
            myExport.ExportToFile(model.Id + "_probabilityMass.csv");
        }
Ejemplo n.º 4
0
 public Cone(int id) : base(id, Type.cone)
 {
     cone = new SystemModel(id + "");
 }
Ejemplo n.º 5
0
        public List<Observation> ReadObsModelFiles(string fileModel, string fileObs) //path?
        {
            //reading model file
            List<Observation> observationsList = new List<Observation>();
           // if (observationsList.Count > 0)
             //   observationsList.Clear();
            FileStream fs = new FileStream(fileModel, FileMode.Open, FileAccess.Read);
            StreamReader reader = new StreamReader(fs);
            string model_allText = reader.ReadToEnd();
            fs.Close();
            reader.Close();
            fs = null;
            reader = null;

            char[] delrow = new char[2];
            delrow[0] = '\n';
            delrow[1] = '\r';
            List<string> rows = model_allText.Split(delrow, StringSplitOptions.RemoveEmptyEntries).ToList();
            if(rows==null || rows.Count<4)
                return null; // throw

            //build Model
            SystemModel theModel;
            string modelID = rows[0].Substring(0, rows[0].Length - 1);
            List<Wire> inputs = new List<Wire>();
            List<Wire> outputs = new List<Wire>();
            List<Wire> internalWires = new List<Wire>();
            Dictionary<Wire.WireType, Dictionary<int, Wire>> wiresDictionary = new Dictionary<Wire.WireType, Dictionary<int, Wire>>();
            wiresDictionary.Add(Wire.WireType.i, new Dictionary<int, Wire>());
            wiresDictionary.Add(Wire.WireType.o, new Dictionary<int, Wire>());
            wiresDictionary.Add(Wire.WireType.z, new Dictionary<int, Wire>());
            //model id
           // if (!Int32.TryParse(rows[0].Substring(0, rows[0].Length - 1), out modelID))
             //   return; //throw

            char[] del = new char[6];
            del[0]='.';
            del[1]=',';
            del[2]='[';
            del[3]=']';
            del[4]='(';
            del[5]=')';

            //Wire.WiresDictionary = new Dictionary<string, Wire>(); 

            //input & output
            string[] inputArr = rows[1].Split(del, StringSplitOptions.RemoveEmptyEntries);
            string[] outputArr = rows[2].Split(del, StringSplitOptions.RemoveEmptyEntries);


            for (int i=0; i < inputArr.Length; i++)
            {
                //need to check if the Value is Valid? 2<=len<=3, starts with i/o/z, end with a number
                //need to check if theres as similar wire exist
                string wireName = inputArr[i];
                int wid; 
                if(Int32.TryParse(wireName.Substring(1),out wid))
                {
                    if (wireName.StartsWith("i"))
                    {
                        Wire w = new Wire(wid, Wire.WireType.i);
                        inputs.Add(w);
                        wiresDictionary[Wire.WireType.i].Add(wid, w);
                    }
                        
                }
                //else --
            }
            for (int j = 0; j < outputArr.Length; j++)
            {
                string wireName = outputArr[j];
                int wid;
                if (Int32.TryParse(wireName.Substring(1), out wid))
                {
                    if (wireName.StartsWith("o"))
                    {
                        Wire w = new Wire(wid, Wire.WireType.o);
                        outputs.Add(w);
                        wiresDictionary[Wire.WireType.o].Add(wid, w);
                    }
                        
                }
            }
            theModel = new SystemModel(modelID, inputs, outputs);

            //creating components
            for (int i = 3; i < rows.Count; i++)
            {
                if (!String.IsNullOrEmpty(rows[i])) 
                    theModel.AddComponent(CreateComponent(rows[i].Split(del, StringSplitOptions.RemoveEmptyEntries),theModel,wiresDictionary));
            }

            //sort model
            theModel.SortComponents();

            //reading observation fila
            delrow = new char[1];
            delrow[0] = '.';
            del = new char[7];
            del[0] = '\r';
            del[1] = ',';
            del[2] = '[';
            del[3] = ']';
            del[4] = '(';
            del[5] = ')';
            del[6] = '\n';
            rows = null;
            fs = new FileStream(fileObs, FileMode.Open, FileAccess.Read);
            reader = new StreamReader(fs);
            string ob_allText = reader.ReadToEnd();
            rows = ob_allText.Split(delrow, StringSplitOptions.RemoveEmptyEntries).ToList();
            fs.Close();
            reader.Close();
            fs = null;
            reader = null;

            if (rows == null || rows.Count == 0)
                return null; // throw


            //build observation
           // List<Observation> obList = new List<Observation>();
            for (int i = 0; i < rows.Count; i++)
            {
                string[] obArr = rows[i].Split(del, StringSplitOptions.RemoveEmptyEntries);
                if (obArr == null || obArr.Length == 0&& i!=rows.Count-1)
                    return null; //throw
                if (obArr.Length == 2 + inputs.Count + outputs.Count)
                {
                    if (!obArr[0].Equals(modelID))
                        return null; //throw
                    Observation toAdd = CreateObservation(obArr);
                    if (toAdd != null) 
                    {
                        toAdd.TheModel = theModel; //try catch
                        observationsList.Add(toAdd);
                    }
                }
                //else return/throw?
            }
            return observationsList;
        }
Ejemplo n.º 6
0
        private Gate CreateComponent(string[] compArr, SystemModel theModel, Dictionary<Wire.WireType, Dictionary<int, Wire>> wiresDictionary)
        {
            if(compArr==null||compArr.Length<4)
                return null; //throw

            int id;

            if(compArr[1].Length<5 || !compArr[1].StartsWith("gate"))
                return null; //throw

            if(!Int32.TryParse(compArr[1].Substring(4),out id))
                return null; //throw
            Wire output = null;
            string oname = compArr[2];
            int oid;
            if(Int32.TryParse(oname.Substring(1),out oid))
            {
                if (oname.StartsWith("o"))
                {
                   if(!wiresDictionary[Wire.WireType.o].TryGetValue(oid,out output))
                   {
                       output = new Wire(oid,Wire.WireType.o);
                       wiresDictionary[Wire.WireType.o].Add(oid, output);
                       theModel.Output.Add(output);
                   }

                }
                else if(oname.StartsWith("z"))
                {
                    if (!wiresDictionary[Wire.WireType.z].TryGetValue(oid, out output))
                    {
                        output = new Wire(oid, Wire.WireType.z);
                        wiresDictionary[Wire.WireType.z].Add(oid, output);
                        theModel.Internal.Add(output);
                    }
                }
                //cant be i 
            }
            if (compArr.Length == 4)
            {
                OneInputComponent ans = null;
                if (compArr[0].Equals("inverter"))
                    ans = new OneInputComponent(id, Gate.Type.not);
                if (compArr[0].Equals("buffer"))
                    ans = new OneInputComponent(id, Gate.Type.buffer);
                if (ans != null)
                {
                    if(output!=null)
                        ans.Output = output;
                    string iname = compArr[3];
                    int inid;
                    Wire input = null;
                    if (Int32.TryParse(iname.Substring(1), out inid))
                    {
                        if (iname.StartsWith("o"))
                        {
                            if (!wiresDictionary[Wire.WireType.o].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.o);
                                wiresDictionary[Wire.WireType.o].Add(inid, input);
                                theModel.Output.Add(input);
                            }

                        }
                        else if (iname.StartsWith("z"))
                        {
                            if (!wiresDictionary[Wire.WireType.z].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.z);
                                wiresDictionary[Wire.WireType.z].Add(inid, input);
                                theModel.Internal.Add(input);
                            }
                        }
                        else if (iname.StartsWith("i"))
                        {
                            if (!wiresDictionary[Wire.WireType.i].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.i);
                                wiresDictionary[Wire.WireType.i].Add(inid, input);
                                theModel.Input.Add(input);
                            }
                        }
                    }
                    if (input != null)
                        ans.Input1 = input;
                }
                return ans;
            }
            if (compArr.Length >= 5)
            {
                MultipleInputComponent ans = null;
                if (compArr[0].StartsWith("and"))
                    ans = new MultipleInputComponent(id, Gate.Type.and);
                if (compArr[0].StartsWith("nor"))
                    ans = new MultipleInputComponent(id, Gate.Type.nor);
                if (compArr[0].StartsWith("xor"))
                    ans = new MultipleInputComponent(id, Gate.Type.xor);
                if (compArr[0].StartsWith("nand"))
                    ans = new MultipleInputComponent(id, Gate.Type.nand);
                if (compArr[0].StartsWith("or"))
                    ans = new MultipleInputComponent(id, Gate.Type.or);
                if (ans != null)
                {
                    if (output != null)
                        ans.Output = output;
                    for (int i = 3; i < compArr.Length; i++)
                    {
                        string iname = compArr[i];
                        int inid;
                        Wire input = null;
                        if (Int32.TryParse(iname.Substring(1), out inid))
                        {
                            if (iname.StartsWith("o"))
                            {
                                if (!wiresDictionary[Wire.WireType.o].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.o);
                                    wiresDictionary[Wire.WireType.o].Add(inid, input);
                                    theModel.Output.Add(input);
                                }

                            }
                            else if (iname.StartsWith("z"))
                            {
                                if (!wiresDictionary[Wire.WireType.z].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.z);
                                    wiresDictionary[Wire.WireType.z].Add(inid, input);
                                    theModel.Internal.Add(input);
                                }
                            }
                            else if (iname.StartsWith("i"))
                            {
                                if (!wiresDictionary[Wire.WireType.i].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.i);
                                    wiresDictionary[Wire.WireType.i].Add(inid, input);
                                    theModel.Input.Add(input);
                                }
                            }
                        }
                        if (input != null)
                            ans.AddInput(input); 
                    }
                }
                return ans;
            }
            return null;
        }
Ejemplo n.º 7
0
        public void BatchRepair(string diagPath, string fileModel, string fileObs, string fileReal, BatchPlanner planner, double overhead, bool minCard, int maxNumOfDiag) //do it more generic
        {
            bool findDiagnoses = false;                                                                                                                                    //

            List <Observation>            observationsList = parser.ReadObsModelFiles(fileModel, fileObs);
            Dictionary <int, List <int> > obsReal          = parser.ReadRealObsFiles(fileReal);

            if (observationsList == null || observationsList.Count == 0 || obsReal == null || obsReal.Count == 0)
            {
                return;
            }
            createNewDiagnoser();
            SystemModel            model   = observationsList[0].TheModel;
            Dictionary <int, Gate> compDic = model.CreateCompDic();
            Stopwatch stopwatch            = new Stopwatch();
            CSVExport myExport             = new CSVExport();

            foreach (Observation obs in observationsList)
            {
                if (!obsReal.ContainsKey(obs.Id))
                {
                    continue;
                }
                List <int> realComp      = new List <int>(obsReal[obs.Id]);
                int        counter       = 0;
                double     cost          = 0;
                int        numberOfFixed = 0;
                stopwatch.Start();
                DiagnosisSet diagnoses = null;

                if (findDiagnoses) //
                {
                    diagnoses = Diagnoser.FindDiagnoses(obs);
                }
                else
                {
                    if (minCard)
                    {
                        string diagFileName = diagPath + model.Id + "_iscas85_" + obs.Id + ".all";
                        diagnoses = parser.ReadGroundedDiagnosesFile(diagFileName, compDic);
                    }
                    else
                    {
                        string diagFileName = diagPath + model.Id + "_" + obs.Id + "_Diag.txt";
                        diagnoses = parser.ReadDiagnosisFile(diagFileName, compDic);
                    }
                }
                if (diagnoses.Count == 1)
                {
                    continue;
                }
                if (maxNumOfDiag > 0 && diagnoses.Count > maxNumOfDiag)
                {
                    continue;
                }
                SystemState state = new SystemState(new List <Comp>(model.Components));
                state.Diagnoses = diagnoses;

                while (realComp.Count != 0)
                {
                    if (state.Diagnoses != null && state.Diagnoses.Count != 0)
                    {
                        RepairAction repairAction = planner.Plan(state);
                        if (repairAction != null)
                        {
                            counter++;
                            cost += overhead;
                            state.SetNextState(repairAction);
                            foreach (Gate gate in repairAction.R)
                            {
                                cost += gate.Cost;
                                numberOfFixed++;
                                if (realComp.Contains(gate.Id))
                                {
                                    realComp.Remove(gate.Id);
                                }
                            }
                            obs.TheModel.SetValue(obs.InputValues);
                            if (realComp.Count == 0)//the system is fixed
                            {
                                planner.ExportIterationDetails(model.Id, obs.Id, counter, true);
                                break;
                            }
                            else
                            {
                                planner.ExportIterationDetails(model.Id, obs.Id, counter, false);
                            }
                            foreach (int gid in realComp)
                            {
                                Gate g;
                                if (compDic.TryGetValue(gid, out g))
                                {
                                    gateFunc.Operate(g);
                                }
                            }
                            obs.OutputValues = model.GetValue();
                            DiagnosisSet newDiagnoses = new DiagnosisSet();
                            foreach (Diagnosis diag in state.Diagnoses.Diagnoses)
                            {
                                if (Diagnoser.IsConsistent(obs, diag))
                                {
                                    newDiagnoses.AddDiagnosis(diag);
                                }
                            }
                            state.Diagnoses = newDiagnoses;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }

                stopwatch.Stop();
                if (realComp.Count > 0)
                {
                    continue;
                }

                TimeSpan time = stopwatch.Elapsed;
                stopwatch.Reset();
                myExport.AddRow();
                myExport["System"]    = model.Id;
                myExport["Algorithm"] = planner.Algorithm();
                if (planner.Bounded)
                {
                    myExport["Bound"] = planner.Bound;
                }
                else
                {
                    myExport["Bound"] = "No Bound";
                }
                myExport["Objective Function"] = planner.ObjectiveFunction();
                myExport["Overhead"]           = overhead;
                myExport["Observation"]        = obs.Id;
                myExport["# Diagnoses"]        = diagnoses.Count;
                myExport["Runtime"]            = time;
                myExport["# Iterations"]       = counter;
                myExport["Cost"] = cost;
                myExport["# Fixed Components"] = numberOfFixed;
            }
            string fileName = model.Id + "_" + planner.Type() + "_o=" + overhead;

            if (maxNumOfDiag > 0)
            {
                fileName += "_MaxDiag" + maxNumOfDiag;
            }
            myExport.ExportToFile(fileName + ".csv");
            planner.CreateIterationDetailsFile(fileName + "_IterationDetails");
        }
Ejemplo n.º 8
0
        private Gate CreateComponent(string[] compArr, SystemModel theModel, Dictionary <Wire.WireType, Dictionary <int, Wire> > wiresDictionary)
        {
            if (compArr == null || compArr.Length < 4)
            {
                Console.WriteLine("Parsing error");
                return(null);
            }

            int id;

            if (compArr[1].Length < 5 || !compArr[1].StartsWith("gate"))
            {
                Console.WriteLine("Parsing error");
                return(null);
            }

            string sid = compArr[1].Substring(4);

            if (!Int32.TryParse(sid, out id))
            {
                //in case of not numeric id:
                string toascii = "";
                foreach (char c in sid)
                {
                    int i = c;
                    toascii += i;
                }
                if (!Int32.TryParse(toascii, out id))
                {
                    Console.WriteLine("Parsing error");
                    return(null);
                }
            }
            Wire   output = null;
            string oname  = compArr[2];
            int    oid;

            if (Int32.TryParse(oname.Substring(1), out oid))
            {
                if (oname.StartsWith("o"))
                {
                    if (!wiresDictionary[Wire.WireType.o].TryGetValue(oid, out output))
                    {
                        output = new Wire(oid, Wire.WireType.o);
                        wiresDictionary[Wire.WireType.o].Add(oid, output);
                        theModel.Output.Add(output);
                    }
                }
                else if (oname.StartsWith("z"))
                {
                    if (!wiresDictionary[Wire.WireType.z].TryGetValue(oid, out output))
                    {
                        output = new Wire(oid, Wire.WireType.z);
                        wiresDictionary[Wire.WireType.z].Add(oid, output);
                        theModel.Internal.Add(output);
                    }
                }
                //cant be i
            }
            if (compArr.Length == 4)
            {
                OneInputComponent ans = null;
                if (compArr[0].Equals("inverter"))
                {
                    ans = new OneInputComponent(id, Gate.Type.not);
                }
                if (compArr[0].Equals("buffer"))
                {
                    ans = new OneInputComponent(id, Gate.Type.buffer);
                }
                if (ans != null)
                {
                    if (output != null)
                    {
                        ans.Output = output;
                    }
                    string iname = compArr[3];
                    int    inid;
                    Wire   input = null;
                    if (Int32.TryParse(iname.Substring(1), out inid))
                    {
                        if (iname.StartsWith("o"))
                        {
                            if (!wiresDictionary[Wire.WireType.o].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.o);
                                wiresDictionary[Wire.WireType.o].Add(inid, input);
                                theModel.Output.Add(input);
                            }
                        }
                        else if (iname.StartsWith("z"))
                        {
                            if (!wiresDictionary[Wire.WireType.z].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.z);
                                wiresDictionary[Wire.WireType.z].Add(inid, input);
                                theModel.Internal.Add(input);
                            }
                        }
                        else if (iname.StartsWith("i"))
                        {
                            if (!wiresDictionary[Wire.WireType.i].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.i);
                                wiresDictionary[Wire.WireType.i].Add(inid, input);
                                theModel.Input.Add(input);
                            }
                        }
                    }
                    if (input != null)
                    {
                        ans.Input1 = input;
                    }
                }
                return(ans);
            }
            if (compArr.Length >= 5)
            {
                MultipleInputComponent ans = null;
                if (compArr[0].StartsWith("and"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.and);
                }
                if (compArr[0].StartsWith("nor"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.nor);
                }
                if (compArr[0].StartsWith("xor"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.xor);
                }
                if (compArr[0].StartsWith("nand"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.nand);
                }
                if (compArr[0].StartsWith("or"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.or);
                }
                if (ans != null)
                {
                    if (output != null)
                    {
                        ans.Output = output;
                    }
                    for (int i = 3; i < compArr.Length; i++)
                    {
                        string iname = compArr[i];
                        int    inid;
                        Wire   input = null;
                        if (Int32.TryParse(iname.Substring(1), out inid))
                        {
                            if (iname.StartsWith("o"))
                            {
                                if (!wiresDictionary[Wire.WireType.o].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.o);
                                    wiresDictionary[Wire.WireType.o].Add(inid, input);
                                    theModel.Output.Add(input);
                                }
                            }
                            else if (iname.StartsWith("z"))
                            {
                                if (!wiresDictionary[Wire.WireType.z].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.z);
                                    wiresDictionary[Wire.WireType.z].Add(inid, input);
                                    theModel.Internal.Add(input);
                                }
                            }
                            else if (iname.StartsWith("i"))
                            {
                                if (!wiresDictionary[Wire.WireType.i].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.i);
                                    wiresDictionary[Wire.WireType.i].Add(inid, input);
                                    theModel.Input.Add(input);
                                }
                            }
                        }
                        if (input != null)
                        {
                            ans.AddInput(input);
                        }
                    }
                }
                return(ans);
            }
            return(null);
        }