Beispiel #1
0
        /// <summary>
        /// Cria um grafo de testes que, quando devidamente estruturado com a pesquisa
        /// de profundidade, pode ser utlizado na resolução da equação às diferenças da
        /// forma y[n+3]= n - y[n] - 2y[n+1] - 3y[n+3]
        /// </summary>
        /// <param name="syncSource">Uma fonte de valores.</param>
        /// <returns>O grafo de testes.</returns>
        /// <remarks>
        /// Note-se que o grafo deverá ser dirigido dos nós de saída para os nós de entrada.
        /// </remarks>
        private LabeledEdgeListGraph <OperationVertex, OperationEdge> CreateTestGraph_DiffEquation(
            SynchGen syncSource)
        {
            var result = new LabeledEdgeListGraph <OperationVertex, OperationEdge>(
                true);
            var sourceVertex = new OperationVertex(
                () => syncSource.Current);
            var prodSumVertex = new OperationVertex(
                4,
                1,
                (i, o) =>
            {
                o[0] = i[0] - i[1] - 2 * i[2] - 3 * i[3];
            });

            // Poderia ser realizado com apenas um vértice e vários canais de saída
            // sem a necessidade de uma linha de atraso.
            var delayVertex = new OperationVertex(
                1,
                4,
                (i, o) =>
            {
                o[0] = o[1];
                o[1] = o[2];
                o[2] = o[3];
                o[3] = i[0];
            });

            delayVertex.Results[1] = 1;
            delayVertex.Results[2] = 2;
            delayVertex.Results[3] = 3;

            result.AddEdge(
                delayVertex,
                prodSumVertex,
                new OperationEdge(0, 0));
            result.AddEdge(
                prodSumVertex,
                sourceVertex,
                new OperationEdge(0, 0));
            result.AddEdge(
                prodSumVertex,
                delayVertex,
                new OperationEdge(1, 1));
            result.AddEdge(
                prodSumVertex,
                delayVertex,
                new OperationEdge(2, 2));
            result.AddEdge(
                prodSumVertex,
                delayVertex,
                new OperationEdge(3, 3));

            return(result);
        }
Beispiel #2
0
        /// <summary>
        /// Cria um grafo de testes.
        /// </summary>
        /// <param name="syncSource">Uma fonte de valores.</param>
        /// <returns>O grafo de testes.</returns>
        private LabeledEdgeListGraph <OperationVertex, OperationEdge> CreateTestGraph_SimpleCycle(
            SynchGen syncSource)
        {
            var result       = new LabeledEdgeListGraph <OperationVertex, OperationEdge>(true);
            var sourceVertex = new OperationVertex(
                1,
                1,
                (arg, res) => res[0] = arg[0] + syncSource.Current);

            Array.Clear(sourceVertex.Arguments, 0, sourceVertex.Arguments.Length);
            Array.Clear(sourceVertex.Results, 0, sourceVertex.Results.Length);

            result.AddVertex(sourceVertex);
            result.AddEdge(
                sourceVertex,
                sourceVertex,
                new OperationEdge(0, 0));
            return(result);
        }
Beispiel #3
0
        /// <summary>
        /// Cria um grafo de testes um pouco mais complexo.
        /// </summary>
        /// <param name="syncSource">Uma fonte de valores.</param>
        /// <returns>O grafo de testes.</returns>
        private LabeledEdgeListGraph <OperationVertex, OperationEdge> CreateTestGraph_Complex(
            SynchGen syncSource)
        {
            var result = new LabeledEdgeListGraph <OperationVertex, OperationEdge>(
                true);
            var delayLine    = new int[] { 1, 2, 3 };
            var sourceVertex = new OperationVertex(
                () => syncSource.Current);
            var prodSumVertex = new OperationVertex(
                4,
                1,
                (i, o) =>
            {
                o[0] = i[0] - i[1] - 2 * i[2] - 3 * i[3];
            });

            // Poderia ser realizado com apenas um vértice e vários canais de saída
            // sem a necessidade de uma linha de atraso.
            var delay1Vertex = new OperationVertex(
                1,
                1,
                (i, o) =>
            {
                o[0]         = delayLine[0];
                delayLine[0] = i[0];
            });

            var delay2Vertex = new OperationVertex(
                1,
                1,
                (i, o) =>
            {
                o[0]         = delayLine[1];
                delayLine[1] = i[0];
            });

            var delay3Vertex = new OperationVertex(
                1,
                1,
                (i, o) =>
            {
                o[0]         = delayLine[2];
                delayLine[2] = i[0];
            });

            // O grafo tem de ser realizado da saída para a entrada
            result.AddEdge(
                sourceVertex,
                prodSumVertex,
                new OperationEdge(0, 0));
            result.AddEdge(
                prodSumVertex,
                delay1Vertex,
                new OperationEdge(0, 0));
            result.AddEdge(
                delay1Vertex,
                delay2Vertex,
                new OperationEdge(0, 0));
            result.AddEdge(
                delay1Vertex,
                prodSumVertex,
                new OperationEdge(0, 1));
            result.AddEdge(
                delay2Vertex,
                delay3Vertex,
                new OperationEdge(0, 0));
            result.AddEdge(
                delay2Vertex,
                prodSumVertex,
                new OperationEdge(0, 2));
            result.AddEdge(
                delay3Vertex,
                prodSumVertex,
                new OperationEdge(0, 3));

            return(result);
        }