/// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="stddev"></param>
        public static void CalculatePortfolioStdDev(this fPortfolio portfolio, out double stddev)
        {
            var data    = fPortfolio.Engine.CallFunction("getSeries", portfolio.Expression);
            var weights = fPortfolio.Engine.CallFunction("getWeights", portfolio.Expression);
            var expr    = fPortfolio.Engine.CallFunction("varRisk", data, weights);

            stddev = expr.AsNumeric().ToArray().First();
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="mean"></param>
        public static void GetMeanReturns(this fPortfolio portfolio, out double[] mean)
        {
            // Get returns
            var expr = fPortfolio.Engine.CallFunction("getMean", portfolio.Expression);
            var ret  = expr.AsNumeric().ToArray();

            mean = ret;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="weights"></param>
        public static void GetWeights(this fPortfolio portfolio, out double[] weights)
        {
            // Get weights
            var expr = fPortfolio.Engine.CallFunction("getWeights", portfolio.Expression);

            var w = expr.AsNumeric();

            weights = w.ToArray();
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="covrisk"></param>
        public static void GetCovRiskBudgets(this fPortfolio portfolio, out double[,] covrisk)
        {
            var expr    = fPortfolio.Engine.CallFunction("getCovRiskBudgets", portfolio.Expression);
            var crmat   = expr.AsNumericMatrix();
            int numrows = crmat.RowCount;
            int numcols = crmat.ColumnCount;

            covrisk = new double[numrows, numcols];
            crmat.CopyTo(covrisk, numrows, numcols);
        }
        /// <summary>
        /// Get Portfolio weights
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="weights"></param>
        public static void GetWeights(this fPortfolio portfolio, out double[,] weights)
        {
            // Get weights
            var expr = fPortfolio.Engine.CallFunction("getWeights", portfolio.Expression, "portfolio");

            var wmat    = expr.AsNumericMatrix();
            int numrows = wmat.RowCount;
            int numcols = wmat.ColumnCount;

            weights = new double[numrows, numcols];
            wmat.CopyTo(weights, numrows, numcols);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="risk"></param>
        public static void GetPortfolioRisk(this fPortfolio portfolio, out double[,] risk)
        {
            // Get returns
            var expr    = fPortfolio.Engine.CallFunction("getTargetRisk", portfolio.Expression, "portfolio");
            var riskmat = expr.AsNumericMatrix();

            int numrows = riskmat.RowCount;
            int numcols = riskmat.ColumnCount;

            risk = new double[numrows, numcols];
            riskmat.CopyTo(risk, numrows, numcols);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="mean"></param>
        public static void GetPortfolioMeanReturns(this fPortfolio portfolio, out double[,] mean)
        {
            // Get returns
            var expr    = fPortfolio.Engine.CallFunction("getTargetReturn", portfolio.Expression, "portfolio");
            var meanmat = expr.AsNumericMatrix();

            int numrows = meanmat.RowCount;
            int numcols = meanmat.ColumnCount;

            mean = new double[numrows, numcols];
            meanmat.CopyTo(mean, numrows, numcols);
        }
        /// <summary>
        /// Get Portfolio Covariance Matrix
        /// </summary>
        /// <param name="portfolio">portfolio object</param>
        /// <returns></returns>
        public static double[,] GetCovarianceMatrix(this fPortfolio portfolio)
        {
            var expr = fPortfolio.Engine.CallFunction("getCov", portfolio.Expression);
            var mat  = expr.AsNumericMatrix();

            int numrows = mat.RowCount;
            int numcols = mat.ColumnCount;

            double[,] cov = new double[numrows, numcols];
            mat.CopyTo(cov, numrows, numcols);

            return(cov);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <returns></returns>
        public static double[,] GetCorrelationMatrix(this fPortfolio portfolio)
        {
            var data = fPortfolio.Engine.CallFunction("getSeries", portfolio.Expression);
            var expr = fPortfolio.Engine.CallFunction("cor", data);
            var mat  = expr.AsNumericMatrix();

            int numrows = mat.RowCount;
            int numcols = mat.ColumnCount;

            double[,] cor = new double[numrows, numcols];
            mat.CopyTo(cor, numrows, numcols);

            return(cor);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="timeseries"></param>
        public static void GetData(this fPortfolio portfolio, out double[,] timeseries, out string[] timevector)
        {
            var expr       = fPortfolio.Engine.CallFunction("getSeries", portfolio.Expression);
            var timeexpr   = fPortfolio.Engine.CallFunction("time", expr);
            var timestring = fPortfolio.Engine.CallFunction("as.character", timeexpr);

            var mat  = expr.AsNumericMatrix();
            var time = timestring.AsCharacter();

            timevector = time.ToArray <string>();

            int numrows = mat.RowCount;
            int numcols = mat.ColumnCount;

            timeseries = new double[numrows, numcols];
            mat.CopyTo(timeseries, numrows, numcols);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="timeseries"></param>
        public static ITimeSeries <double> GetTimeSeries(this fPortfolio portfolio)
        {
            string[] timevector;
            double[,] timeseries;

            var expr       = fPortfolio.Engine.CallFunction("getSeries", portfolio.Expression);
            var timeexpr   = fPortfolio.Engine.CallFunction("time", expr);
            var timestring = fPortfolio.Engine.CallFunction("as.character", timeexpr);

            var mat  = expr.AsNumericMatrix();
            var time = timestring.AsCharacter();

            timevector = time.ToArray <string>();

            int numrows = mat.RowCount;
            int numcols = mat.ColumnCount;

            timeseries = new double[numrows, numcols];
            mat.CopyTo(timeseries, numrows, numcols);

            return(TimeSeriesFactory <double> .Create(timeseries, timevector));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="portfolio"></param>
        /// <param name="covrisk"></param>
        public static void GetCovRiskBudgets(this fPortfolio portfolio, out double[] covrisk)
        {
            var expr = fPortfolio.Engine.CallFunction("getCovRiskBudgets", portfolio.Expression);

            covrisk = expr.AsNumeric().ToArray();
        }