public bool ProcessResponses(SnowballParameters parameters, IEnumerable <Hash <Block>?> responses) { if (Confidence > parameters.Beta) { return(true); } var threshold = parameters.Alpha * parameters.K; var responseValues = responses.GroupBy(response => response) .Where(group => group.Count() > threshold) .Select(group => group.Key); foreach (var responseValue in responseValues) { if (responseValue == null) { continue; // NOTE: Should probably be retrying erroring results as per original Snowball paper } Memory[responseValue] = Memory.TryGetValue(responseValue, out var answerCount) ? answerCount + 1 : 1; if (CurrentValue == null) { CurrentValue = responseValue; } if (Memory[responseValue] > Memory[CurrentValue]) { CurrentValue = responseValue; } if (responseValue != LastValue) { Confidence = 0; LastValue = responseValue; } else { if (Confidence++ > parameters.Beta) { return(true); } } } return(false); }
public IEnumerable <Peer> SamplePeers(SnowballParameters parameters, Peer[] peers) { return(peers.OrderBy(_ => RandomNumberGenerator.GetInt32(peers.Length)).Take(parameters.K)); }