Ejemplo n.º 1
0
        /// <summary>
        /// Performs IMRU iterations on map side
        /// </summary>
        /// <returns></returns>
        protected override byte[] TaskBody(byte[] memento)
        {
            MapControlMessage controlMessage = MapControlMessage.AnotherRound;

            while (!_cancellationSource.IsCancellationRequested && controlMessage != MapControlMessage.Stop)
            {
                if (_invokeGc)
                {
                    Logger.Log(Level.Verbose, "Calling Garbage Collector");
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }

                using (
                    MapInputWithControlMessage <TMapInput> mapInput =
                        _dataAndMessageReceiver.Receive(_cancellationSource))
                {
                    controlMessage = mapInput.ControlMessage;
                    if (controlMessage != MapControlMessage.Stop)
                    {
                        TMapOutput output = default(TMapOutput);
                        try
                        {
                            output = _mapTask.Map(mapInput.Message);
                        }
                        catch (Exception e)
                        {
                            HandleTaskAppException(e);
                        }
                        _dataReducer.Send(output, _cancellationSource);
                    }
                }
            }
            return(null);
        }
Ejemplo n.º 2
0
        public byte[] Call(byte[] memento)
        {
            for (int i = 0; i < _numIterations; i++)
            {
                // Receive n from Master Task
                int[] intVec = _broadcastReceiver.Receive();

                Logger.Log(Level.Info, "Calculating TriangleNumber({0}) on slave task...", intVec[0]);

                // Calculate the nth Triangle number and send it back to driver
                int triangleNum = TriangleNumber(intVec[0]);
                Logger.Log(Level.Info, "Sending sum: {0} on iteration {1}.", triangleNum, i);

                int[] resArr = new int[intVec.Length];

                for (int j = 0; j < resArr.Length; j++)
                {
                    resArr[j] = triangleNum;
                }

                _triangleNumberSender.Send(resArr);
            }

            return(null);
        }
Ejemplo n.º 3
0
        private static void ScatterReceiveReduce(IScatterReceiver <int> receiver, IReduceSender <int> sumSender)
        {
            List <int> data1 = receiver.Receive();
            int        sum1  = data1.Sum();

            sumSender.Send(sum1);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Performs IMRU iterations on map side
        /// </summary>
        /// <param name="memento"></param>
        /// <returns></returns>
        public byte[] Call(byte[] memento)
        {
            while (true)
            {
                if (_invokeGC)
                {
                    Logger.Log(Level.Verbose, "Calling Garbage Collector");
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }

                TMapOutput result;

                using (
                    MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive())
                {
                    if (mapInput.ControlMessage == MapControlMessage.Stop)
                    {
                        break;
                    }
                    result = _mapTask.Map(mapInput.Message);
                }

                _dataReducer.Send(result);
            }
            return(null);
        }
Ejemplo n.º 5
0
        public void TestReduceOperator()
        {
            string groupName    = "group1";
            string operatorName = "reduce";
            int    numTasks     = 4;
            string driverId     = "driverid";
            string masterTaskId = "task0";
            int    fanOut       = 2;

            IGroupCommDriver groupCommDriver = GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);

            var commGroup = groupCommDriver.DefaultGroup
                            .AddReduce <int>(operatorName, "task0", TopologyTypes.Flat, GetDefaultDataConverterConfig(), GetDefaultReduceFuncConfig())
                            .Build();

            List <ICommunicationGroupClient> commGroups = CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig());

            IReduceReceiver <int> receiver = commGroups[0].GetReduceReceiver <int>(operatorName);
            IReduceSender <int>   sender1  = commGroups[1].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender2  = commGroups[2].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender3  = commGroups[3].GetReduceSender <int>(operatorName);

            Assert.NotNull(receiver);
            Assert.NotNull(sender1);
            Assert.NotNull(sender2);
            Assert.NotNull(sender3);

            sender3.Send(5);
            sender1.Send(1);
            sender2.Send(3);

            Assert.Equal(9, receiver.Reduce());
        }
