private void PublishOrdersAfterReplay()
        {
            string currencyPair = "XBTUSD";
            Order  order1       = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 100, 406, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order1));
            Order order2 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 101, 406, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order2));
            Order order3 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 102, 405, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order3));
            Order order4 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "sell", 100, 407, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order4));
            Order order5 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "sell", 104, 409, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order5));
            Order order6 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "sell", 104, 413, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order6));
            ManualResetEvent resetEvent = new ManualResetEvent(false);

            resetEvent.WaitOne(10000);
        }
Пример #2
0
        public async Task OppositeSymbolTest()
        {
            // Arrange
            InputPayload InputPayload = new InputPayload()
            {
                Move = 1,
                AzurePlayerSymbol = "X",
                HumanPlayerSymbol = "O",
                GameBoard         = new List <string> {
                    "X", "O", "?", "?", "?", "?", "?", "?", "?"
                },
            };

            // Act
            HttpOperationResponse <object> resultObject = await _client.ProcessComplexInputWithHttpMessagesAsync(InputPayload);

            // Assert
            Assert.AreEqual(StatusCodes.Status200OK, (int)resultObject.Response.StatusCode);
            OutputPayload response = resultObject.Body as OutputPayload;

            if (response != null)
            {
                Assert.IsTrue(
                    (response.AzurePlayerSymbol == "X" && response.HumanPlayerSymbol == "O") ||
                    (response.AzurePlayerSymbol == "O" && response.HumanPlayerSymbol == "X"));
            }
            else
            {
                Assert.Fail("Expected an ExecuteMove response but didn't receive one");
            }
        }
Пример #3
0
 public CalculateResponse Compute(InputPayload payload)
 {
     if (Validate(payload))
     {
         result.Value = payload.Value1 * payload.Value2;
     }
     return(result);
 }
        private void Scenario1()
        {
            string currencyPair = "XBTUSD";
            Order  order1       = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 100, 400, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order1));
            Order order2 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 101, 401, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order2));
            Order order3 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 102, 402, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order3));
            Order order4 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 103, 403, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order4));
            Order order5 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 104, 404, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order5));
            Order order6 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 105, 405, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order6));
            Order order7 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 106, 406, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order7));
            Order order8 = OrderFactory.CreateOrder("4444", currencyPair, "limit", "sell", 100, 410, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order8));
            Order order9 = OrderFactory.CreateOrder("4444", currencyPair, "limit", "sell", 101, 409, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order9));
            Order order10 = OrderFactory.CreateOrder("4444", currencyPair, "limit", "sell", 102, 407, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order10));
            Order order11 = OrderFactory.CreateOrder("4444", currencyPair, "limit", "sell", 103, 406, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order11));
            Order order12 = OrderFactory.CreateOrder("4444", currencyPair, "limit", "sell", 104, 405, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order12));
            Order order13 = OrderFactory.CreateOrder("4444", currencyPair, "limit", "sell", 105, 411, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order13));
            Order order14 = OrderFactory.CreateOrder("4444", currencyPair, "limit", "sell", 106, 412, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order14));
            Order order15 = OrderFactory.CreateOrder("5555", currencyPair, "limit", "buy", 107, 400, new StubbedOrderIdGenerator());

            InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order15));
            ManualResetEvent resetEvent = new ManualResetEvent(false);

            resetEvent.WaitOne(20000);
        }
Пример #5
0
 public bool Validate(InputPayload payload)
 {
     if ((payload.Value1 == float.MinValue) || (payload.Value2 == float.MinValue))
     {
         result.Success = false;
         result.Message = "Invalid parameter value";
         return(false);
     }
     else
     {
         return(true);
     }
 }
