/// <summary> /// Вычисление синхронизации весов ДМЧ в процентах. /// </summary> /// <param name="recipient">Получатель (второй абонент).</param> /// <param name="weights">Веса ДМЧ.</param> /// <param name="weightRange">Диапозон весов.</param> /// <returns> /// Если запрос на синхронизацию весов ДМЧ от второго абонента был - возвращает процент синхронизации весов ДМЧ. /// Иначе - запрос записывается в список запросов с нужный методом синхронизации. /// </returns> public async Task SendWeights(string recipient, int[][] weights, int weightRange) { SyncRequest request = new SyncRequest { Sender = Context.UserIdentifier, Recipient = recipient, Way = new SyncWay { Weights = weights } }; SyncRequest recipientRequest = SyncRequestsList.GetOrAdd(request, syncReq => syncReq.Sender == recipient && syncReq.Recipient == Context.UserIdentifier && syncReq.Way.Weights != null); if (recipientRequest != null) { await Clients.User(Context.UserIdentifier).SendAsync("ReceiveValueSyncWeights", recipientRequest.Way.Weights); await Clients.User(recipient).SendAsync("ReceiveValueSyncWeights", weights); } }
/// <summary> /// Запрос на отправку <paramref name="tau"/> значений Тау (результат выполнения ДМЧ) второму абоненту. /// </summary> /// <param name="recipient">Получатель (второй абонент).</param> /// <param name="tau">Результат выполнения ДМЧ, который нужно передать второму абоненту.</param> /// <returns> /// Если запрос на передачу Тау от второго абонента был - то вызывается функция <see cref="ReceiveTau"/> /// у обоих клиентов, передавая Тау другого абонента /// Иначе - запрос записывается в список запросов с нужный методом синхронизации. /// </returns> public async Task SendTau(string recipient, int tau) { SyncRequest request = new SyncRequest { Sender = Context.UserIdentifier, Recipient = recipient, Way = new SyncWay { Tau = tau } }; // поиск запроса от userName на передачу тау SyncRequest recipientRequest = SyncRequestsList.GetOrAdd(request, syncReq => syncReq.Sender == recipient && syncReq.Recipient == Context.UserIdentifier && syncReq.Way.Tau != null); if (recipientRequest != null) { // отправка Тау обоим клиентам await Clients.User(Context.UserIdentifier).SendAsync("ReceiveTau", recipientRequest.Way.Tau.Value); await Clients.User(recipient).SendAsync("ReceiveTau", tau); } }
/// <summary> /// Запрос на получение случайных входных значений для ДМЧ. /// </summary> /// <param name="recipient">Получатель (второй абонент).</param> /// <param name="numberInputNeurons">Размер первого измерения (кол-во входных нейронов в ДМЧ).</param> /// <param name="numberHiddenNeurons">Размер второго измерения (кол-во скрытых нейронов в ДМЧ).</param> /// <returns> /// Если запрос от второго абонента на получение случайного массива был - то /// вызывается функция <see cref="ReceiveValuesInput"/> у обоих клиентов и передаёт /// в неё двумерный массив со случайными значениями -1 и 1 /// Иначе - запрос записывается в список запросов с нужный методом синхронизации. /// </returns> public async Task SendValuesInput(string recipient, uint numberInputNeurons, uint numberHiddenNeurons) { SyncRequest request = new SyncRequest { Sender = Context.UserIdentifier, Recipient = recipient, Way = new SyncWay { isGetVector = true } }; // поиск запроса от userName на получение случайного вектора SyncRequest recipientRequest = SyncRequestsList.GetOrAdd(request, syncReq => syncReq.Sender == recipient && syncReq.Recipient == Context.UserIdentifier && syncReq.Way.isGetVector); if (recipientRequest != null) { // генерация вектора int[][] randomVector = await Task.Run(() => GetRandomVector(numberInputNeurons, numberHiddenNeurons)); await Clients.User(Context.UserIdentifier).SendAsync("ReceiveValuesInput", randomVector); await Clients.User(recipient).SendAsync("ReceiveValuesInput", randomVector); } }
/// <summary> /// Проверка синхронизации весов ДМЧ обоих клиентов по хэшу этих весов <paramref name="hashWeights"/>. /// </summary> /// <param name="recipient">Получатель (второй абонент).</param> /// <param name="hashWeights">Значение хэша весов ДМЧ.</param> /// <returns> /// Если запрос на синхронизацию весов ДМЧ от второго абонента был - вызывается функция <see cref="ReceiveSyncWeights"/> /// у обоих клиентов с булевым результатом синхронизации /// Иначе - запрос записывается в список запросов с нужный методом синхронизации. /// </returns> public async Task SendHashWeights(string recipient, string hashWeights) { SyncRequest request = new SyncRequest { Sender = Context.UserIdentifier, Recipient = recipient, Way = new SyncWay { HashedWeighs = hashWeights } }; // поиск запроса от userName на синхронизацию весов SyncRequest recipientRequest = SyncRequestsList.GetOrAdd(request, syncReq => syncReq.Sender == recipient && syncReq.Recipient == Context.UserIdentifier && !string.IsNullOrEmpty(syncReq.Way.HashedWeighs)); if (recipientRequest != null) { // отправка результата синхронизации весов обоим клиентам await Clients.User(Context.UserIdentifier).SendAsync("ReceiveHashWeights", recipientRequest.Way.HashedWeighs); await Clients.User(recipient).SendAsync("ReceiveHashWeights", hashWeights); } }