private bool check(EdgeWeightedDigraph G)
        {
            if (hasCycle)
            {
                DirectedEdge first = new DirectedEdge(0, 0, 0);
                DirectedEdge last = new DirectedEdge(0, 0, 0);

                foreach (DirectedEdge e in cycle)
                {
                    if (!first.IsSet) first = e;
                    if (last.IsSet)
                    {
                        if (last.To != e.From)
                        {
                            Log.Info("cycle edges " + last + " and " + e + " not incident");
                            return false;
                        }
                    }
                    last = e;
                }

                if (last.To != first.From)
                {
                    Log.Info("cycle edges " + last + " and " + first + " not incident");
                    return false;
                }
            }

            return true;
        }
        public void addEdge(DirectedEdge e)
        {
            int v = e.From;
            if (m_adj[v].Add(e))
            {
                m_e++;
            }
            /*if (!m_adj[v].Contains(e))
            {
            }
            else
            {

            }*/
        }
        private void CalculateShortestPath()
        {
            EdgeWeightedDigraph G = new EdgeWeightedDigraph(m_a.Rows);
            for (int v = 0; v < m_a.Rows; v++)
            {
                for (int w = 0; w < m_a.Cols; w++)
                {
                    DirectedEdge e = new DirectedEdge(v, w, -Math.Log(m_a[v, w]));
                    G.addEdge(e);
                }
            }

            BellmanFordSP spt = new BellmanFordSP(G, 0);

            if (spt.negativeCycleCount > 2)
            {
                double stake = 25000;
                double arbitrage = 1;

                ArbitrageCycle cycle = new ArbitrageCycle(m_currentTime);

                foreach (DirectedEdge e in spt.negativeCycle)
                {
                    double weight = Math.Exp(-e.Weight);
                    arbitrage *= weight;
                    cycle.Edges.Add(new DirectedEdge(e.From, e.To, weight));
                }

                if (!m_activeArbitrage.Contains(cycle, ARBITRAGE_CYCLE_COMPARER))
                {
                    m_activeArbitrage.Add(cycle);
                    Status(cycle.Summary);
                    Status("arbitrage(" + arbitrage + ") stake(" + stake + ") balance(" + (arbitrage * stake) + ") profit(" + Math.Round(((arbitrage * stake) / stake) - 1, 5) + "%)");
                }
            }
        }