Ejemplo n.º 6
0
        public byte[] Call(byte[] memento)
        {
            _groupCommClient.Initialize();
            Stopwatch broadcastTime = new Stopwatch();
            Stopwatch reduceTime    = new Stopwatch();

            for (int i = 0; i < _numIterations; i++)
            {
                broadcastTime.Start();

                // Receive n from Master Task
                int n = _broadcastReceiver.Receive();
                broadcastTime.Stop();

                Logger.Log(Level.Info, "Calculating TriangleNumber({0}) on slave task...", n);

                // Calculate the nth Triangle number and send it back to driver
                int triangleNum = TriangleNumber(n);
                Logger.Log(Level.Info, "Sending sum: {0} on iteration {1}.", triangleNum, i);

                reduceTime.Start();
                _triangleNumberSender.Send(triangleNum);
                reduceTime.Stop();

                if (i >= 1)
                {
                    var msg = string.Format("Average time (milliseconds) taken for broadcast: {0} and reduce: {1}",
                                            broadcastTime.ElapsedMilliseconds / ((double)i),
                                            reduceTime.ElapsedMilliseconds / ((double)i));
                    Logger.Log(Level.Info, msg);
                }
            }

            return(null);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Performs IMRU iterations on map side
        /// </summary>
        /// <param name="memento"></param>
        /// <returns></returns>
        public byte[] Call(byte[] memento)
        {
            MapControlMessage controlMessage = MapControlMessage.AnotherRound;

            while (!_taskCloseCoordinator.ShouldCloseTask() && controlMessage != MapControlMessage.Stop)
            {
                if (_invokeGC)
                {
                    Logger.Log(Level.Verbose, "Calling Garbage Collector");
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }

                using (
                    MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive())
                {
                    controlMessage = mapInput.ControlMessage;
                    if (controlMessage != MapControlMessage.Stop)
                    {
                        _dataReducer.Send(_mapTask.Map(mapInput.Message));
                    }
                }
            }

            _taskCloseCoordinator.SignalTaskStopped();
            return(null);
        }
Ejemplo n.º 8
0
        public void TestBroadcastReduceOperators()
        {
            string groupName             = "group1";
            string broadcastOperatorName = "broadcast";
            string reduceOperatorName    = "reduce";
            string masterTaskId          = "task0";
            string driverId = "Driver Id";
            int    numTasks = 3;
            int    fanOut   = 2;

            var groupCommunicationDriver        = GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);
            ICommunicationGroupDriver commGroup = groupCommunicationDriver.DefaultGroup
                                                  .AddBroadcast <int>(
                broadcastOperatorName,
                masterTaskId,
                TopologyTypes.Flat,
                GetDefaultDataConverterConfig())
                                                  .AddReduce <int>(
                reduceOperatorName,
                masterTaskId,
                TopologyTypes.Flat,
                GetDefaultDataConverterConfig(),
                GetDefaultReduceFuncConfig())
                                                  .Build();

            var commGroups = CommGroupClients(groupName, numTasks, groupCommunicationDriver, commGroup, GetDefaultCodecConfig());

            // for master task
            IBroadcastSender <int> broadcastSender = commGroups[0].GetBroadcastSender <int>(broadcastOperatorName);
            IReduceReceiver <int>  sumReducer      = commGroups[0].GetReduceReceiver <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver1    = commGroups[1].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver2    = commGroups[2].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName);

            for (int j = 1; j <= 10; j++)
            {
                broadcastSender.Send(j);

                int n1 = broadcastReceiver1.Receive();
                int n2 = broadcastReceiver2.Receive();
                Assert.Equal(j, n1);
                Assert.Equal(j, n2);

                int triangleNum1 = TriangleNumber(n1);
                triangleNumberSender1.Send(triangleNum1);
                int triangleNum2 = TriangleNumber(n2);
                triangleNumberSender2.Send(triangleNum2);

                int sum      = sumReducer.Reduce();
                int expected = TriangleNumber(j) * (numTasks - 1);
                Assert.Equal(sum, expected);
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Performs IMRU iterations on map side
        /// </summary>
        /// <param name="memento"></param>
        /// <returns></returns>
        public byte[] Call(byte[] memento)
        {
            MapControlMessage controlMessage = MapControlMessage.AnotherRound;

            while (!_cancellationSource.IsCancellationRequested && controlMessage != MapControlMessage.Stop)
            {
                if (_invokeGC)
                {
                    Logger.Log(Level.Verbose, "Calling Garbage Collector");
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }

                try
                {
                    using (
                        MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive(_cancellationSource))
                    {
                        controlMessage = mapInput.ControlMessage;
                        if (controlMessage != MapControlMessage.Stop)
                        {
                            _dataReducer.Send(_mapTask.Map(mapInput.Message), _cancellationSource);
                        }
                    }
                }
                catch (OperationCanceledException e)
                {
                    Logger.Log(Level.Warning, "Received OperationCanceledException in MapTaskHost with message: {0}.", e.Message);
                    break;
                }
                catch (IOException e)
                {
                    Logger.Log(Level.Error, "Received IOException in MapTaskHost with message: {0}.", e.Message);
                    if (!_cancellationSource.IsCancellationRequested)
                    {
                        throw new IMRUTaskGroupCommunicationException(TaskManager.TaskGroupCommunicationError);
                    }
                    break;
                }
                catch (TcpClientConnectionException e)
                {
                    Logger.Log(Level.Error, "Received TcpClientConnectionException in MapTaskHost with message: {0}.", e.Message);
                    if (!_cancellationSource.IsCancellationRequested)
                    {
                        throw new IMRUTaskGroupCommunicationException(TaskManager.TaskGroupCommunicationError);
                    }
                    break;
                }
            }

            _taskCloseCoordinator.SignalTaskStopped();
            Logger.Log(Level.Info, "MapTaskHost returned with cancellation token:{0}.", _cancellationSource.IsCancellationRequested);
            return(null);
        }
Ejemplo n.º 10
0
        public byte[] Call(byte[] memento)
        {
            List <int> data = _scatterReceiver.Receive();

            _logger.Log(Level.Info, "Received data: {0}", string.Join(" ", data));

            int sum = data.Sum();

            _logger.Log(Level.Info, "Sending back sum: {0}", sum);
            _sumSender.Send(sum);

            return(null);
        }
        public void TestReduceOperator()
        {
            string groupName    = "group1";
            string operatorName = "reduce";
            int    numTasks     = 10;
            string driverId     = "driverId";
            string masterTaskId = "task0";
            int    fanOut       = 3;

            var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);

            ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup
                                                  .AddReduce <int>(operatorName, masterTaskId, TopologyTypes.Tree, GetDefaultDataConverterConfig(), GetDefaultReduceFuncConfig())
                                                  .Build();

            var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig());

            IReduceReceiver <int> receiver = commGroups[0].GetReduceReceiver <int>(operatorName);
            IReduceSender <int>   sender1  = commGroups[1].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender2  = commGroups[2].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender3  = commGroups[3].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender4  = commGroups[4].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender5  = commGroups[5].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender6  = commGroups[6].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender7  = commGroups[7].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender8  = commGroups[8].GetReduceSender <int>(operatorName);
            IReduceSender <int>   sender9  = commGroups[9].GetReduceSender <int>(operatorName);

            Assert.NotNull(receiver);
            Assert.NotNull(sender1);
            Assert.NotNull(sender2);
            Assert.NotNull(sender3);
            Assert.NotNull(sender4);
            Assert.NotNull(sender5);
            Assert.NotNull(sender6);
            Assert.NotNull(sender7);
            Assert.NotNull(sender8);
            Assert.NotNull(sender9);

            sender9.Send(9);
            sender8.Send(8);
            sender7.Send(7);
            sender6.Send(6);
            sender5.Send(5);
            sender4.Send(4);
            sender3.Send(3);
            sender2.Send(2);
            sender1.Send(1);

            Assert.Equal(45, receiver.Reduce());
        }
