コード例 #1
0
        public IList <Cluster <TNode, double> > Solve([NotNull] IList <TNode> Nodes, [NotNull] CostAnalyzer <double> costanalyzer, double maxCostOfNearestNeighbor, int maxNodesPerCluster = -1)
        {
            var clusterFactory = new ClusterFactory(Nodes, costanalyzer);

            var transposedCostMatrix = CostMatrix <double> .CreateTransposed(costanalyzer.CostMatrix);

            var transposedCostanalyzer = new CostAnalyzer <double>(transposedCostMatrix);


            // While unhandled indexes available and the loop runs for at most a certain amount of times, continue the algorithm
            for (var counter = 0; counter < Nodes.Count * maxFactorOfLoopCount && clusterFactory.NodesAsIndexes.Count > 0; counter++)
            {
                // set the current pointer to a random node index among the nodes not yet classified in a cluster
                int currentPointer = clusterFactory.NodesAsIndexes[randomizer.Next(0, clusterFactory.NodesAsIndexes.Count - 1)];

                var candidateCluster = CalculateCluster(clusterFactory.NodesAsIndexes, costanalyzer, transposedCostanalyzer, maxCostOfNearestNeighbor, maxNodesPerCluster);

                if (candidateCluster.Count > 1)
                {
                    // loop over the cluster again maybe to cut the cluster in pieces. Clusters with one item are thrown back in the pool
                    for (int indexInCluster = 0; indexInCluster < candidateCluster.Count - 1; indexInCluster++)
                    {
                        var maxCostInCluster = indexInCluster == 0 ?
                                               costanalyzer.AllNeighborsOrdered(candidateCluster[0])[candidateCluster[1]]
                            : candidateCluster.Take(indexInCluster + 1).Tuples().Max(t => costanalyzer.AllNeighborsOrdered(t.Item1)[t.Item2]);

                        var nodesOutsideClusterQuiteCloseToCluster = costanalyzer.AllNeighborsOrdered(candidateCluster[indexInCluster])
                                                                     .Where(neighbor =>
                                                                            !candidateCluster.Contains(neighbor.Key) && neighbor.Value <= maxCostInCluster);

                        if (nodesOutsideClusterQuiteCloseToCluster.Count() > 1) // Split the cluster
                        {
                            var firstPart = candidateCluster.GetRange(0, indexInCluster + 1);

                            clusterFactory.CreateCluster(firstPart);

                            candidateCluster.RemoveRange(0, indexInCluster + 1);
                            indexInCluster = -1;
                        }
                    }
                }

                clusterFactory.CreateCluster(candidateCluster);
            }

            // Here we add the singleton clusters from the remaining nodes
            clusterFactory.CreateSingletonClusters();

            return(clusterFactory.ListOfClusters);
        }
コード例 #2
0
        // methods
        public ICluster BuildCluster()
        {
            IStreamFactory streamFactory = new TcpStreamFactory(_tcpStreamSettings);

            if (_sslStreamSettings != null)
            {
                streamFactory = new SslStreamFactory(_sslStreamSettings, streamFactory);
            }

            streamFactory = _streamFactoryWrapper(streamFactory);

            var connectionFactory = new BinaryConnectionFactory(
                _connectionSettings,
                streamFactory,
                _connectionListener);

            var connectionPoolFactory = new ExclusiveConnectionPoolFactory(
                _connectionPoolSettings,
                connectionFactory,
                _connectionPoolListener);

            var serverFactory = new ServerFactory(
                _serverSettings,
                connectionPoolFactory,
                connectionFactory,
                _serverListener);

            var clusterFactory = new ClusterFactory(
                _clusterSettings,
                serverFactory,
                _clusterListener);

            return(clusterFactory.CreateCluster());
        }
コード例 #3
0
        // methods
        public ICluster BuildCluster()
        {
            IStreamFactory streamFactory = new TcpStreamFactory(_tcpStreamSettings);

            // TODO: SSL gets handled here specifically...

            streamFactory = _streamFactoryWrapper(streamFactory);

            var connectionFactory = new BinaryConnectionFactory(
                _connectionSettings,
                streamFactory,
                _connectionListener);

            var connectionPoolFactory = new ExclusiveConnectionPoolFactory(
                _connectionPoolSettings,
                connectionFactory,
                _connectionPoolListener);

            var serverFactory = new ServerFactory(
                _serverSettings,
                connectionPoolFactory,
                connectionFactory,
                _serverListener);

            var clusterFactory = new ClusterFactory(
                _clusterSettings,
                serverFactory,
                _clusterListener);

            return(clusterFactory.CreateCluster());
        }
コード例 #4
0
        // methods
        /// <summary>
        /// Builds the cluster.
        /// </summary>
        /// <returns>A cluster.</returns>
        public ICluster BuildCluster()
        {
            IStreamFactory streamFactory = new TcpStreamFactory(_tcpStreamSettings);

            if (_sslStreamSettings != null)
            {
                streamFactory = new SslStreamFactory(_sslStreamSettings, streamFactory);
            }

            streamFactory = _streamFactoryWrapper(streamFactory);

            var connectionFactory = new BinaryConnectionFactory(
                _connectionSettings,
                streamFactory,
                _eventAggregator);

            var connectionPoolFactory = new ExclusiveConnectionPoolFactory(
                _connectionPoolSettings,
                connectionFactory,
                _eventAggregator);

            var serverMonitorConnectionSettings = _connectionSettings.With(authenticators: new IAuthenticator[] { });
            var serverMonitorConnectionFactory  = new BinaryConnectionFactory(
                serverMonitorConnectionSettings,
                streamFactory,
                new EventAggregator());
            var serverMonitorFactory = new ServerMonitorFactory(
                _serverSettings,
                serverMonitorConnectionFactory,
                _eventAggregator);

            var serverFactory = new ServerFactory(
                _clusterSettings.ConnectionMode,
                _serverSettings,
                connectionPoolFactory,
                serverMonitorFactory,
                _eventAggregator);

            var clusterFactory = new ClusterFactory(
                _clusterSettings,
                serverFactory,
                _eventAggregator);

            return(clusterFactory.CreateCluster());
        }
コード例 #5
0
        // methods
        private ICluster CreateCluster(ClusterKey clusterKey)
        {
            var clusterSettings        = CreateClusterSettings(clusterKey);
            var serverSettings         = CreateServerSettings(clusterKey);
            var connectionSettings     = CreateConnectionSettings(clusterKey);
            var connectionPoolSettings = CreateConnectionPoolSettings(clusterKey);

            var listener              = EmptyListener.Instance;
            var streamFactory         = CreateStreamFactory(clusterKey);
            var connectionFactory     = new BinaryConnectionFactory(connectionSettings, streamFactory, listener);
            var connectionPoolFactory = new ExclusiveConnectionPoolFactory(connectionPoolSettings, connectionFactory, listener);
            var serverFactory         = new ServerFactory(serverSettings, connectionPoolFactory, connectionFactory, listener);
            var clusterFactory        = new ClusterFactory(clusterSettings, serverFactory, listener);

            var cluster = clusterFactory.CreateCluster();

            cluster.Initialize();

            return(cluster);
        }