/// <summary>
        /// Get the observed input counts
        /// </summary>
        public static ObservedInputCounts GetObservedInputCount(ReadOnlyArray <ObservedInput> observedInputs)
        {
            ObservedInputCounts count = default(ObservedInputCounts);

            foreach (var item in observedInputs)
            {
                switch (item.Type)
                {
                case ObservedInputType.AbsentPathProbe:
                    count.AbsentPathProbeCount++;
                    break;

                case ObservedInputType.DirectoryEnumeration:
                    count.DirectoryEnumerationCount++;
                    break;

                case ObservedInputType.ExistingDirectoryProbe:
                    count.ExistingDirectoryProbeCount++;
                    break;

                case ObservedInputType.FileContentRead:
                    count.FileContentReadCount++;
                    break;

                case ObservedInputType.ExistingFileProbe:
                    count.ExistingFileProbeCount++;
                    break;

                default:
                    throw new NotImplementedException("Unrecognized Observed Input Type");
                }
            }

            return(count);
        }
        /// <inheritdoc />
        public override void ProcessFingerprintComputed(ProcessFingerprintComputationEventData data)
        {
            if (data.Kind == FingerprintComputationKind.CacheCheck)
            {
                ObservedInputCounts?cacheMaxCounts = null;
                if (data.StrongFingerprintComputations != null)
                {
                    foreach (var strongFingerprintComputation in data.StrongFingerprintComputations)
                    {
                        if (strongFingerprintComputation.Succeeded)
                        {
                            var computationCounts = GetObservedInputCount(strongFingerprintComputation.ObservedInputs);
                            cacheMaxCounts = cacheMaxCounts?.Max(computationCounts) ?? computationCounts;
                        }
                    }

                    if (cacheMaxCounts.HasValue)
                    {
                        m_observedInputCounts.TryAdd(data.PipId, cacheMaxCounts.Value);
                    }
                }
            }
            else
            {
                Contract.Assert(data.Kind == FingerprintComputationKind.Execution);

                if (((data.StrongFingerprintComputations?.Count ?? 0) != 0) && data.StrongFingerprintComputations[0].Succeeded)
                {
                    ObservedInputCounts cacheMaxCounts;
                    if (m_observedInputCounts.TryRemove(data.PipId, out cacheMaxCounts))
                    {
                        var executionCounts = GetObservedInputCount(data.StrongFingerprintComputations[0].ObservedInputs);
                        ObservedInputCounts.LogForLowObservedInputs(
                            Events.StaticContext,
                            GetDescription(GetPip(data.PipId)),
                            executionCounts: executionCounts,
                            cacheMaxCounts: cacheMaxCounts);
                    }
                }
            }
        }