protected override void Harvest()
 {
     log.WriteLine("Run Mode1 harvesting ...");
     ClearHarvested();
     GenerateNewPrescriptions(sosielData);
     foreach (var agent in Agents)
     {
         var areas = sheParameters.AgentToManagementAreaList
                     .First(map => map.Agent.Equals(agent.Id)).ManagementAreas
                     .Select(ma => Areas.First(area => area.Key.Equals(ma)).Value);
         foreach (var area in areas)
         {
             var key = HarvestResults.GetKey(ModeId, agent, area);
             //Debugger.Launch();
             if (sosielData.SelectedDecisions.ContainsKey(key))
             {
                 var selectedPrescriptionNames = sosielData.SelectedDecisions[key];
                 log.WriteLine($"\t\t{key}: decisions: {string.Join(",", selectedPrescriptionNames)}");
                 var selectedPrescriptions = _prescriptions.Where(
                     p => selectedPrescriptionNames.Contains(p.Name));
                 var harvestManager =
                     new HarvestManager(area, selectedPrescriptions, _harvestPrescriptionName, _siteCohorts);
                 _harvested[key] = harvestManager.Harvest();
                 log.WriteLine($"\t\t{key}: harvested {harvestManager.HarvestedSitesNumber} sites");
             }
             else
             {
                 log.WriteLine($"\t\t{key}: harvested 0 sites (no decision found)");
             }
         }
     }
     log.WriteLine("Mode 1: Harvesting finished.");
 }
        protected override HarvestResults AnalyzeHarvestingResult()
        {
            var results = new HarvestResults();

            foreach (var agent in Agents)
            {
                var areas = sheParameters.AgentToManagementAreaList
                            .First(map => map.Agent == agent.Id).ManagementAreas
                            .Select(ma => Areas.First(area => area.Key == ma).Value);
                foreach (var area in areas)
                {
                    var key = HarvestResults.GetKey(1, agent, area);
                    results.ManagementAreaBiomass[key]         = 0;
                    results.ManagementAreaMaturityPercent[key] = 0;

                    double manageAreaMaturityProportion = 0;
                    foreach (var stand in area.ManagementArea)
                    {
                        double standMaturityProportion = 0;
                        foreach (var site in stand)
                        {
                            double siteBiomass  = 0;
                            double siteMaturity = 0;

                            foreach (var species in PlugIn.ModelCore.Species)
                            {
                                var cohorts = _siteCohorts[site][species];
                                if (cohorts == null)
                                {
                                    continue;
                                }
                                double siteSpeciesMaturity = 0;
                                foreach (var cohort in cohorts)
                                {
                                    siteBiomass += cohort.Biomass;
                                    if (cohort.Age >= PlugIn.ModelCore.Species[species.Name].Maturity)
                                    {
                                        siteSpeciesMaturity += cohort.Biomass;
                                    }
                                }
                                siteMaturity += siteSpeciesMaturity;
                            }

                            var siteMaturityProportion = Math.Abs(siteBiomass) < 0.0001
                                ? 0 : (siteMaturity / siteBiomass) * 2;
                            results.ManagementAreaBiomass[key] += siteBiomass;
                        }
                        standMaturityProportion      /= stand.Count();
                        manageAreaMaturityProportion += standMaturityProportion;
                    }

                    manageAreaMaturityProportion              /= area.ManagementArea.StandCount;
                    results.ManagementAreaBiomass[key]         = results.ManagementAreaBiomass[key] / 100 * PlugIn.ModelCore.CellArea;
                    results.ManagementAreaHarvested[key]       = _harvested[key] * PlugIn.ModelCore.CellArea;
                    results.ManagementAreaMaturityPercent[key] = 100 * manageAreaMaturityProportion;
                }
            }
            return(results);
        }
 private void ClearHarvested()
 {
     foreach (var agent in Agents)
     {
         PlugIn.ModelCore.UI.WriteLine($"ClearHarvested: agent {agent.Id}");
         var areas = sheParameters.AgentToManagementAreaList
                     .First(map => map.Agent.Equals(agent.Id))
                     .ManagementAreas.Select(ma => Areas.First(area => area.Key.Equals(ma)).Value);
         foreach (var area in areas)
         {
             var key = HarvestResults.GetKey(1, agent, area);
             _harvested[key] = 0.0;
         }
     }
 }
        protected override HarvestResults AnalyzeHarvestingResult()
        {
            // Report all zeros
            var results = new HarvestResults();

            foreach (var agent in Agents)
            {
                var areas = sheParameters.AgentToManagementAreaList
                            .First(map => map.Agent == agent.Id).ManagementAreas
                            .Select(ma => Areas.First(area => area.Key == ma).Value);
                foreach (var area in areas)
                {
                    var key = HarvestResults.GetKey(ModeId, agent, area);
                    results.ManagementAreaBiomass[key]         = 0;
                    results.ManagementAreaMaturityPercent[key] = 0;
                    results.ManagementAreaBiomass[key]         = 0;
                    results.ManagementAreaHarvested[key]       = 0;
                    results.ManagementAreaMaturityPercent[key] = 0;
                }
            }
            return(results);
        }