Beispiel #1
0
        /// <summary>
        /// Adds the Scatter Group Communication operator to the communication group.
        /// </summary>
        /// <typeparam name="T">The type of messages that operators will send</typeparam>
        /// <param name="configurations">The configuration for the scatter operator</param>
        /// <param name="operatorName">The name of the scatter operator</param>
        /// <param name="senderId">The sender id</param>
        /// <param name="topologyType">type of topology used in the operaor</param>
        /// <returns>The same CommunicationGroupDriver with the added Scatter operator info</returns>
        public ICommunicationGroupDriver AddScatter <T>(string operatorName, string senderId,
                                                        TopologyTypes topologyType, params IConfiguration[] configurations)
        {
            if (_finalized)
            {
                throw new IllegalStateException("Can't add operators once the spec has been built.");
            }

            var spec = new ScatterOperatorSpec(senderId, configurations);

            ITopology <T> topology;

            if (topologyType == TopologyTypes.Flat)
            {
                topology = new FlatTopology <T>(operatorName, _groupName, spec.SenderId, _driverId,
                                                spec);
            }
            else
            {
                topology = new TreeTopology <T>(operatorName, _groupName, spec.SenderId, _driverId,
                                                spec,
                                                _fanOut);
            }
            _topologies[operatorName]    = topology;
            _operatorSpecs[operatorName] = spec;

            return(this);
        }
Beispiel #2
0
        /// <summary>
        /// Gets the task configuration for the operator topology.
        /// </summary>
        /// <param name="taskId">The task identifier</param>
        /// <returns>The task configuration</returns>
        public IConfiguration GetTaskConfiguration(string taskId)
        {
            ICsConfigurationBuilder confBuilder;

            confBuilder = TangFactory.GetTang().NewConfigurationBuilder()
                          .BindNamedParameter <GroupCommConfigurationOptions.TopologyRootTaskId, string>(
                GenericType <GroupCommConfigurationOptions.TopologyRootTaskId> .Class,
                _rootId);

            if (taskId.Equals(_rootId))
            {
                foreach (var tId in _nodes.Keys)
                {
                    if (!tId.Equals(_rootId))
                    {
                        confBuilder.BindSetEntry <GroupCommConfigurationOptions.TopologyChildTaskIds, string>(
                            GenericType <GroupCommConfigurationOptions.TopologyChildTaskIds> .Class,
                            tId);
                    }
                }
            }

            if (OperatorSpec is BroadcastOperatorSpec)
            {
                var broadcastSpec = OperatorSpec as BroadcastOperatorSpec;

                if (taskId.Equals(broadcastSpec.SenderId))
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <BroadcastSender <T> > .Class);
                    SetMessageType(typeof(BroadcastSender <T>), confBuilder);
                }
                else
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <BroadcastReceiver <T> > .Class);
                    SetMessageType(typeof(BroadcastReceiver <T>), confBuilder);
                }
            }
            else if (OperatorSpec is ReduceOperatorSpec)
            {
                var reduceSpec = OperatorSpec as ReduceOperatorSpec;
                if (taskId.Equals(reduceSpec.ReceiverId))
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <ReduceReceiver <T> > .Class);
                    SetMessageType(typeof(ReduceReceiver <T>), confBuilder);
                }
                else
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <ReduceSender <T> > .Class);
                    SetMessageType(typeof(ReduceSender <T>), confBuilder);
                }
            }
            else if (OperatorSpec is ScatterOperatorSpec)
            {
                ScatterOperatorSpec scatterSpec = OperatorSpec as ScatterOperatorSpec;
                if (taskId.Equals(scatterSpec.SenderId))
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <ScatterSender <T> > .Class);
                    SetMessageType(typeof(ScatterSender <T>), confBuilder);
                }
                else
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <ScatterReceiver <T> > .Class);
                    SetMessageType(typeof(ScatterReceiver <T>), confBuilder);
                }
            }
            else
            {
                throw new NotSupportedException("Spec type not supported");
            }

            return(Configurations.Merge(confBuilder.Build(), OperatorSpec.Configuration));
        }
Beispiel #3
0
        /// <summary>
        /// Gets the task configuration for the operator topology.
        /// </summary>
        /// <param name="taskId">The task identifier</param>
        /// <returns>The task configuration</returns>
        public IConfiguration GetTaskConfiguration(string taskId)
        {
            if (taskId == null)
            {
                throw new ArgumentException("TaskId is null when GetTaskConfiguration");
            }

            TaskNode selfTaskNode = GetTaskNode(taskId);

            if (selfTaskNode == null)
            {
                throw new ArgumentException("Task has not been added to the topology");
            }

            string   parentId;
            TaskNode parent = selfTaskNode.Parent;

            if (parent == null)
            {
                parentId = selfTaskNode.TaskId;
            }
            else
            {
                parentId = parent.TaskId;
            }

            //add parentid, if no parent, add itself
            ICsConfigurationBuilder confBuilder = TangFactory.GetTang().NewConfigurationBuilder()
                                                  .BindNamedParameter <GroupCommConfigurationOptions.TopologyRootTaskId, string>(
                GenericType <GroupCommConfigurationOptions.TopologyRootTaskId> .Class,
                parentId);

            //add all its children
            foreach (TaskNode childNode in selfTaskNode.GetChildren())
            {
                confBuilder.BindSetEntry <GroupCommConfigurationOptions.TopologyChildTaskIds, string>(
                    GenericType <GroupCommConfigurationOptions.TopologyChildTaskIds> .Class,
                    childNode.TaskId);
            }

            if (OperatorSpec is BroadcastOperatorSpec)
            {
                var broadcastSpec = OperatorSpec as BroadcastOperatorSpec;
                if (taskId.Equals(broadcastSpec.SenderId))
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <BroadcastSender <T> > .Class);
                    SetMessageType(typeof(BroadcastSender <T>), confBuilder);
                }
                else
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <BroadcastReceiver <T> > .Class);
                    SetMessageType(typeof(BroadcastReceiver <T>), confBuilder);
                }
            }
            else if (OperatorSpec is ReduceOperatorSpec)
            {
                var reduceSpec = OperatorSpec as ReduceOperatorSpec;
                if (taskId.Equals(reduceSpec.ReceiverId))
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <ReduceReceiver <T> > .Class);
                    SetMessageType(typeof(ReduceReceiver <T>), confBuilder);
                }
                else
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <ReduceSender <T> > .Class);
                    SetMessageType(typeof(ReduceSender <T>), confBuilder);
                }
            }
            else if (OperatorSpec is ScatterOperatorSpec)
            {
                ScatterOperatorSpec scatterSpec = OperatorSpec as ScatterOperatorSpec;
                if (taskId.Equals(scatterSpec.SenderId))
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <ScatterSender <T> > .Class);
                    SetMessageType(typeof(ScatterSender <T>), confBuilder);
                }
                else
                {
                    confBuilder.BindImplementation(GenericType <IGroupCommOperator <T> > .Class, GenericType <ScatterReceiver <T> > .Class);
                    SetMessageType(typeof(ScatterReceiver <T>), confBuilder);
                }
            }
            else
            {
                throw new NotSupportedException("Spec type not supported");
            }

            return(Configurations.Merge(confBuilder.Build(), OperatorSpec.Configiration));
        }