public void CheckGradientExhaustive(Layer <T> layer, BlobCollection <T> colBottom, BlobCollection <T> colTop, int nCheckBottom = -1)
        {
            Stopwatch sw = new Stopwatch();

            layer.Setup(colBottom, colTop);

            m_log.CHECK_GT(colTop.Count, 0, "Exhaustive mode requires at least one top blob.");
            sw.Start();

            int nTotal = 0;
            int nIdx   = 0;

            for (int i = 0; i < colTop.Count; i++)
            {
                nTotal += colTop[i].count();
            }

            TestingProgressSet progress = new TestingProgressSet();

            for (int i = 0; i < colTop.Count; i++)
            {
                for (int j = 0; j < colTop[i].count(); j++)
                {
                    CheckGradientSingle(layer, colBottom, colTop, nCheckBottom, i, j);
                    nIdx++;

                    if (sw.Elapsed.TotalMilliseconds > 1000)
                    {
                        double dfPct = (double)nIdx / (double)nTotal;
                        Trace.WriteLine(m_strBaseType + ": Check gradient exhaustive at " + dfPct.ToString("P") + "...");

                        progress.SetProgress(dfPct);

                        sw.Restart();
                    }
                }
            }

            progress.SetProgress(0);
            progress.Dispose();
        }