private SegmentZone[] ComputeSegment(int segment) { double[] sizeFactors = Global.ContainerDaySim.GetInstance <SamplingWeightsSettingsFactory>().SamplingWeightsSettings.SizeFactors[segment]; double[] weightFactors = Global.ContainerDaySim.GetInstance <SamplingWeightsSettingsFactory>().SamplingWeightsSettings.WeightFactors[segment]; SegmentZone[] segmentZones = new SegmentZone[_zoneCount]; foreach (IParcelWrapper parcel in _eligibleParcels) { SegmentZone segmentZone = segmentZones[parcel.ZoneId]; IZone zone = _eligibleZones[parcel.ZoneId]; if (segmentZone == null) { segmentZone = new SegmentZone(_parcelCounts[parcel.ZoneId], _zoneCount) { Id = parcel.ZoneId, Key = zone.Key }; segmentZones[segmentZone.Id] = segmentZone; } double openSpace = (Global.Configuration.UseParcelLandUseCodeAsSquareFeetOpenSpace) ? parcel.LandUseCode : parcel.OpenSpaceType2Buffer1; double openSpaceSize = (Global.Configuration.UseLogOfSquareFeetOpenSpaceInDestinationSampling || Global.Configuration.UseParcelLandUseCodeAsSquareFeetOpenSpace) ? Math.Log(openSpace + 1.0) : openSpace; double factor = Math.Exp(sizeFactors[0]) * parcel.EmploymentEducation + Math.Exp(sizeFactors[1]) * parcel.EmploymentFood + Math.Exp(sizeFactors[2]) * parcel.EmploymentGovernment + Math.Exp(sizeFactors[3]) * parcel.EmploymentIndustrial + Math.Exp(sizeFactors[4]) * parcel.EmploymentMedical + Math.Exp(sizeFactors[5]) * parcel.EmploymentOffice + Math.Exp(sizeFactors[6]) * parcel.EmploymentAgricultureConstruction + Math.Exp(sizeFactors[7]) * parcel.EmploymentRetail + Math.Exp(sizeFactors[8]) * parcel.EmploymentService + Math.Exp(sizeFactors[9]) * parcel.EmploymentTotal + Math.Exp(sizeFactors[10]) * parcel.Households + Math.Exp(sizeFactors[11]) * parcel.StudentsK8 + Math.Exp(sizeFactors[12]) * parcel.StudentsUniversity + Math.Exp(sizeFactors[13]) * parcel.GetLandUseCode19() + Math.Exp(sizeFactors[14]) * parcel.OpenSpaceType1Buffer1 + Math.Exp(sizeFactors[15]) * openSpaceSize + Math.Exp(sizeFactors[16]) * parcel.StudentsHighSchool; double size = 100 * factor; if (size >= Global.Configuration.MinParcelSize) { segmentZone.TotalSize += size; } segmentZone.SetSize(parcel.Sequence, parcel.Id, size); } foreach (SegmentZone origin in segmentZones.Where(o => o != null)) { origin.RankSizes(); foreach (SegmentZone destination in segmentZones.Where(d => d != null)) { SkimValue skimValue = ImpedanceRoster.GetValue(_variableName, _mode, _pathType, _vot, _minute, origin.Id, destination.Id); //jb 20130707 mimic mb fix for 0 intrazonals if (Global.Configuration.DestinationScale == Global.Settings.DestinationScales.Zone && origin.Id == destination.Id && skimValue.Variable < Constants.EPSILON) { if (_variableName == "distance") { skimValue.Variable = 0.25 * Global.Settings.DistanceUnitsPerMile; } else if (_variableName == "ivtime" || _variableName == "time" || _variableName == "ivtfree") { skimValue.Variable = (_mode == Global.Settings.Modes.Walk) ? 5 : (_mode == Global.Settings.Modes.Bike) ? 2 : (_mode > Global.Settings.Modes.Bike && _mode < Global.Settings.Modes.Transit) ? 1 : 0; } } double sovInVehicleTime = skimValue.Variable; // give 0 weight if not connected in SOV matrix double weight = sovInVehicleTime < Constants.EPSILON ? 0.0 : Math.Exp(-2 * sovInVehicleTime * 100 / weightFactors[0]) * destination.TotalSize; origin.TotalWeight += weight; origin.SetWeight(destination.Id, weight); } origin.RankWeights(); } return(segmentZones); }