Ejemplo n.º 1
0
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            CrowNetSOMNDP net = new CrowNetSOMNDP();

            xyzD = new List <int>();
            topD = new List <int>();
            double relativeIndex = 0.0;

            DA.GetData(0, ref net);
            if (!DA.GetDataList(1, xyzD))
            {
                xyzD = new List <int> {
                    0, 1, 2
                }
            }
            ;
            if (!DA.GetDataList(2, topD))
            {
                topD = new List <int> {
                    0, 1, 2
                }
            }
            ;
            if (!DA.GetData(3, ref relativeIndex))
            {
                relativeIndex = 0.0;
            }
            List <Point3d> pts = new List <Point3d>();

            if (net.trainedVectors.GetLength(0) > 0)
            {
                int[][] newAdressBook = net.adressBook;
                // in case network topology is one-dimensional, add two zeros to the end of each adress book entry
                if (newAdressBook[0].Length == 1)
                {
                    for (int i = 0; i < newAdressBook.GetLength(0); i++)
                    {
                        List <int> curr = new List <int> {
                            newAdressBook[i][0], 0, 0
                        };
                        newAdressBook[i] = curr.ToArray();
                    }
                }
                // in case network topology is two-dimensional, add a zero to the end of each adress book entry
                else if (newAdressBook[0].Length == 2)
                {
                    for (int i = 0; i < newAdressBook.GetLength(0); i++)
                    {
                        List <int> curr = new List <int> {
                            newAdressBook[i][0], newAdressBook[i][1], 0
                        };
                        newAdressBook[i] = curr.ToArray();
                    }
                }

                // create point tree structure
                GH_Structure <GH_Point> pointTree = net.PointTree(xyzD);

                //draw polylines
                List <Polyline> _1st = new List <Polyline>();
                List <Polyline> _2nd = new List <Polyline>();
                List <Polyline> _3rd = new List <Polyline>();


                int[] newSize = net.size;
                if (net.size.Length == 1)
                {
                    newSize = new int[3] {
                        net.size[0], 1, 1
                    }
                }
                ;
                if (net.size.Length == 2)
                {
                    newSize = new int[3] {
                        net.size[0], net.size[1], 1
                    }
                }
                ;

                for (int i = 0; i < newSize[topD[1]]; i++)
                {
                    for (int j = 0; j < newSize[topD[2]]; j++)
                    {
                        List <Point3d> p1 = new List <Point3d>();
                        for (int k = 0; k < newSize[topD[0]]; k++)
                        {
                            GH_Path newPath = AddZerosToPath(new GH_Path(k, i, j), topD.ToArray(), newSize.Length, relativeIndex, newSize);
                            p1.Add(pointTree.get_DataItem(newPath, 0).Value);
                        }

                        _1st.Add(new Polyline(p1));
                    }
                }


                for (int i = 0; i < newSize[topD[2]]; i++)
                {
                    for (int j = 0; j < newSize[topD[0]]; j++)
                    {
                        List <Point3d> p1 = new List <Point3d>();
                        for (int k = 0; k < newSize[topD[1]]; k++)
                        {
                            GH_Path newPath = AddZerosToPath(new GH_Path(j, k, i), topD.ToArray(), newSize.Length, relativeIndex, newSize);
                            p1.Add(pointTree.get_DataItem(newPath, 0).Value);
                        }
                        _2nd.Add(new Polyline(p1));
                    }
                }


                for (int i = 0; i < newSize[topD[0]]; i++)
                {
                    for (int j = 0; j < newSize[topD[1]]; j++)
                    {
                        List <Point3d> p1 = new List <Point3d>();
                        for (int k = 0; k < newSize[topD[2]]; k++)
                        {
                            GH_Path newPath = AddZerosToPath(new GH_Path(i, j, k), topD.ToArray(), newSize.Length, relativeIndex, newSize);
                            p1.Add(pointTree.get_DataItem(newPath, 0).Value);
                        }
                        _3rd.Add(new Polyline(p1));
                    }
                }

                DA.SetDataList(0, _1st);
                DA.SetDataList(1, _2nd);
                DA.SetDataList(2, _3rd);
            }
        }
Ejemplo n.º 2
0
        void Solve()
        {
            #region prepare and assign
            trainingSet.Clear();
            for (int i = 0; i < trainVectorCount; i++)
            {
                List <double> dl = new List <double>();
                for (int j = 0; j < trainVectorDimension; j++)
                {
                    dl.Add(trainVectors[i][j]);
                }
                trainingSet.Add(new TrainingSample(dl.ToArray()));
            }

            ///  process
            ///  start learning

            ///  get learning radius for neighborhood function
            int learningRadius = 0;
            for (int i = 0; i < dimension; i++)
            {
                if (size[i] > learningRadius)
                {
                    learningRadius = size[i];
                }
            }
            learningRadius /= 2;

            INeighborhoodFunction neighborhoodFunction = new GaussianFunction(learningRadius, netUP.neighborDistance) as INeighborhoodFunction;
            if (neighborhood)
            {
                neighborhoodFunction = new MexicanHatFunction(learningRadius) as INeighborhoodFunction;
            }

            LatticeTopology topology = LatticeTopology.Rectangular;
            if (latticeTopology)
            {
                topology = LatticeTopology.Hexagonal;
            }
            /// instantiate relevant network layers
            KohonenLayer       inputLayer  = new KohonenLayer(trainVectorDimension);
            KohonenLayerND     outputLayer = new KohonenLayerND(size, neighborhoodFunction, topology);
            KohonenConnectorND connector   = new KohonenConnectorND(inputLayer, outputLayer, netUP.initialNodes);
            if (netUP.initialNodes.Length != 0)
            {
                connector.Initializer = new GivenInput(netUP.initialNodes);
            }
            else
            {
                connector.Initializer = new RandomFunction(0.0, 1.0);
            }
            outputLayer.SetLearningRate(learningRate, 0.05d);
            outputLayer.IsDimensionCircular = isDimensionCircular;
            network = new KohonenNetworkND(inputLayer, outputLayer);
            network.useRandomTrainingOrder  = randomTrainingOrder;
            inputLayer.ParallelComputation  = false;
            outputLayer.ParallelComputation = parallelComputing;
            #endregion

            #region delegates
            network.BeginEpochEvent += new TrainingEpochEventHandler(
                delegate(object senderNetwork, TrainingEpochEventArgs args)
            {
                #region trainingCylce
                if (network == null || !GO)
                {
                    return;
                }
                trainedVectors = new double[outputLayer.neuronCount, trainVectorDimension];

                for (int i = 0; i < outputLayer.neuronCount; i++)
                {
                    IList <ISynapse> synapses = (network.OutputLayer as KohonenLayerND)[outputLayer.adressBook[i]].SourceSynapses;
                    for (int j = 0; j < trainVectorDimension; j++)
                    {
                        trainedVectors[i, j] = synapses[j].Weight;
                    }
                }

                //make new net here
                netP = new CrowNetSOMNDP(size, isDimensionCircular, latticeTopology, neighborhood, trainedVectors, outputLayer.adressBook);

                counter++;

                #endregion
            });

            network.EndSampleEvent += new TrainingSampleEventHandler(
                delegate(object senderNetwork, TrainingSampleEventArgs args)
            {
                netP.winner = outputLayer.WinnerND.CoordinateND;
            });
            #endregion



            network.Learn(trainingSet, cycles);
        }