Exemple #1
0
        /// <summary>
        /// finds max 'i' in svm solver, its called in separate thread
        /// and find it in specific range of array
        /// </summary>
        /// <param name="threadData"></param>
        private void FindMaxPairInThread(object threadData)
        {
            MaxFindingThreadData data     = (MaxFindingThreadData)threadData;
            Pair <int, float>    localMax = data.Pair;

            for (int t = data.Range.Item1; t < data.Range.Item2; t++)
            {
                if (y[t] == +1)
                {
                    if (!is_upper_bound(t))
                    {
                        if (-G[t] > localMax.Second) //wcześniej było większe lub równe
                        {
                            localMax.First  = t;
                            localMax.Second = -G[t];
                        }
                    }
                }
                else
                {
                    if (!is_lower_bound(t))
                    {
                        if (G[t] > localMax.Second) //wcześniej było >=
                        {
                            localMax.First  = t;
                            localMax.Second = G[t];
                        }
                    }
                }
            }
            //signal for thread that computation complete
            data.ResetEvent.Set();
        }
Exemple #2
0
        public ParallelSmoFanSolver2(Problem <TProblemElement> problem, IKernel <TProblemElement> kernel, float C)
            : base(problem, kernel, C)
        {
            //todo: add checking if kernel is initialized

            //remeber that we have variable kernel in base class
            Q = new CachedKernel <TProblemElement>(problem, kernel);

            //get diagonal cache, kernel should compute that
            QD = Q.GetQD();

            //Shrinking = false;
            //todo: change it, add array to base class with different penalty for labels
            Cp          = C;
            Cn          = C;
            problemSize = problem.ElementsCount;

            numberOfThreads = Environment.ProcessorCount;

            rangeSize   = (int)Math.Ceiling((problemSize + 0.0) / numberOfThreads);
            partition   = Partitioner.Create(0, problemSize, rangeSize);
            resetEvents = new ManualResetEvent[numberOfThreads];
            //max data structures
            maxPairsWaitCallbacks = new WaitCallback[numberOfThreads];
            //data for finding maxPair in svm solver
            maxPairThreadsData = new MaxFindingThreadData[numberOfThreads];
            maxPairs           = new Pair <int, float> [numberOfThreads];

            //min data structures
            minPairsWaitCallbacks = new WaitCallback[numberOfThreads];
            //data for finding minPair in svm solver
            minPairThreadsData = new MinFindingThreadData[numberOfThreads];
            minPairs           = new Pair <int, float> [numberOfThreads];

            //int startRange = 0;
            //int endRange = startRange + rangeSize;

            Tuple <int, int>[] ranges = ListHelper.CreateRanges(problemSize, numberOfThreads);

            for (int i = 0; i < numberOfThreads; i++)
            {
                resetEvents[i] = new ManualResetEvent(false);
                maxPairs[i]    = new Pair <int, float>(-1, float.NegativeInfinity);

                maxPairThreadsData[i] = new MaxFindingThreadData()
                {
                    ResetEvent = resetEvents[i],
                    Pair       = maxPairs[i],
                    //Range = new Tuple<int, int>(startRange, endRange)
                    Range = ranges[i]
                };

                maxPairsWaitCallbacks[i] = new WaitCallback(this.FindMaxPairInThread);

                minPairs[i]           = new Pair <int, float>(-1, float.PositiveInfinity);
                minPairThreadsData[i] = new MinFindingThreadData()
                {
                    ResetEvent = resetEvents[i],
                    Pair       = minPairs[i],
                    //Range = new Tuple<int, int>(startRange, endRange)
                    Range = ranges[i]
                };

                minPairsWaitCallbacks[i] = new WaitCallback(this.FindMinPairInThread);


                //change the range
                //startRange = endRange;
                //int rangeSum = endRange + rangeSize;
                //endRange = rangeSum < problemSize ? rangeSum : problemSize;
            }
        }