Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="frequency"></param>
        /// <param name="startTimeFrequency"></param>
        /// <param name="startTime"></param>
        /// <param name="outFrequencyLevels"></param>
        /// <param name="numberOfDistributions"></param>
        /// <param name="highestFrequency"></param>
        /// <param name="startTimeQuantums"></param>
        private void CreateFrequencyDistroCache()
        {
            if ( !this.GenerateIfExists && File.Exists( this.GetFullPath( this.FrequencyLevelsZFC ) ) )
            {
                return;
            }
            string temp = Path.GetTempFileName();
            StreamReader readFrequency;
            StreamReader readStartTimeFrequency;
            StreamReader readStartTime;
            StreamWriter writer;
            using ( writer = new StreamWriter( temp ) )
            using ( readStartTime = new StreamReader( this.GetFullPath( this.DurationDistribution ) ) )
            using ( readStartTimeFrequency = new StreamReader( this.GetFullPath( this.StartTimeFrequency ) ) )
            using ( readFrequency = new StreamReader( this.GetFullPath( this.Frequency ) ) )
            {
                // get rid of the headers
                RemoveHeaders( readFrequency, readStartTime, readStartTimeFrequency );

                StringBuilder line;
                for ( int dist = 0; dist < this.NumberOfDistributions; dist++ )
                {
                    line = new StringBuilder( 20000 );
                    line.Append( dist );
                    line.Append( ',' );

                    WriteFrequencies( line, readFrequency );
                    WriteDurations( line, readStartTime );
                    WriteStartTimeFrequencies( line, readStartTimeFrequency );
                    writer.WriteLine( line.ToString( 0, line.Length - 1 ) );
                }
            }

            var numberOfFrequencies = this.HighFrequency + 1; // it was inclusive
            var numberOfSTF = numberOfFrequencies * this.StartTimeQuantums;
            // there are actually StartTimeQuantums + 1 durations
            var numberOfDurations = ( this.StartTimeQuantums ) * ( this.StartTimeQuantums + 1 );

            int types = numberOfFrequencies + numberOfSTF + numberOfDurations;
            if ( File.Exists( this.FrequencyLevelsZFC ) )
            {
                try
                {
                    File.Delete( this.FrequencyLevelsZFC );
                }
                catch
                { }
            }
            SparseZoneCreator zc = new SparseZoneCreator( this.NumberOfDistributions, types );
            zc.LoadCSV( temp, false );
            zc.Save( this.GetFullPath( this.FrequencyLevelsZFC ) );
            File.Delete( temp );
        }