Ejemplo n.º 12
0
        public byte[] Call(byte[] memento)
        {
            int[] resArr = new int[_arraySize];

            for (int j = 0; j < resArr.Length; j++)
            {
                resArr[j] = j;
            }

            Stopwatch broadcastTime = new Stopwatch();
            Stopwatch reduceTime    = new Stopwatch();

            for (int i = 0; i < _numIterations; i++)
            {
                if (i == 1)
                {
                    broadcastTime.Reset();
                    reduceTime.Reset();
                }

                broadcastTime.Start();

                // Receive n from Master Task
                int[] intVec = _broadcastReceiver.Receive();
                broadcastTime.Stop();

                Logger.Log(Level.Info, "Calculating TriangleNumber({0}) on slave task...", intVec[0]);

                // Calculate the nth Triangle number and send it back to driver
                int triangleNum = TriangleNumber(intVec[0]);

                Logger.Log(Level.Info, "Sending sum: {0} on iteration {1}.", triangleNum, i);

                resArr[0] = triangleNum;

                reduceTime.Start();
                _triangleNumberSender.Send(resArr);
                reduceTime.Stop();

                if (i >= 1)
                {
                    var msg = string.Format("Average time (milliseconds) taken for broadcast: {0} and reduce: {1}",
                                            broadcastTime.ElapsedMilliseconds / ((double)i),
                                            reduceTime.ElapsedMilliseconds / ((double)i));
                    Logger.Log(Level.Info, msg);
                }
            }

            return(null);
        }
