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);
        }