Пример #6
0
        public void CreateOrder_PublishToInputDisruptor_JournalerShouldSaveTheEvent()
        {
            Order order = OrderFactory.CreateOrder("1234", "XBTUSD", "limit", "buy", 5, 10,
                                                   new StubbedOrderIdGenerator());
            InputPayload payload = InputPayload.CreatePayload(order);

            InputDisruptorPublisher.Publish(payload);
            _manualResetEvent.WaitOne(5000);
            //retrieve order
            Order savedOrder = _eventStore.GetEvent(order.OrderId.Id.ToString()) as Order;

            Assert.NotNull(savedOrder);
            Assert.AreEqual(savedOrder, order);
        }
Пример #7
0
        public void CreateAndLogOrder_GetAllTheOrdersBackFromTheEventStore_CheckIfOrderIsRetreivedProperly()
        {
            Order order = OrderFactory.CreateOrder("1234", "XBTUSD", "limit", "buy", 5, 10,
                                                   new StubbedOrderIdGenerator());
            InputPayload payload = InputPayload.CreatePayload(order);

            InputDisruptorPublisher.Publish(payload);
            _manualResetEvent.WaitOne(5000);
            //retrieve order
            Order savedOrder = _eventStore.GetEvent(order.OrderId.Id.ToString()) as Order;

            Assert.NotNull(savedOrder);
            Assert.AreEqual(savedOrder, order);
        }
        private void OnInput(InputPayload input)
        {
            switch (input.Type)
            {
            case InputPayload.Action.Up:     spaceship.SpeedUp();     break;

            case InputPayload.Action.Down:   spaceship.SpeedDown();   break;

            case InputPayload.Action.Left:   spaceship.RotateLeft();  break;

            case InputPayload.Action.Right:  spaceship.RotateRight(); break;

            case InputPayload.Action.Button: weapons.Shoot();         break;
            }
        }
Пример #9
0
        public CalculateResponse Post(InputPayload payload)
        {
            CalculateResponse response = null;

            //Log all requests
            log.Info(string.Format("HttpPost requested {0}", new JavaScriptSerializer().Serialize(payload)));
            Operators.Calculator Calculator = null;
            try
            {
                switch (payload.Operation)
                {
                case "add":
                    log.Info("Add operation executed");
                    Calculator = new Operators.Calculator(new Operators.Add());
                    break;

                case "subtract":
                    log.Info("Subtract operation executed");
                    Calculator = new Operators.Calculator(new Operators.Subtract());
                    break;

                case "multiply":
                    log.Info("Multiply operation executed");
                    Calculator = new Operators.Calculator(new Operators.Multiply());
                    break;

                case "divide":
                    log.Info("Divide operation executed");
                    Calculator = new Operators.Calculator(new Operators.Divide());
                    break;

                default:
                    log.Error(string.Format("Invalid operation {0}", payload.Operation));
                    Calculator = new Operators.Calculator(new Operators.InvalidOperation());
                    break;
                }
            }
            catch (Exception ex)
            {
                //log invalid paramter passing
                log.Error(string.Format("Exception error occur {0}", ex.Message));
                Calculator = new Operators.Calculator(new Operators.InvalidParameter());
            }

            response = Calculator.Compute(payload);
            log.Info(string.Format("HttpPost response {0}", new JavaScriptSerializer().Serialize(response)));
            return(response);
        }
        public async Task <ActionResult> SampleInnerMethod([FromBody] InputPayload input)
        {
            try
            {
                _logger.Information("[SampleInnerMethod] - Param1:[" + input.Param1 + "] - Param2:[" + input.Param2 + "]");
                string get_data = await _repository.Get(input.Param1);

                string save_data = await _repository.Save(input.Param2);

                return(Ok("Calling sample method finished."));
            }
            catch (Exception ex)
            {
                _logger.Error(ex.Message);
                return(BadRequest());
            }
        }
