public Observation(int id, bool[] inputVals, bool[] outputVals, SystemModel model) { Id = id; TheModel = model; InputValues = inputVals; OutputValues = outputVals; CorrectValues = new Dictionary <Wire, bool>(); SetCorrectValuesDictionary(); }
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); }
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"); }
public Cone(int id) : base(id, Type.cone) { cone = new SystemModel(id + ""); }
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; }
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; }
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"); }
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); }