Example #1
0
        private void FindDiagnosisFromConflicts()
        {
            var hittingSets        = SwitchingAlgorithmHittingSetFinder.FindHittingSet(_conflictsSetDataStructure.GetCompSets(), RequiredNumOfHittinSets, IdToGates);
            var filteredHittingSet = FilterNewHittingSsets(_hittingSetsFromConflicts, hittingSets);

            _hittingSetsFromConflicts.AddRange(filteredHittingSet);
            var numOfFilteredHittingSets = filteredHittingSet.Count;
            var taskCount  = numOfFilteredHittingSets % NumOfThreads == 0 ? numOfFilteredHittingSets / NumOfThreads : (numOfFilteredHittingSets / NumOfThreads) + 1;
            var tasks      = new Task[taskCount];
            var startIndex = 0;
            var endIndex   = numOfFilteredHittingSets < NumOfThreads ? numOfFilteredHittingSets : NumOfThreads;

            for (var index = 0; index < taskCount; index++)
            {
                var localStartIndex = startIndex;
                var localEndIndex   = endIndex;
                tasks[index] = Task.Factory.StartNew(() => AddComponentFromConflicts(filteredHittingSet, localStartIndex, localEndIndex));
                if (endIndex == numOfFilteredHittingSets)
                {
                    break;
                }
                startIndex = endIndex;
                if (endIndex + NumOfThreads > numOfFilteredHittingSets)
                {
                    endIndex = numOfFilteredHittingSets;
                }
                else
                {
                    endIndex = endIndex + NumOfThreads;
                }
            }
            Task.WaitAll(tasks);
        }
        public void TestFindHittingSet()
        {
            Dictionary <int, Gate> idTGates = new Dictionary <int, Gate>();

            Gate gate1 = new MultipleInputComponent(1, Gate.Type.and);

            idTGates.Add(gate1.Id, gate1);
            Gate gate2 = new MultipleInputComponent(2, Gate.Type.or);

            idTGates.Add(gate2.Id, gate2);
            Gate gate3 = new MultipleInputComponent(3, Gate.Type.xor);

            idTGates.Add(gate3.Id, gate3);
            Gate gate4 = new MultipleInputComponent(4, Gate.Type.and);

            idTGates.Add(gate4.Id, gate4);

            List <Gate> gateList1 = new List <Gate>();

            gateList1.Add(gate1);
            gateList1.Add(gate2);
            gateList1.Add(gate3);
            Conflict conflict1 = new Conflict(gateList1);

            List <Gate> gateList2 = new List <Gate>();

            gateList2.Add(gate3);
            gateList2.Add(gate4);
            Conflict conflict2 = new Conflict(gateList2);

            List <Gate> gateList3 = new List <Gate>();

            gateList3.Add(gate2);
            gateList3.Add(gate4);
            Conflict conflict3 = new Conflict(gateList3);

            List <List <Gate> > conflictSet = new List <List <Gate> >();

            conflictSet.Add(conflict1.TheConflict);
            conflictSet.Add(conflict2.TheConflict);
            conflictSet.Add(conflict3.TheConflict);
            List <List <Gate> > hittingSets = SwitchingAlgorithmHittingSetFinder.FindHittingSet(conflictSet, 10, idTGates);

            Assert.AreEqual(hittingSets.Count, 4);

            printSetList(hittingSets);
        }