Пример #11
0
        /// <summary>
        /// payload is either Order or CancelOrder
        /// </summary>
        /// <param name="payload"></param>
        /// <returns></returns>
        public static InputPayload CreatePayload(object payload)
        {
            InputPayload inputPayload = null;

            if (payload is Order)
            {
                inputPayload         = new InputPayload();
                inputPayload.Order   = payload as Order;
                inputPayload.IsOrder = true;
            }
            else if (payload is OrderCancellation)
            {
                inputPayload = new InputPayload();
                inputPayload.OrderCancellation = payload as OrderCancellation;
                inputPayload.IsOrder           = false;
            }
            return(inputPayload);
        }
        public NewOrderRepresentation CreateOrder(CreateOrderCommand orderCommand)
        {
            IOrderIdGenerator orderIdGenerator = ContextRegistry.GetContext()["OrderIdGenerator"] as IOrderIdGenerator;

            Tuple <string, string> splittedCurrencyPairs = CurrencySplitterService.SplitCurrencyPair(orderCommand.Pair);

            Order order = OrderFactory.CreateOrder(orderCommand.TraderId, orderCommand.Pair,
                                                   orderCommand.Type, orderCommand.Side, orderCommand.Volume, orderCommand.Price, orderIdGenerator);

            if (_balanceValidationService.FundsConfirmation(order.TraderId.Id, splittedCurrencyPairs.Item1,
                                                            splittedCurrencyPairs.Item2, order.Volume.Value, order.Price.Value, order.OrderSide.ToString(),
                                                            order.OrderId.Id))
            {
                InputDisruptorPublisher.Publish(InputPayload.CreatePayload(order));
                return(new NewOrderRepresentation(order));
            }
            throw new InvalidOperationException("Not Enough Balance for Trader with ID: " + orderCommand.TraderId);
        }
Пример #13
0
        [ProducesResponseType(typeof(int), StatusCodes.Status400BadRequest)] // Tells swagger that the response format will be an int for a BadRequest (400)
        public ActionResult <OutputPayload> ProcessComplexInput([FromBody] InputPayload inputPayload)
        {
            // Ensure valid player markers, valid board
            if (!(inputPayload.ValidPlayerMarkers()) ||
                (!(TicTacToe.BoardIsValid(inputPayload.gameBoard))))
            {
                return(BadRequest(400));
            }

            // Compute response
            TicTacToe ttt = new TicTacToe(inputPayload.gameBoard,
                                          inputPayload.azurePlayerSymbol, inputPayload.humanPlayerSymbol);
            WinStatus ws = ttt.winStatus;

            // If game isn't over, get the AI's next move
            int?nextMove;

            if (ws.winner.Equals(TicTacToe.GAME_NOT_DONE_STR))
            {
                int choice = ttt.MinimaxWithPruningMove();
                ttt[TicTacToe.IndexToTuple(choice)] = inputPayload.azurePlayerSymbol;
                nextMove = choice;

                // Recalculate win status
                ws = TicTacToe.GetWinStatus(ttt.board);
            }
            else
            {
                nextMove = null;
            }

            // Assemble response payload
            OutputPayload complexOutput = new OutputPayload()
            {
                move = nextMove,
                azurePlayerSymbol = inputPayload.azurePlayerSymbol,
                humanPlayerSymbol = inputPayload.humanPlayerSymbol,
                winner            = ws.winner,
                winPositions      = (ws.winPositions == null) ? null : ws.winPositions.ConvertAll(i => i.ToString()),
                gameBoard         = TicTacToe.BoardToList(ttt.board),
            };

            return(complexOutput);
        }
