public AVisit(int time_index, Vector state, Vector[] actions, Vector[] next_states)
        {
            TimeIndex = time_index;
            State = state.Clone();

            Actions = new Vector[actions.Length];
            for (int i = 0; i < actions.Length; i++)
                Actions[i] = actions[i].Clone();

            NextStates = new Vector[next_states.Length];
            //for (int i = 0; i < next_states.Length; i++)
            //    NextStates[i] = next_states[i].Clone();
            int j = -1;
            while (++j < next_states.Length && next_states[j] != null)
                NextStates[j] = next_states[j].Clone();
        }
        public static void LinearEquationGaussElimination(Matrix A, ref Vector x, Vector b)
        {
            int dim = A.Height, i,j,k;
            if (dim!=A.Width || dim!=b.Dimension)
                throw (new System.Exception("Matrix.LinearEquationGaussSafe()  wrong dimensions"));

            Matrix localA = A.Clone();
            Vector localB = b.Clone();

            for (i=0; i<dim; i++)
            {
                //	znalezienie wiersza zaczynajacego sie od najwiekszej wartosci
                double maxv = System.Math.Abs(localA[i,i]);
                int indexof_max = i;
                for (j=i+1; j<dim; j++)
                    if (System.Math.Abs(localA[j,i])>maxv)
                    {
                        maxv = System.Math.Abs(localA[j,i]);
                        indexof_max = j;
                    }
                maxv = localA[indexof_max, i];
                if (maxv==0)
                    throw (new System.Exception("No defined solution of the linear equation"));
                //	wymiana wiersza i-tego z tym zaczynajacym sie od najwiekszej wartosci
                double swap = localB[indexof_max];
                localB[indexof_max] = localB[i];
                localB[i] = swap/maxv;
                for (k=i; k<dim; k++)
                {
                    swap = localA[indexof_max, k];
                    localA[indexof_max, k] = localA[i, k];
                    localA[i, k] = swap/maxv;
                }
                //	poprawienie najnizszych wierszy
                for (j=i+1; j<dim; j++)
                {
                    double factor = localA[j, i];
                    localB[j] -= localB[i]*factor;
                    for (k=i; k<dim; k++)
                        localA[j, k] -= localA[i, k]*factor;
                }
            }

            if (x==null || x.Dimension!=dim)
                x = new Vector(dim);
            for (i=dim-1; i>=0; i--)
            {
                double tmpx=localB[i];
                for (j=i+1; j<dim; j++)
                    tmpx -= localA[i, j]*x[j];
                x[i] = tmpx;
            }
        }