Ejemplo n.º 2
0
        public void BuildLocationChoiceCacheHome(float[,] p, IZone[] flatZones)
        {
            string temp = Path.GetTempFileName();
            //string temp = Directory.GetCurrentDirectory() + "\\" + "test2.csv";
            Console.WriteLine( temp );
            StreamWriter writer = new StreamWriter( temp );
            //fire up the cache

            ZoneCache<IZone>.CacheSize = 8000;

            StringBuilder line = null;
            Console.WriteLine( "Building LocationChoiceHomeCache" );
            int sum = 0;
            for ( int i = 0; i < flatZones.Length; i++ )
            {
                IZone iz = flatZones[i];
                if ( iz.Population == 0 &&
                   iz.X == 0 && iz.Y == 0 ) continue;
                else
                {
                    sum++;
                }

                double distkm = 0;
                //sum EXP for G---------------------------------------------------
                double sumExp = 0;
                double empP = 0;
                double empG = 0;
                double empR = 0;
                double sh0 = 0.0;
                double sh1 = 0.0;
                double sh2 = 0.0;
                double empT = 0;
                line = new StringBuilder( 100000 );
                line.Append( i );

                //h=0

                for ( int k = 0; k < flatZones.Length; k++ )
                {
                    IZone kz = flatZones[k];

                    if ( kz.InternalDistance == 0 )
                        continue;

                    if ( kz.TotalEmployment > 0 )
                    {
                        empT = Math.Log( ( (double)kz.TotalEmployment / 1000.0 ) + 1.0 );

                        //distance in KM
                        distkm = this.ZoneSystem.Distances[iz.ZoneNumber, kz.ZoneNumber] / 1000;
                        if ( distkm >= 0 && distkm <= p[0, 4] )
                        {
                            sh0 = 0.0;
                            sh1 = 0.0;
                            sh2 = 0.0;
                            if ( distkm >= 0 && distkm < 1 ) sh0 = 1;
                            else if ( distkm >= 1 && distkm < 2 ) sh1 = 1;
                            else if ( distkm >= 2 && distkm < 3 ) sh2 = 1;

                            sumExp += Math.Exp( ( p[0, 0] * distkm ) + ( p[0, 1] * empT ) + ( p[0, 2] * sh0 ) + ( p[0, 3] * sh1 ) );
                        }
                    }
                }
                //now calculate CDF sums from ... k .. num InternalZones

                double cdf = 0.0;
                for ( int k = 0; k < flatZones.Length; k++ )
                {
                    IZone kz = flatZones[k];

                    if ( kz.TotalEmployment > 0 )
                    {
                        empT = Math.Log( ( (double)kz.TotalEmployment / 1000.0 ) + 1.0 );

                        distkm = this.ZoneSystem.Distances[iz.ZoneNumber, kz.ZoneNumber] / 1000;
                        if ( distkm >= 0 && distkm <= p[0, 4] && kz.InternalDistance > 0 )
                        {
                            sh0 = 0.0;
                            sh1 = 0.0;
                            sh2 = 0.0;
                            if ( distkm >= 0 && distkm < 1 ) sh0 = 1;
                            else if ( distkm >= 1 && distkm < 2 ) sh1 = 1;
                            else if ( distkm >= 2 && distkm < 3 ) sh2 = 1;

                            cdf += ( Math.Exp( ( p[0, 0] * distkm ) + ( p[0, 1] * empT ) + ( p[0, 2] * sh0 ) + ( p[0, 3] * sh1 ) ) / sumExp );
                        }
                    }
                    line.Append( "," );
                    line.Append( cdf );
                }

                sumExp = 0;
                for ( int k = 0; k < flatZones.Length; k++ )
                {
                    IZone kz = flatZones[k];

                    if ( kz.InternalDistance == 0 )
                        continue;
                    if ( kz.TotalEmployment > 0 )
                    {
                        empT = Math.Log( ( (double)kz.TotalEmployment / 1000.0 ) + 1.0 );
                        distkm = this.ZoneSystem.Distances[iz.ZoneNumber, kz.ZoneNumber] / 1000;
                        if ( distkm >= 0 && distkm <= p[1, 5] )
                        {
                            sh0 = 0.0;
                            sh1 = 0.0;
                            sh2 = 0.0;
                            if ( distkm >= 0 && distkm < 1 ) sh0 = 1;
                            else if ( distkm >= 1 && distkm < 2 ) sh1 = 1;
                            else if ( distkm >= 2 && distkm < 3 ) sh2 = 1;

                            sumExp += Math.Exp( ( ( p[1, 0] * distkm ) + ( p[1, 1] * empT ) + ( p[1, 2] * sh0 ) + ( p[1, 3] * sh1 ) + ( p[1, 4] * sh2 ) ) );
                        }
                    }
                }

                cdf = 0.0;
                for ( int k = 0; k < flatZones.Length; k++ )
                {
                    IZone kz = flatZones[k];

                    if ( kz.TotalEmployment > 0 )
                    {
                        empT = Math.Log( ( (double)kz.TotalEmployment / 1000 ) + 1.0 );

                        distkm = this.ZoneSystem.Distances[iz.ZoneNumber, kz.ZoneNumber] / 1000;
                        if ( distkm >= 0 && distkm <= p[1, 5] && kz.InternalDistance > 0 )
                        {
                            sh0 = 0.0;
                            sh1 = 0.0;
                            sh2 = 0.0;
                            if ( distkm >= 0 && distkm < 1 ) sh0 = 1;
                            else if ( distkm >= 1 && distkm < 2 ) sh1 = 1;
                            else if ( distkm >= 2 && distkm < 3 ) sh2 = 1;

                            cdf += Math.Exp( ( ( p[1, 0] * distkm ) + ( p[1, 1] * empT ) + ( p[1, 2] * sh0 ) + ( p[1, 3] * sh1 ) + ( p[1, 4] * sh2 ) ) ) / sumExp;
                        }
                    }
                    line.Append( "," );
                    line.Append( cdf );
                }

                sumExp = 0;
                for ( int k = 0; k < flatZones.Length; k++ )
                {
                    IZone kz = flatZones[k];

                    if ( kz.InternalDistance == 0 || kz.TotalEmployment <= 0 )
                        continue;

                    empT = Math.Log( ( (double)kz.TotalEmployment / 1000.0 ) + 1.0 );
                    double pop = Math.Log( ( (double)kz.Population / 1000.0 ) + 1.0 );
                    distkm = this.ZoneSystem.Distances[iz.ZoneNumber, kz.ZoneNumber] / 1000;
                    if ( distkm >= 0 && distkm <= p[2, 4] )
                    {
                        empP = ( kz.ProfessionalEmployment / 1000 ) + 0.001;
                        empG = ( kz.GeneralEmployment / 1000 ) + 0.001;
                        sh0 = 0.0;
                        sh1 = 0.0;
                        sh2 = 0.0;
                        if ( distkm >= 0 && distkm < 1 ) sh0 = 1;
                        else if ( distkm >= 1 && distkm < 2 ) sh1 = 1;

                        sumExp += Math.Exp( ( p[2, 0] * distkm ) + ( p[2, 1] * empT ) + ( p[2, 2] * pop ) + ( p[2, 3] * sh0 ) );
                    }
                }

                //line.Append(sumExp);
                cdf = 0.0;
                for ( int k = 0; k < flatZones.Length; k++ )
                {
                    IZone kz = flatZones[k];

                    if ( kz.TotalEmployment > 0 )
                    {
                        empT = Math.Log( ( (double)kz.TotalEmployment / 1000.0 ) + 1.0 );
                        double pop = Math.Log( ( (double)kz.Population / 1000.0 ) + 1.0 );

                        distkm = this.ZoneSystem.Distances[iz.ZoneNumber, kz.ZoneNumber] / 1000;
                        if ( distkm >= 0 && distkm <= p[2, 4] && kz.InternalDistance > 0 )
                        {
                            sh0 = 0.0;
                            sh1 = 0.0;
                            sh2 = 0.0;
                            if ( distkm >= 0 && distkm < 1 ) sh0 = 1;
                            else if ( distkm >= 1 && distkm < 2 ) sh1 = 1;
                            else if ( distkm >= 2 && distkm < 3 ) sh2 = 1;

                            cdf += Math.Exp( ( p[2, 0] * distkm ) + ( p[2, 1] * empT ) + ( p[2, 2] * pop ) + ( p[2, 3] * sh0 ) ) / sumExp;
                        }
                    }
                    line.Append( "," );
                    line.Append( cdf );
                }

                sumExp = 0;
                for ( int k = 0; k < flatZones.Length; k++ )
                {
                    IZone kz = flatZones[k];

                    if ( kz.InternalDistance == 0 || kz.TotalEmployment <= 0 )
                        continue;

                    empR = Math.Log( ( (double)kz.RetailEmployment / 1000.0 ) + 1.0 );
                    distkm = this.ZoneSystem.Distances[iz.ZoneNumber, kz.ZoneNumber] / 1000;

                    double maxDist;
                    int index;
                    if ( kz.PlanningDistrict == 1 )
                    {
                        maxDist = p[3, 16]; //config <MMaxDist1>
                        index = 16;
                    }
                    //if retail activity > 3
                    else if ( ActivityDistribution.GetDistribution( kz, 0 ) >= 3 )
                    {
                        maxDist = p[3, 17];
                        index = 17;
                    }
                    else
                    {
                        maxDist = p[3, 18];
                        index = 18;
                    }

                    if ( distkm >= 0 && distkm <= maxDist )
                    {
                        //empR = ( kz.RetailActivityLevel / 1000 ) + 0.001;
                        sh0 = 0.0;
                        sh1 = 0.0;
                        sh2 = 0.0;
                        if ( distkm >= 0 && distkm < 1 ) sh0 = 1;
                        else if ( distkm >= 1 && distkm < 2 ) sh1 = 1;

                        switch ( index )
                        {
                            case 16:
                                sumExp += Math.Exp( ( p[3, 0] * distkm ) + ( p[3, 1] * empR ) + ( p[3, 2] * sh0 ) + ( p[3, 3] * sh1 ) + ( p[3, 4] * sh2 ) );
                                break;

                            case 17:
                                sumExp += Math.Exp( p[3, 6] + ( p[3, 5] * distkm ) + ( p[3, 7] * empR ) + ( p[3, 8] * sh0 ) + ( p[4, 9] * sh1 ) + ( p[3, 10] * sh2 ) );
                                break;

                            case 18:
                                sumExp += Math.Exp( p[3, 12] + ( p[3, 11] * distkm ) + ( p[3, 13] * empR ) + ( p[3, 14] * sh0 ) + ( p[3, 15] * sh1 ) );
                                break;
                        }
                    }
                }

                //line.Append(sumExp);
                cdf = 0.0;
                for ( int k = 0; k < flatZones.Length; k++ )
                {
                    IZone kz = flatZones[k];

                    if ( kz.TotalEmployment > 0 )
                    {
                        empR = Math.Log( ( (double)kz.RetailEmployment / 1000.0 ) + 1.0 );
                        distkm = this.ZoneSystem.Distances[iz.ZoneNumber, kz.ZoneNumber] / 1000;

                        double maxDist;
                        int index;
                        if ( kz.PlanningDistrict == 1 )
                        {
                            maxDist = p[3, 16]; //config <MMaxDist1>
                            index = 16;
                        }
                        //if retail activity > 3
                        else if ( ActivityDistribution.GetDistribution( kz, 0 ) >= 3 )
                        {
                            maxDist = p[3, 17];
                            index = 17;
                        }
                        else
                        {
                            maxDist = p[3, 18];
                            index = 18;
                        }

                        if ( distkm >= 0 && distkm <= maxDist && kz.InternalDistance > 0 )
                        {
                            // empR = ( kz.RetailActivityLevel / 1000 ) + 0.001;
                            sh0 = 0.0;
                            sh1 = 0.0;
                            sh2 = 0.0;
                            if ( distkm >= 0 && distkm < 1 ) sh0 = 1;
                            else if ( distkm >= 1 && distkm < 2 ) sh1 = 1;

                            switch ( index )
                            {
                                case 16:

                                    cdf += Math.Exp( ( p[3, 0] * distkm ) + ( p[3, 1] * empR ) + ( p[3, 2] * sh0 ) + ( p[3, 3] * sh1 ) + ( p[3, 4] * sh2 ) ) / sumExp;
                                    break;

                                case 17:
                                    cdf += Math.Exp( p[3, 6] + ( p[3, 5] * distkm ) + ( p[3, 7] * empR ) + ( p[3, 8] * sh0 ) + ( p[4, 9] * sh1 ) + ( p[3, 10] * sh2 ) ) / sumExp;
                                    break;

                                case 18:
                                    cdf += Math.Exp( p[3, 12] + ( p[3, 11] * distkm ) + ( p[3, 13] * empR ) + ( p[3, 14] * sh0 ) + ( p[3, 15] * sh1 ) ) / sumExp;
                                    break;
                            }
                        }
                    }
                    line.Append( "," );
                    line.Append( cdf );
                }

                writer.WriteLine( line.ToString( 0, line.Length - 1 ) );
            }
            writer.Close();
            //IConfigurationDirectory directory =
            //    TashaConfiguration.GetDirectory("LocationChoiceModelParameters");
            SparseZoneCreator creator = new SparseZoneCreator( 3, ( 4 * flatZones.Last().ZoneNumber ) + 1 );
            creator.LoadCSV( temp, false );
            creator.Save( this.LocatonChoiceModelHomeCache );
            File.Delete( temp );
        }
