Beispiel #1
0
        public async Task <object> MatrixMultiply(MatrixMultiplyRequest matrixMultiplyRequest, CancellationToken cancellationToken)
        {
            int rows_1    = matrixMultiplyRequest.Matrix1.GetUpperBound(0) + 1;
            int columns_1 = matrixMultiplyRequest.Matrix1[0].Length;
            int rows_2    = matrixMultiplyRequest.Matrix2.GetUpperBound(0) + 1;
            int columns_2 = matrixMultiplyRequest.Matrix2[0].Length;

            if (rows_1 > 2500 || columns_1 > 2500 || rows_2 > 2500 || columns_2 > 2500)
            {
                return(new ResponseBase <string> {
                    Status = ResponeStatusCodes.BadRequest, Data = ResponseMessages.MatrixSizesEror
                });
            }

            if (columns_1 != rows_2)
            {
                return(new ResponseBase <string> {
                    Status = ResponeStatusCodes.BadRequest, Data = ResponseMessages.MatrixSizesEror
                });
            }

            try
            {
                int userPublicDataId = _context.UsersPublicData.FirstOrDefault(u => u.UserId == matrixMultiplyRequest.UserId).Id;

                int amountOFAllExecutableTasks = await this._context.History.CountAsync(history => history.IsCurrentlyExecuted);

                if (amountOFAllExecutableTasks == AmountOfSimulateniouslyExecutedTasks)
                {
                    return(new ResponseBase <string> {
                        Status = ResponeStatusCodes.LimitOfExecutableTasks, Data = ResponseMessages.LimitOfExecutableTasks
                    });
                }

                int amountOfSimultaneouslyExecutedTasks = await this._context.History.Where(item => item.UserPublicDataId == userPublicDataId && item.IsCurrentlyExecuted).CountAsync();

                if (amountOfSimultaneouslyExecutedTasks + 1 /*+1 means +1 thread for current task*/ > AmountOfSimulateniouslyExecutedUserTasks)
                {
                    return(new ResponseBase <string> {
                        Status = ResponeStatusCodes.LimitOfExecutableTasks, Data = ResponseMessages.LimitOfExecutableTasksForUser
                    });
                }

                string  formattedMatrixSizes = this.FormatMatrixSize(rows_1, columns_1, rows_2, columns_2);
                History history = await this.AddMathResultToDb(result : 0, userPublicDataId : userPublicDataId, formattedMatrixSize : formattedMatrixSizes, isBeingExecuted : true);

                var matrix3 = new int[rows_1, columns_2];

                for (var i = 0; i < rows_1; i++)
                {
                    for (var j = 0; j < columns_2; j++)
                    {
                        matrix3[i, j] = 0;
                        if (cancellationToken.IsCancellationRequested)
                        {
                            await this.PreviousStateDueToCanceledRequest(history : history, cancellationToken : cancellationToken);
                        }

                        for (var k = 0; k < columns_1; k++)
                        {
                            matrix3[i, j] += matrixMultiplyRequest.Matrix1[i][k] * matrixMultiplyRequest.Matrix2[k][j];
                            if (cancellationToken.IsCancellationRequested)
                            {
                                await this.PreviousStateDueToCanceledRequest(history : history, cancellationToken : cancellationToken);
                            }
                        }
                    }
                }

                long matrixSum = 0;

                for (var i = 0; i < rows_1; i++)
                {
                    for (var j = 0; j < columns_2; j++)
                    {
                        matrixSum += matrix3[i, j];
                        if (cancellationToken.IsCancellationRequested)
                        {
                            await this.PreviousStateDueToCanceledRequest(history : history, cancellationToken : cancellationToken);
                        }
                    }
                }
                history.IsCurrentlyExecuted = false;
                history.MatrixSum           = matrixSum;
                await this.ModifyHistoryInDb(historyToModify : history);

                return(new ResponseBase <MatrixMultiplyResponse> {
                    Data = new MatrixMultiplyResponse {
                        MatrixSum = matrixSum, ResultMatrix = Newtonsoft.Json.JsonConvert.DeserializeObject <int[][]>(JsonConvert.SerializeObject(matrix3))
                    }
                });
            }
            catch (Exception ex)
            {
                return(new ResponseBase <string> {
                    Status = ResponeStatusCodes.UnexpectedServerError, Data = $"Ooops. {ex.Message}"
                });
            }
        }
Beispiel #2
0
        public async Task <ActionResult> MatrixMultiply([FromBody] MatrixMultiplyRequest matrixMultiplyRequest, CancellationToken cancellationToken)
        {
            object result = await _mathService.MatrixMultiply(matrixMultiplyRequest : matrixMultiplyRequest, cancellationToken : cancellationToken);

            return(new JsonResult(result));
        }