private List <Diagnosis> generateDiagsFromGrounded(List <List <Gate> > grounded) { List <Diagnosis> ans = new List <Diagnosis>(); int numOfGroups = 0; grounded.ForEach(list => { if (list.Count > 1) { numOfGroups++; } }); if (numOfGroups == 0) { List <Diagnosis> diagnoses = new List <Diagnosis>(); Diagnosis diag = new Diagnosis(); grounded.ForEach(x => { if (x.Count == 1) { diag.AddCompToDiagnosis(x.First()); } }); diagnoses.Add(diag); return(diagnoses); } else if (numOfGroups == 1) { List <Diagnosis> diagnoses = new List <Diagnosis>(); List <Gate> bigGroup = grounded.Find(x => x.Count > 1); foreach (Gate g in bigGroup) { Diagnosis diag = new Diagnosis(); diag.AddCompToDiagnosis(g); grounded.Where(x => x.Count == 1).ToList().ForEach(x => { diag.AddCompToDiagnosis(x.First()); }); diagnoses.Add(diag); } return(diagnoses); } else { List <Diagnosis> diagnoses = new List <Diagnosis>(); List <Gate> bigGroup = grounded.Find(x => x.Count > 1); List <List <Gate> > newGrounded = new List <List <Gate> >(grounded); newGrounded.Remove(bigGroup); foreach (Gate g in bigGroup) { List <Gate> single = new List <Gate>(); single.Add(g); newGrounded.Add(single); diagnoses.AddRange(generateDiagsFromGrounded(newGrounded)); newGrounded.Remove(single); } return(diagnoses); } }
private DiagnosisSet computeNextState(List <Gate> action) { if (m_diagnoses == null || m_diagnoses.Count == 0 || action == null || action.Count == 0) { return(null); } DiagnosisSet ans = new DiagnosisSet(); foreach (Diagnosis diag in m_diagnoses.Diagnoses) { Diagnosis toAdd = new Diagnosis(); foreach (Gate g in diag.TheDiagnosis) { if (!action.Contains(g)) { toAdd.AddCompToDiagnosis(g); } } if (toAdd.TheDiagnosis.Count == diag.TheDiagnosis.Count) //to save space and time { toAdd = diag; } if (toAdd.TheDiagnosis.Count != 0) { ans.AddDiagnosis(toAdd); } } return(ans); }
private DiagnosisSet computeNextState(RepairAction action) //the resulted diagnoses could be not subset minimal! { if (m_diagnoses == null || m_diagnoses.Count == 0 || action == null || action.Count == 0) { return(null); } DiagnosisSet ans = new DiagnosisSet(); foreach (Diagnosis diag in m_diagnoses.Diagnoses) { Diagnosis toAdd = new Diagnosis(); foreach (Comp g in diag.Comps) { if (!action.Contains(g)) { toAdd.AddCompToDiagnosis(g); } } if (toAdd.Comps.Count != 0) { ans.AddDiagnosis(toAdd); } } return(ans); }
public DiagnosisSet ReadTLDiagnosisFile(string fileName, Dictionary <int, Cone> conesDic) { FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); StreamReader reader = new StreamReader(fs); string allText = reader.ReadToEnd(); fs.Close(); reader.Close(); fs = null; reader = null; DiagnosisSet ans = new DiagnosisSet(); char[] delrow = new char[2]; delrow[0] = '\n'; delrow[1] = '\r'; List <string> rows = allText.Split(delrow, StringSplitOptions.RemoveEmptyEntries).ToList(); if (rows == null || rows.Count == 0) { return(null); } foreach (string row in rows) { if (!row.StartsWith("[gate")) { continue; } List <string> delDiag = new List <string>(); delDiag.Add("["); delDiag.Add("]"); delDiag.Add("."); delDiag.Add(","); delDiag.Add("gate"); List <string> diagString = row.Split(delDiag.ToArray(), StringSplitOptions.RemoveEmptyEntries).ToList(); Diagnosis diag = new Diagnosis(); bool addDiag = true; foreach (string comp in diagString) { int compId = 0; if (!Int32.TryParse(comp, out compId)) { //in case of not numeric id: string toascii = ""; foreach (char c in comp) { int i = c; toascii += i; } if (!Int32.TryParse(toascii, out compId)) { Console.WriteLine("Parsing error"); return(null); } } if (conesDic.ContainsKey(compId)) { diag.AddCompToDiagnosis(conesDic[compId]); } else { addDiag = false; break; } } if (addDiag) { ans.AddDiagnosis(diag); } } return(ans); }