Ejemplo n.º 3
0
        private void CreateAdultFrequencyDistroCache()
        {
            if ( !this.GenerateIfExists && File.Exists( this.GetFullPath( this.AdultDistributionsZFC ) ) ) return;
            string temp = Path.GetTempFileName();
            using ( StreamReader reader = new StreamReader( this.GetFullPath( this.adultIn ) ) )
            {
                using ( StreamWriter writer = new StreamWriter( temp ) )
                {
                    //0...num of distrubtions
                    for ( int i = 0; i < this.AdultDistributions; i++ )
                    {
                        StringBuilder sb = new StringBuilder( 1000000 );
                        //convert the data to one line

                        sb.Append( i );
                        for ( int j = 0; j < this.NumberOfAdultFrequencies; j++ )
                        {
                            string line = reader.ReadLine();
                            //skip the first 3 values (they are implied) based on index
                            string[] values = line.Split( ',' );
                            sb.Append( "," );
                            sb.Append( values[3] );
                        }
                        writer.WriteLine( sb );
                    }
                }
            }
            //  ZoneCreator.CsvToZFC(temp, Zone.GetNumberOfZones, 4 * numInternalZones, TashaConfiguration.GetInputFile(directory, "LocationChoiceModelWorkCache"), false);
            if ( File.Exists( this.GetFullPath( this.AdultDistributionsZFC ) ) )
            {
                try
                {
                    File.Delete( this.GetFullPath( this.AdultDistributionsZFC ) );
                }
                catch
                { }
            }
            SparseZoneCreator zc = new SparseZoneCreator( this.AdultDistributions, this.NumberOfAdultFrequencies );
            zc.LoadCSV( temp, false );
            zc.Save( this.GetFullPath( AdultDistributionsZFC ) );
            File.Delete( temp );
        }
