Exemplo n.º 1
0
        /// <summary>
        /// Compares the simulation cell's Tst value to the transitions Tst min and max
        /// </summary>
        /// <param name="simulationCell">The simulation cell</param>
        /// <param name="tr">The transition</param>
        /// <returns>TRUE if the cell's Tst is in range and FALSE if not.</returns>
        /// <remarks></remarks>
        private bool CompareTstValues(Cell simulationCell, Transition tr)
        {
            //If the transition's Transition Type doesn't have an associated Transition Group in
            //Time-Since-Transition groups then return True.

            TstTransitionGroup tstgroup = this.m_TstTransitionGroupMap.GetGroup(
                tr.TransitionTypeId, simulationCell.StratumId,
                simulationCell.SecondaryStratumId, simulationCell.TertiaryStratumId);

            if (tstgroup == null)
            {
                return(true);
            }

            //Get the matching Tst for the simulation cell
            Tst cellTst = simulationCell.TstValues[tstgroup.TSTGroupId];

            //If the cell Tst value is within the Transition's TstMin and TstMax range then return TRUE
            if (cellTst.TstValue >= tr.TstMinimum && cellTst.TstValue <= tr.TstMaximum)
            {
                return(true);
            }

            return(false);
        }
Exemplo n.º 2
0
        public void AddGroup(int transitionTypeId, int?stratumId, int?secondaryStratumId, int?tertiaryStratumId, TstTransitionGroup item)
        {
            TstTransitionGroup v = this.m_Map.GetItemExact(transitionTypeId, stratumId, secondaryStratumId, tertiaryStratumId);

            if (v != null)
            {
                string template = "A duplicate Time-Since-Transition Group was detected: More information:" + Environment.NewLine + "Transition Type={0}, {1}={2}, {3}={4}, {5}={6}.";
                ExceptionUtils.ThrowArgumentException(template, this.GetTransitionTypeName(transitionTypeId), this.PrimaryStratumLabel, this.GetStratumName(stratumId), this.SecondaryStratumLabel, this.GetSecondaryStratumName(secondaryStratumId), this.TertiaryStratumLabel, this.GetTertiaryStratumName(tertiaryStratumId));
            }

            this.m_Map.AddItem(transitionTypeId, stratumId, secondaryStratumId, tertiaryStratumId, item);
            this.SetHasItems();
        }
Exemplo n.º 3
0
        private void ApplyTransitionSpread(Cell contagionCell, Cell neighboringCell, TransitionGroup spreadGroup, int iteration, int timestep, bool isDiagonal, CardinalDirection direction, Dictionary <int, double[]> rasterTransitionAttrValues, Dictionary <int, int[]> dictTransitionedPixels)
        {
            Debug.Assert(this.IsSpatial);

            //Get the cell probability.  If it is less than or equal to zero we don't need to continue

            //DEVTODO: LEO, is this OK with the new Transition Prioritization Code?

            double CellProbability = this.SpatialCalculateCellProbability(neighboringCell, spreadGroup.TransitionGroupId, iteration, timestep);

            if (CellProbability <= 0.0)
            {
                return;
            }

            //Get the transition pathway.  If there isn't one we don't need to continue
            Transition tr = this.SelectTransitionPathway(neighboringCell, spreadGroup.TransitionGroupId, iteration, timestep);

            if (tr == null)
            {
                return;
            }

            //Prepare a TST value with a default of 1.  If we can find a TST group for the contagion cell's stratum and transition type, and
            //the the contagion cells TST values contains that group, then use that TST value.

            int tstvalue = 1;

            TstTransitionGroup tstgroup = this.m_TstTransitionGroupMap.GetGroup(
                tr.TransitionTypeId, contagionCell.StratumId, contagionCell.SecondaryStratumId, contagionCell.TertiaryStratumId);

            if (tstgroup != null)
            {
                if (contagionCell.TstValues.Contains(tstgroup.TSTGroupId))
                {
                    tstvalue = contagionCell.TstValues[tstgroup.TSTGroupId].TstValue;
                }
            }

            if (tstvalue > 0)
            {
                double MinThreshold     = 0;
                double MaxThreshold     = 0;
                double SpreadDistance   = this.CalculateSpreadDistance(contagionCell, tstvalue, spreadGroup, iteration, timestep);
                double NeighborDistance = this.GetNeighborCellDistance(direction);
                double Slope            = GetSlope(contagionCell, neighboringCell, NeighborDistance);

                SpreadDistance *= this.m_TransitionDirectionMultiplierMap.GetDirectionMultiplier(spreadGroup.TransitionGroupId, contagionCell.StratumId, contagionCell.SecondaryStratumId, contagionCell.TertiaryStratumId, direction, iteration, timestep);
                SpreadDistance *= this.m_TransitionSlopeMultiplierMap.GetSlopeMultiplier(spreadGroup.TransitionGroupId, contagionCell.StratumId, contagionCell.SecondaryStratumId, contagionCell.TertiaryStratumId, iteration, timestep, Slope);

                if (isDiagonal)
                {
                    MinThreshold = this.m_InputRasters.GetCellSizeDiagonalMeters() / 2;
                    MaxThreshold = this.m_InputRasters.GetCellSizeDiagonalMeters() * 1.5;
                }
                else
                {
                    MinThreshold = this.m_InputRasters.GetCellSizeMeters() / 2;
                    MaxThreshold = this.m_InputRasters.GetCellSizeMeters() * 1.5;
                }

                if (SpreadDistance >= MinThreshold && SpreadDistance <= MaxThreshold)
                {
                    this.RecordSummaryTransitionOutput(neighboringCell, tr, iteration, timestep, null);
                    this.RecordSummaryTransitionByStateClassOutput(neighboringCell, tr, iteration, timestep);

                    this.ChangeCellForProbabilisticTransition(neighboringCell, tr, iteration, timestep, rasterTransitionAttrValues);
                    this.UpdateTransitionedPixels(neighboringCell, tr.TransitionTypeId, dictTransitionedPixels[spreadGroup.TransitionGroupId]);
                    this.FillProbabilisticTransitionsForCell(neighboringCell, iteration, timestep);
                }
                else if (SpreadDistance > MaxThreshold)
                {
                    int  randdirection = this.m_RandomGenerator.GetNextInteger(0, 360);
                    Cell DistantCell   = GetCellByDistanceAndDirection(contagionCell, randdirection, SpreadDistance);

                    if (DistantCell != null)
                    {
                        Transition DistantTransition = this.SelectTransitionPathway(DistantCell, spreadGroup.TransitionGroupId, iteration, timestep);

                        if (DistantTransition != null)
                        {
                            this.RecordSummaryTransitionOutput(DistantCell, DistantTransition, iteration, timestep, null);
                            this.RecordSummaryTransitionByStateClassOutput(DistantCell, DistantTransition, iteration, timestep);

                            this.ChangeCellForProbabilisticTransition(DistantCell, DistantTransition, iteration, timestep, rasterTransitionAttrValues);
                            this.UpdateTransitionedPixels(DistantCell, DistantTransition.TransitionTypeId, dictTransitionedPixels[spreadGroup.TransitionGroupId]);
                            this.FillProbabilisticTransitionsForCell(DistantCell, iteration, timestep);
                        }
                    }
                }
            }
        }