Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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);
            }
        }
Esempio n. 3
0
        /// <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);
            }
        }
Esempio n. 4
0
        /// <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);
            }
        }