Ejemplo n.º 4
0
        public void BuildLocationChoiceCache(float[,] p, IZone[] flatZones)
        {
            string temp = Path.GetTempFileName();
            //string temp = Directory.GetCurrentDirectory() + "\\" + "test.csv";
            Console.WriteLine( temp );
            StreamWriter writer = new StreamWriter( temp );
            //fire up the cache

            ZoneCache<IZone>.CacheSize = 8000;
            //each row comparing one zone to another zone
            //column 1 zone ID, column 2 zone(comparing zone),column 3 distance,
            //column 4 sumExp1,
            //column5 exponentExpression1: exp( (p1*distkm) + (p2*log(empP)) + (p3*log(empG)) + (p4*sh0) + (p5*sh1) + (p6*sh2) )
            //column 6 sumExp1,
            //column7 exponentExpression1: exp( (p1*distkm) + (p2*log(empP)) + (p3*log(empG)) + (p4*sh0) + (p5*sh1) + (p6*sh2) )
            //column 8 sumExp1,
            //column9 exponentExpression1: exp( (p1*distkm) + (p2*log(empP)) + (p3*log(empG)) + (p4*sh0) + (p5*sh1) + (p6*sh2) )
            //column 10 sumExp1,
            //column11 exponentExpression1: exp( (p1*distkm) + (p2*log(empP)) + (p3*log(empG)) + (p4*sh0) + (p5*sh1) + (p6*sh2) )
            //n = number of zones, so n*n number of rows
            StringBuilder line = null;
            int sum = 0;

            for ( int i = 0; i < flatZones.Length; i++ )
            {
                IZone iz = flatZones[i];
                if ( ( iz.Population == 0 &&
                   iz.X == 0 && iz.Y == 0 ) || iz.InternalDistance == 0 ) continue;
                else
                {
                    sum++;
                }

                line = new StringBuilder( 100000 );
                line.Append( i );

                BuildOfficeWorkCache( line, iz, p, flatZones );
                BuildManufacturingWorkCache( line, iz, p, flatZones );
                BuildRetailWorkCache( line, iz, p, flatZones );
                BuildProfessionalWorkCache( line, iz, p, flatZones );

                writer.WriteLine( line.ToString( 0, line.Length - 1 ) );
            }
            writer.Close();

            //IConfigurationDirectory directory =
            //    TashaConfiguration.GetDirectory("LocationChoiceModelParameters");
            SparseZoneCreator creator = new SparseZoneCreator( 3, ( 4 * flatZones.Last().ZoneNumber ) + 1 );
            creator.LoadCSV( temp, false );
            creator.Save( LocatonChoiceModelWorkCache );
            File.Delete( temp );
        }