void IterateBindAndEvaluate()

in Tools/WinMLRunner/src/Run.cpp [402:469]


void IterateBindAndEvaluate(const int maxBindAndEvalIterations, int& lastIteration, CommandLineArgs& args, OutputHelper& output,
                            LearningModelSession& session, HRESULT& lastHr,
                            const LearningModelDeviceWithMetadata& device, const InputBindingType inputBindingType,
                            const InputDataType inputDataType,
                            Profiler<WINML_MODEL_TEST_PERF>& profiler, const std::wstring& imagePath)
{
    Timer iterationTimer;
    for (; lastIteration < maxBindAndEvalIterations; lastIteration++)
    {
#if defined(_AMD64_)
        // PIX markers only work on AMD64
        // If PIX tool was attached then capture already began for the first iteration before
        // session creation. This is to begin PIX capture for each iteration after the first
        // iteration.
        if (lastIteration > 0)
        {
            StartPIXCapture(output);
        }
#endif
        if (args.IsTimeLimitIterations())
        {
            if (lastIteration == 1)
            {
                iterationTimer.Start();
            }
            else if (lastIteration >= 1 && iterationTimer.Stop() >= args.IterationTimeLimit())
            {
                std::cout << "Iteration time exceeded limit specified. Exiting.." << std::endl;
                break;
            }
        }
        LearningModelBinding context(session);
        lastHr = BindInputs(context, session, output, device, args, inputBindingType, inputDataType, lastIteration, profiler, imagePath);
        if (FAILED(lastHr))
        {
            break;
        }
        LearningModelEvaluationResult result = nullptr;
        bool capture_perf = args.IsPerformanceCapture() || args.IsPerIterationCapture();
        lastHr = EvaluateModel(result, context, session, args, output, capture_perf, lastIteration, profiler);
        if (FAILED(lastHr))
        {
            output.PrintEvaluatingInfo(lastIteration + 1, device.DeviceType, inputBindingType, inputDataType,
                                       device.DeviceCreationLocation, "[FAILED]");
            break;
        }
        else if (!args.TerseOutput() || lastIteration == 0)
        {
            output.PrintEvaluatingInfo(lastIteration + 1, device.DeviceType, inputBindingType, inputDataType,
                                       device.DeviceCreationLocation, "[SUCCESS]");

            // Only print eval results on the first iteration, iff it's not garbage data
            if (!args.IsGarbageInput() || args.IsSaveTensor())
            {
                BindingUtilities::PrintOrSaveEvaluationResults(session.Model(), args, result.Outputs(), output, lastIteration);
            }

            if (args.TerseOutput() && args.NumIterations() > 1)
            {
                printf("Binding and Evaluating %d more time%s...", args.NumIterations() - 1,
                       (args.NumIterations() == 2 ? "" : "s"));
            }
        }
#if defined(_AMD64_)
        EndPIXCapture(output);
#endif
    }
}