/// <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); }
/// <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)); }
/// <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)); }