/** * Equals only iff every implicant is in the same order and same subarea in both */ public override bool Equals(object obj) { QuineColumn column = (QuineColumn)obj; if (column.implicantLength != this.implicantLength) { return(false); } if (column.implicants.Count != this.implicants.Count) { return(false); } for (int i = 0; i < implicants.Count; i++) { if (implicants[i].Count != this.implicants[i].Count) { return(false); } } for (int i = 0; i < this.implicants.Count; i++) { for (int j = 0; j < this.implicants[i].Count; j++) { if (!this.implicants[i][j].Equals(column.implicants[i][j])) { return(false); } } } return(true); }
/** * Finds the prime Implicants by repeatedly simplify the resulting columns */ private void findPrimeImplicants() { int currentColumnNum = 0; do { //System.Console.WriteLine(this.columns[currentColumnNum].ToString()); QuineColumn currentColumn = this.columns[currentColumnNum]; Tuple <QuineColumn, List <Implicant> > tempTuple = QuineColumn.ColumnSimplify(currentColumn); //this.primeImplicants.AddRange(tempTuple.Item2); this.primeImplicants.AddRange(tempTuple.Item2); this.columns.Add(tempTuple.Item1); currentColumnNum += 1; } while (!this.columns[currentColumnNum].Equals(columns[currentColumnNum - 1])); // continue as long as simplification still occurs this.foundPrimes = true; }
/** * Simplifies a list and removes any dublicates */ public static Tuple <QuineColumn, List <Implicant> > ColumnSimplify(QuineColumn column) { List <List <Implicant> > newColumn = new List <List <Implicant> >(); List <Implicant> unusedImplcants = buildUnusedList(column.implicants); for (int i = 0; i <= column.implicantLength; i++) { newColumn.Add(new List <Implicant>()); } for (int i = 0; i < column.implicants.Count - 1; i++) // Loops through the super list which sorts sublists based on the number of ones { for (int j = 0; j < column.implicants[i].Count; j++) // one column looping through { for (int m = 0; m < column.implicants[i + 1].Count; m++) // Lopp through next column looking for a match { if (Implicant.CanCombine(column.implicants[i][j], column.implicants[i + 1][m])) { //Console.WriteLine($"Trying to combine: {column[i][j].ToString()} {column[i + 1][m].ToString()}"); //Console.WriteLine($"These can combine: {Implicant.CanCombine(column[i][j], column[i+1][m])}"); Implicant newImp = Implicant.Combine(column.implicants[i][j], column.implicants[i + 1][m]); //Console.WriteLine($"Num Ones: {newImp.numOnes}"); //Console.WriteLine($"{newImp.ToString()}"); newColumn[newImp.numOnes].Add(newImp); if (unusedImplcants.Contains(column.implicants[i][j])) // Checks if either implucant is in the unused column, if unused removes and updates unused list { unusedImplcants.Remove(column.implicants[i][j]); } if (unusedImplcants.Contains(column.implicants[i + 1][m])) { unusedImplcants.Remove(column.implicants[i + 1][m]); } } } } } newColumn = QuineColumn.removeDublicates(newColumn); QuineColumn nextColumn = new QuineColumn(column.implicantLength, newColumn); return(Tuple.Create(nextColumn, unusedImplcants)); }