Пример #14
0
        public async Task ValidNumberOfMarkersTest()
        {
            // Arrange
            InputPayload InputPayload = new InputPayload()
            {
                Move = 1,
                AzurePlayerSymbol = "X",
                HumanPlayerSymbol = "O",
                GameBoard         = new List <string> {
                    "X", "O", "O", "?", "?", "?", "?", "?", "?"
                },
            };

            // Act
            HttpOperationResponse <object> resultObject = await _client.ProcessComplexInputWithHttpMessagesAsync(InputPayload);

            // Assert
            Assert.AreEqual(StatusCodes.Status400BadRequest, (int)resultObject.Response.StatusCode);
        }
 public CancelOrderResponse CancelOrder(CancelOrderCommand cancelOrderCommand)
 {
     try
     {
         // Verify cancel order command
         if (_commandValidationService.ValidateCancelOrderCommand(cancelOrderCommand))
         {
             string            currencyPair = _commandValidationService.GetCurrencyPair(cancelOrderCommand.OrderId);
             OrderCancellation cancellation = new OrderCancellation(cancelOrderCommand.OrderId,
                                                                    cancelOrderCommand.TraderId, currencyPair);
             InputDisruptorPublisher.Publish(InputPayload.CreatePayload(cancellation));
             return(new CancelOrderResponse(true, "Cancel Request Accepted"));
         }
         return(new CancelOrderResponse(false, new InvalidDataException("Invalid orderid").ToString()));
     }
     catch (Exception exception)
     {
         return(new CancelOrderResponse(false, exception.Message));
     }
 }
Пример #16
0
        public async Task TieTest()
        {
            // Arrange
            InputPayload InputPayload = new InputPayload()
            {
                Move = 7,
                AzurePlayerSymbol = "X",
                HumanPlayerSymbol = "O",
                GameBoard         = new List <string> {
                    "X", "O", "X", "X", "O", "X", "O", "X", "O"
                },
            };

            // Act
            HttpOperationResponse <object> resultObject = await _client.ProcessComplexInputWithHttpMessagesAsync(InputPayload);

            OutputPayload response = resultObject.Body as OutputPayload;

            // Assert
            Assert.IsTrue(response.Winner.Equals("tie"));
        }
 public bool Validate(InputPayload payload)
 {
     return(false);
 }
Пример #18
0
 public CalculateResponse Compute(InputPayload payload)
 {
     return(operation.Compute(payload));
 }
