Esempio n. 1
0
        // Update is called once per frame
        protected override void OnUpdate( )
        {
            if (Time.ElapsedTime <= i_startTime)
            {
                return;                                     // Delay startup.
            }
            EntityCommandBuffer ecb = becb.CreateCommandBuffer();

            ComponentDataFromEntity <NNManagerComponent> a_manager;


            if (group_MMMamager.CalculateChunkCount() == 0)
            {
                // Debug.LogWarning ( "There is no active managers yet." ) ;
                return;
            }


            a_manager = GetComponentDataFromEntity <NNManagerComponent> (false);
            // NNManagerComponent manager ;
            ComponentDataFromEntity <NNTimerComponent> a_managerTimer = GetComponentDataFromEntity <NNTimerComponent> (false);
            ComponentDataFromEntity <IsTimeUpTag>      a_isTimeUpTag  = GetComponentDataFromEntity <IsTimeUpTag> (true);


            int i_activeManager = 0;


            l_managerSharedData.Clear();
            EntityManager.GetAllUniqueSharedComponentData(l_managerSharedData);


            // Ignore default manager entity ( index = 0, version = 0 ), taken from prefab entity.
            for (int i = 0; i < l_managerSharedData.Count; i++)
            {
                NNManagerSharedComponent mangerSharedComponent = l_managerSharedData [i];
                Entity managerEntity = new Entity()
                {
                    Index = mangerSharedComponent.i_entityIndex, Version = mangerSharedComponent.i_entityVersion
                };

                ComponentDataFromEntity <IsAliveTag> a_isAliveTag = GetComponentDataFromEntity <IsAliveTag> (false);
// Debug.Log ( "nnManagerEntity: " + nnManagerEntity ) ;


                // Entity manager must be valid and active.
                if (ManagerMethods._SkipInvalidManager(managerEntity, ref a_isAliveTag))
                {
                    continue;
                }

                if (!a_isTimeUpTag.HasComponent(managerEntity))
                {
                    NNTimerComponent managerTimer = a_managerTimer [managerEntity];

                    NNManagerComponent manager = a_manager [managerEntity];

// Debug.Log ( "Timer" ) ;
                    group_finishedPopulation.SetSharedComponentFilter(mangerSharedComponent);

                    if (Time.ElapsedTime >= managerTimer.f || group_finishedPopulation.CalculateEntityCount() >= manager.i_populationSize)
                    {
                        managerTimer.f = (float)Time.ElapsedTime + manager.i_startLifeTime;

                        a_managerTimer [managerEntity] = managerTimer;   // Set back.

                        ecb.AddComponent <IsTimeUpTag> (managerEntity);

// Debug.LogError ( "Set" ) ;
                    }
                }
                else // if ( a_isTimeUpTag.Exists ( managerEntity ) )
                {
// Debug.LogError ( "Reset" ) ;
                    ecb.RemoveComponent <IsTimeUpTag> (managerEntity);
                }

                i_activeManager++;
            } // for

            becb.AddJobHandleForProducer(Dependency);
        }
        protected override void OnUpdate( )
        {
            if (group_MMMamager.CalculateChunkCount() == 0)
            {
                Debug.LogWarning("There is no active manager.");
                return;
            }

            EntityCommandBuffer ecb = becb.CreateCommandBuffer();

            EntityCommandBuffer.ParallelWriter ecbp = ecb.AsParallelWriter();


            l_managerSharedData.Clear();
            EntityManager.GetAllUniqueSharedComponentData(l_managerSharedData);

            ComponentDataFromEntity <NNManagerBestFitnessComponent> a_managerBestFitness = GetComponentDataFromEntity <NNManagerBestFitnessComponent> (false);
            ComponentDataFromEntity <NNManagerComponent>            a_manager            = GetComponentDataFromEntity <NNManagerComponent> (true);
            ComponentDataFromEntity <NNScoreComponent> a_managerScore = GetComponentDataFromEntity <NNScoreComponent> (true);

            ComponentDataFromEntity <NNBrainScoreComponent> a_brainScore = GetComponentDataFromEntity <NNBrainScoreComponent> (true);

            ComponentDataFromEntity <NNMangerIsSpawningNewGenerationTag> a_mangerIsSpawningNewGeneration = GetComponentDataFromEntity <NNMangerIsSpawningNewGenerationTag> (false);

            BufferFromEntity <NNInput2HiddenLayersWeightsBuffer>  NNInput2HiddenLayersWeightsBuffer  = GetBufferFromEntity <NNInput2HiddenLayersWeightsBuffer> (false);
            BufferFromEntity <NNHidden2OutputLayersWeightsBuffer> NNHidden2OutputLayersWeightsBuffer = GetBufferFromEntity <NNHidden2OutputLayersWeightsBuffer> (false);

            // BufferFromEntity <NNHiddenLayersNeuronsBiasBuffer> NNHiddenLayersNeuronsBiasBuffer           = GetBufferFromEntity <NNHiddenLayersNeuronsBiasBuffer> ( false ) ;


            // ComponentDataFromEntity <NNScoreComponent> a_managerScore                                           = GetComponentDataFromEntity <NNScoreComponent> ( true ) ;

            BufferFromEntity <NNINdexProbabilityBuffer> indexProbabilityBuffer = GetBufferFromEntity <NNINdexProbabilityBuffer> (false);

            // int i_validManagersCount                                                                     = 0 ;
            // bool canCalculateCrossovers                                                                  = false ;

            for (int i = 0; i < l_managerSharedData.Count; i++)
            {
                NNManagerSharedComponent mangerSharedComponent = l_managerSharedData [i];
                Entity nnManagerEntity = new Entity()
                {
                    Index = mangerSharedComponent.i_entityIndex, Version = mangerSharedComponent.i_entityVersion
                };

                if (a_mangerIsSpawningNewGeneration.HasComponent(nnManagerEntity))
                {
                    group_parentPopulation.SetSharedComponentFilter(mangerSharedComponent);
                    group_offspringPopulation.SetSharedComponentFilter(mangerSharedComponent);

                    NativeArray <Entity> na_parentPopulationEntities    = group_parentPopulation.ToEntityArray(Allocator.TempJob);
                    NativeArray <Entity> na_offspringPopulationEntities = group_offspringPopulation.ToEntityArray(Allocator.TempJob);

                    DynamicBuffer <NNINdexProbabilityBuffer> a_indexProbability = indexProbabilityBuffer [nnManagerEntity];


                    NNScoreComponent managerScore = a_managerScore [nnManagerEntity];
                    // int i_eliteScore                                            = managerScore.i ;



                    Debug.Log("Total score: " + managerScore.i + "; elite score: " + managerScore.i_elite);


                    if (managerScore.i_elite <= 1)
                    {
                        Dependency = new CopyLastBestGenerationDNAJob()
                        {
                            na_parentPopulationEntities    = na_parentPopulationEntities,
                            na_offspringPopulationEntities = na_offspringPopulationEntities,

                            // na_indexProbability              = na_indexProbability,

                            input2HiddenLayersWeightsBuffer  = NNInput2HiddenLayersWeightsBuffer,
                            hidden2OutputLayersWeightsBuffer = NNHidden2OutputLayersWeightsBuffer,

                            // hiddenLayersNeuronsBiasBuffer    = NNHiddenLayersNeuronsBiasBuffer
                        }.Schedule(na_parentPopulationEntities.Length, 256, Dependency);

                        Dependency.Complete();
                    }
                    else
                    {
                        // New score is fine.

                        // Calculate index probability, to get best parents.
                        // Each entity indicies will be in the array, as many times, as many score has
                        // e.g.
                        // 0th entity with 0 points won't be in the array
                        // 1st entity with 2 points will be 2 times
                        // nth entity with xth score will be xth times in the array

                        NNManagerComponent manager = a_manager [nnManagerEntity];

                        NativeMultiHashMap <int, EntityIndex> nmhm_parentEntitiesScore = new NativeMultiHashMap <int, EntityIndex> (na_parentPopulationEntities.Length, Allocator.TempJob);

// Debug.Log ( "crossover parent score" ) ;
                        Dependency = new CommonJobs.GetPopulationScoreJob( )
                        {
                            canGetEachScore       = false,
                            na_populationEntities = na_parentPopulationEntities,
                            a_brainScore          = a_brainScore,

                            nmhm_populationEntitiesScore = nmhm_parentEntitiesScore.AsParallelWriter()
                        }.Schedule(na_parentPopulationEntities.Length, 256, Dependency);

                        Dependency.Complete();

                        NativeArray <int> na_parentSortedKeysWithDuplicates = nmhm_parentEntitiesScore.GetKeyArray(Allocator.TempJob);
                        // This stores key keys in order. But keeps first unique keys at the front of an array.
                        // Total array size matches of total elements.
                        na_parentSortedKeysWithDuplicates.Sort();
                        // Sorted.
                        int i_uniqueKeyCount = na_parentSortedKeysWithDuplicates.Unique();

                        int i_eltieCountTemp = (int)(na_parentSortedKeysWithDuplicates.Length * manager.f_eliteSize);
                        // Minimum elite size mus be met.
                        int i_eltiesCount = i_eltieCountTemp > 0 ? i_eltieCountTemp : na_parentSortedKeysWithDuplicates.Length;

                        if (na_parentSortedKeysWithDuplicates.Length == 0)
                        {
                            Debug.LogError("Not enough elites for training. Please increase population, or elites %.");

                            na_offspringPopulationEntities.Dispose();
                            na_parentPopulationEntities.Dispose();
                            nmhm_parentEntitiesScore.Dispose();
                            na_parentSortedKeysWithDuplicates.Dispose();

                            continue;
                        }

                        NativeArray <EntityIndex> na_elities = new NativeArray <EntityIndex> (i_eltiesCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);

                        DynamicBuffer <NNINdexProbabilityBuffer> a_eliteIndexProbability = indexProbabilityBuffer [nnManagerEntity];
                        int i_totalElitesScore = managerScore.i_elite;
                        a_eliteIndexProbability.ResizeUninitialized(i_totalElitesScore);

                        Dependency = new CommonJobs.GetElitesEntitiesJob()
                        {
                            i_eltiesCount = i_eltiesCount,

                            na_elities         = na_elities,
                            nmhm_entitiesScore = nmhm_parentEntitiesScore,
                            na_currentSortedKeysWithDuplicates = na_parentSortedKeysWithDuplicates
                        }.Schedule();



                        Dependency = new CalculateIndexProbabilityOfPopulationJob()
                        {
                            na_populationEntities = na_elities,

                            a_indexProbability = a_eliteIndexProbability,

                            a_brainScore = a_brainScore
                        }.Schedule(Dependency);


                        NativeArray <int> na_randomValues = new NativeArray <int> (na_parentPopulationEntities.Length, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);

                        random.NextInt2();
                        Dependency = new RandomIntsJob()
                        {
                            na_randomValues = na_randomValues,
                            random          = random
                        }.Schedule(Dependency);

                        Dependency.Complete();

// Debug.LogError ( "parent pop: " + na_parentPopulationEntities.Length + "; offspring pop: " + na_offspringPopulationEntities.Length ) ;
                        Dependency = new DNACrossOverJob()
                        {
                            na_parentPopulationEntities    = na_parentPopulationEntities,
                            na_offspringPopulationEntities = na_offspringPopulationEntities,

                            na_indexProbability = a_eliteIndexProbability.Reinterpret <int> ().AsNativeArray(),

                            input2HiddenLayersWeightsBuffer  = NNInput2HiddenLayersWeightsBuffer,
                            hidden2OutputLayersWeightsBuffer = NNHidden2OutputLayersWeightsBuffer,

                            na_randomValues = na_randomValues,
                            random          = random,

                            // i_eliteScore                     = i_eliteScore
                        }.Schedule(na_parentPopulationEntities.Length, 256, Dependency);

                        Dependency.Complete();

                        na_randomValues.Dispose();
                        na_elities.Dispose();
                        nmhm_parentEntitiesScore.Dispose();
                        na_parentSortedKeysWithDuplicates.Dispose();
                    }

                    ecb.RemoveComponent <NNMangerIsSpawningNewGenerationTag> (nnManagerEntity);
                    becb.AddJobHandleForProducer(Dependency);


                    na_offspringPopulationEntities.Dispose();
                    na_parentPopulationEntities.Dispose();
                }
            } // for


            Entities
            .WithName("GenerationSpawningIsCompleteJob")
            .WithAll <NNBrainTag, IsSpawningTag> ()
            .ForEach((Entity entity, int entityInQueryIndex) =>
            {
                ecbp.RemoveComponent <IsSpawningTag> (entityInQueryIndex, entity);
                ecbp.AddComponent <IsSpawningCompleteTag> (entityInQueryIndex, entity);
            }).ScheduleParallel();

            becb.AddJobHandleForProducer(Dependency);
        }