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; }
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 float[][][] { 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 (this.DistanceHistogram != null) { var distances = ZoneSystem.Distances.GetFlatData(); this.DistanceHistogram.Export(distances, model); } ModelData.ReleaseResource(); for (int i = 0; i < PostRun.Length; i++) { PostRun[i].Start(); } }