Ejemplo n.º 13
0
        public byte[] Call(byte[] memento)
        {
            for (int i = 0; i < _numIterations; i++)
            {
                // Receive n from Master Task
                int n = _broadcastReceiver.Receive();
                _logger.Log(Level.Info, "Calculating TriangleNumber({0}) on slave task...", n);

                // Calculate the nth Triangle number and send it back to driver
                int triangleNum = TriangleNumber(n);
                _logger.Log(Level.Info, "Sending sum: {0} on iteration {1}.", triangleNum, i);
                _triangleNumberSender.Send(triangleNum);
            }

            return(null);
        }
Ejemplo n.º 14
0
        public byte[] Call(byte[] memento)
        {
            while (true)
            {
                if (_controlBroadcastReceiver.Receive() == ControlMessage.STOP)
                {
                    break;
                }
                Centroids centroids = _dataBroadcastReceiver.Receive();
                // we compute the loss here before data is relabled, this does not reflect the latest clustering result at the end of current iteration,
                // but it will save another round of group communications in each iteration
                _logger.Log(Level.Info, "Received centroids from master: " + centroids);
                _dataPartition.LabelData(centroids);
                ProcessedResults partialMeans = new ProcessedResults(ComputePartialMeans(), ComputeLossFunction(centroids, _dataPartition.DataVectors));
                _logger.Log(Level.Info, "Sending partial means: " + partialMeans);
                _partialMeansSender.Send(partialMeans);
            }

            return(null);
        }
        public void TestScatterReduceOperatorsWithCancelation()
        {
            string groupName           = "group1";
            string scatterOperatorName = "scatter";
            string reduceOperatorName  = "reduce";
            string masterTaskId        = "task0";
            string driverId            = "Driver Id";
            int    numTasks            = 5;
            int    fanOut = 2;

            var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);
            ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup
                                                  .AddScatter <int>(
                scatterOperatorName,
                masterTaskId,
                TopologyTypes.Tree,
                GetDefaultDataConverterConfig())
                                                  .AddReduce <int>(
                reduceOperatorName,
                masterTaskId,
                TopologyTypes.Tree,
                GetDefaultDataConverterConfig(),
                GetDefaultReduceFuncConfig())
                                                  .Build();

            var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig());

            IScatterSender <int>  sender     = commGroups[0].GetScatterSender <int>(scatterOperatorName);
            IReduceReceiver <int> sumReducer = commGroups[0].GetReduceReceiver <int>(reduceOperatorName);

            IScatterReceiver <int> receiver1  = commGroups[1].GetScatterReceiver <int>(scatterOperatorName);
            IReduceSender <int>    sumSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName);

            IScatterReceiver <int> receiver2  = commGroups[2].GetScatterReceiver <int>(scatterOperatorName);
            IReduceSender <int>    sumSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName);

            IScatterReceiver <int> receiver3  = commGroups[3].GetScatterReceiver <int>(scatterOperatorName);
            IReduceSender <int>    sumSender3 = commGroups[3].GetReduceSender <int>(reduceOperatorName);

            IScatterReceiver <int> receiver4  = commGroups[4].GetScatterReceiver <int>(scatterOperatorName);
            IReduceSender <int>    sumSender4 = commGroups[4].GetReduceSender <int>(reduceOperatorName);

            Assert.NotNull(sender);
            Assert.NotNull(receiver1);
            Assert.NotNull(receiver2);
            Assert.NotNull(receiver3);
            Assert.NotNull(receiver4);

            List <int> data = Enumerable.Range(1, 100).ToList();

            sender.Send(data);

            List <int> data1 = receiver1.Receive();
            List <int> data2 = receiver2.Receive();

            List <int> data3 = receiver3.Receive();
            List <int> data4 = receiver4.Receive();

            int sum3 = data3.Sum();

            sumSender3.Send(sum3);

            int sum4 = data4.Sum();

            sumSender4.Send(sum4);

            int sum2 = data2.Sum();

            sumSender2.Send(sum2);

            int sum1 = data1.Sum();

            var token = new CancellationTokenSource();

            token.Cancel();
            Action send = () => sumSender1.Send(sum1, token);

            Assert.Throws <OperationCanceledException>(send);

            var taskThread = new Thread(() =>
            {
                Action reduce = () => sumReducer.Reduce(token);
                Assert.Throws <OperationCanceledException>(reduce);
            });

            taskThread.Start();
            token.Cancel();
        }
        public void TestBroadcastReduceOperators()
        {
            string groupName             = "group1";
            string broadcastOperatorName = "broadcast";
            string reduceOperatorName    = "reduce";
            string masterTaskId          = "task0";
            string driverId = "Driver Id";
            int    numTasks = 10;
            int    fanOut   = 3;

            var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);

            ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup
                                                  .AddBroadcast <int>(
                broadcastOperatorName,
                masterTaskId,
                TopologyTypes.Tree,
                GetDefaultDataConverterConfig())
                                                  .AddReduce <int>(
                reduceOperatorName,
                masterTaskId,
                TopologyTypes.Tree,
                GetDefaultDataConverterConfig(),
                GetDefaultReduceFuncConfig())
                                                  .Build();

            var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig());

            // for master task
            IBroadcastSender <int> broadcastSender = commGroups[0].GetBroadcastSender <int>(broadcastOperatorName);
            IReduceReceiver <int>  sumReducer      = commGroups[0].GetReduceReceiver <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver1    = commGroups[1].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver2    = commGroups[2].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver3    = commGroups[3].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender3 = commGroups[3].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver4    = commGroups[4].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender4 = commGroups[4].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver5    = commGroups[5].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender5 = commGroups[5].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver6    = commGroups[6].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender6 = commGroups[6].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver7    = commGroups[7].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender7 = commGroups[7].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver8    = commGroups[8].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender8 = commGroups[8].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver9    = commGroups[9].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender9 = commGroups[9].GetReduceSender <int>(reduceOperatorName);

            for (int i = 1; i <= 10; i++)
            {
                broadcastSender.Send(i);

                int n1 = broadcastReceiver1.Receive();
                int n2 = broadcastReceiver2.Receive();
                int n3 = broadcastReceiver3.Receive();
                int n4 = broadcastReceiver4.Receive();
                int n5 = broadcastReceiver5.Receive();
                int n6 = broadcastReceiver6.Receive();
                int n7 = broadcastReceiver7.Receive();
                int n8 = broadcastReceiver8.Receive();
                int n9 = broadcastReceiver9.Receive();
                Assert.Equal(i, n1);
                Assert.Equal(i, n2);
                Assert.Equal(i, n3);
                Assert.Equal(i, n4);
                Assert.Equal(i, n5);
                Assert.Equal(i, n6);
                Assert.Equal(i, n7);
                Assert.Equal(i, n8);
                Assert.Equal(i, n9);

                int triangleNum9 = GroupCommunicationTests.TriangleNumber(n9);
                triangleNumberSender9.Send(triangleNum9);

                int triangleNum8 = GroupCommunicationTests.TriangleNumber(n8);
                triangleNumberSender8.Send(triangleNum8);

                int triangleNum7 = GroupCommunicationTests.TriangleNumber(n7);
                triangleNumberSender7.Send(triangleNum7);

                int triangleNum6 = GroupCommunicationTests.TriangleNumber(n6);
                triangleNumberSender6.Send(triangleNum6);

                int triangleNum5 = GroupCommunicationTests.TriangleNumber(n5);
                triangleNumberSender5.Send(triangleNum5);

                int triangleNum4 = GroupCommunicationTests.TriangleNumber(n4);
                triangleNumberSender4.Send(triangleNum4);

                int triangleNum3 = GroupCommunicationTests.TriangleNumber(n3);
                triangleNumberSender3.Send(triangleNum3);

                int triangleNum2 = GroupCommunicationTests.TriangleNumber(n2);
                triangleNumberSender2.Send(triangleNum2);

                int triangleNum1 = GroupCommunicationTests.TriangleNumber(n1);
                triangleNumberSender1.Send(triangleNum1);

                int sum      = sumReducer.Reduce();
                int expected = GroupCommunicationTests.TriangleNumber(i) * (numTasks - 1);
                Assert.Equal(sum, expected);
            }
        }
        public void TestScatterReduceOperators()
        {
            string groupName           = "group1";
            string scatterOperatorName = "scatter";
            string reduceOperatorName  = "reduce";
            string masterTaskId        = "task0";
            string driverId            = "Driver Id";
            int    numTasks            = 5;
            int    fanOut = 2;

            var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);
            ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup
                                                  .AddScatter <int>(
                scatterOperatorName,
                masterTaskId,
                TopologyTypes.Tree,
                GetDefaultDataConverterConfig())
                                                  .AddReduce <int>(
                reduceOperatorName,
                masterTaskId,
                TopologyTypes.Tree,
                GetDefaultDataConverterConfig(),
                GetDefaultReduceFuncConfig())
                                                  .Build();

            var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig());

            IScatterSender <int>  sender     = commGroups[0].GetScatterSender <int>(scatterOperatorName);
            IReduceReceiver <int> sumReducer = commGroups[0].GetReduceReceiver <int>(reduceOperatorName);

            IScatterReceiver <int> receiver1  = commGroups[1].GetScatterReceiver <int>(scatterOperatorName);
            IReduceSender <int>    sumSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName);

            IScatterReceiver <int> receiver2  = commGroups[2].GetScatterReceiver <int>(scatterOperatorName);
            IReduceSender <int>    sumSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName);

            IScatterReceiver <int> receiver3  = commGroups[3].GetScatterReceiver <int>(scatterOperatorName);
            IReduceSender <int>    sumSender3 = commGroups[3].GetReduceSender <int>(reduceOperatorName);

            IScatterReceiver <int> receiver4  = commGroups[4].GetScatterReceiver <int>(scatterOperatorName);
            IReduceSender <int>    sumSender4 = commGroups[4].GetReduceSender <int>(reduceOperatorName);

            Assert.IsNotNull(sender);
            Assert.IsNotNull(receiver1);
            Assert.IsNotNull(receiver2);
            Assert.IsNotNull(receiver3);
            Assert.IsNotNull(receiver4);

            List <int> data = Enumerable.Range(1, 100).ToList();

            sender.Send(data);

            List <int> data1 = receiver1.Receive();
            List <int> data2 = receiver2.Receive();

            List <int> data3 = receiver3.Receive();
            List <int> data4 = receiver4.Receive();

            int sum3 = data3.Sum();

            sumSender3.Send(sum3);

            int sum4 = data4.Sum();

            sumSender4.Send(sum4);

            int sum2 = data2.Sum();

            sumSender2.Send(sum2);

            int sum1 = data1.Sum();

            sumSender1.Send(sum1);

            int sum = sumReducer.Reduce();

            Assert.AreEqual(sum, 6325);
        }