Exemplo n.º 1
0
        public void LoadData()
        {
            var  ret       = Data;
            bool firstTime = false;

            if (ret == null)
            {
                Data      = ret = ZoneSystemHelper.CreatePdTwinArray <float>(Root.ZoneSystem.ZoneArray);
                firstTime = true;
            }
            var data = ret.GetFlatData();

            // initialize the data
            if (data.Length > 0)
            {
                if (firstTime)
                {
                    for (int i = 0; i < data.Length; i++)
                    {
                        var row = data[i];
                        for (int j = 0; j < row.Length; j++)
                        {
                            row[j] = 1.0f;
                        }
                    }
                }
                // now load in our kfactors
                for (int i = 0; i < Factors.Length; i++)
                {
                    data[ret.GetFlatIndex(Factors[i].OriginPD)][ret.GetFlatIndex(Factors[i].DestinationPD)] = Factors[i].Factor;
                }
            }
            Loaded = true;
        }
Exemplo n.º 2
0
        public void Start()
        {
            if (FirstTime || LoadTruthEveryTime)
            {
                ZoneSystem.LoadData();
                foreach (var network in NetworkData)
                {
                    network.LoadData();
                }
                Truth = TruthData.AcquireResource <SparseTwinIndex <float> >().GetFlatData();
                TruthData.ReleaseResource();
            }
            var model = ModelData.AcquireResource <SparseTriIndex <float> >().GetFlatData();
            var zones = ZoneSystem.ZoneArray.GetFlatData();

            // sum up the Truth
            if (FirstTime || LoadTruthEveryTime)
            {
                // we only need to do this once
                TruthRows = (from row in Truth
                             select row.Sum()).ToArray();

                InverseOfTotalTrips = 1.0f / TruthRows.Sum();
                if (AggregateToPlanningDistricts)
                {
                    PDError          = ZoneSystemHelper.CreatePdTwinArray <float>(ZoneSystem.ZoneArray);
                    ZoneToPDIndexMap = (from zone in zones
                                        select PDError.GetFlatIndex(zone.PlanningDistrict)).ToArray();
                    // transform the Truth to be PD based
                    Truth = AggregateResults((new[] { Truth }), zones)
                            .Select(row => row.Select(element => element).ToArray()).ToArray();
                }
                FirstTime = false;
            }
            var aggregated = AggregateResults(model, zones);
            // calculate the error
            float error = ComputeError(Truth, aggregated);

            // set the value in the root
            Root.RetrieveValue = () => error;
            if (ModelSaveFile != null)
            {
                SaveData.SaveMatrix(zones, AggregateResults(model, zones), ModelSaveFile);
            }

            if (DistanceHistogram != null)
            {
                var distances = ZoneSystem.Distances.GetFlatData();
                DistanceHistogram.Export(distances, model);
            }


            ModelData.ReleaseResource();
            for (int i = 0; i < PostRun.Length; i++)
            {
                PostRun[i].Start();
            }
        }
Exemplo n.º 3
0
        public void LoadData()
        {
            var ret = Data;

            if (ret == null)
            {
                Data = ret = ZoneSystemHelper.CreatePdTwinArray <float>(Root.ZoneSystem.ZoneArray);
            }
            var data = ret.GetFlatData();

            // initialize the data
            if (data.Length > 0)
            {
                for (int i = 0; i < data.Length; i++)
                {
                    var row = data[i];
                    for (int j = 0; j < row.Length; j++)
                    {
                        row[j] = 1.0f;
                    }
                }
                // now load in our kfactors
                for (int o = 0; o < data.Length; o++)
                {
                    var sparseO = ret.GetSparseIndex(o);
                    for (int d = 0; d < data.Length; d++)
                    {
                        var sparseD = ret.GetSparseIndex(d);
                        foreach (var factor in Factors)
                        {
                            if (factor.OriginPD.Contains(sparseO) && factor.DestinationPD.Contains(sparseD))
                            {
                                if (data[o][d] != 1.0f)
                                {
                                    Console.WriteLine($"Warning: In {Name}, multiple KFactors are altering PD{sparseO} to PD{sparseD}!");
                                }
                                data[o][d] *= factor.Factor;
                            }
                        }
                    }
                }
            }
            Loaded = true;
        }