Пример #19
0
        /// <summary>
        /// Provides an AI-generated optimal countermove to a tic-tac-toe game state
        /// by using minimax.
        /// </summary>
        /// <param name='body'>
        /// </param>
        /// <param name='customHeaders'>
        /// Headers that will be added to request.
        /// </param>
        /// <param name='cancellationToken'>
        /// The cancellation token.
        /// </param>
        /// <return>
        /// A response object containing the response body and response headers.
        /// </return>
        public async Task <HttpOperationResponse <object> > ProcessComplexInputWithHttpMessagesAsync(InputPayload body = default(InputPayload), Dictionary <string, List <string> > customHeaders = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            // Tracing
            bool   _shouldTrace  = ServiceClientTracing.IsEnabled;
            string _invocationId = null;

            if (_shouldTrace)
            {
                _invocationId = ServiceClientTracing.NextInvocationId.ToString();
                Dictionary <string, object> tracingParameters = new Dictionary <string, object>();
                tracingParameters.Add("body", body);
                tracingParameters.Add("cancellationToken", cancellationToken);
                ServiceClientTracing.Enter(_invocationId, this, "ProcessComplexInput", tracingParameters);
            }
            // Construct URL
            var _baseUrl = this.BaseUri.AbsoluteUri;
            var _url     = new Uri(new Uri(_baseUrl + (_baseUrl.EndsWith("/") ? "" : "/")), "api/v1/ttt/executemove").ToString();
            // Create HTTP transport objects
            HttpRequestMessage  _httpRequest  = new HttpRequestMessage();
            HttpResponseMessage _httpResponse = null;

            _httpRequest.Method     = new HttpMethod("POST");
            _httpRequest.RequestUri = new Uri(_url);
            // Set Headers
            if (customHeaders != null)
            {
                foreach (var _header in customHeaders)
                {
                    if (_httpRequest.Headers.Contains(_header.Key))
                    {
                        _httpRequest.Headers.Remove(_header.Key);
                    }
                    _httpRequest.Headers.TryAddWithoutValidation(_header.Key, _header.Value);
                }
            }

            // Serialize Request
            string _requestContent = null;

            if (body != null)
            {
                _requestContent      = SafeJsonConvert.SerializeObject(body, this.SerializationSettings);
                _httpRequest.Content = new StringContent(_requestContent, Encoding.UTF8);
                _httpRequest.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json; charset=utf-8");
            }
            // Set Credentials
            if (this.Credentials != null)
            {
                cancellationToken.ThrowIfCancellationRequested();
                await this.Credentials.ProcessHttpRequestAsync(_httpRequest, cancellationToken).ConfigureAwait(false);
            }
            // Send Request
            if (_shouldTrace)
            {
                ServiceClientTracing.SendRequest(_invocationId, _httpRequest);
            }
            cancellationToken.ThrowIfCancellationRequested();
            _httpResponse = await this.HttpClient.SendAsync(_httpRequest, cancellationToken).ConfigureAwait(false);

            if (_shouldTrace)
            {
                ServiceClientTracing.ReceiveResponse(_invocationId, _httpResponse);
            }
            HttpStatusCode _statusCode = _httpResponse.StatusCode;

            cancellationToken.ThrowIfCancellationRequested();
            string _responseContent = null;

            if ((int)_statusCode != 200 && (int)_statusCode != 400)
            {
                var ex = new HttpOperationException(string.Format("Operation returned an invalid status code '{0}'", _statusCode));
                _responseContent = await _httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);

                ex.Request  = new HttpRequestMessageWrapper(_httpRequest, _requestContent);
                ex.Response = new HttpResponseMessageWrapper(_httpResponse, _responseContent);
                if (_shouldTrace)
                {
                    ServiceClientTracing.Error(_invocationId, ex);
                }
                _httpRequest.Dispose();
                if (_httpResponse != null)
                {
                    _httpResponse.Dispose();
                }
                throw ex;
            }
            // Create Result
            var _result = new HttpOperationResponse <object>();

            _result.Request  = _httpRequest;
            _result.Response = _httpResponse;
            // Deserialize Response
            if ((int)_statusCode == 200)
            {
                _responseContent = await _httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);

                try
                {
                    _result.Body = SafeJsonConvert.DeserializeObject <OutputPayload>(_responseContent, this.DeserializationSettings);
                }
                catch (JsonException ex)
                {
                    _httpRequest.Dispose();
                    if (_httpResponse != null)
                    {
                        _httpResponse.Dispose();
                    }
                    throw new SerializationException("Unable to deserialize the response.", _responseContent, ex);
                }
            }
            // Deserialize Response
            if ((int)_statusCode == 400)
            {
                _responseContent = await _httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);

                try
                {
                    _result.Body = SafeJsonConvert.DeserializeObject <int?>(_responseContent, this.DeserializationSettings);
                }
                catch (JsonException ex)
                {
                    _httpRequest.Dispose();
                    if (_httpResponse != null)
                    {
                        _httpResponse.Dispose();
                    }
                    throw new SerializationException("Unable to deserialize the response.", _responseContent, ex);
                }
            }
            if (_shouldTrace)
            {
                ServiceClientTracing.Exit(_invocationId, _result);
            }
            return(_result);
        }
Пример #20
0
 /// <summary>
 /// Provides an AI-generated optimal countermove to a tic-tac-toe game state
 /// by using minimax.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='body'>
 /// </param>
 public static object ProcessComplexInput(this IRestClientSDKLibraryClient operations, InputPayload body = default(InputPayload))
 {
     return(Task.Factory.StartNew(s => ((IRestClientSDKLibraryClient)s).ProcessComplexInputAsync(body), operations, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).Unwrap().GetAwaiter().GetResult());
 }
Пример #21
0
 public ActionResult testAPI([FromBody] InputPayload model)
 {
     return(Ok());
 }
