Exemplo n.º 1
0
        /// <summary>
        /// Checks if the loop has ended
        /// </summary>
        /// <param name="data"></param>
        /// <param name="dependencyGraph"></param>
        /// <returns>next set of Ids to be triggered</returns>
        public int[] Finished(DataStore data, Dictionary <int, DependentNode> dependencyGraph)
        {
            //check condition
            bool done = false;

            {
                //find the "done" result
                NodeSlot search = ExecutionHelper.FindFirstNodeSlotInDependencies(node, dependencyGraph, 1);
                if (search.NodeId == -1)
                {
                    return(new int[0]);
                }

                byte[] result = data.getData(search);
                if (result == null)
                {
                    return(new int[0]);
                }

                if (Convert.ToBoolean(result[0]))
                {
                    done = true;
                }
            }

            //trigger dependencies and iterate loop start depth
            if (done)
            {
                //move the data through to the output of the node
                List <byte[]> transferData = new List <byte[]>();
                for (int j = 2; j < node.Dependencies.Length; j++)
                {
                    for (var i = 0; i < node.Dependencies.Length; i++)
                    {
                        NodeSlot slot    = node.Dependencies[i];
                        int      slotPos = ExecutionHelper.OtherNodeSlotDependents(dependencyGraph[slot.NodeId], node.Id);

                        //slot 0 and 1 are loop node slots, all other data must be passed on
                        if (slotPos == j)
                        {
                            transferData.Add(data.getData(node.Dependencies[i]));
                            break;
                        }
                    }
                }

                data.StoreResults(transferData, NodeId);

                //trigger next nodes
                List <int> ids = new List <int>();
                foreach (NodeSlot slot in node.Dependents)
                {
                    if (!ids.Contains(slot.NodeId))
                    {
                        ids.Add(slot.NodeId);
                    }
                }

                return(ids.ToArray());
            }

            //move loop end input data to the loop start output
            //so that it can be used in the next cycle

            List <byte[]> outputData = new List <byte[]>();

            outputData.Add(new byte[0]);                             //loop start Link slot
            outputData.Add(BitConverter.GetBytes(++pair.Iteration)); //loop start increment slot

            for (int j = 2; j < node.Dependencies.Length; j++)
            {
                for (var i = 0; i < node.Dependencies.Length; i++)
                {
                    NodeSlot slot    = node.Dependencies[i];
                    int      slotPos = ExecutionHelper.OtherNodeSlotDependents(dependencyGraph[slot.NodeId], node.Id);

                    //slot 0 and 1 are loop node slots, all other data must be passed on
                    if (slotPos == j)
                    {
                        outputData.Add(data.getData(node.Dependencies[i]));
                        break;
                    }
                }
            }

            data.ClearResults(pair.ContainedNodes);
            data.StoreResults(outputData, pair.Start.NodeId);

            return(pair.Start.StartDependencies(NodeId, data));
        }