Пример #22
0
 /// <summary>
 /// Provides an AI-generated optimal countermove to a tic-tac-toe game state
 /// by using minimax.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='body'>
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <object> ProcessComplexInputAsync(this IRestClientSDKLibraryClient operations, InputPayload body = default(InputPayload), CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.ProcessComplexInputWithHttpMessagesAsync(body, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
Пример #23
0
 private static List<OutputPayload> BuildOutputs(InputPayload line, DateTime[] dates)
 {
     List<OutputPayload> outputs = new List<OutputPayload>();
     for (int i = 0; i < line.Weights.Length; i++)
     {
         var o = new OutputPayload()
         {
             Pen = line.Pen,
             TRT = line.TRT,
             Rep = line.Rep,
             Ration = line.Ration,
             ID = line.ID,
             Date = dates[i],
             Weight = line.Weights[i]
         };
         outputs.Add(o);
     }
     return outputs;
 }
Пример #24
0
        private static InputPayload GetPayloadFromLine(string line)
        {
            var fields = GetFields(line);

            var payload = new InputPayload()
            {
                Pen = fields[0],
                TRT = fields[1],
                Rep = fields[2],
                Ration = fields[3],
                ID = fields[4],
                Weights = fields.Skip(5).Select(s => !String.IsNullOrWhiteSpace(s) ? Decimal.Parse(s) : 0).ToArray()
            };

            return payload;
        }
Пример #25
0
        private static string[][] BuildOutput(InputPayload line, DateTime[] dates)
        {
            // only process files with 1 or more dates
            if (dates.Length == 0)
                return null;

            List<OutputPayload> outputs = BuildOutputs(line, dates);

            if (dates.Length > 1)
            {
                // check if the first two dates are contiguous
                if (AreDatesContiguous(dates[0], dates[1]))
                {
                    // remove the first output row
                    outputs.RemoveAt(0);

                    // set the weight value of the first output to the first two weights in the input
                    outputs[0].Weight = line.Weights.Take(2).Average();
                }

                // check if the last two dates are contiguous
                if (AreDatesContiguous(dates[dates.Length - 2], dates[dates.Length - 1]))
                {
                    // remove the 2nd to last output row
                    outputs.RemoveAt(outputs.Count - 2);

                    // set the weight value of the last output to the last two weights in the input
                    outputs[outputs.Count - 1].Weight = line.Weights.Skip(line.Weights.Length - 2).Average();
                }
            }

            string[][] results = new string[outputs.Count][];
            for (int i = 0; i < outputs.Count; i++)
            {
                if (results[i] == null)
                    results[i] = new string[11];

                // get previous values
                DateTime? prevDate = i != 0 ? outputs[i - 1].Date : (DateTime?)null;
                int? prevRunningDays = i != 0 ? outputs[i - 1].RunningDays : (int?)null;
                decimal? prevWeight = i != 0 ? outputs[i - 1].Weight : (decimal?)null;

                // set Period, Running Days, and ADG
                outputs[i].Period = i.ToString();
                outputs[i].DaysInPeriod = prevDate.HasValue ? (outputs[i].Date - prevDate).Value.Days : 1;
                outputs[i].RunningDays = prevRunningDays.HasValue ? prevRunningDays.Value + outputs[i].DaysInPeriod : 1;
                outputs[i].ADG = prevWeight.HasValue ? (outputs[i].Weight - prevWeight.Value) / outputs[i].DaysInPeriod : 0;

                // 0) Pen
                // 1) Treatment
                // 2) Replication
                // 3) Ration
                // 4) Tag
                // 5) Date
                // 6) WT
                // 7) Period
                // 8) DaysInPeriod
                // 9) RunningDays
                // 10) ADG
                results[i][0] = line.Pen;
                results[i][1] = line.TRT;
                results[i][2] = line.Rep;
                results[i][3] = line.Ration;
                results[i][4] = line.ID;
                results[i][5] = outputs[i].Date.ToShortDateString();
                results[i][6] = outputs[i].Weight.ToString();
                results[i][7] = outputs[i].Period;
                results[i][8] = outputs[i].DaysInPeriod.ToString();
                results[i][9] = outputs[i].RunningDays.ToString();
                results[i][10] = outputs[i].ADG.ToString();
            }

            return results;
        }
 public CalculateResponse Compute(InputPayload payload)
 {
     return(result);
 }