{"@attributes":{"version":"2.0"},"channel":{"title":"Surrogate Modeling for Urban Regeneration (SMUR)","description":"Project page of the SMUR Vertically Integrated Project at Georgia Tech.","link":"https:\/\/vip-smur.github.io\/","managingEditor":"Patrick Kastner","docs":"https:\/\/github.com\/VIP-SMUR\/vip-smur.github.io","language":"en","pubDate":"Wed, 11 Mar 2026 12:46:41 -0000","lastBuildDate":"Wed, 11 Mar 2026 12:46:41 -0000","ttl":"1440","generator":"MkDocs RSS plugin - v1.17.7","image":{"url":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/4\/43\/Feed-icon.svg\/128px-Feed-icon.svg.png","title":"Surrogate Modeling for Urban Regeneration (SMUR)","link":"https:\/\/vip-smur.github.io\/"},"item":[{"title":"24-Sp-Mobility-Seg","description":"<h1 id=\"segregation-in-the-15-minute-city\">Segregation in the 15-Minute City<\/h1> <h2 id=\"introduction\">Introduction<\/h2> <p>This notebook focuses on the concept of the 15-minute city and investigates segregation on a basis of mobility. In this notebook, 15-minute usage is defined as the proportion of consumption-related trips made within a 15-minute walk from a home. 15-minute access is defined as the number of essential amenities within the 15-minute walk from a home. Segregation is examined within this context to measure and assess the distribution of amenities within urban areas.<\/p> <h2 id=\"notebook-summary\">Notebook Summary<\/h2> <p>This project includes procedures for loading, analyzing, processing, then modeling mobility and segregation density within a defined 15-minute city. The process includes:<\/p> <ol> <li>Data loading and initial analysis.<\/li> <li>Define 15-minute city parameters for the given dataset.<\/li> <li>Identifying data file tags to define residents, streets, amenities, and places of work.<\/li> <li>Calculate routes between coordinates of residents and amenities through the shortest path profile.<\/li> <li>Project a grid of points to routes.<\/li> <li>Estimate populations in provided buildings.<\/li> <li>Interpret relations between routes and intersection density (segregation) with populations weighted.<\/li> <li>Calculate and model final data normalized with heatmap through Grasshopper and Rhino.<\/li> <\/ol> <h2 id=\"usage\">Usage<\/h2> <p>The notebook is structured to be followed sequentially. Detailed comments and markdown notes guide through each step of the analysis and modeling process.<\/p> <p><img alt=\"image\" src=\"https:\/\/github.com\/VIP-SMUR\/wiki\/assets\/80086242\/42125dde-0ed8-4f24-8647-b76ec7fe20c2\" \/><\/p> <h2 id=\"models-and-algorithms-used\">Models and Algorithms Used<\/h2> <ul> <li><strong>Kernel Densities<\/strong><\/li> <li><strong>Space-Time Prisms<\/strong><\/li> <li><strong>Volumetric Population Estimation<\/strong><\/li> <li><strong>Vehicle Profile Routing (Itinero)<\/strong><\/li> <\/ul> <h2 id=\"data-description\">Data Description<\/h2> <p>Densities for segregation are calculated and output through the heatmap weighted by population. In Rhino, the heatmap overlays a segment of data from OSM that will display darker blue for greater density and red for lower. Aggregated results can be generated through dataset and certain amenity types to compare the average encounter densities.<\/p> <h2 id=\"key-findings-and-observations\">Key Findings and Observations<\/h2> <ul> <li>Kernel densities allow for a simple calculation of segregation under the definition of interaction between pedestrians in a defined 15-minute city<\/li> <li>Volumetric Method with building area, building height, and census population provides general estimate for populations with data from https:\/\/opendata.atlantaregional.com\/<\/li> <li>Potential for interaction is best calculated through space-time prisms which are more accurately representing spatial and temporal dynamics and constraints<\/li> <li>Increased local usage correlates with higher experienced segregation for low-income residents.<\/li> <\/ul> <h2 id=\"conclusions\">Conclusions<\/h2> <p>This notebook serves as a detailed example of using methods within provided data and activity spaces to calculate segregation values for a 15-minute city. The methodologies outlined here can be adapted and expanded for other types of assessment for pedestrian mobility and accessibility.<\/p> <h2 id=\"references\">References<\/h2> <ul> <li>Abbiasov, et al. (2024) The 15-minute city quantified using human mobility data.<\/li> <li>Patterson &amp; Farber (2015) Potential Path Areas and Activity Spaces in Application: A Review<\/li> <li>Sch\u00f6nfelder (2002) Measuring the size and structure of human activity spaces: The longitudinal perspective.<\/li> <\/ul> <h1 id=\"itinero\">Itinero<\/h1> <h2 id=\"overview\">Overview<\/h2> <p>Itinero is a flexible open-source routing engine for a variety of transportation modes such as walking, cycling, and driving. It provides sophisticated tools to integrate customizable routing solutions into their applications, enabling efficient navigation. Itinero emphasizes versatility, offering support for various map data formats and allowing customization to suit specific needs. Most importantly, features like offline routing and routing across multiple transportation modes are provided. For the sake of this project, the pedestrian shortest path profile is utilized to calculate and map routes for individuals within the city.<\/p> <h2 id=\"repository\">Repository<\/h2> <p><a href=\"https:\/\/github.com\/itinero\/routing\">Itinero Routing<\/a><\/p> <h2 id=\"features\">Features<\/h2> <ul> <li><strong>Routing<\/strong>: The Router uses the RouterDb data to calculate routes for a given Profile. It starts and ends the Route at a RouterPoint.<\/li> <li>RouterDb: Contains the routing network, all meta-data, restrictions and so on.<\/li> <li>Profile: Defines vehicles and their behaviour.<\/li> <li>RouterPoint: A location on the routing network to use as a start or endpoint of a route.<\/li> <li>Router: The router is where you ask for routes.<\/li> <li><strong>GeoJSON Conversion<\/strong>: Export calculated routing to GeoJSON for use in mapping and other geospatial applications.<\/li> <li><strong>Open Street Maps Data Retrieval<\/strong>: Automatically download street and building data required for demand calculations.<\/li> <\/ul> <h2 id=\"getting-started\">Getting Started<\/h2> <p>To start using Itinero, follow these steps: 1. Install following Itinero packages to .NET project: - Itinero: The Itinero routing core, this is usually the only package you need to install. - Itinero.Geo: This package ensures compatibility with NTS. - Itinero.IO.Osm: This package contains code to load OSM data. - Itinero.IO.Shape: This package contains code to load data from shapefiles. 2. Specify OSM file as needed 3. Run project through determined routing coordinates<\/p> <h2 id=\"data-requirements\">Data Requirements<\/h2> <ul> <li>Street data should include both OSM or FEMA tag attributes for project defined amenities and places of work<\/li> <li>Open Street Maps (OSM): amenities and workplaces<\/li> <li>Federal Emergency Management Agency (FEMA): residentials<\/li> <\/ul> <h2 id=\"credits\">Credits<\/h2> <p><a href=\"https:\/\/www.itinero.tech\/\">Itinero<\/a> is open-source and commercially supported, developed by the Itinero BVBA team. Itinero was built using <a href=\"https:\/\/www.openstreetmap.org\/\">OpenStreetMap<\/a><\/p> <h1 id=\"future-work\">Future Work<\/h1> <ul> <li>Integrate temporal layer to find effective rates of encounter between pedestrians.<\/li> <li>Generate daily routines to represent more realistic behavior.<\/li> <li>Normalization of results to allow comparisons across sites with different total populations.<\/li> <\/ul>","link":"https:\/\/vip-smur.github.io\/24sp-mobility-seg\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:50 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/24sp-mobility-seg\/#__comments","guid":"https:\/\/vip-smur.github.io\/24sp-mobility-seg\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/24sp-mobility-seg\/README.png","type":"image\/png","length":"None"}}},{"title":"24-Sp-Mobility-PEI","description":"<h1 id=\"pedestrian-environment-index-pei-documentation\">Pedestrian Environment Index (PEI) Documentation<\/h1> <p>The Pedestrian Environment Index (PEI) is a composite measure of walkability that combines four key subindices to evaluate pedestrian-friendly environments.<\/p> <h3 id=\"core-subindices\">Core Subindices<\/h3> <ol> <li><strong>Population Density Index (PDI)<\/strong><\/li> <li>Measures residential population density within defined areas<\/li> <li>Data sourced from Census block groups<\/li> <li> <p>Implementation: <code>PDI_generator.ipynb<\/code><\/p> <\/li> <li> <p><strong>Commercial Density Index (CDI)<\/strong><\/p> <\/li> <li>Evaluates density of commercial establishments per Block Group<\/li> <li>Indicates availability of walkable destinations and services<\/li> <li> <p>Implementation: <code>CDI_generator.ipynb<\/code><\/p> <\/li> <li> <p><strong>Intersection Density Index (IDI)<\/strong><\/p> <\/li> <li>Quantifies intersection density within an area<\/li> <li>Evaluates route options and pedestrian safety<\/li> <li> <p>Implementation: <code>IDI_generator.ipynb<\/code><\/p> <\/li> <li> <p><strong>Land-use Diversity Index (LDI)<\/strong><\/p> <\/li> <li>Analyzes mix of land-use types (residential, commercial, industrial)<\/li> <li>Assesses environment walkability through land use diversity<\/li> <li>Implementation: <code>LDI_generator.ipynb<\/code><\/li> <\/ol> <h2 id=\"implementation-workflow\">Implementation Workflow<\/h2> <ol> <li><strong>Subindex Calculation<\/strong><\/li> <li>Individual Jupyter notebooks (<code>*_generator.ipynb<\/code>) process Census block group shapefiles<\/li> <li>Each generator computes its respective subindex score<\/li> <li> <p>Outputs saved as CSV or GeoJSON files<\/p> <\/li> <li> <p><strong>PEI Compilation<\/strong><\/p> <\/li> <li><code>PEI_generator.ipynb<\/code> combines subindex outputs<\/li> <li> <p>Computes final PEI score for each block group<\/p> <\/li> <li> <p><strong>Visualization<\/strong><\/p> <\/li> <li>Results displayed as geographic maps<\/li> <li>PEI scores visualized across census block groups<\/li> <\/ol> <p><em>Note: Project is transitioning to standardize all output files to GeoJSON format.<\/em><\/p> <h2 id=\"detailed-index-methodologies\">Detailed Index Methodologies<\/h2> <h3 id=\"commercial-density-index-cdi\">Commercial Density Index (CDI)<\/h3> <h4 id=\"overview\">Overview<\/h4> <p>Calculates amenity counts per block group, normalized against the region's maximum commercial density.<\/p> <h4 id=\"input-data\">Input Data<\/h4> <ul> <li>Source: <code>atl_bg.geojson<\/code><\/li> <li>Contains Atlanta neighborhood data<\/li> <li>Uses OSMNx for amenity quantification<\/li> <\/ul> <h4 id=\"amenity-categories\">Amenity Categories<\/h4> <ul> <li><strong>Groceries<\/strong>: supermarket, convenience, grocery, food, organic<\/li> <li><strong>Restaurants<\/strong>: restaurant, cafe, food_court, bistro, fast_food<\/li> <li><strong>Banks<\/strong>: bank, atm<\/li> <li><strong>Schools<\/strong>: school, college, university, kindergarten, music_school, language_school, driving_school<\/li> <li><strong>Entertainment<\/strong>: cinema, theatre, nightclub, casino, arts_centre, sports_centre, stadium, amusement_arcade, dance, bowling_alley, attraction, theme_park, zoo<\/li> <li><strong>Parks<\/strong>: recreation_ground, grass, greenfield<\/li> <\/ul> <h4 id=\"output\">Output<\/h4> <p>Normalized commercial density values relative to regional maximum<\/p> <h3 id=\"intersection-density-index-idi\">Intersection Density Index (IDI)<\/h3> <h4 id=\"overview_1\">Overview<\/h4> <p>Analyzes intersection patterns within block groups to evaluate street connectivity.<\/p> <h4 id=\"input-requirements\">Input Requirements<\/h4> <ul> <li>GeoJSON file containing:<\/li> <li>Block group geometries<\/li> <li>State and county FIPS codes<\/li> <\/ul> <h4 id=\"output-data-csv\">Output Data (CSV)<\/h4> <ul> <li>Polygon: Block group geometry<\/li> <li>Area: Block group area<\/li> <li>Intersection: Sum of intersection-connected roads<\/li> <li>IDI: Normalized intersection density value<\/li> <\/ul> <h4 id=\"processing-steps\">Processing Steps<\/h4> <ol> <li>Read GeoJSON geometry data<\/li> <li>Extract intersection data via OSMNx<\/li> <li>Calculate equivalency factors<\/li> <li>Compute population density<\/li> <li>Generate visualization-ready output<\/li> <\/ol> <h3 id=\"land-diversity-index-ldi\">Land Diversity Index (LDI)<\/h3> <h4 id=\"overview_2\">Overview<\/h4> <p>Evaluates land use diversity within block groups.<\/p> <h4 id=\"input-requirements_1\">Input Requirements<\/h4> <ul> <li>GeoJSON file containing:<\/li> <li>Block group geometries<\/li> <li>State and county FIPS codes<\/li> <\/ul> <h4 id=\"output-data-csv_1\">Output Data (CSV)<\/h4> <ul> <li>Polygon: Block group geometry<\/li> <li>Land_use_dict: Land use type areas<\/li> <li>Entropy: Block entropy value<\/li> <li>LDI: Normalized land diversity value<\/li> <\/ul> <h4 id=\"processing-steps_1\">Processing Steps<\/h4> <ol> <li>Extract GeoJSON geometry<\/li> <li>Gather land use data via OSMNx<\/li> <li>Calculate block entropy<\/li> <li>Compute land diversity<\/li> <li>Prepare visualization data<\/li> <\/ol> <h3 id=\"population-density-index-pdi\">Population Density Index (PDI)<\/h3> <h4 id=\"overview_3\">Overview<\/h4> <p>Processes Census Bureau population data to calculate density metrics.<\/p> <h4 id=\"input-requirements_2\">Input Requirements<\/h4> <ul> <li>GeoDataFrame with:<\/li> <li>Block group geometries<\/li> <li>State\/county FIPS codes<\/li> <li>Census API key (from parameter or <code>census_api_key.txt<\/code>)<\/li> <\/ul> <h4 id=\"output-data-geodataframe\">Output Data (GeoDataFrame)<\/h4> <ul> <li>POP: Block group population<\/li> <li>POPDENSITY: Persons per square kilometer<\/li> <li>NORMPOPDENSITY: Normalized population density<\/li> <\/ul> <h4 id=\"processing-steps_2\">Processing Steps<\/h4> <ol> <li>Validate API credentials<\/li> <li>Extract FIPS codes<\/li> <li>Retrieve Census data<\/li> <li>Integrate population data<\/li> <li>Calculate density metrics<\/li> <li>Clean and format output<\/li> <\/ol> <h4 id=\"error-handling\">Error Handling<\/h4> <p>Raises ValueError if Census API key is unavailable<\/p>","link":"https:\/\/vip-smur.github.io\/24sp-mobility-pei\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:50 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/24sp-mobility-pei\/#__comments","guid":"https:\/\/vip-smur.github.io\/24sp-mobility-pei\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/24sp-mobility-pei\/README.png","type":"image\/png","length":"None"}}},{"title":"24-Fa-Microclimate-LSTM-Kriging","description":"<h1 id=\"24fa-microclimate-geo-lstm-kriging\">24Fa-Microclimate-Geo-LSTM-Kriging<\/h1> <p>Urban Weather Generator Deep Learning: LSTM-Kriging Model<\/p> <h2 id=\"description\">Description<\/h2> <p>This project aims to understand and reproduce data published by the National University of Singapore's (NUS) approach for microclimate prediction, the Geo-LSTM-Kriging Model. This model meshes three key layers to provide accurate microclimate predictions using local weatherstation data. The model takes together LULC data, historical data, and spatial distance information to learn from previous data and apply such learnings to present data. This combination is a novel combination of the strengths of LSTM's time series predictions and Kriging's spatial data dependencies.<\/p> <p>This team spent work cleaning up the open-source code from NUS to understand the model's inputs better. Having improved legibility, the adapatability of the model was clear to the team and allowed them to integrate campus-specific data. The team's work this semester was focused to replicate the NUS's model for Georgia Tech campus. The team used real weather data collected on GT campus coupled with Tech's Tree Viewer App to improve the accuracy of results for the campus. <\/p> <h2 id=\"requirements\">Requirements<\/h2> <ol> <li>Python<\/li> <li>Pandas<\/li> <li>Numpy<\/li> <li>OSMNX<\/li> <li>Scikit-Learn<\/li> <li>Pytorch<\/li> <li>Pykrige<\/li> <\/ol> <p>In addition this program requires that you provide a dataframe for the features you want to measure, as well as gridpoint data for the Kriging Regression. We\u2019ve provided test dataframes that you can find within the \u201cweather_station_5min\u201d and \u201cweather_station_60min\u201d folders. <\/p> <h2 id=\"repository-structure\">Repository Structure<\/h2> <p>This repo contains the aspects needed to replicate the Geo-Kriging LSTM Model. Inside the \u201cpython\u201d folder, you will find the necessary notebook files to execute it. The main ones to focus on are \u201cOrganized_Model_Eval.ipynb\u201d and \u201cosmnx 2.ipynb\u201d. The latter is used to gather the necessary gridpoint data for the kriging aspect and the former is utilized for execution of the models onto the data.<\/p> <h2 id=\"installation\">Installation<\/h2> <p>Each of the required libraries can be easily installed with pip. For OSMNX, a separate process is required. You can find it at this <a href=\"https:\/\/osmnx.readthedocs.io\/en\/stable\/installation.html\">link<\/a>. Once installed, run the \u201cosmnx 2.ipynb\u201d with the OX kernel.<\/p> <h2 id=\"methodology\">Methodology<\/h2> <p><img alt=\"\" src=\"Figures\/1Methodology.png\" \/><\/p> <p>For the methodology, the team used three wokflows: pre-processing, machine learning (ML) training, &amp; prediction and plotting. Pre-processing involves cleaning up the data and making it usable for the ML training workflow. For the spatial method that the team incorporated into the model, the OpenStreetMap Python library osmnx, and using the library, a map of Georgia Tech's campus was used as a basis. Overlayed on top of the map is system of equally spaced out points forming a grid. For each of the equidistant points, 12 distance vectors were obtained. Theses distances are from each point on the grid to the nearest centers of various variables; these various variables are buildings, libraries, parks, parking, footways, grass, fitness centers, woods, wetlands, trees on campus, and trees in Atlanta off Tech's campus. The tree data was not easily accessible through osmnx, so the team utilized Georgia Tech's Tree Viewer App for the tree location data and distances. In the Geo-LSTM-Kriging model that our team followed, Kriging is a statistical method for spacial interpolation, predicting unknown values at locations that don\u2019t have measured values by using spatial correlations. These spatial correlations, the 12 distance vectors for each x,y point, are based off of relationships between variables. Dr. Brian Stone's weather data obtained from the several weather stations he set up a year ago on Tech's campus was used as an input for pre-processing as well, and it mainly provided information on temperatures, dew point, and relative humidity. This is the data that our group tried to find out and this data will be used as a means for comparison and training the machine learning model. The weather data from Dr. Stone's weather stations were quite messy and required cleaning. The coordinates for each of the weather stations were obtained and separated into folders. Within each of the weather station files, the averages of the data columns, namely the temperatures, dew point, and relative humidities columns, were obtained. This normalization of data to a value of zero to one ensures that during training, there will not be any errors that come up when predicting new values. Each of the normalized values were then appended into a dictionary for machine learning training. Originally, our team tried to train the weather station files in one single large data set, however it was too much for a computer to handle, so splitting it up to dictionaries ensure that it was able to run very smoothly. The outputs of the pre-processing workflow are the CSV file for the grid distances and a CSV for the normalized weather station values. <\/p> <p><img alt=\"\" src=\"Figures\/2Trees.png\" \/> <img alt=\"\" src=\"Figures\/3Grid_data.png\" \/> <img alt=\"\" src=\"Figures\/4station_id.png\" \/> <img alt=\"\" src=\"Figures\/5coord.png\" \/> <img alt=\"\" src=\"Figures\/6weather_dict.png\" \/><\/p> <p>Using PyTorch, the team set the main target for the prediction as the temperature and main features as relative humidity and dew point. A sequence for the LSTM was created and set as default the 10 time steps. The team did not change the parameter values too much, as the team followed the documentation's recommendations. The hidden size was changed to about 8 layers and 200 epochs, which are how many iterations one wants the program to run through the training and ensures that the program is decently trained and not too overfitted. After training each of the weather station files independently, they are all appended into one single data frame to obtain the average prediction results for each of the stations.<\/p> <p><img alt=\"\" src=\"Figures\/7station_loop.png\" \/> <img alt=\"\" src=\"Figures\/8station_results.png\" \/><\/p> <p>The distance vectors obtained from each of the approximately 1300 different grid points mentioned earlier were used for the actual Geo-Kriging part of the project. The model is based off the random forest regression because random forest typically works well with a lot of different types of parameters, especially if the data turns out to be non linear.<\/p> <p><img alt=\"\" src=\"Figures\/9features.png\" \/> <img alt=\"\" src=\"Figures\/10regression.png\" \/><\/p> <p>The team finally fit the model with these parameters to obtain a temperature graph displaying the heat distribution of Georgia Tech's campus. <\/p> <p><img alt=\"\" src=\"Figures\/11output.png\" \/><\/p> <h2 id=\"future-work\">Future Work<\/h2> <p>The team would like to run further validation studies on the model to ensure its functionality in different climates and with consistent data. As the NUS ran their model using a month's data, given steady annual temperature data, and our weather station data is inconsistent, the model should be continute to be validated before considered for further application.<\/p> <p>To enhance the robustness and applicability of the LSTM-Kriging Model for urban weather generation, the following future developments are proposed: 1. Accuracy Validation<\/p> <p>A critical next step is to rigorously test the accuracy of the model under various scenarios. Comparative analysis with existing models and observations will help assess the reliability and identify potential areas for refinement, including:<\/p> <p>\u2022 Assessing the model's predictions across various time scales, such as hourly, daily, and seasonal trends, to identify performance consistency over short- and long-term periods. <\/p> <p>\u2022 Performing a detailed breakdown of prediction errors to uncover biases or patterns associated with specific weather variables (temperature, humidity, wind speed) and urban contexts.<\/p> <ol> <li>Handling Missing Data<\/li> <\/ol> <p>Addressing missing data in weather and spatial datasets remains a key challenge. Future work will focus on integrating advanced imputation techniques or machine learning methods to fill data gaps effectively without compromising the model's performance, including:<\/p> <p>\u2022 Using diffusion models to reconstruct missing data patterns.<\/p> <ol> <li>Generalizability Testing<\/li> <\/ol> <p>The model will be tested on additional university campuses with contexts similar to Georgia Tech, particularly those featuring comparable weather station setups and spatial characteristics. This will help evaluate the model's adaptability to different urban microclimates and provide insights for broader applications. <\/p> <h2 id=\"reference\">Reference<\/h2> <p>Jintong Han, Adrian Chong, Joie Lim, Savitha Ramasamy, Nyuk Hien Wong, Filip Biljecki, (2024). Microclimate spatio-temporal prediction using deep learning and land use data. Building and Environment. <a href=\"https:\/\/doi.org\/10.1016\/j.buildenv.2024.111358\">https:\/\/doi.org\/10.1016\/j.buildenv.2024.111358<\/a><\/p> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=deMabiRxBAA\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/deMabiRxBAA\/maxresdefault.jpg\" width=\"480\" alt=\"Final Presentation --- 24Fa --- Microclimate-LSTM-Kriging\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>Department<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Sofia Mujica<\/td> <td>Junior<\/td> <td>Mechanical Engineering<\/td> <td>ME<\/td> <td><a href=\"https:\/\/github.com\/sofia-mujica\">sofia-mujica<\/a><\/td> <\/tr> <tr> <td>Ze Yu Jiang<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>COC<\/td> <td><a href=\"https:\/\/github.com\/zeyujiang8800\">zeyujiang8800<\/a><\/td> <\/tr> <tr> <td>Krish Gupta<\/td> <td>Sophomore<\/td> <td>Civil Engineering<\/td> <td>CEE<\/td> <td><a href=\"https:\/\/github.com\/krishgupta-CE\">krishgupta-CE<\/a><\/td> <\/tr> <tr> <td>Thanasarn Changnawa<\/td> <td>PhD<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td><a href=\"https:\/\/github.com\/Thanasarn-Changnawa\">Thanasarn-Changnawa<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/24fa-microclimate-lstm-kriging\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:49 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/24fa-microclimate-lstm-kriging\/#__comments","guid":"https:\/\/vip-smur.github.io\/24fa-microclimate-lstm-kriging\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/24fa-microclimate-lstm-kriging\/README.png","type":"image\/png","length":"None"}}},{"title":"Data Extraction","description":"<p><strong>Data Extraction<\/strong><\/p> <p><strong>Identification<\/strong><\/p> <ul> <li>Title <\/li> <li>Author <\/li> <li>Country in which the study conducted<\/li> <\/ul> <p><strong>Methods<\/strong><\/p> <ul> <li>Study design <\/li> <li>A Survey-based study <\/li> <li>Randomised controlled trial <\/li> <li>Case-control study <\/li> <li>Historically controlled trial <\/li> <li>Prospective cohort study <\/li> <li>Retrospective cohort study <\/li> <li>Hypothesis study <\/li> <li>Cross-sectional observational study <\/li> <li>K-means cluster analyses <\/li> <li>Others<\/li> <\/ul> <p><strong>Population<\/strong><\/p> <ul> <li>Population description <\/li> <li>Inclusion Criteria <\/li> <li>Exclusion Criteria (because some of the participants in the articles do not meet the include criteria, but the proportion is very small) <\/li> <li>Group difference <\/li> <li>Method of recruitment of participants <\/li> <li>Population data <\/li> <li>Total number of participants <\/li> <li>Number of withdrawals <\/li> <li>Reason for withdrawals <\/li> <li>Other <\/li> <li>Population Characteristics <\/li> <li>Mean age (years) \u00b1 SD <\/li> <li>Age Category(Range) <\/li> <li>Gender Distribution <\/li> <li>Identity <\/li> <li>Educational level <\/li> <li>Ethnic Background <\/li> <li>Language Proficiency <\/li> <li>Physical Ability <\/li> <li>Nationality <\/li> <li>Marital Status <\/li> <li>Residency or Migrant(e.g Participants must have lived in the city for <strong>at least six months<\/strong>.) <\/li> <li>Household income <\/li> <li>Job <\/li> <li>Health <\/li> <li>Family composition <\/li> <li>Others<\/li> <\/ul> <p><strong>Intervention \/ Exposure<\/strong> <\/p> <ul> <li>Intervention categories <\/li> <li>Outdoor Built environment <ul> <li>Urban environment <\/li> <li>Public open space <\/li> <li>Plazas and square <\/li> <li>Urban green space <\/li> <li>Sports and Recreation Areas <\/li> <li>Accessibility to transportation <\/li> <li>Proximity to city center <\/li> <li>Visual appeal <\/li> <li>Walkable accessibility\/distances\/ pedestrian walkway <\/li> <li>Sub-urban environment <\/li> <\/ul> <\/li> <li>Environmental factors <ul> <li>Air pollution <\/li> <li>Sunlight <\/li> <li>Temperature <\/li> <li>Humidity <\/li> <li>Noise <\/li> <\/ul> <\/li> <li>Intervention characteristics <\/li> <li>Number of participants allocated <\/li> <li>Frequency <\/li> <li>Percentages <\/li> <li>Other<\/li> <\/ul> <p><strong>Outcome<\/strong><\/p> <ul> <li>Outcome categories <\/li> <li>Mental health <\/li> <li>Well-being <ul> <li>Subjective Well Being (SWB) <\/li> <li>Comfort <\/li> <li>Satisfaction <\/li> <\/ul> <\/li> <li> <p>Outcome Type <\/p> <ul> <li>continuous(e.g data,score) <\/li> <li>dichotomous(e.g true or false)<\/li> <\/ul> <\/li> <li> <p>Outcome details <\/p> <\/li> <li> <p>CR:Composite Reliability <\/p> <\/li> <li>C\u03b1: Cronbach's Alpha <\/li> <li>SFL: standardized factor loading <\/li> <li>AVE:average variance extracted <\/li> <li>VIF:variance inflation factor. <\/li> <li>Fornell\u2013Larcker(F-L)criteria <\/li> <li>heterotrait\u2013monotrait(HTMT)ratio <\/li> <li>T Value <\/li> <li>beta coefficients(\u03b2) <\/li> <li>95% CI <\/li> <li>P-value<\/li> <\/ul> <p><strong>Result<\/strong><\/p> <ul> <li> <h3 id=\"continuous-data\">Continuous data<\/h3> <\/li> <li> <p>Mean <\/p> <\/li> <li>Sum <\/li> <li>Median <\/li> <li>IQR(Interquartile Range) <\/li> <li>Range <\/li> <li>P-value <\/li> <li>beta coefficients(\u03b2) <\/li> <li>95% confidence intervals(95%CI) <\/li> <li> <p>Others<\/p> <\/li> <li> <h3 id=\"dichotomous-data\">Dichotomous data<\/h3> <\/li> <li> <p>Ratio<\/p> <\/li> <\/ul>","link":"https:\/\/vip-smur.github.io\/24fa-neuroarchitecture\/selecting_process\/Data%20Extraction\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:49 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/24fa-neuroarchitecture\/selecting_process\/Data%20Extraction\/#__comments","guid":"https:\/\/vip-smur.github.io\/24fa-neuroarchitecture\/selecting_process\/Data%20Extraction\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/24fa-neuroarchitecture\/selecting_process\/Data Extraction.png","type":"image\/png","length":"40256"}}},{"title":"25-Sp-Mobility-PEI","description":"<h1 id=\"pedestrian-environment-index-pei-documentation\">Pedestrian Environment Index (PEI) Documentation<\/h1> <p><a href=\"https:\/\/vip-pei-app-2.onrender.com\/\"><img alt=\"Demo\" src=\"https:\/\/img.shields.io\/badge\/demo-render-brightgreen?logo=render&amp;logoColor=white\" \/><\/a><\/p> <p>This project implements the Pedestrian Environment Index (PEI) methodology as developed at the University of Illinois Chicago (see the research paper: <a href=\"https:\/\/www.sciencedirect.com\/science\/article\/pii\/S0966692314001343\">https:\/\/www.sciencedirect.com\/science\/article\/pii\/S0966692314001343<\/a>). The PEI provides a composite measure of the walkability of an environment, incorporating the following subindices:<\/p> <ul> <li>Population Density Index (PDI)<\/li> <li>Commercial Density Index (CDI)<\/li> <li>Intersection Density Index (IDI)<\/li> <li>Land-use Diversity Index (LDI)<\/li> <\/ul> <h2 id=\"1-motivation-and-introduction\">1. Motivation and Introduction<\/h2> <p>The <strong>Pedestrian Environment Index (PEI)<\/strong> is a composite measure of walkability that combines four key subindices to evaluate pedestrian-friendly environments. This implementation of the PEI is useful for researchers aiming to:<\/p> <ul> <li>Assess the current walkability of neighborhoods or regions.<\/li> <li>Compare walkability across different areas.<\/li> <li>Identify areas with potential for improvement.<\/li> <\/ul> <hr \/> <h2 id=\"2-getting-started\">2. Getting Started<\/h2> <h3 id=\"prerequisites\"><strong>Prerequisites<\/strong><\/h3> <ol> <li> <p><strong>Python 3.x<\/strong>:<br \/> Ensure Python is installed and available in your system path. Check using: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"><\/a>python<span class=\"w\"> <\/span>--version <\/span><\/code><\/pre><\/div><\/p> <\/li> <li> <p><strong>Required Libraries<\/strong>:<br \/> Install the following Python libraries:<\/p> <\/li> <li>osmnx<\/li> <li>pandas<\/li> <li>numpy<\/li> <li>matplotlib.pyplot<\/li> <li>csv<\/li> <li> <p>census<\/p> <\/li> <li> <p><strong>Census API Key<\/strong>:<br \/> Obtain a Census API key from <a href=\"https:\/\/api.census.gov\/data\/key_signup.html\">Census API Key Signup<\/a>.<br \/> Save the key in a text file named <code>census_api_key.txt<\/code> in the same directory as <code>PDI_generator.ipynb<\/code>.<\/p> <\/li> <\/ol> <h3 id=\"installation\"><strong>Installation<\/strong><\/h3> <p>Install the required libraries using pip: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-1-1\"><a id=\"__codelineno-1-1\" name=\"__codelineno-1-1\" href=\"#__codelineno-1-1\"><\/a>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>osmnx<span class=\"w\"> <\/span>pandas<span class=\"w\"> <\/span>numpy<span class=\"w\"> <\/span>matplotlib<span class=\"w\"> <\/span>csv<span class=\"w\"> <\/span>census <\/span><\/code><\/pre><\/div><\/p> <hr \/> <h2 id=\"3-core-subindices\">3. Core Subindices<\/h2> <h3 id=\"population-density-index-pdi\"><strong>Population Density Index (PDI)<\/strong><\/h3> <ul> <li><strong>Definition<\/strong>: Measures residential population density within defined areas.<\/li> <li><strong>Data Source<\/strong>: Population and area data are downloaded from the Missouri Census Data Center.<\/li> <li> <p><strong>Calculation<\/strong>:<\/p> <p><span class=\"arithmatex\">\\(\\text{Population Density} = \\frac{\\text{Total Population}}{\\text{Total Area (Square Miles)}}\\)<\/span><br \/> - <strong>PDI<\/strong>: Percentile rank of Population Density across all years and cities.<\/p> <\/li> <\/ul> <h3 id=\"commercial-density-index-cdi\"><strong>Commercial Density Index (CDI)<\/strong><\/h3> <ul> <li><strong>Definition<\/strong>: Evaluates the density of commercial establishments per block group.<\/li> <li><strong>Data Source<\/strong>: Data is sourced using the Overpass API.<\/li> <li><strong>Method<\/strong>:<\/li> <li>Tags used include shops, restaurants, cafes, banks, schools, cinemas, parks, sports centers, and stadiums.<\/li> <li> <p>Area is derived from census tracts in the US Census GeoJSON files.<\/p> <p><span class=\"arithmatex\">\\(\\text{Commercial Density} = \\frac{\\text{Count of Commercial POIs}}{\\text{Total Land Area (Square Miles)}}\\)<\/span><br \/> - <strong>CDI<\/strong>: Percentile rank of Commercial Density across all years and cities.<\/p> <\/li> <\/ul> <h3 id=\"intersection-density-index-idi\"><strong>Intersection Density Index (IDI)<\/strong><\/h3> <ul> <li><strong>Definition<\/strong>: Quantifies the density of intersections in a given area.<\/li> <li><strong>Data Source<\/strong>: Retrieved using the Overpass API.<\/li> <li><strong>Method<\/strong>: <span class=\"arithmatex\">\\(\\text{Intersection Density} = \\frac{\\text{Number of Nodes Part of More than One Way (Intersections)}}{\\text{Area (Square Miles)}}\\)<\/span> <\/li> <li><strong>IDI<\/strong>: Percentile rank of Intersection Densities across all years and cities.<\/li> <\/ul> <h3 id=\"land-use-diversity-index-ldi\"><strong>Land-use Diversity Index (LDI)<\/strong><\/h3> <ul> <li><strong>Definition<\/strong>: Analyzes the diversity of land-use types within an area.<\/li> <li><strong>Data Source<\/strong>: Land-use data is retrieved from OpenStreetMap using the Overpass API with the \"landuse\" tag.<\/li> <li><strong>Method<\/strong>: <span class=\"arithmatex\">\\(\\text{Entropy} = \\sum \\left( \\frac{\\text{Area of Land Use Type}}{\\text{Total Area}} \\cdot \\ln \\left( \\frac{\\text{Area of Land Use Type}}{\\text{Total Area}} \\right) \\right)\\)<\/span> (for all land-use types with non-zero area). <ul> <li>Normalized by: <span class=\"arithmatex\">\\(\\frac{\\text{Entropy}}{\\ln(\\text{Number of Land Use Types with Non-Zero Area})}\\)<\/span> <\/li> <li><strong>LDI<\/strong>: Percentile rank of Entropies across all years and cities.<\/li> <\/ul> <\/li> <\/ul> <hr \/> <h2 id=\"4-pei-formula\">4. PEI Formula<\/h2> <p>The PEI is calculated using the following formula:<\/p> <div class=\"arithmatex\">\\[ PEI = \\frac{{(1 + PDI) \\cdot (1 + IDI) \\cdot (1 + LDI) \\cdot (1 + CDI)}}{16} \\]<\/div> <hr \/> <h2 id=\"5-implementation-workflow\">5. Implementation Workflow<\/h2> <h3 id=\"step-1-files\">Step 1: Files<\/h3> <ul> <li>Download population data files from the Missouri Census Data Center (MCDC) for each required year.<\/li> <li>Download block group and census tract files from the US Census Bureau website.<\/li> <\/ul> <h3 id=\"step-2-subindex-calculation\">Step 2: Subindex Calculation<\/h3> <ul> <li>Run individual generator scripts (e.g., <code>&lt;subindex&gt;_&lt;city&gt;_&lt;year&gt;.ipynb<\/code>) for each subindex.<\/li> <li>Outputs include CSV and GeoJSON files with fields for block group, year, and the \"raw subindex\" values:<\/li> <li>Population Density<\/li> <li>Commercial Density<\/li> <li>Intersection Density<\/li> <li>Entropy<\/li> <li>Append all results to master files (<code>all_PDI<\/code>, <code>all_CDI<\/code>, <code>all_IDI<\/code>, <code>all_LDI<\/code>) for comprehensive cross-year\/city comparison.<\/li> <\/ul> <h3 id=\"step-3-normalization\">Step 3: Normalization<\/h3> <ul> <li>Normalize raw subindex data - between 1 and 0:<\/li> <li>This normalization is done by taking each block group\/tract's percentile rank for each \"raw subindex\" versus every other city and every other year:<\/li> <li>Because we normalize across all cities and years, our subindex values can be compared seamlessly against any other block group regardless of time\/location.<\/li> <li>We are able to normalize across all cities and years thanks to these aforementioned 4 files - <code>all_PDI.csv<\/code>, <code>all_CDI.csv<\/code>, <code>all_IDI.csv<\/code>, <code>all_LDI.csv<\/code> - which contain raw data for all years\/cities.<\/li> <li>Once we normalize the raw subindex we can now call it an actual subindex - e.g. the normalized <code>Commercial Density<\/code> becomes <code>CDI<\/code>, normalized <code>Entropy<\/code> becomes <code>LDI<\/code>, etc.<\/li> <li> <p>The file also updates the CSV &amp; GeoJSON files for each subindex and city with a new field - one of <code>CDI<\/code>, <code>LDI<\/code>, <code>PDI<\/code>, <code>IDI<\/code>.<\/p> <\/li> <li> <p>Now we finally have finalized CSV and GeoJSON files for the 4 subindexes:<\/p> <ul> <li><code>&lt;subindex&gt;_&lt;city&gt;_&lt;year&gt;.csv\/geojson<\/code><\/li> <\/ul> <\/li> <\/ul> <h3 id=\"step-4-pei-calculation\">Step 4: PEI Calculation<\/h3> <ul> <li>Combine normalized subindices using the PEI formula for each block group\/tract.<\/li> <li>Generate CSV and GeoJSON files (<code>PEI_&lt;city&gt;_&lt;year&gt;.csv\/geojson<\/code>).<\/li> <\/ul> <h3 id=\"step-5-web-app-integration\">Step 5: Web App Integration<\/h3> <ul> <li>Upload finalized GeoJSON files to AWS S3 buckets.<\/li> <li>Implement and visualize data on the web app.<\/li> <\/ul> <hr \/> <h2 id=\"6-usage\">6. Usage<\/h2> <h3 id=\"inside-the-fall24-folder-you-will-find-3-folders\">Inside the Fall24 folder you will find 3 folders:<\/h3> <ul> <li>Tract_Files - we mainly used this folder for testing:<\/li> <li>This contains the relevant <code>ipynb<\/code> files for creating the subindexes.<\/li> <li> <p>It also contains <code>tracts.geojson<\/code> which has the first 10 rows of tracts in the US - useful for testing. - Please download full tract files from https:\/\/www.census.gov\/cgi-bin\/geo\/shapefiles\/index.php, or contact abeesen3@gatech.edu for full files.<\/p> <\/li> <li> <p>BlockGroup_Files:<\/p> <\/li> <li>This contains the relevant <code>ipynb<\/code> files for creating the subindexes. (In the PDI file, only run code blocks after the <code>#NEW<\/code> comment).<\/li> <li>It also contains <code>block_groups.geojson<\/code> which has the first 10 rows of blockgroups in Atlanta - useful for testing. - Please create the full files using the <code>.\/Spring24\/Blockgroup GeoJSON Generator<\/code> folder (you need to rename the output of this to <code>block_groups.geojson<\/code>), downlaod the full files from https:\/\/www.census.gov\/cgi-bin\/geo\/shapefiles\/index.php, or contact abeesen3@gatech.edu for full files.<\/li> <\/ul> <h3 id=\"step-1-data-download\">Step 1: Data Download<\/h3> <p>Download the required data files from the following sources: - <strong>Population Data<\/strong>: Obtain CSV files from <a href=\"https:\/\/mcdc.missouri.edu\/cgi-bin\/uexplore?\/data\">Missouri Census Data Center (MCDC)<\/a>. - <strong>Census Block Groups\/Tract GeoJSON<\/strong>: Retrieve the required GeoJSON files from the US Census Bureau or relevant sources: - As described above, download files from https:\/\/www.census.gov\/cgi-bin\/geo\/shapefiles\/index.php, or contact abeesen3@gatech.edu for full files.<\/p> <h3 id=\"step-2-update-generator-scripts\">Step 2: Update Generator Scripts<\/h3> <p>Modify the generator scripts (<code>PDI_Generator.ipynb<\/code>, <code>CDI_Generator.ipynb<\/code>, <code>LDI_Generator.ipynb<\/code>, <code>IDI_Generator.ipynb<\/code>) to include your specific file paths and input parameters. For all the subindex files, they will have a portion like the code shown below. This is the only part you must update as required:<\/p> <div class=\"language-python highlight\"><pre><span><\/span><code><span id=\"__span-2-1\"><a id=\"__codelineno-2-1\" name=\"__codelineno-2-1\" href=\"#__codelineno-2-1\"><\/a><span class=\"n\">calculate_<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">subindex<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span> <\/span><span id=\"__span-2-2\"><a id=\"__codelineno-2-2\" name=\"__codelineno-2-2\" href=\"#__codelineno-2-2\"><\/a> <span class=\"n\">input_geojson<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;path_to_your_geojson_file.geojson&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># Replace with your census tract or blockgroup GeoJSON file<\/span> <\/span><span id=\"__span-2-3\"><a id=\"__codelineno-2-3\" name=\"__codelineno-2-3\" href=\"#__codelineno-2-3\"><\/a> <span class=\"n\">output_prefix<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;tracts&gt; or &lt;block_groups&gt;&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># tracts or bg based on if we are analyzing tracts or blockgroups<\/span> <\/span><span id=\"__span-2-4\"><a id=\"__codelineno-2-4\" name=\"__codelineno-2-4\" href=\"#__codelineno-2-4\"><\/a> <span class=\"n\">year<\/span><span class=\"o\">=<\/span><span class=\"mi\">2013<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-2-5\"><a id=\"__codelineno-2-5\" name=\"__codelineno-2-5\" href=\"#__codelineno-2-5\"><\/a> <span class=\"n\">aggregate_file<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;subindex&gt;_&lt;tract\/bg&gt;_all.csv&quot;<\/span> <span class=\"c1\"># update the &lt;subindex&gt; and choose tracts or bg<\/span> <\/span><span id=\"__span-2-6\"><a id=\"__codelineno-2-6\" name=\"__codelineno-2-6\" href=\"#__codelineno-2-6\"><\/a><span class=\"p\">)<\/span> <\/span><span id=\"__span-2-7\"><a id=\"__codelineno-2-7\" name=\"__codelineno-2-7\" href=\"#__codelineno-2-7\"><\/a> <\/span><span id=\"__span-2-8\"><a id=\"__codelineno-2-8\" name=\"__codelineno-2-8\" href=\"#__codelineno-2-8\"><\/a><span class=\"n\">calculate_<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">subindex<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span> <\/span><span id=\"__span-2-9\"><a id=\"__codelineno-2-9\" name=\"__codelineno-2-9\" href=\"#__codelineno-2-9\"><\/a> <span class=\"n\">input_geojson<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;path_to_your_geojson_file.geojson&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># Replace with your census tract or blockgroup GeoJSON file<\/span> <\/span><span id=\"__span-2-10\"><a id=\"__codelineno-2-10\" name=\"__codelineno-2-10\" href=\"#__codelineno-2-10\"><\/a> <span class=\"n\">output_prefix<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;tracts&gt; or &lt;block_groups&gt;&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># tracts or bg based on if we are analyzing tracts or blockgroups<\/span> <\/span><span id=\"__span-2-11\"><a id=\"__codelineno-2-11\" name=\"__codelineno-2-11\" href=\"#__codelineno-2-11\"><\/a> <span class=\"n\">year<\/span><span class=\"o\">=<\/span><span class=\"mi\">2017<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-2-12\"><a id=\"__codelineno-2-12\" name=\"__codelineno-2-12\" href=\"#__codelineno-2-12\"><\/a> <span class=\"n\">aggregate_file<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;subindex&gt;_&lt;tract\/bg&gt;_all.csv&quot;<\/span> <span class=\"c1\"># update the &lt;subindex&gt; and choose tracts or bg<\/span> <\/span><span id=\"__span-2-13\"><a id=\"__codelineno-2-13\" name=\"__codelineno-2-13\" href=\"#__codelineno-2-13\"><\/a><span class=\"p\">)<\/span> <\/span><span id=\"__span-2-14\"><a id=\"__codelineno-2-14\" name=\"__codelineno-2-14\" href=\"#__codelineno-2-14\"><\/a> <\/span><span id=\"__span-2-15\"><a id=\"__codelineno-2-15\" name=\"__codelineno-2-15\" href=\"#__codelineno-2-15\"><\/a><span class=\"n\">calculate_<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">subindex<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span> <\/span><span id=\"__span-2-16\"><a id=\"__codelineno-2-16\" name=\"__codelineno-2-16\" href=\"#__codelineno-2-16\"><\/a> <span class=\"n\">input_geojson<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;path_to_your_geojson_file.geojson&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># Replace with your census tract or blockgroup GeoJSON file<\/span> <\/span><span id=\"__span-2-17\"><a id=\"__codelineno-2-17\" name=\"__codelineno-2-17\" href=\"#__codelineno-2-17\"><\/a> <span class=\"n\">output_prefix<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;tracts&gt; or &lt;block_groups&gt;&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># tracts or bg based on if we are analyzing tracts or blockgroups<\/span> <\/span><span id=\"__span-2-18\"><a id=\"__codelineno-2-18\" name=\"__codelineno-2-18\" href=\"#__codelineno-2-18\"><\/a> <span class=\"n\">year<\/span><span class=\"o\">=<\/span><span class=\"mi\">2022<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-2-19\"><a id=\"__codelineno-2-19\" name=\"__codelineno-2-19\" href=\"#__codelineno-2-19\"><\/a> <span class=\"n\">aggregate_file<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;subindex&gt;_&lt;tract\/bg&gt;_all.csv&quot;<\/span> <span class=\"c1\"># update the &lt;subindex&gt; and choose tracts or bg<\/span> <\/span><span id=\"__span-2-20\"><a id=\"__codelineno-2-20\" name=\"__codelineno-2-20\" href=\"#__codelineno-2-20\"><\/a><span class=\"p\">)<\/span> <\/span><\/code><\/pre><\/div> <h3 id=\"step-3-run-scripts-in-the-following-order\">Step 3: Run Scripts in the Following Order<\/h3> <ol> <li><strong>Run the Subindex Generators<\/strong>:<br \/> Execute the following scripts to calculate raw subindices:<\/li> <li><code>CDI_Generator.ipynb<\/code><\/li> <li><code>LDI_Generator.ipynb<\/code><\/li> <li> <p><code>IDI_Generator.ipynb<\/code><br \/> These can be run in any order.<\/p> <\/li> <li> <p><strong>Run PDI<\/strong><\/p> <\/li> <li>For small input files (not many tracts or geojsons), run our current <code>PDI_Generator.ipynb<\/code>.<\/li> <li> <p>For larger files, a custom approach using CSV files from <a href=\"https:\/\/mcdc.missouri.edu\/cgi-bin\/uexplore?\/data\">Missouri Census Data Center (MCDC)<\/a> is requied: - For this, please contact cnguyen369@gatech.edu<\/p> <\/li> <li> <p><strong>Normalize Subindices<\/strong>:<br \/> Run <code>Normalizer.ipynb<\/code> to normalize the raw subindices across all years and cities.<\/p> <\/li> <li> <p><strong>Generate PEI<\/strong>:<br \/> Finally, run <code>PEI_Generator.ipynb<\/code> to calculate the Pedestrian Environment Index.<\/p> <\/li> <\/ol> <h3 id=\"step-4-output\">Step 4: Output<\/h3> <ul> <li>This process will output normalized subindex files and the final PEI results as CSV and GeoJSON files.<\/li> <li>The file format will be:<ul> <li><code>&lt;subindex&gt;_&lt;city&gt;_&lt;year&gt;.csv\/geojson<\/code><\/li> <\/ul> <\/li> <li>Utilize the <code>Subindex_Visualizer.ipynb<\/code> file to visualize your geojson file output!<\/li> <\/ul> <hr \/> <h2 id=\"7-challenges\">7. Challenges<\/h2> <h3 id=\"the-biggest-challege-in-our-statistic-generators-was-developing-the-pdi-generator\">The biggest challege in our statistic generators was developing the PDI Generator.<\/h3> <ul> <li> <p>While most of our subindexes - <code>CDI<\/code>, <code>LDI<\/code>, <code>IDI<\/code> - use the <code>Overpass API (OSM data)<\/code> to gather data, this is not possible for the <code>PDI<\/code> as population data is not provided by OSM.<\/p> <\/li> <li> <p>Because of this, we were forced to utilize the <code>Census API<\/code>, which had 2 main issues:<\/p> <ul> <li>It often returned simply the latest data i.e. 2024 data - even when we requested historical population data.<\/li> <li>On large geoJSONs, where we have to make hundreds and thousands of API calls, the Census API frequently errored due to API call limits.<ul> <li>This became a considerable problem when running our files using <code>PACE<\/code> to generate Census Tract data for Dr Ku. Our code would run for 10 or so hours and then fail - as we would run out of API tokens.<\/li> <\/ul> <\/li> <\/ul> <\/li> <li> <p>We got over this challenge by downloading population data by tract\/block group directly - from <a href=\"https:\/\/mcdc.missouri.edu\/cgi-bin\/uexplore?\/data\">Missouri Census Data Center (MCDC)<\/a><\/p> <\/li> <li>We could then easily calculate <code>Population Density<\/code> and hence <code>PDI<\/code> by block_group\/tract by merging this data with our block_groups\/tracts geoJSON files - which contain an area column.<\/li> <\/ul> <hr \/> <h2 id=\"8-spring-2025-aditions-pei-dynamic-adjustment-documentation\"><strong>8. Spring 2025 Aditions - PEI Dynamic Adjustment Documentation<\/strong><\/h2> <p>The purpose of this tool is to load block groups sequentially with their individual and combined subindex scores and change a subindex value at a specified block group to observe trends and distinguishing factors from adjacent block groups. This proffers insight into how adjacent block groups can become more cohesive and bolster existing infrastructure to create a more pedestrian-friendly environment.<\/p> <ul> <li> <p><strong>Input<\/strong>:<br \/> The tool takes in a GeoDataFrame with GEOID'd block groups, along with the four subindices and its composite PEI, plus user-provided selections for block group, subindex, and new value.<\/p> <\/li> <li> <p><strong>Output<\/strong>:<br \/> The output is a live-updated GeoDataFrame where the specified subindex value is modified for the chosen block group, enabling visualization of the resulting changes to the map and overall infrastructure.<\/p> <\/li> <li> <p><strong>Challenges<\/strong>:<br \/> Key challenges included maintaining data integrity after edits, and beginning the design of the function for seamless integration with interactive visualization tools on the web app.<\/p> <\/li> <li> <p><strong>Future Work<\/strong>:<br \/> Future improvements include adding functionality to adjust multiple subindices at once, creating a user-friendly and non-terminal application to the web app to visualize theoretical metropolitan PEI changes, and integrating model-based recalculations of PEI rather than direct manual edits.<\/p> <\/li> <li> <p><strong>Conclusion<\/strong>:<br \/> The PEI slider tool provides an intuitive way to experiment with subindex values and better understand the sensitivity of walkability metrics at a granular level, paving the way for more informed urban planning discussions.<\/p> <\/li> <\/ul> <hr \/> <h2 id=\"9-spring-2025-aditions-public-transport-accessibility-level-ptal\"><strong>9. Spring 2025 Aditions - Public Transport Accessibility Level (PTAL)<\/strong><\/h2> <p>This project also implements the Public Transport Accessibility Level (PTAL) methodology, adapted from Transport for London\u2019s (TfL) standard practices (Reference: <em>PTAL Methodology, Transport for London, April 2010<\/em>). PTAL measures the accessibility of locations to public transit services based on walking distance and service frequency.<\/p> <hr \/> <h4 id=\"1-motivation-and-introduction_1\">1. Motivation and Introduction<\/h4> <p>The PTAL score quantifies how easily a location is served by public transit. This project adapts the PTAL method for U.S. cities like Atlanta, enabling:<\/p> <ul> <li>Quantitative assessments of transit accessibility.<\/li> <li>Cross-region comparison of transit service quality.<\/li> <li>Identification of underserved and well-served areas for urban planning.<\/li> <\/ul> <hr \/> <h4 id=\"2-getting-started_1\">2. Getting Started<\/h4> <ul> <li><strong>Prerequisites<\/strong>:<\/li> <li>Python 3.x<\/li> <li>Libraries: <code>geopandas<\/code>, <code>pandas<\/code>, <code>numpy<\/code>, <code>shapely<\/code>, <code>math<\/code><\/li> <li>Public Transit Stop Data (GeoJSON) with service frequency information (data pulled from UrbanFootprint and Mobility Database).<\/li> <\/ul> <hr \/> <h4 id=\"3-core-components\">3. Core Components<\/h4> <ul> <li><strong>Walk Access Time<\/strong>:<br \/> Time taken to walk from a Point-of-Interest (POI) to a Service Access Point (SAP) like a bus stop or rail station.<\/li> <li>Walk speed: 80 meters\/minute (4.8 km\/hr).<\/li> <li> <p>Max distances: 640m for buses, 960m for rail.<\/p> <\/li> <li> <p><strong>Service Frequency and Reliability<\/strong>:<br \/> Number of transit services per hour.<\/p> <\/li> <li>Add 2 minutes reliability penalty for buses.<\/li> <li> <p>Add 0.75 minutes reliability penalty for rail.<\/p> <\/li> <li> <p><strong>Equivalent Doorstep Frequency (EDF)<\/strong>:<\/p> <\/li> <li> <p>Formula:<br \/> $$ EDF = \\frac{30}{\\text{Walk Time} + \\text{Average Waiting Time}} $$<\/p> <\/li> <li> <p><strong>Accessibility Index (AI)<\/strong>:<\/p> <\/li> <li> <p>Calculation: Sum of EDFs, with secondary routes discounted by 50% to avoid overrepresentation.<\/p> <\/li> <li> <p><strong>PTAL Level Assignment<\/strong>:<\/p> <\/li> <li>Accessibility Index values are normalized similar to other subindices.<\/li> <\/ul> <hr \/> <h4 id=\"4-ptal-calculation-workflow\">4. PTAL Calculation Workflow<\/h4> <ul> <li><strong>Data Preparation<\/strong>:<\/li> <li>Load POIs (e.g., block groups).<\/li> <li> <p>Load Transit Stops with service frequency attributes.<\/p> <\/li> <li> <p><strong>Walk Access Calculation<\/strong>:<\/p> <\/li> <li> <p>Filter stops within the walking thresholds.<\/p> <\/li> <li> <p><strong>Access Time and EDF Calculation<\/strong>:<\/p> <\/li> <li>Compute walk time and average waiting time.<\/li> <li> <p>Calculate EDF for each nearby route.<\/p> <\/li> <li> <p><strong>Accessibility Index Computation<\/strong>:<\/p> <\/li> <li> <p>Sum EDFs, applying 50% discount to non-dominant routes per transport mode.<\/p> <\/li> <li> <p><strong>PTAL Assignment<\/strong>:<\/p> <\/li> <li>Assign final PTAL levels based on AI bands.<\/li> <\/ul> <hr \/> <h4 id=\"5-outputs\">5. Outputs<\/h4> <ul> <li>Final outputs are available as CSV and GeoJSON files with PTAL scores for each geographic unit.<\/li> <\/ul> <hr \/> <h4 id=\"6-challenges\">6. Challenges<\/h4> <ul> <li>Limited transit stop data coverage in non-dense areas.<\/li> <li>Incomplete GTFS feeds for certain systems.<\/li> <li>Simplified pedestrian network modeling.<\/li> <\/ul> <hr \/> <h3 id=\"6-limitations\"><strong>6. Limitations<\/strong><\/h3> <ul> <li> <p><strong>Data Quality and Completeness<\/strong>:<br \/> PEI heavily relies on OpenStreetMap (OSM) data and census datasets, which may have missing or outdated entries, especially outside major urban centers.<\/p> <\/li> <li> <p><strong>Simplified Walkability<\/strong>:<br \/> Current PEI calculations assume basic walk access without modeling detailed pedestrian barriers (e.g., highways, rivers, unsafe crossings).<\/p> <\/li> <li> <p><strong>Transit Data Challenges<\/strong>:<br \/> PTAL relies on accurate service frequency data, which is often incomplete, inconsistent, or missing for certain cities or transit providers.<\/p> <\/li> <\/ul> <hr \/> <h3 id=\"7-future-work\"><strong>7. Future Work<\/strong><\/h3> <ul> <li>Integrate complete GTFS schedule data for previous years.<\/li> <li>Merge with walkability indices like PEI for a full mobility landscape.<\/li> <\/ul> <hr \/> <h2 id=\"10-spring-2025-aditions-nationwide-data-generation-for-dr-ku\"><strong>10. Spring 2025 Aditions - Nationwide Data Generation for Dr Ku.<\/strong><\/h2> <p>We also created a nationwide data dataset using the PEI methodologies we described above. We simple ran the relevant PEI files in the aforementioned way (see <strong>6. Usage<\/strong>), but with a <code>national_tracts.geojson<\/code> file. - This dataset containts CDI, LDI, IDI, PDI, and PEI files as a CSV. - We created the files on both a Tract and County level (County Level data is new to Spring 2025).<\/p> <p>In order to access raw files, please contact: abeesen3@gatech.edu<\/p> <h3 id=\"nationwide-dataset-examples\">Nationwide dataset examples:<\/h3> <table> <tr> <td align=\"center\"> <img src=\"NationwideImages\/Boston.png?raw=true\" width=\"45%\"><br\/> <strong>Boston<\/strong> <\/td> <td align=\"center\"> <img src=\"NationwideImages\/Chicago.png?raw=true\" width=\"45%\"><br\/> <strong>Chicago<\/strong> <\/td> <\/tr> <tr> <td align=\"center\"> <img src=\"NationwideImages\/Miami.png?raw=true\" width=\"45%\"><br\/> <strong>Miami<\/strong> <\/td> <td align=\"center\"> <img src=\"NationwideImages\/NewYork.png?raw=true\" width=\"45%\"><br\/> <strong>New York<\/strong> <\/td> <\/tr> <tr> <td align=\"center\"> <img src=\"NationwideImages\/SanFrancisco.jpeg?raw=true\" width=\"45%\"><br\/> <strong>San Francisco<\/strong> <\/td> <td align=\"center\"> <img src=\"NationwideImages\/WashingtonDC.png?raw=true\" width=\"45%\"><br\/> <strong>Washington, DC<\/strong> <\/td> <\/tr> <\/table> <h2 id=\"11-spring-2025-aditions-pei-documentation\"><strong>11. Spring 2025 Aditions - PEI Documentation.<\/strong><\/h2> <p>We also created an easy-to-share pdf file that summarizes our PEI methodologies to be used for exposure, funding, etc. This can be found in this repository as <code>VIP_PEI_Documentation.pdf<\/code>.<\/p> <h2 id=\"12-overall-future-work\">12. Overall Future Work<\/h2> <p>To improve the comprehensiveness of the Public Infrastructure Environment (PIE) framework, a major future goal is to expand the number of subindices beyond the current set.<br \/> If we were to do this, we also want to make sure that they are properly integrated into PEI.<\/p> <p>Planned improvements include:<\/p> <ul> <li> <p><strong>Support for New Subindices<\/strong>:<br \/> Add visualization options for future subindices.<\/p> <\/li> <li> <p><strong>Expansion to More Cities<\/strong>:<br \/> Make additional cities available for viewing.<\/p> <\/li> <li> <p><strong>Official Publication<\/strong>:<br \/> Publish our research officially and publicly to help advance urban sustainability.<\/p> <\/li> <li> <p><strong>Verification via Overpass API<\/strong>:<br \/> Fully integrate data checking against Overpass API to verify the accuracy of inputted data.<\/p> <\/li> <li> <p><strong>Ground-Truthing<\/strong>:<br \/> Conduct surveys and other research to validate PEI accuracy and compare with other walkability models.<\/p> <\/li> <\/ul> <hr \/> <hr \/> <h2 id=\"13-contributing\">13. Contributing<\/h2> <p>We welcome contributions to this project. <\/p> <h3 id=\"steps-to-contribute\">Steps to Contribute:<\/h3> <ol> <li>Fork the repository.<\/li> <li>Create a feature branch: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-3-1\"><a id=\"__codelineno-3-1\" name=\"__codelineno-3-1\" href=\"#__codelineno-3-1\"><\/a>git<span class=\"w\"> <\/span>checkout<span class=\"w\"> <\/span>-b<span class=\"w\"> <\/span>feature\/new-feature <\/span><\/code><\/pre><\/div><\/li> <li>Push your changes and submit a pull request.<\/li> <\/ol> <hr \/> <h2 id=\"14-license\">14. License<\/h2> <p>This project is shared for research and educational purposes. Please do not redistribute for commercial use.<\/p> <hr \/> <h1 id=\"web-app-documentation\">Web App Documentation<\/h1> <p>The web app is currently deployed at this link: https:\/\/vip-pei-app-2.onrender.com\/ \ud83d\ude0a<\/p> <p>This deployment is dynamic and so any updates to our codebase (https:\/\/github.com\/AtharvaBeesen\/vip-pei-app-2) will automatically be displayed.<\/p> <h2 id=\"1-introduction\">1. Introduction<\/h2> <ul> <li><strong>App Name<\/strong>: VIP SMUR PEI Proof of Concept<\/li> <li><strong>Purpose<\/strong>: Visualize the work we have done in creating the aforementioned subindexes. We also wanted to allow the data we generate to be available online in a visually appealing, paletable, and easy-to-download way.<\/li> <\/ul> <h3 id=\"key-features\">Key Features:<\/h3> <ul> <li>Interactive map with GeoJSON visualization for the subindexes - PDI, IDI, CDI, LDI, PEI - across different cities and years.<\/li> <li>Dynamic city, statistic, and year selection.<\/li> <li>Ability to download CSV and GeoJSON files for selected data.<\/li> <\/ul> <h3 id=\"technology-stack\">Technology Stack:<\/h3> <ul> <li><strong>Frontend<\/strong>: React, JavaScript, HTML, CSS<\/li> <li><strong>Backend<\/strong>: All functionality contained within JavaScript<\/li> <li><strong>Mapping Library<\/strong>: Leaflet<\/li> <li><strong>Data Source<\/strong>: Amazon S3 Buckets<\/li> <\/ul> <h2 id=\"2-getting-started_2\">2. Getting Started<\/h2> <h3 id=\"prerequisites_1\">Prerequisites<\/h3> <ol> <li> <p><strong>Node.js and npm\/yarn<\/strong>:<br \/> Ensure Node.js and npm (or yarn) are installed on your system. You can check this by running: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-4-1\"><a id=\"__codelineno-4-1\" name=\"__codelineno-4-1\" href=\"#__codelineno-4-1\"><\/a>node<span class=\"w\"> <\/span>-v <\/span><span id=\"__span-4-2\"><a id=\"__codelineno-4-2\" name=\"__codelineno-4-2\" href=\"#__codelineno-4-2\"><\/a>npm<span class=\"w\"> <\/span>-v <\/span><\/code><\/pre><\/div> If not installed, download them from <a href=\"https:\/\/nodejs.org\/\">Node.js official site<\/a>.<\/p> <\/li> <li> <p><strong>Code Editor (Optional)<\/strong>:<br \/> Install a code editor like <a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a>.<\/p> <\/li> <li> <p><strong>Browser<\/strong>:<br \/> A modern browser like Chrome, Firefox, or Edge to test your app.<\/p> <\/li> <li> <p><strong>Git<\/strong>:<br \/> Install Git for cloning the repository. Check installation by running: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-5-1\"><a id=\"__codelineno-5-1\" name=\"__codelineno-5-1\" href=\"#__codelineno-5-1\"><\/a>git<span class=\"w\"> <\/span>--version <\/span><\/code><\/pre><\/div><\/p> <\/li> <li> <p><strong>Leaflet Library Dependencies<\/strong>:<br \/> The app uses Leaflet for maps, which requires:<\/p> <\/li> <li>A valid internet connection to download Leaflet assets via npm or yarn.<\/li> <li>Ensure the browser supports Leaflet.<\/li> <\/ol> <h3 id=\"installation_1\">Installation<\/h3> <ol> <li>Clone the repository: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-6-1\"><a id=\"__codelineno-6-1\" name=\"__codelineno-6-1\" href=\"#__codelineno-6-1\"><\/a>git<span class=\"w\"> <\/span>clone<span class=\"w\"> <\/span>https:\/\/github.com\/AtharvaBeesen\/vip-pei-app-2.git <\/span><\/code><\/pre><\/div><\/li> <li>Install dependencies: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-7-1\"><a id=\"__codelineno-7-1\" name=\"__codelineno-7-1\" href=\"#__codelineno-7-1\"><\/a>npm<span class=\"w\"> <\/span>install <\/span><\/code><\/pre><\/div><\/li> <li>Ensure Leaflet is installed: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-8-1\"><a id=\"__codelineno-8-1\" name=\"__codelineno-8-1\" href=\"#__codelineno-8-1\"><\/a>npm<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>leaflet <\/span><\/code><\/pre><\/div><\/li> <li>Run the application: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-9-1\"><a id=\"__codelineno-9-1\" name=\"__codelineno-9-1\" href=\"#__codelineno-9-1\"><\/a>npm<span class=\"w\"> <\/span>start <\/span><\/code><\/pre><\/div><\/li> <li>Access the app at <code>http:\/\/localhost:3000<\/code>.<\/li> <\/ol> <h3 id=\"deployment\">Deployment<\/h3> <ul> <li>Already deployed! We deployed using <code>Render<\/code>:<br \/> <a href=\"https:\/\/vip-pei-app-2.onrender.com\/\">https:\/\/vip-pei-app-2.onrender.com\/<\/a> <\/li> <\/ul> <hr \/> <h2 id=\"3-features\">3. Features<\/h2> <h3 id=\"31-interactive-map\">3.1 Interactive Map<\/h3> <ul> <li>Displays GeoJSON data visualized on a Leaflet map.<\/li> <li>Map dynamically updates based on city, statistic, and year selections.<\/li> <\/ul> <h3 id=\"32-city-statistic-and-year-selection\">3.2 City, Statistic, and Year Selection<\/h3> <ul> <li>Dropdown menus for users to select:<\/li> <li><strong>Cities<\/strong>: Atlanta, New York, Los Angeles.<\/li> <li><strong>Statistics<\/strong>: IDI, PDI, CDI, LDI, PEI.<\/li> <li><strong>Years<\/strong>: 2022, 2013.<\/li> <\/ul> <h3 id=\"33-file-downloads\">3.3 File Downloads<\/h3> <ul> <li>CSV and GeoJSON files for the selected data can be downloaded with a single click.<\/li> <\/ul> <hr \/> <h2 id=\"4-components\">4. Components<\/h2> <h3 id=\"41-appjs\">4.1 App.js<\/h3> <ul> <li>The main entry point for the application.<\/li> <li>Manages state for selected city, statistic, and year.<\/li> <li>Renders <code>CitySelector<\/code>, <code>DownloadButton<\/code>, and <code>MapComponent<\/code>.<\/li> <\/ul> <h3 id=\"42-cityselectorjs\">4.2 CitySelector.js<\/h3> <ul> <li>Dropdown menus for selecting city, statistic, and year.<\/li> <li>Capitalizes city names and statistics for user-friendly display.<\/li> <\/ul> <h3 id=\"43-mapcomponentjs\">4.3 MapComponent.js<\/h3> <ul> <li>Displays the Leaflet map and GeoJSON data.<\/li> <li>Dynamically fetches data from S3 Buckets based on user selections (more on this below).<\/li> <li>Highlights GeoJSON features with a color-coded scheme based on statistic values.<\/li> <\/ul> <h3 id=\"44-downloadbuttonjs\">4.4 DownloadButton.js<\/h3> <ul> <li>Provides buttons to download CSV and GeoJSON files from S3.<\/li> <li>Dynamically constructs download URLs based on user selections.<\/li> <\/ul> <hr \/> <h2 id=\"5-api-integration\">5. API Integration<\/h2> <p>The app dynamically fetches GeoJSON data from an Amazon S3 bucket: - URL format:<br \/> <code>https:\/\/vip-censusdata.s3.us-east-2.amazonaws.com\/{city}_blockgroup_{statistic}_{year}.geojson<\/code><\/p> <h3 id=\"example\">Example:<\/h3> <p>For Atlanta, IDI, and 2022:<br \/> <code>https:\/\/vip-censusdata.s3.us-east-2.amazonaws.com\/atlanta_blockgroup_IDI_2022.geojson<\/code><\/p> <hr \/> <hr \/> <h2 id=\"5-city-comparison-tool-spring-2025\">5. City Comparison Tool (Spring 2025)<\/h2> <h3 id=\"1-overview\"><strong>1. Overview<\/strong><\/h3> <p>We created a City Comparison Tool MVP to allow users to dynamically compare changes in walkability-related subindices (IDI, PDI, CDI, LDI, PEI) between two different years for a selected city.<\/p> <p>This tool calculates and visualizes the <strong>percentage change<\/strong> in the selected statistic for each census block group, helping to identify areas that have improved or declined over time.<\/p> <h3 id=\"2-key-features\"><strong>2. Key Features<\/strong><\/h3> <ul> <li> <p><strong>City Selection<\/strong>:<br \/> Compare changes for Atlanta, New York, or Los Angeles.<\/p> <\/li> <li> <p><strong>Statistic Selection<\/strong>:<br \/> Choose one of the following subindices to analyze:<\/p> <\/li> <li>Intersection Density Index (IDI)<\/li> <li>Population Density Index (PDI)<\/li> <li>Commercial Density Index (CDI)<\/li> <li>Land-use Diversity Index (LDI)<\/li> <li> <p>Pedestrian Environment Index (PEI)<\/p> <\/li> <li> <p><strong>Year Selection<\/strong>:<br \/> Select two different years to calculate the percent change.<\/p> <\/li> <li> <p><strong>Dynamic GeoJSON Visualization<\/strong>:<br \/> The map displays block groups color-coded by the percentage change in the selected statistic.<\/p> <\/li> <li> <p><strong>Interactive Tooltips<\/strong>:<br \/> Hovering over a block group shows its GEOID and computed percent change.<\/p> <\/li> <li> <p><strong>Custom Color Scale<\/strong>:<br \/> The visualization uses a diverging color scheme to easily distinguish between positive and negative changes.<\/p> <\/li> <\/ul> <hr \/> <h3 id=\"3-technical-workflow\"><strong>3. Technical Workflow<\/strong><\/h3> <ul> <li> <p><strong>Data Fetching<\/strong>:<br \/> The tool fetches the respective city's GeoJSON files for both selected years from the Amazon S3 bucket.<\/p> <\/li> <li> <p><strong>Difference Calculation<\/strong>: <\/p> <\/li> <li>For most subindices (IDI, PDI, CDI, PEI), block groups are matched by <strong>GEOID<\/strong>.<\/li> <li> <p>For LDI (which currently lacks GEOIDs), features are temporarily matched by their <strong>array index<\/strong>.<\/p> <\/li> <li> <p><strong>Percent Change Computation<\/strong>:<br \/> The percent change for each block group is calculated as:<\/p> <\/li> <\/ul> <div class=\"arithmatex\">\\[ \\text{Percent Change} = \\frac{(\\text{After Value} - \\text{Before Value})}{\\text{Before Value}} \\times 100 \\]<\/div> <ul> <li><strong>Visualization<\/strong>:<\/li> <li>Block groups are shaded according to the magnitude of their percent change.<\/li> <li> <p>Tooltips display the block group ID and the exact percent change.<\/p> <\/li> <li> <p><strong>Robust Edge Case Handling<\/strong>:<\/p> <\/li> <li>If both before and after values are zero, the percent change is set to 0.<\/li> <li>If a before value is zero and after is nonzero, the block group is highlighted accordingly without division errors.<\/li> <\/ul> <hr \/> <h3 id=\"4-known-limitations\"><strong>4. Known Limitations<\/strong><\/h3> <ul> <li>LDI currently matches features by array index due to missing GEOIDs (planned to be fixed in future data versions).<\/li> <li>Only a few cities and years are currently available.<\/li> <li>No smoothing or statistical aggregation (e.g., at the neighborhood level) yet applied \u2014 purely block group level.<\/li> <\/ul> <hr \/> <h3 id=\"5-future-work\"><strong>5. Future Work<\/strong><\/h3> <ul> <li>Add more cities and historical years to expand the tool\u2019s coverage.<\/li> <li>Improve LDI data quality by assigning proper GEOIDs.<\/li> <li>Integrate this comparison tool directly into the main PEI web app navigation.<\/li> <li>Add multi-year trend graphs and regional aggregation for deeper urban insights.<\/li> <li>Allow users to select multiple subindices at once for richer comparisons.<\/li> <\/ul> <hr \/> <h2 id=\"6-future-work\">6. Future Work<\/h2> <h3 id=\"there-are-3-key-goals-we-hope-to-achieve\">There are 3 key goals we hope to achieve:<\/h3> <ol> <li> <p><strong>Increase the number of cities and years supported<\/strong>:<br \/> This would simply require us to continue running our subindex generators over the course of the next semester(s) in order to continue to grow the size of our database.<\/p> <\/li> <li> <p><strong>Seek Collaboration\/Monetization Opportunities<\/strong>:<br \/> As we grow the site and our footprint in the space, we could seek to replicate WalkScore's monetization and collaboration business model:<\/p> <\/li> <li> <p><strong>Collaborate with products\/sites<\/strong>:<br \/> Work with products or sites that require walkability statistics (e.g., Zillow and City Planning Companies) to create customized statistics at a cost.<\/p> <\/li> <li> <p><strong>Direct collaboration with local government<\/strong>:<br \/> Assist local governments in achieving their goals of improving walkability in urban areas.<\/p> <\/li> <li> <p><strong>Developing a for-cost API<\/strong>:<br \/> Create an API that allows third-party researchers to use our data. <\/p> <ul> <li>For Example: Collaborating with researchers like Dr. Ku, who uses our data to enhance his psychology research.<\/li> <\/ul> <\/li> <li> <p><strong>Improve the UI<\/strong>:<br \/> This goal is less essential and is more about improving user-experience in the case that we decide to push towards becoming a standalone software for third-parties to gather walkability data on different urban areas.<\/p> <\/li> <\/ol> <hr \/> <h2 id=\"7-contributing\">7. Contributing<\/h2> <ul> <li>Please contact abeesen3@gatech.edu before doing so.<\/li> <li>Example of how to contribute:<\/li> <li>Fork the repository (https:\/\/github.com\/AtharvaBeesen\/vip-pei-app-2)<\/li> <li>Create a feature branch: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-10-1\"><a id=\"__codelineno-10-1\" name=\"__codelineno-10-1\" href=\"#__codelineno-10-1\"><\/a>git<span class=\"w\"> <\/span>checkout<span class=\"w\"> <\/span>-b<span class=\"w\"> <\/span>feature\/new-feature <\/span><\/code><\/pre><\/div><\/li> <li>Push your changes and submit a pull request.<\/li> <\/ul> <h2 id=\"8-license\">8. License<\/h2> <p>This project is shared for research and educational purposes. Please do not redistribute for commercial use.<\/p> <hr \/> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=2OY8LxKQn4o\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/2OY8LxKQn4o\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>Department<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Yao Xiao<\/td> <td>Sophomore<\/td> <td>Computer Science<\/td> <td>COC<\/td> <td><a href=\"https:\/\/github.com\/Xyrro\">Xyrro<\/a><\/td> <\/tr> <tr> <td>Mason DeWitt<\/td> <td>Freshman<\/td> <td>Electrical Engineering<\/td> <td>ECE<\/td> <td><a href=\"https:\/\/github.com\/Masonrd\">Masonrd<\/a><\/td> <\/tr> <tr> <td>Joshua Cohen<\/td> <td>Senior<\/td> <td>Civil Engineering<\/td> <td>CEE<\/td> <td><a href=\"https:\/\/github.com\/paradoxwalk\">paradoxwalk<\/a><\/td> <\/tr> <tr> <td>Nicholas Stone<\/td> <td>Sophomore<\/td> <td>Computer Science<\/td> <td>COC<\/td> <td><a href=\"https:\/\/github.com\/nstone213\">nstone213<\/a><\/td> <\/tr> <tr> <td>Atharva Beesen<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>COC<\/td> <td><a href=\"https:\/\/github.com\/AtharvaBeesen\">AtharvaBeesen<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25sp-mobility-pei\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:49 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25sp-mobility-pei\/#__comments","guid":"https:\/\/vip-smur.github.io\/25sp-mobility-pei\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25sp-mobility-pei\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Sp-Microclimate-UMCF","description":"<h1 id=\"microclimate-umcf-project-documentation\">Microclimate-UMCF Project Documentation<\/h1> <p>This document provides a comprehensive overview of the VIP-SMUR Spring 25 - Microclimate-UMCF project, which focuses on simulating and analyzing microclimate effects, particularly those involving vegetation and building materials.<\/p> <h2 id=\"project-goals\">Project Goals<\/h2> <p>The overarching goals of this project are:<\/p> <ul> <li>To simulate various microclimate scenarios using computational fluid dynamics (CFD) tools such as OpenFOAM's <code>urbanMicroclimateFoam<\/code> solver and explore alternative tools like ENVI-met.<\/li> <li>To understand how different parameters, including vegetation properties (like leaf area index, tree types, and root systems) and building material characteristics, influence microclimate conditions like temperature, humidity, and wind flow.<\/li> <li>To validate simulation results against established benchmarks, such as the HAMSTAD benchmarks, and to refine simulation methodologies.<\/li> <\/ul> <h2 id=\"key-research-areas\">Key Research Areas<\/h2> <h3 id=\"vegetation-effects-on-temperature\">Vegetation Effects on Temperature<\/h3> <ul> <li><strong>Sensitivity Analysis:<\/strong> Determining how sensitive temperature changes are to variations in vegetation parameters like Leaf Area Index (LAI), tree species, and root system characteristics.<\/li> <li><strong>Experimental Design:<\/strong> Developing a series of simulation experiments to isolate and study the impacts of key vegetation variables.<\/li> <li><strong>Simulation and Iteration:<\/strong> Conducting simulations, analyzing results, and iteratively refining models to identify the most influential vegetation factors.<\/li> <\/ul> <h3 id=\"building-materials\">Building Materials<\/h3> <ul> <li><strong>Solver Research:<\/strong> Reviewing solver documentation (wikis) and published research to understand how building materials are modeled and implemented.<\/li> <li><strong>Case Study Formulation:<\/strong> Developing relevant case studies, possibly based on the Georgia Tech campus or other real-world projects, to test the effects of different building materials.<\/li> <li><strong>Simulation Runs:<\/strong> Conducting simulations to observe and quantify the impact of various building materials on the surrounding microclimate.<\/li> <\/ul> <h3 id=\"technical-implementation-and-challenges\">Technical Implementation and Challenges<\/h3> <ul> <li><strong>Terrain Modeling:<\/strong> Implementing terrain features in the UMCF (Urban Microclimate CFD) model, including the creation of terrain patches and handling underground cells.<\/li> <li><strong>Grass Geometry:<\/strong> Integrating grass geometry into the simulation domain.<\/li> <li><strong>Solver Exploration:<\/strong> Investigating the <code>hamFoam<\/code> solver, including its governing equations, assumptions, and wiki documentation.<\/li> <li><strong>Error Handling:<\/strong> Addressing and resolving various warnings and errors encountered during simulations, such as <code>FaceWarning<\/code> messages.<\/li> <li><strong>Mesh Generation:<\/strong> Optimizing mesh creation processes to reduce computational time and improve accuracy.<\/li> <\/ul> <h2 id=\"progress-and-weekly-updates\">Progress and Weekly Updates<\/h2> <p>The project progressed through several phases, documented by weekly updates, including:<\/p> <ul> <li><strong>Weeks 1\/27 &amp; 2\/6:<\/strong> Initial setup, parameter sensitivity analysis, and implementation of Foamonary and Foamist.<\/li> <li><strong>Weeks 2\/13 &amp; 2\/20:<\/strong> Implementing terrain features, creating terrain patches, and addressing boundary condition issues, particularly with <code>mappedWall<\/code>.<\/li> <li><strong>Weeks 2\/27 &amp; 03\/06:<\/strong> Continued troubleshooting with ENVI-met and revisiting its use for comparison. Refinement of terrain parsing and processing.<\/li> <li><strong>Weeks 03\/13 &amp; 03\/31:<\/strong> Facing slow simulation speeds with ENVI-met, encountering timestep errors in OpenFOAM, and working with <code>viewFactorsGen<\/code>.<\/li> <li><strong>Week 04\/07 &amp; After Break:<\/strong> Analyzing simulation results, varying wind parameters, and attempting to probe points for data collection.<\/li> <\/ul> <h2 id=\"detailed-technical-issues-and-solutions\">Detailed Technical Issues and Solutions<\/h2> <h3 id=\"facewarning-messages\">FaceWarning Messages<\/h3> <ul> <li>Encountering <code>FaceWarning<\/code> messages during mesh creation.<\/li> <li>Investigating the relevance of these warnings and their potential impact on simulation accuracy.<\/li> <li>Exploring methods to optimize mesh creation and reduce\/eliminate these warnings.<\/li> <\/ul> <h3 id=\"boundary-condition-issues\">Boundary Condition Issues<\/h3> <ul> <li>Troubleshooting issues with the <code>mappedWall<\/code> boundary condition.<\/li> <li>Ensuring correct face mapping between building geometries and the air region.<\/li> <li>Resolving discrepancies in the number of faces between different regions.<\/li> <\/ul> <h3 id=\"solver-errors\">Solver Errors<\/h3> <ul> <li>Debugging crashes of <code>urbanMicroclimateFoam<\/code> due to timestep issues.<\/li> <li>Addressing <code>FOAM FATAL ERROR<\/code> related to dynamic list capacity in <code>viewFactorsGen<\/code>.<\/li> <\/ul> <h3 id=\"envi-met-challenges\">ENVI-met Challenges<\/h3> <ul> <li>Encountering difficulties saving SIMX files in ENVI-met.<\/li> <li>Experiencing slow simulation speeds and limitations in the trial version.<\/li> <li>Issues with remote desktop access and administrator permissions.<\/li> <\/ul> <h2 id=\"benchmarking-and-validation\">Benchmarking and Validation<\/h2> <ul> <li><strong>HAMSTAD Benchmarks:<\/strong> Utilizing the HAMSTAD benchmarks to compare simulation results and validate model accuracy.<\/li> <li><strong>ETH Zurich Resources:<\/strong> Accessing and utilizing benchmark descriptions, input data, and result data from ETH Zurich's Gitlab repository.<\/li> <\/ul> <h2 id=\"simulation-parameters-and-analysis\">Simulation Parameters and Analysis<\/h2> <ul> <li><strong>Wind Conditions:<\/strong> Varying wind speed and direction to observe their impact on temperature, humidity, and CO2 levels.<\/li> <li><strong>Temperature and Humidity:<\/strong> Analyzing the spatial distribution and variation of temperature and humidity within the simulation domain.<\/li> <li><strong>CO2 Levels:<\/strong> Investigating CO2 concentration at different heights.<\/li> <li><strong>Probing Points:<\/strong> Attempting to probe specific points within the brick blocks to collect detailed data.<\/li> <\/ul> <h2 id=\"tools-and-software-used\">Tools and Software Used<\/h2> <ul> <li><strong>OpenFOAM:<\/strong> Primary CFD software used, particularly the <code>urbanMicroclimateFoam<\/code> and <code>hamFoam<\/code> solvers.<\/li> <li><strong>ENVI-met:<\/strong> Explored for comparative analysis but faced several challenges.<\/li> <li><strong>Rhino:<\/strong> Potential use for 3D modeling and geometry preparation.<\/li> <li><strong>WSL (Windows Subsystem for Linux):<\/strong> Used to run simulations on an Ubuntu 20.04 environment.<\/li> <li><strong>blueCFD-Core-2020:<\/strong> Specific distribution of OpenFOAM used for the project.<\/li> <\/ul> <h2 id=\"current-status\">Current Status<\/h2> <p>The project involves ongoing efforts to refine simulations, troubleshoot persistent issues, and validate results against established benchmarks. Continued work on ENVI-met and debugging specific solver errors is in progress.<\/p> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=qj7gHptpZig\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/qj7gHptpZig\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Marcelo \u00c1lvarez<\/td> <td>Masters<\/td> <td>Architecture (DC)<\/td> <td>ARCH<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/alvarezdmarch\">alvarezdmarch<\/a><\/td> <\/tr> <tr> <td>Marcellus English<\/td> <td>Sophomore<\/td> <td>Civil Engineering<\/td> <td>CEE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/mcenglish\">mcenglish<\/a><\/td> <\/tr> <tr> <td>Victor Wang<\/td> <td>Freshman<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/vdwang\">vdwang<\/a><\/td> <\/tr> <tr> <td>Gonzalo Vegas<\/td> <td>PhD<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/gvegasol\">gvegasol<\/a><\/td> <\/tr> <tr> <td>Sina Rahimi<\/td> <td>PhD<\/td> <td>Architectural Science<\/td> <td>ARCH<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/sinarhm\">sinarahimi<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25sp-microclimate-umcf\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:48 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25sp-microclimate-umcf\/#__comments","guid":"https:\/\/vip-smur.github.io\/25sp-microclimate-umcf\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25sp-microclimate-umcf\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Sp-Microclimate-LSTM-Kriging","description":"<h1 id=\"urban-microclimate-prediction-hybrid-lstm-transformer-kriging\">Urban-Microclimate-Prediction-Hybrid-LSTM-Transformer-Kriging<\/h1> <p><img src=\".\/Figures\/prediction_result_image.png\" width=\"300\" \/> <img src=\".\/Figures\/prediction_result_2.png\" width=\"300\" \/><\/p> <h1 id=\"microclimate-prediction-model\">\ud83c\udf26\ufe0f Microclimate Prediction Model<\/h1> <h2 id=\"overview\">\ud83e\udded Overview<\/h2> <p><img src=\".\/Figures\/Diagram_1.jpg\" width=\"300\" \/> This project introduces a hybrid machine learning approach for urban microclimate prediction. It integrates time series forecasting (using LSTM and Transformer architecture) with spatial interpolation (Kriging) to model environmental conditions across the urban canopy layer.<\/p> <p>Key inputs include: - Meteorological data: temperature, humidity, dew point - Urban features: land cover, 3D elevation, surface materials, shadow coverage, sun angle<\/p> <hr \/> <h2 id=\"work-distribution\">Work Distribution<\/h2> <p>We\u2019d like to share a quick update on what the team has been working on. For our convenience in tracking files, please see the suggested file naming guide below. If possible, kindly consider revising your file names accordingly. However, if the file name cannot be changed for any reason, please feel free to let me know.<\/p> <p>1_ExtractUrbanFeatures.ipynb -- \/krishgupta-CE \/Thanasarn-Changnawa<\/p> <p>1_1_ExtractBuildings.ipynb -- \/krishgupta-CE \/Thanasarn-Changnawa<\/p> <p>1_2_ExtractShadows.ipynb -- \/daytss \/Thanasarn-Changnawa<\/p> <p>1_3_ExtractSurfaceMaterials.ipnb -- \/BenjaminHansyun<\/p> <p>2_TrainModel.ipynb -- \/yupengtang \/zeyujiang8800 \/Thanasarn-Changnawa<\/p> <p>2_1_LSTM_Model_Eval.ipynb<\/p> <p>2_2_(Model Name)<\/p> <p>3_Inference.ipynb -- \/zeyujiang8800 \/Thanasarn-Changnawa<\/p> <p><img src=\".\/Figures\/Responsibilities.png\" width=\"300\" \/><\/p> <h2 id=\"geospatial-feature-engineering\">\ud83c\udf10 Geospatial Feature Engineering<\/h2> <h3 id=\"2d-spatial-data\">2D Spatial Data<\/h3> <ul> <li>12 distance vectors per grid point to features such as buildings, parks, libraries, parking, footways, grass, fitness centers, woods, and wetlands<\/li> <li>Data sourced from OSMnx and GT Tree Viewer<\/li> <li>Returns .csv file: grid_analysis.csv <img src=\".\/Figures\/Spatial%20Table.png\" width=\"300\" \/> <img src=\".\/Figures\/Spatial%20Map.png\" width=\"300\" \/><\/li> <\/ul> <h3 id=\"building-elevation\">Building Elevation<\/h3> <ul> <li>Derived from DSM and DTM to compute building heights<\/li> <li>Digital Terrain Model (DTM) for GT\u2019s campus (.tif file) obtained through USGS EarthExplorer<\/li> <li>Digital Surface Model (DSM) for GT\u2019s campus (.tif file) obtained through OpenTopography<\/li> <li>Returns .csv file: grid_with_ground_and_building_elevation.csv <img src=\".\/Figures\/DTM%20figure.png\" width=\"300\" \/> <img src=\".\/Figures\/elevation%20map.png\" width=\"300\" \/><\/li> <\/ul> <h3 id=\"building-area-density\">Building Area Density<\/h3> <ul> <li>Utilizes osmnx to find total building footprint per spatial unit<\/li> <li>Returns .csv file: squares_with_building_areas.csv <img src=\".\/Figures\/building%20areas%20map.png\" width=\"300\" \/><\/li> <\/ul> <h3 id=\"surface-materials\">Surface Materials<\/h3> <ul> <li>OSM map tiles converted to material categories by pixel color <img src=\".\/Figures\/Surface_Material_Workfow.png\" width=\"300\" \/><\/li> <\/ul> <h3 id=\"shadow-coverage\">Shadow Coverage<\/h3> <ul> <li>Calculated using Pybdshadow and Astral for sunlight\/shadow estimation<\/li> <\/ul> <h3 id=\"sun-angle-dynamics\">Sun Angle Dynamics<\/h3> <ul> <li>Sun angle included as a physical feature for seasonal generalization<\/li> <\/ul> <hr \/> <h2 id=\"project-structure\">\ud83d\udcc1 Project Structure<\/h2> <ul> <li><strong>Data Collection<\/strong>: Automated via Selenium<\/li> <li><strong>Feature Engineering<\/strong>: Spatial and environmental attributes<\/li> <li><strong>Modeling<\/strong>: Temporal Fusion Transformer with LSTM-Attention Encoder (TFT-LAE)<\/li> <li><strong>Training<\/strong>: Adam optimizer + MSE loss + early stopping<\/li> <li><strong>Evaluation<\/strong>: RMSE, MAPE, R\u00b2, residual tracking<\/li> <\/ul> <hr \/> <h2 id=\"model-architecture-tft-lae\">\ud83e\udde0 Model Architecture: TFT-LAE<\/h2> <ul> <li><strong>VSN<\/strong>: Variable Selection Network<\/li> <li><strong>Time2Vec<\/strong>: Temporal embedding module<\/li> <li><strong>LSTM + Attention<\/strong>: Captures time dependencies<\/li> <li><strong>GRN Decoder<\/strong>: Multi-step forecast generation<\/li> <\/ul> <p>Workflow: Input \u2192 VSN \u2192 Time2Vec \u2192 LSTM+Attention \u2192 GRN \u2192 Output<\/p> <hr \/> <h2 id=\"feature-engineering-selection\">\ud83e\uddee Feature Engineering &amp; Selection<\/h2> <p>Selected Features: - Meteorological: RH, DewPt, Azimuth, Altitude, \u0394Temp - Temporal: hour_sin, hour_cos - Scaled with MinMaxScaler to ensure consistency<\/p> <hr \/> <h2 id=\"training-process\">\ud83c\udfcb\ufe0f\u200d\u2642\ufe0f Training Process<\/h2> <ul> <li><strong>Loss<\/strong>: MSE<\/li> <li><strong>Optimizer<\/strong>: Adam with weight decay<\/li> <li><strong>Early stopping<\/strong>: Prevents overfitting<\/li> <li><strong>Logging<\/strong>: tqdm + best model saving<\/li> <\/ul> <hr \/> <h2 id=\"evaluation-process\">\ud83c\udf0d Evaluation Process<\/h2> <h3 id=\"data-sources\">Data Sources<\/h3> <table> <thead> <tr> <th>Source<\/th> <th>Use<\/th> <th>Location<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Atlanta Weather<\/td> <td>Train time series<\/td> <td>Atlanta, GA<\/td> <\/tr> <tr> <td>Singapore Grid<\/td> <td>Train spatial Kriging<\/td> <td>Singapore<\/td> <\/tr> <tr> <td>GT Campus<\/td> <td>Final test<\/td> <td>Georgia Tech<\/td> <\/tr> <\/tbody> <\/table> <h3 id=\"tools\">Tools<\/h3> <ul> <li>Selenium for data scraping<\/li> <li>Python for processing<\/li> <\/ul> <h3 id=\"workflow\">Workflow<\/h3> <ol> <li>Scrape and clean data<\/li> <li>Train time series model (Atlanta)<\/li> <li>Train spatial interpolation (Singapore)<\/li> <li>Apply both to Georgia Tech data<\/li> <li>Evaluate with real measurements<\/li> <\/ol> <hr \/> <h2 id=\"evaluation-and-prediction\">\ud83d\udcca Evaluation and Prediction<\/h2> <p>Functions: - <code>predict_and_plot<\/code>, <code>plot_full_sequence<\/code><\/p> <p>Metrics: - RMSE, MAPE, R\u00b2<\/p> <p>Residuals: - Histogram and time-series plots to detect bias<\/p> <p>Overfitting: - Train\/test error comparison<\/p> <hr \/> <h2 id=\"problem-outlier-distortion\">\ud83d\udc1e Problem: Outlier Distortion<\/h2> <p>Initial training data contained extreme values: - <strong>-51\u00b0C to 174\u00b0C<\/strong><\/p> <p>Distorted MinMaxScaler and flattened predictions.<\/p> <h3 id=\"solution\">Solution<\/h3> <ul> <li>Filtered to <strong>-15\u00b0C to 40\u00b0C<\/strong><\/li> <li>Result: Better scaling, more generalization<\/li> <\/ul> <p>Lesson: Always validate input ranges before normalization.<\/p> <hr \/> <h2 id=\"post-fix-evaluation\">\ud83d\udcc9 Post-Fix Evaluation<\/h2> <ul> <li>Residuals became balanced and centered<\/li> <li>Predictions improved but remained smooth<\/li> <li>Future work: increase expressiveness and precision<\/li> <\/ul> <hr \/> <h2 id=\"summary\">\u2705 Summary<\/h2> <p>This workflow combines spatial and temporal modeling for urban microclimate forecasting using: - Deep learning (TFT-LAE) - Spatial Kriging interpolation - Automated feature extraction and evaluation<\/p> <p>It provides a framework for scalable, data-driven urban climate resilience solutions.<\/p> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=knRSFEzkwDA\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/knRSFEzkwDA\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Han\u2011Syun Shih<\/td> <td>Masters<\/td> <td>Architecture (HBP)<\/td> <td>ARCH<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/hshih38\">Benjaminhansyun<\/a><\/td> <\/tr> <tr> <td>Thanasarn Changnawa<\/td> <td>PhD<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/Thanasarn-Changnawa\">Thanasarn\u2011Changnawa<\/a><\/td> <\/tr> <tr> <td>Krish Gupta<\/td> <td>Junior<\/td> <td>Civil Engineering<\/td> <td>CEE<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/krishgupta-CE\">krishgupta\u2011CE<\/a><\/td> <\/tr> <tr> <td>Yupeng Tang<\/td> <td>Masters<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/yupengtang\">yupengtang<\/a><\/td> <\/tr> <tr> <td>Dayeon Song<\/td> <td>Freshman<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/daytss\">daytss<\/a><\/td> <\/tr> <tr> <td>Ze Yu Jiang<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/zeyujiang8800\">zeyujiang8800<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25sp-microclimate-lstm-kriging\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:48 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25sp-microclimate-lstm-kriging\/#__comments","guid":"https:\/\/vip-smur.github.io\/25sp-microclimate-lstm-kriging\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25sp-microclimate-lstm-kriging\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Sp-Energy","description":"<h2 id=\"table-of-contents\">Table of Contents<\/h2> <ul> <li><a href=\"#rhino-energy-prediction-plugin\">Rhino Energy Prediction Plugin<\/a><\/li> <li><a href=\"#overview\">Overview<\/a><\/li> <li><a href=\"#features\">Features<\/a><\/li> <li><a href=\"#architecture\">Architecture<\/a><\/li> <li><a href=\"#installation\">Installation<\/a><\/li> <li><a href=\"#workflow\">Workflow<\/a><\/li> <li><a href=\"#requirements\">Requirements<\/a><\/li> <li><a href=\"#tech-stack\">Tech Stack<\/a><\/li> <li><a href=\"#roadmap\">Roadmap<\/a><\/li> <li><a href=\"#energy-map\">Energy Map<\/a><\/li> <li><a href=\"#overview-1\">Overview<\/a><\/li> <li><a href=\"#repository-structure\">Repository Structure<\/a><\/li> <li><a href=\"#getting-started\">Getting Started<\/a><ul> <li><a href=\"#requirements-1\">Requirements<\/a><\/li> <li><a href=\"#set-up-to-run-locally\">Set up to run locally<\/a><\/li> <\/ul> <\/li> <li><a href=\"#map-information\">Map Information<\/a><ul> <li><a href=\"#datasets\">Datasets<\/a><\/li> <\/ul> <\/li> <li><a href=\"#extracting-vegetation-data\">Extracting Vegetation Data<\/a><\/li> <li><a href=\"#overview-2\">Overview<\/a><\/li> <li><a href=\"#ndvi-analysis\">NDVI Analysis<\/a><\/li> <li><a href=\"#treecountsegheight\">TreeCountSegHeight<\/a><\/li> <li><a href=\"#next-steps\">Next Steps<\/a><\/li> <li><a href=\"#presentation\">Presentation<\/a><\/li> <li><a href=\"#team\">Team<\/a><\/li> <\/ul> <hr \/> <h1 id=\"rhino-energy-prediction-plugin\"><a href=\"https:\/\/github.com\/VIP-SMUR\/25Sp-EnergyPlugin\">Rhino Energy Prediction Plugin<\/a><\/h1> <h2 id=\"overview\">Overview<\/h2> <p>Rhino Energy Prediction Plugin is designed to support architects in making energy-informed design decisions early in the building process. The plugin enables users to create or modify building models and receive predictions for heating and cooling loads using a machine learning (ML) model. Architects can gauge building energy performance early (concept stage) using the Rhino Energy Prediction Plugin. The plugin embeds a self-contained ONNX runtime directly in Grasshopper.<\/p> <h2 id=\"features\">Features<\/h2> <ul> <li> <p><strong>Model Initialization<\/strong><br \/> Reads an ONNX model file path and sets up an <code>InferenceSession<\/code> that exposes each input tensor\u2019s name, datatype, and shape.<\/p> <\/li> <li> <p><strong>Real-Time Inference<\/strong><br \/> Packs Grasshopper inputs into dense tensors, executes the ONNX model, and returns the first element of the output array as an energy load estimate.<\/p> <\/li> <li> <p><strong>Automatic Feature Extraction<\/strong><br \/> Companion Python script reads 3D building geometry and computes features such as roof area, window-to-wall ratio, floor area, and number of stories.<\/p> <\/li> <li> <p><strong>Pure C# Runtime<\/strong><br \/> Runs entirely in .NET via Microsoft\u2019s ONNX Runtime\u2014no Python interpreter required at inference time.<\/p> <\/li> <\/ul> <h2 id=\"architecture\">Architecture<\/h2> <ol> <li> <p><strong>Component Initialization<\/strong><br \/> The plugin reads the ONNX model path from the Grasshopper input.<br \/> It then creates an <code>InferenceSession<\/code> and retrieves input tensor metadata.<\/p> <\/li> <li> <p><strong>Input Packing<\/strong><br \/> Grasshopper values are loaded into dense tensors that match the ONNX input shapes.<\/p> <\/li> <li> <p><strong>Model Inference<\/strong><br \/> The plugin runs the ONNX model with the packed inputs and receives an output array.<br \/> The first element of that array is sent to the Grasshopper output.<\/p> <\/li> <li> <p><strong>Feature Extraction Script<\/strong><br \/> A Python helper extracts building features automatically by classifying layers named <code>Wall<\/code>, <code>Slab<\/code>, <code>Window<\/code>, and <code>Roof<\/code>.<\/p> <\/li> <\/ol> <h2 id=\"installation\">Installation<\/h2> <ol> <li>Download the <code>VIP_Energy_Plugin<\/code> folder. <\/li> <li>Copy it to your Grasshopper Libraries folder: <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"><\/a>C:\\Users\\YourUserName\\AppData\\Roaming\\Grasshopper\\Libraries <\/span><\/code><\/pre><\/div><\/li> <li>Launch Rhino and open Grasshopper. <\/li> <li>Drag the <strong>VIPPlugin<\/strong> component from the Params tab onto the canvas. <\/li> <li>Provide the ONNX model file path to the component input. <\/li> <li>View the energy load prediction on the second output parameter.<\/li> <\/ol> <h2 id=\"workflow\">Workflow<\/h2> <ol> <li>Open Rhino and start Grasshopper. <\/li> <li>Place the VIPPlugin component and connect the ONNX model path. <\/li> <li>Sketch or import a building mass in Rhino. <\/li> <li>Run the feature extraction script to compute geometry parameters. <\/li> <li>Grasshopper packs the inputs and runs the ONNX model. <\/li> <li>Inspect the real-time energy load estimate.<\/li> <\/ol> <h2 id=\"requirements\">Requirements<\/h2> <ul> <li><strong>Rhino 7+<\/strong> \u2013 Plugin host environment <\/li> <li><strong>Windows OS<\/strong> \u2013 .NET and Rhino SDK compatibility <\/li> <li><strong>.NET Framework 4.8+<\/strong> \u2013 ONNX Runtime support <\/li> <li><strong>Python 3.8+<\/strong> \u2013 Feature extraction and model conversion scripts <\/li> <li><strong>ONNX model file<\/strong> \u2013 Trained energy prediction model <\/li> <\/ul> <h2 id=\"tech-stack\">Tech Stack<\/h2> <ul> <li><strong>Rhino SDK (C#)<\/strong> \u2013 Core plugin development and geometry handling <\/li> <li><strong>Grasshopper (C#)<\/strong> \u2013 Dynamic component architecture <\/li> <li><strong>Microsoft ONNX Runtime<\/strong> \u2013 High-performance model inference <\/li> <li><strong>Python<\/strong> \u2013 Building feature extraction and <code>.joblib<\/code> \u2192 <code>.onnx<\/code> conversion <\/li> <li><strong>scikit-learn \/ sklearn-onnx<\/strong> \u2013 Model training and conversion <\/li> <\/ul> <h2 id=\"roadmap\">Roadmap<\/h2> <ul> <li> <p><strong>Real-Time EUI Feedback<\/strong><br \/> Provide energy use intensity updates as users modify height, WWR, and story count.<\/p> <\/li> <li> <p><strong>Flexible Model Inputs<\/strong><br \/> Detect parameter names and types automatically to support multiple climates and typologies.<\/p> <\/li> <li> <p><strong>Multi-Format Support<\/strong><br \/> Add seamless handling of both <code>.onnx<\/code> and <code>.joblib<\/code> models with built-in feature mapping.<\/p> <\/li> <li> <p><strong>Map Integration<\/strong><br \/> Link with an energy prediction map to import existing building geometry and simulate retrofits.<\/p> <\/li> <\/ul> <hr \/> <h1 id=\"energy-map\">Energy Map<\/h1> <h2 id=\"overview_1\">Overview<\/h2> <div align=\"center\"> <img src=\".\/Figures\/heating.png\" width=\"400\"> <img src=\".\/Figures\/cooling.png\" width=\"400\"> <\/div> <p>The energy map provides visualizations of predicted building energy loads (heating and cooling) across an urban environment. Users can click on individual buildings to inspect specific feature details such as building height and estimated energy loads.<\/p> <p>Given a GeoJSON file, the application calculates various building features, including height, shape (e.g., L-shaped, H-shaped), number of stories, building type (residential, commercial, etc.), energy code classification, HVAC category, roof area, rotation, wall area, and window area. These extracted features are then fed into a machine learning model, as described here.<\/p> <h2 id=\"deployment\">Deployment<\/h2> <p>It is currently deployed on <a href=\"https:\/\/render.com\/\">Render<\/a> at: https:\/\/two5sp-energyinbuildings-1.onrender.com\/<\/p> <h3 id=\"render-frontend-settings\">Render Frontend Settings<\/h3> <p>It's deployed as a Static Service with the following settings: <\/p> <ol> <li>Service as <strong>Static Service<\/strong> <\/li> <li> <p>Root Directory set as <code>\/energy_map\/<\/code> <\/p> <\/li> <li> <p>Pushlish Directory as <code>dist<\/code><\/p> <\/li> <li>Build Command set as <code>yarn &amp;&amp; yarn build<\/code> <\/li> <\/ol> <h3 id=\"render-backend-settings\">Render Backend Settings<\/h3> <p>It's deployed as a Web Service with the following settings: <\/p> <ol> <li>Service as <strong>Web Service<\/strong> <\/li> <li> <p>Root Directory set as <code>\/energy_map\/flask-api\/<\/code> <\/p> <\/li> <li> <p>Build Command set as <code>pip install -r requirements.txt<\/code> <\/p> <\/li> <li>Start Command as <code>python app.py<\/code><\/li> <\/ol> <h2 id=\"repository-structure\">Repository Structure<\/h2> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-1-1\"><a id=\"__codelineno-1-1\" name=\"__codelineno-1-1\" href=\"#__codelineno-1-1\"><\/a>energy map <\/span><span id=\"__span-1-2\"><a id=\"__codelineno-1-2\" name=\"__codelineno-1-2\" href=\"#__codelineno-1-2\"><\/a>\u251c\u2500 api <\/span><span id=\"__span-1-3\"><a id=\"__codelineno-1-3\" name=\"__codelineno-1-3\" href=\"#__codelineno-1-3\"><\/a>| \u251c\u2500 calculate_building_features # Scripts to calculate building-level features like height, area, rotation <\/span><span id=\"__span-1-4\"><a id=\"__codelineno-1-4\" name=\"__codelineno-1-4\" href=\"#__codelineno-1-4\"><\/a>| \u2514\u2500 route.ts # API routing configuration for feature calculations <\/span><span id=\"__span-1-5\"><a id=\"__codelineno-1-5\" name=\"__codelineno-1-5\" href=\"#__codelineno-1-5\"><\/a>| <\/span><span id=\"__span-1-6\"><a id=\"__codelineno-1-6\" name=\"__codelineno-1-6\" href=\"#__codelineno-1-6\"><\/a>\u251c\u2500 flask-api # Backend Flask server <\/span><span id=\"__span-1-7\"><a id=\"__codelineno-1-7\" name=\"__codelineno-1-7\" href=\"#__codelineno-1-7\"><\/a>| <\/span><span id=\"__span-1-8\"><a id=\"__codelineno-1-8\" name=\"__codelineno-1-8\" href=\"#__codelineno-1-8\"><\/a>\u251c\u2500 node_modules # Dependency libraries (auto-generated) <\/span><span id=\"__span-1-9\"><a id=\"__codelineno-1-9\" name=\"__codelineno-1-9\" href=\"#__codelineno-1-9\"><\/a>\u251c\u2500 public # Static public assets <\/span><span id=\"__span-1-10\"><a id=\"__codelineno-1-10\" name=\"__codelineno-1-10\" href=\"#__codelineno-1-10\"><\/a>\u251c\u2500 src <\/span><span id=\"__span-1-11\"><a id=\"__codelineno-1-11\" name=\"__codelineno-1-11\" href=\"#__codelineno-1-11\"><\/a>| \u251c\u2500 assets # Static files such as icons or images <\/span><span id=\"__span-1-12\"><a id=\"__codelineno-1-12\" name=\"__codelineno-1-12\" href=\"#__codelineno-1-12\"><\/a>| \u251c\u2500 App.tsx # Main application file <\/span><span id=\"__span-1-13\"><a id=\"__codelineno-1-13\" name=\"__codelineno-1-13\" href=\"#__codelineno-1-13\"><\/a>| \u251c\u2500 App.css # Application-level styling <\/span><span id=\"__span-1-14\"><a id=\"__codelineno-1-14\" name=\"__codelineno-1-14\" href=\"#__codelineno-1-14\"><\/a>| \u251c\u2500 index.css # Global styles <\/span><span id=\"__span-1-15\"><a id=\"__codelineno-1-15\" name=\"__codelineno-1-15\" href=\"#__codelineno-1-15\"><\/a>| \u251c\u2500 main.tsx # Application bootstrap and render entry <\/span><span id=\"__span-1-16\"><a id=\"__codelineno-1-16\" name=\"__codelineno-1-16\" href=\"#__codelineno-1-16\"><\/a>| \u2514\u2500 components # React components for UI (buttons, feature displays, map container, map view) <\/span><span id=\"__span-1-17\"><a id=\"__codelineno-1-17\" name=\"__codelineno-1-17\" href=\"#__codelineno-1-17\"><\/a>| \u251c\u2500 ButtonComponent.tsx <\/span><span id=\"__span-1-18\"><a id=\"__codelineno-1-18\" name=\"__codelineno-1-18\" href=\"#__codelineno-1-18\"><\/a>| | \u251c\u2500 FeatureDisplay.tsx <\/span><span id=\"__span-1-19\"><a id=\"__codelineno-1-19\" name=\"__codelineno-1-19\" href=\"#__codelineno-1-19\"><\/a>| | \u251c\u2500 MapContainer.tsx <\/span><span id=\"__span-1-20\"><a id=\"__codelineno-1-20\" name=\"__codelineno-1-20\" href=\"#__codelineno-1-20\"><\/a>| | \u251c\u2500 MapView.tsx <\/span><span id=\"__span-1-21\"><a id=\"__codelineno-1-21\" name=\"__codelineno-1-21\" href=\"#__codelineno-1-21\"><\/a>| \u2514\u2500 utils <\/span><span id=\"__span-1-22\"><a id=\"__codelineno-1-22\" name=\"__codelineno-1-22\" href=\"#__codelineno-1-22\"><\/a>| \u2514\u2500 building.ts # Utility functions for parsing and handling building feature data <\/span><span id=\"__span-1-23\"><a id=\"__codelineno-1-23\" name=\"__codelineno-1-23\" href=\"#__codelineno-1-23\"><\/a>\u2514\u2500 ... <\/span><\/code><\/pre><\/div> <h2 id=\"getting-started\">Getting Started<\/h2> <h3 id=\"requirements_1\">Requirements<\/h3> <ol> <li> <p>Run with Python 3.12.5 (otherwise there are issues with the .pkl files)<\/p> <\/li> <li> <p>Install <a href=\"https:\/\/nodejs.org\/en\">node.js<\/a><\/p> <\/li> <\/ol> <h3 id=\"set-up-to-run-locally\">Set up to run locally<\/h3> <ol> <li>Clone the repository using <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-2-1\"><a id=\"__codelineno-2-1\" name=\"__codelineno-2-1\" href=\"#__codelineno-2-1\"><\/a>git clone https:\/\/github.com\/VIP-SMUR\/25Sp-EnergyInBuildings-Com.git <\/span><\/code><\/pre><\/div><\/li> <li>Navigate to the project folder <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-3-1\"><a id=\"__codelineno-3-1\" name=\"__codelineno-3-1\" href=\"#__codelineno-3-1\"><\/a>cd energy_map <\/span><\/code><\/pre><\/div><\/li> <li>Run front end locally using <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-4-1\"><a id=\"__codelineno-4-1\" name=\"__codelineno-4-1\" href=\"#__codelineno-4-1\"><\/a>npm run dev <\/span><\/code><\/pre><\/div><\/li> <li>To run the flask backend, open a new terminal and navigate to the energy_map\/app\/flask-api folder. Make sure to have the required python libraries. You can then run app.py without any errors <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-5-1\"><a id=\"__codelineno-5-1\" name=\"__codelineno-5-1\" href=\"#__codelineno-5-1\"><\/a>pip install -r \/path\/to\/requirements.txt <\/span><span id=\"__span-5-2\"><a id=\"__codelineno-5-2\" name=\"__codelineno-5-2\" href=\"#__codelineno-5-2\"><\/a> <\/span><span id=\"__span-5-3\"><a id=\"__codelineno-5-3\" name=\"__codelineno-5-3\" href=\"#__codelineno-5-3\"><\/a>python app.py <\/span><\/code><\/pre><\/div><\/li> <\/ol> <h1 id=\"map-information\">Map Information<\/h1> <h3 id=\"datasets\">Datasets<\/h3> <p>The dataset is derived from the <a href=\"https:\/\/overturemaps.org\/\">Overture Maps Foundation<\/a> building footprints, provided in GeoJSON<\/p> <hr \/> <h1 id=\"extracting-vegetation-data\">Extracting Vegetation Data<\/h1> <h2 id=\"overview_2\">Overview<\/h2> <p>We examined various methods of extracting vegetation data for use with the models due to the effect of shading on the heating and cooling load of nearby buildings.<\/p> <h2 id=\"ndvi-analysis\">NDVI Analysis<\/h2> <p>NDVI (Normalized Difference Vegetation Index) is a metric used to quantify the health and density of vegetation from satellite imagery. Seemed promising at first, but does not provide any way of estimating vegetation height, which is likely needed as a metric for the model to be trained on.<\/p> <h2 id=\"treecountsegheight\"><a href=\"https:\/\/github.com\/sizhuoli\/TreeCountSegHeight\">TreeCountSegHeight<\/a><\/h2> <p>A recently developed model called TreeCountSegHeight was also examined for potential integration with the model. It seemed to fit our purposes quite well, returning an estimate of tree height from input satellite imagery, but was found to be very computationally intensive. It may have the potential to yield results given sufficient hardware, but this was a stumbling point in the workflow. <\/p> <h2 id=\"next-steps\">Next Steps<\/h2> <p>Continue searching for a lightweight\/efficient way to extract vegetation height from satellite imagery.<\/p> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=4AXZ__TYZlY\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/4AXZ__TYZlY\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Joseph M. Aerathu<\/td> <td>Masters<\/td> <td>Architecture (HPB)<\/td> <td>ARCH<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/jma1999\">jma1999<\/a><\/td> <\/tr> <tr> <td>Anubha Mahajan<\/td> <td>Senior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/amahajan68\">amahajan68<\/a><\/td> <\/tr> <tr> <td>Jessica Hernandez<\/td> <td>Masters<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/jhernandez312\">jhernandez312<\/a><\/td> <\/tr> <tr> <td>Hang Xu<\/td> <td>PhD<\/td> <td>Architecture (HBP)<\/td> <td>ARCH<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/HangXXXu\">HangXXXu<\/a><\/td> <\/tr> <tr> <td>Jiayi Li<\/td> <td>Junior<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/jli3307\">jli3307<\/a><\/td> <\/tr> <tr> <td>Kavya Lalith<\/td> <td>Sophomore<\/td> <td>Computer Engineering<\/td> <td>ECE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/kavya-oop\">kavya\u2011oop<\/a><\/td> <\/tr> <tr> <td>Johnny Chen<\/td> <td>Freshman<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/jxchen21\">jxchen21<\/a><\/td> <\/tr> <tr> <td>Shivam Patel<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/FlippyShivam\">FlippyShivam<\/a><\/td> <\/tr> <tr> <td>Yichao Shi<\/td> <td>PhD<\/td> <td>Architecture (DC)<\/td> <td>ARCH<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/SHIyichao98\">SHIyichao98<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25sp-energyinbuildings\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:48 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25sp-energyinbuildings\/#__comments","guid":"https:\/\/vip-smur.github.io\/25sp-energyinbuildings\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25sp-energyinbuildings\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Sp-Neuroarchitecture","description":"<h1 id=\"25sp-neuroarchitecture\">25Sp-Neuroarchitecture<\/h1> <h2 id=\"description\">Description<\/h2> <p>During the COVID-19 pandemic, lockdown measures like home isolation, online learning, and public space closures helped control the virus but also increased social isolation, loneliness, and mental health issues such as depression and anxiety. These challenges, including restricted freedom, limited mental health access, and financial stress, underscored the urgent need to address mental well-being.<\/p> <p>Neuroarchitecture is an interdisciplinary field that combines principles of neuroscience with architecture and urban design. It studies how the built environment influences human behavior, emotions, and cognitive functions<\/p> <ul> <li>Current studies in \"Neuroarchitecture\" mainly emphasize physical health rather than mental health<\/li> <li>\"Neuroarchitecture\" research remains at a conceptual level<\/li> <li>The relationship between mental health and the urban built environment is nearly never explored across different age groups.<\/li> <li>Many studies rely on subjective survey-based data collection instead of data-driven<\/li> <\/ul> <p><img alt=\"Description\" src=\"Figure\/Description.jpg\" \/><\/p> <h2 id=\"spring-2025-neuroarchitecture-plan\">Spring 2025 Neuroarchitecture Plan<\/h2> <p>Since In Fall 2024, we have already filtered papers which are aligned with our eligibility criteria, so we focused on the data extraction and text mining in this semester.<\/p> <p><img alt=\"Plan\" src=\"Figure\/Plan.jpg\" \/><\/p> <h2 id=\"data-extraction\">Data Extraction<\/h2> <p>Based on the Prisma we concluded last semester, we have 69 papers for data extraction continually(). We divided our data extraction templete into 4 part: Study Characteristics, Exposures, Outcomes, and main findings.Each section has corresponding subtopics. We allocate for extracting, Changda is responsible for 1-35, Sydney is reponsible for 36-69, Catherine odd studies, and Sam even studyies After we finished out part, we compare and conclude each of them into our final extraction to prepare for the next step of summarizing and reviewing.<\/p> <p><strong>Data extraction template link:<\/strong><\/p> <p>1-35:https:\/\/docs.google.com\/spreadsheets\/d\/1dmjwXb4HLyvpfUUZywa7am7V2aKzJbMcyEQSukTinsg\/edit?usp=sharing<\/p> <p>36-69\uff1ahttps:\/\/docs.google.com\/spreadsheets\/d\/1ZH4K2hzg9c5WXQHB95zIHeHFIp6cPviqGr89F73DKlU\/edit?usp=sharing<\/p> <p>Odd studies: https:\/\/docs.google.com\/spreadsheets\/d\/1QcBIreRME7fBgll861OODxGawknsswH9EIXd4c0AnFA\/edit?usp=sharing<\/p> <p>Even studies: https:\/\/docs.google.com\/spreadsheets\/d\/1W7AGIvFBVuOaBzlWEwXGdXNMYHH14X3dbDm6qOQqFyE\/edit?usp=sharing<\/p> <h3 id=\"study-characteristics\">Study Characteristics<\/h3> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"><\/a>study_metadata <\/span><span id=\"__span-0-2\"><a id=\"__codelineno-0-2\" name=\"__codelineno-0-2\" href=\"#__codelineno-0-2\"><\/a>\u251c\u2500\u2500 basic_info <\/span><span id=\"__span-0-3\"><a id=\"__codelineno-0-3\" name=\"__codelineno-0-3\" href=\"#__codelineno-0-3\"><\/a>\u2502 \u251c\u2500\u2500 Study ID (first author last name_year of publication <\/span><span id=\"__span-0-4\"><a id=\"__codelineno-0-4\" name=\"__codelineno-0-4\" href=\"#__codelineno-0-4\"><\/a>\u2502 \u251c\u2500\u2500 Full study title <\/span><span id=\"__span-0-5\"><a id=\"__codelineno-0-5\" name=\"__codelineno-0-5\" href=\"#__codelineno-0-5\"><\/a>\u2502 \u251c\u2500\u2500 List of authors <\/span><span id=\"__span-0-6\"><a id=\"__codelineno-0-6\" name=\"__codelineno-0-6\" href=\"#__codelineno-0-6\"><\/a>\u2502 \u251c\u2500\u2500 Year the study was published <\/span><span id=\"__span-0-7\"><a id=\"__codelineno-0-7\" name=\"__codelineno-0-7\" href=\"#__codelineno-0-7\"><\/a>\u2502 \u251c\u2500\u2500 ournal or source of publication <\/span><span id=\"__span-0-8\"><a id=\"__codelineno-0-8\" name=\"__codelineno-0-8\" href=\"#__codelineno-0-8\"><\/a>\u2502 <\/span><span id=\"__span-0-9\"><a id=\"__codelineno-0-9\" name=\"__codelineno-0-9\" href=\"#__codelineno-0-9\"><\/a>\u251c\u2500\u2500 study_design <\/span><span id=\"__span-0-10\"><a id=\"__codelineno-0-10\" name=\"__codelineno-0-10\" href=\"#__codelineno-0-10\"><\/a>\u2502 \u251c\u2500\u2500 options <\/span><span id=\"__span-0-11\"><a id=\"__codelineno-0-11\" name=\"__codelineno-0-11\" href=\"#__codelineno-0-11\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 analytical_cross_sectional <\/span><span id=\"__span-0-12\"><a id=\"__codelineno-0-12\" name=\"__codelineno-0-12\" href=\"#__codelineno-0-12\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 case_report <\/span><span id=\"__span-0-13\"><a id=\"__codelineno-0-13\" name=\"__codelineno-0-13\" href=\"#__codelineno-0-13\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 case_series <\/span><span id=\"__span-0-14\"><a id=\"__codelineno-0-14\" name=\"__codelineno-0-14\" href=\"#__codelineno-0-14\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 case_control <\/span><span id=\"__span-0-15\"><a id=\"__codelineno-0-15\" name=\"__codelineno-0-15\" href=\"#__codelineno-0-15\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 cohort_observational <\/span><span id=\"__span-0-16\"><a id=\"__codelineno-0-16\" name=\"__codelineno-0-16\" href=\"#__codelineno-0-16\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 prevalence <\/span><span id=\"__span-0-17\"><a id=\"__codelineno-0-17\" name=\"__codelineno-0-17\" href=\"#__codelineno-0-17\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 qualitative <\/span><span id=\"__span-0-18\"><a id=\"__codelineno-0-18\" name=\"__codelineno-0-18\" href=\"#__codelineno-0-18\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 quasi_experimental <\/span><span id=\"__span-0-19\"><a id=\"__codelineno-0-19\" name=\"__codelineno-0-19\" href=\"#__codelineno-0-19\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 randomized_controlled_trial <\/span><span id=\"__span-0-20\"><a id=\"__codelineno-0-20\" name=\"__codelineno-0-20\" href=\"#__codelineno-0-20\"><\/a>\u2502 \u2502 \u2514\u2500\u2500 longitudinal <\/span><span id=\"__span-0-21\"><a id=\"__codelineno-0-21\" name=\"__codelineno-0-21\" href=\"#__codelineno-0-21\"><\/a>\u2502 <\/span><span id=\"__span-0-22\"><a id=\"__codelineno-0-22\" name=\"__codelineno-0-22\" href=\"#__codelineno-0-22\"><\/a>\u251c\u2500\u2500 participant_info <\/span><span id=\"__span-0-23\"><a id=\"__codelineno-0-23\" name=\"__codelineno-0-23\" href=\"#__codelineno-0-23\"><\/a>\u2502 \u251c\u2500\u2500 age_range(16-60, Age eligibility criteria) <\/span><span id=\"__span-0-24\"><a id=\"__codelineno-0-24\" name=\"__codelineno-0-24\" href=\"#__codelineno-0-24\"><\/a>\u2502 \u251c\u2500\u2500 Mean (SD) of age <\/span><span id=\"__span-0-25\"><a id=\"__codelineno-0-25\" name=\"__codelineno-0-25\" href=\"#__codelineno-0-25\"><\/a>\u2502 \u251c\u2500\u2500 Number and percentage male\/female <\/span><span id=\"__span-0-26\"><a id=\"__codelineno-0-26\" name=\"__codelineno-0-26\" href=\"#__codelineno-0-26\"><\/a>\u2502 <\/span><span id=\"__span-0-27\"><a id=\"__codelineno-0-27\" name=\"__codelineno-0-27\" href=\"#__codelineno-0-27\"><\/a>\u251c\u2500\u2500 setting_and_context <\/span><span id=\"__span-0-28\"><a id=\"__codelineno-0-28\" name=\"__codelineno-0-28\" href=\"#__codelineno-0-28\"><\/a>\u2502 \u251c\u2500\u2500 Study population and setting <\/span><span id=\"__span-0-29\"><a id=\"__codelineno-0-29\" name=\"__codelineno-0-29\" href=\"#__codelineno-0-29\"><\/a>\u2502 \u251c\u2500\u2500 geographic_location(Country, city, region) <\/span><span id=\"__span-0-30\"><a id=\"__codelineno-0-30\" name=\"__codelineno-0-30\" href=\"#__codelineno-0-30\"><\/a>\u2502 \u2514\u2500\u2500 Socioeconomic_factors <\/span><\/code><\/pre><\/div> <p><img alt=\"Research_type\" src=\"Figure\/research_type.png\" \/> <img alt=\"Population_type\" src=\"Figure\/Population_types.png\" \/> A Brief Summary: 40 papers use cross sectional studies, most papers are from Asia, Europe, and North America, as well as virtual enviroment, for participant, most are university students and public.<\/p> <h3 id=\"exposures\">Exposures<\/h3> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-1-1\"><a id=\"__codelineno-1-1\" name=\"__codelineno-1-1\" href=\"#__codelineno-1-1\"><\/a>Exposures_metadata <\/span><span id=\"__span-1-2\"><a id=\"__codelineno-1-2\" name=\"__codelineno-1-2\" href=\"#__codelineno-1-2\"><\/a>\u251c\u2500\u2500 Exposure Type <\/span><span id=\"__span-1-3\"><a id=\"__codelineno-1-3\" name=\"__codelineno-1-3\" href=\"#__codelineno-1-3\"><\/a>\u2502 \u251c\u2500\u2500 Green &amp; Blue Spaces <\/span><span id=\"__span-1-4\"><a id=\"__codelineno-1-4\" name=\"__codelineno-1-4\" href=\"#__codelineno-1-4\"><\/a>\u2502 \u251c\u2500\u2500 Public Spaces <\/span><span id=\"__span-1-5\"><a id=\"__codelineno-1-5\" name=\"__codelineno-1-5\" href=\"#__codelineno-1-5\"><\/a>\u2502 \u251c\u2500\u2500 Transportation and Mobility <\/span><span id=\"__span-1-6\"><a id=\"__codelineno-1-6\" name=\"__codelineno-1-6\" href=\"#__codelineno-1-6\"><\/a>\u2502 \u251c\u2500\u2500 Programmatic Function <\/span><span id=\"__span-1-7\"><a id=\"__codelineno-1-7\" name=\"__codelineno-1-7\" href=\"#__codelineno-1-7\"><\/a>\u2502 \u251c\u2500\u2500 Other <\/span><span id=\"__span-1-8\"><a id=\"__codelineno-1-8\" name=\"__codelineno-1-8\" href=\"#__codelineno-1-8\"><\/a>\u2502 <\/span><span id=\"__span-1-9\"><a id=\"__codelineno-1-9\" name=\"__codelineno-1-9\" href=\"#__codelineno-1-9\"><\/a>\u251c\u2500\u2500 Categories <\/span><span id=\"__span-1-10\"><a id=\"__codelineno-1-10\" name=\"__codelineno-1-10\" href=\"#__codelineno-1-10\"><\/a>\u251c\u2500\u2500 Mesures <\/span><span id=\"__span-1-11\"><a id=\"__codelineno-1-11\" name=\"__codelineno-1-11\" href=\"#__codelineno-1-11\"><\/a>\u251c\u2500\u2500 Metrics <\/span><\/code><\/pre><\/div> <p><img alt=\"Exposure_type\" src=\"Figure\/Exposure_type.png\" \/> <img alt=\"Meaure_metrics\" src=\"Figure\/Green_blue_categories_measure_metrics.jpg\" \/> <\/p> <p>As for urban built environment, we divided into four categories: urban &amp; blue space, public space, transportation and program function. There are 40 papers discussing green &amp;blue space. Therefore, in this category, Park\/Nature Reserve are mainly talking aboot, and most of them are meaured by survey, image(view analysis), and GIS method, in this case, the metric of vegetation percentage\/density are used most among all the papers.<\/p> <h3 id=\"outcomes\">Outcomes<\/h3> <p><div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-2-1\"><a id=\"__codelineno-2-1\" name=\"__codelineno-2-1\" href=\"#__codelineno-2-1\"><\/a>Mental health or Well-Being <\/span><span id=\"__span-2-2\"><a id=\"__codelineno-2-2\" name=\"__codelineno-2-2\" href=\"#__codelineno-2-2\"><\/a>\u251c\u2500\u2500 Subcategories <\/span><span id=\"__span-2-3\"><a id=\"__codelineno-2-3\" name=\"__codelineno-2-3\" href=\"#__codelineno-2-3\"><\/a>\u2502 \u251c\u2500\u2500 Mental Health <\/span><span id=\"__span-2-4\"><a id=\"__codelineno-2-4\" name=\"__codelineno-2-4\" href=\"#__codelineno-2-4\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Depression <\/span><span id=\"__span-2-5\"><a id=\"__codelineno-2-5\" name=\"__codelineno-2-5\" href=\"#__codelineno-2-5\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Anxiety <\/span><span id=\"__span-2-6\"><a id=\"__codelineno-2-6\" name=\"__codelineno-2-6\" href=\"#__codelineno-2-6\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 PTSD <\/span><span id=\"__span-2-7\"><a id=\"__codelineno-2-7\" name=\"__codelineno-2-7\" href=\"#__codelineno-2-7\"><\/a>\u2502 \u251c\u2500\u2500 Well-Being <\/span><span id=\"__span-2-8\"><a id=\"__codelineno-2-8\" name=\"__codelineno-2-8\" href=\"#__codelineno-2-8\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Psychological <\/span><span id=\"__span-2-9\"><a id=\"__codelineno-2-9\" name=\"__codelineno-2-9\" href=\"#__codelineno-2-9\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Social <\/span><span id=\"__span-2-10\"><a id=\"__codelineno-2-10\" name=\"__codelineno-2-10\" href=\"#__codelineno-2-10\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Physical <\/span><span id=\"__span-2-11\"><a id=\"__codelineno-2-11\" name=\"__codelineno-2-11\" href=\"#__codelineno-2-11\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Life satisfaction <\/span><span id=\"__span-2-12\"><a id=\"__codelineno-2-12\" name=\"__codelineno-2-12\" href=\"#__codelineno-2-12\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Other <\/span><span id=\"__span-2-13\"><a id=\"__codelineno-2-13\" name=\"__codelineno-2-13\" href=\"#__codelineno-2-13\"><\/a>\u2502 <\/span><span id=\"__span-2-14\"><a id=\"__codelineno-2-14\" name=\"__codelineno-2-14\" href=\"#__codelineno-2-14\"><\/a>\u251c\u2500\u2500 Measures <\/span><span id=\"__span-2-15\"><a id=\"__codelineno-2-15\" name=\"__codelineno-2-15\" href=\"#__codelineno-2-15\"><\/a>\u2502 \u251c\u2500\u2500 Mental Health <\/span><span id=\"__span-2-16\"><a id=\"__codelineno-2-16\" name=\"__codelineno-2-16\" href=\"#__codelineno-2-16\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Diagnoses <\/span><span id=\"__span-2-17\"><a id=\"__codelineno-2-17\" name=\"__codelineno-2-17\" href=\"#__codelineno-2-17\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Symptoms <\/span><span id=\"__span-2-18\"><a id=\"__codelineno-2-18\" name=\"__codelineno-2-18\" href=\"#__codelineno-2-18\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Others <\/span><span id=\"__span-2-19\"><a id=\"__codelineno-2-19\" name=\"__codelineno-2-19\" href=\"#__codelineno-2-19\"><\/a>\u2502 \u251c\u2500\u2500 Well-Being <\/span><span id=\"__span-2-20\"><a id=\"__codelineno-2-20\" name=\"__codelineno-2-20\" href=\"#__codelineno-2-20\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Interview <\/span><span id=\"__span-2-21\"><a id=\"__codelineno-2-21\" name=\"__codelineno-2-21\" href=\"#__codelineno-2-21\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Questionare <\/span><span id=\"__span-2-22\"><a id=\"__codelineno-2-22\" name=\"__codelineno-2-22\" href=\"#__codelineno-2-22\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Survey <\/span><span id=\"__span-2-23\"><a id=\"__codelineno-2-23\" name=\"__codelineno-2-23\" href=\"#__codelineno-2-23\"><\/a>\u2502 \u2502 \u251c\u2500\u2500 Other <\/span><span id=\"__span-2-24\"><a id=\"__codelineno-2-24\" name=\"__codelineno-2-24\" href=\"#__codelineno-2-24\"><\/a>\u2502 <\/span><span id=\"__span-2-25\"><a id=\"__codelineno-2-25\" name=\"__codelineno-2-25\" href=\"#__codelineno-2-25\"><\/a>\u251c\u2500\u2500 Specific Measures <\/span><\/code><\/pre><\/div> <img alt=\"Outcomes\" src=\"Figure\/outcomes.png\" \/> <\/p> <p>We begin by identifying whether each paper addresses mental health, well-being, or both. We then categorize them into specific subdomains: for mental health, the categories include depression, anxiety, and PTSD; for well-being, the categories cover psychological, social, physical well-being, and life satisfaction. Following this, we identify the instruments used to assess these outcomes\u2014such as questionnaires or surveys\u2014and specify the exact measurement tools applied. Among the reviewed studies, 37 focus exclusively on well-being, 16 exclusively on mental health, and 9 address both.<\/p> <h3 id=\"main-findings\">Main Findings<\/h3> <p><div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-3-1\"><a id=\"__codelineno-3-1\" name=\"__codelineno-3-1\" href=\"#__codelineno-3-1\"><\/a>Main Findings <\/span><span id=\"__span-3-2\"><a id=\"__codelineno-3-2\" name=\"__codelineno-3-2\" href=\"#__codelineno-3-2\"><\/a>\u251c\u2500\u2500 Aims\/Research Questions <\/span><span id=\"__span-3-3\"><a id=\"__codelineno-3-3\" name=\"__codelineno-3-3\" href=\"#__codelineno-3-3\"><\/a>\u251c\u2500\u2500 Main Findings <\/span><span id=\"__span-3-4\"><a id=\"__codelineno-3-4\" name=\"__codelineno-3-4\" href=\"#__codelineno-3-4\"><\/a>\u251c\u2500\u2500 Statistical methods used <\/span><span id=\"__span-3-5\"><a id=\"__codelineno-3-5\" name=\"__codelineno-3-5\" href=\"#__codelineno-3-5\"><\/a>\u251c\u2500\u2500 Effect Size (if reported) <\/span><span id=\"__span-3-6\"><a id=\"__codelineno-3-6\" name=\"__codelineno-3-6\" href=\"#__codelineno-3-6\"><\/a>\u251c\u2500\u2500 Strengths <\/span><span id=\"__span-3-7\"><a id=\"__codelineno-3-7\" name=\"__codelineno-3-7\" href=\"#__codelineno-3-7\"><\/a>\u251c\u2500\u2500 Limitations <\/span><span id=\"__span-3-8\"><a id=\"__codelineno-3-8\" name=\"__codelineno-3-8\" href=\"#__codelineno-3-8\"><\/a>\u251c\u2500\u2500 Policy Implications <\/span><\/code><\/pre><\/div> <img alt=\"statistic_method\" src=\"Figure\/statistic_method.png\" \/> <\/p> <p>Finally, we extract the \u201cmain findings\u201d section from each study, focusing on the research aim, statistical methods, effect sizes, strengths, limitations, and policy implications. Given the complexity of statistical findings, a detailed summary will be provided at a later stage. For now, we visualized the types of statistical methods used across the 69 studies. Among these, Structural Equation Modeling (SEM) emerged as one of the most common techniques.<\/p> <p>## Text Mining ## ### PDF Inititial Collecting and Cleaning ###<\/p> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-4-1\"><a id=\"__codelineno-4-1\" name=\"__codelineno-4-1\" href=\"#__codelineno-4-1\"><\/a>mistral_workflow <\/span><span id=\"__span-4-2\"><a id=\"__codelineno-4-2\" name=\"__codelineno-4-2\" href=\"#__codelineno-4-2\"><\/a>\u251c\u2500\u2500 call_mistral_api # Step 1: Call the Mistral API <\/span><span id=\"__span-4-3\"><a id=\"__codelineno-4-3\" name=\"__codelineno-4-3\" href=\"#__codelineno-4-3\"><\/a>\u251c\u2500\u2500 generate_json_output # Step 2: Generate JSON output(Using OCR Scanning) <\/span><span id=\"__span-4-4\"><a id=\"__codelineno-4-4\" name=\"__codelineno-4-4\" href=\"#__codelineno-4-4\"><\/a>\u2502 \u2514\u2500\u2500 table_characteristic # If JSON is tabular, it&#39;s convenient to clean <\/span><span id=\"__span-4-5\"><a id=\"__codelineno-4-5\" name=\"__codelineno-4-5\" href=\"#__codelineno-4-5\"><\/a>\u251c\u2500\u2500 reindex_json_sections # Step 3: Re-index JSON sections <\/span><span id=\"__span-4-6\"><a id=\"__codelineno-4-6\" name=\"__codelineno-4-6\" href=\"#__codelineno-4-6\"><\/a>\u251c\u2500\u2500 remove_unwanted_sections # Step 4: Remove unnecessary sections <\/span><span id=\"__span-4-7\"><a id=\"__codelineno-4-7\" name=\"__codelineno-4-7\" href=\"#__codelineno-4-7\"><\/a>\u2514\u2500\u2500 Initial Cleanin Details # Step 5: Initial Cleanin Details <\/span><\/code><\/pre><\/div> <h4 id=\"pdf-initial-cleaning-results-paper-json-after-initial-cleaning\">PDF Initial Cleaning Results: \ud83d\udcc1 <a href=\".\/paper%20json%20after%20initial%20cleaning\/\"><code>paper json after initial cleaning<\/code><\/a><\/h4> <h3 id=\"using-nltk-filtering-wanted-and-unwanted-tokens\">Using NLTK Filtering wanted and unwanted tokens<\/h3> <p><strong>FLow Chart<\/strong><\/p> <pre class=\"mermaid\"><code>flowchart TD A[Tokenize and preprocess text: lowercase, clean symbols url,etc, keep collocations] B[Filter unnecessary symbols: remove degree, ampersand, percent, hash, at, exclam] C[Count word frequencies and delete common content] D[Remove text in parentheses] E[Ignore numbered lists like 1-dot item, 2-dot item] F[Handle compound words: keep phrases like machine learning together] A --&gt; B --&gt; C --&gt; D --&gt; E --&gt; F<\/code><\/pre> <p><strong>Code<\/strong> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-5-1\"><a id=\"__codelineno-5-1\" name=\"__codelineno-5-1\" href=\"#__codelineno-5-1\"><\/a>import nltk <\/span><span id=\"__span-5-2\"><a id=\"__codelineno-5-2\" name=\"__codelineno-5-2\" href=\"#__codelineno-5-2\"><\/a>from nltk.corpus import names, stopwords <\/span><span id=\"__span-5-3\"><a id=\"__codelineno-5-3\" name=\"__codelineno-5-3\" href=\"#__codelineno-5-3\"><\/a>from nltk.tokenize import word_tokenize <\/span><span id=\"__span-5-4\"><a id=\"__codelineno-5-4\" name=\"__codelineno-5-4\" href=\"#__codelineno-5-4\"><\/a>import re <\/span><span id=\"__span-5-5\"><a id=\"__codelineno-5-5\" name=\"__codelineno-5-5\" href=\"#__codelineno-5-5\"><\/a> <\/span><span id=\"__span-5-6\"><a id=\"__codelineno-5-6\" name=\"__codelineno-5-6\" href=\"#__codelineno-5-6\"><\/a># Download required resources <\/span><span id=\"__span-5-7\"><a id=\"__codelineno-5-7\" name=\"__codelineno-5-7\" href=\"#__codelineno-5-7\"><\/a>nltk.download(&quot;punkt&quot;) <\/span><span id=\"__span-5-8\"><a id=\"__codelineno-5-8\" name=\"__codelineno-5-8\" href=\"#__codelineno-5-8\"><\/a>nltk.download(&quot;averaged_perceptron_tagger&quot;) <\/span><span id=\"__span-5-9\"><a id=\"__codelineno-5-9\" name=\"__codelineno-5-9\" href=\"#__codelineno-5-9\"><\/a>nltk.download(&quot;names&quot;) <\/span><span id=\"__span-5-10\"><a id=\"__codelineno-5-10\" name=\"__codelineno-5-10\" href=\"#__codelineno-5-10\"><\/a>nltk.download(&quot;stopwords&quot;) <\/span><span id=\"__span-5-11\"><a id=\"__codelineno-5-11\" name=\"__codelineno-5-11\" href=\"#__codelineno-5-11\"><\/a> <\/span><span id=\"__span-5-12\"><a id=\"__codelineno-5-12\" name=\"__codelineno-5-12\" href=\"#__codelineno-5-12\"><\/a># Load resources <\/span><span id=\"__span-5-13\"><a id=\"__codelineno-5-13\" name=\"__codelineno-5-13\" href=\"#__codelineno-5-13\"><\/a>all_names = set(names.words()) <\/span><span id=\"__span-5-14\"><a id=\"__codelineno-5-14\" name=\"__codelineno-5-14\" href=\"#__codelineno-5-14\"><\/a>custom_stopwords = set(stopwords.words(&quot;english&quot;)) <\/span><span id=\"__span-5-15\"><a id=\"__codelineno-5-15\" name=\"__codelineno-5-15\" href=\"#__codelineno-5-15\"><\/a> <\/span><span id=\"__span-5-16\"><a id=\"__codelineno-5-16\" name=\"__codelineno-5-16\" href=\"#__codelineno-5-16\"><\/a># Define custom collocations <\/span><span id=\"__span-5-17\"><a id=\"__codelineno-5-17\" name=\"__codelineno-5-17\" href=\"#__codelineno-5-17\"><\/a>custom_collocations = { <\/span><span id=\"__span-5-18\"><a id=\"__codelineno-5-18\" name=\"__codelineno-5-18\" href=\"#__codelineno-5-18\"><\/a> &quot;machine learning&quot;, &quot;deep learning&quot;, &quot;artificial intelligence&quot;, &quot;neural network&quot;, <\/span><span id=\"__span-5-19\"><a id=\"__codelineno-5-19\" name=\"__codelineno-5-19\" href=\"#__codelineno-5-19\"><\/a> &quot;natural language processing&quot;, &quot;computer vision&quot;, &quot;data science&quot;, &quot;big data&quot;, <\/span><span id=\"__span-5-20\"><a id=\"__codelineno-5-20\" name=\"__codelineno-5-20\" href=\"#__codelineno-5-20\"><\/a> &quot;number theory&quot;, &quot;complex analysis&quot;, &quot;linear algebra&quot;, &quot;gradient descent&quot;, <\/span><span id=\"__span-5-21\"><a id=\"__codelineno-5-21\" name=\"__codelineno-5-21\" href=\"#__codelineno-5-21\"><\/a> &quot;support vector machine&quot;, &quot;random forest&quot;, &quot;decision tree&quot;, &quot;reinforcement learning&quot;, <\/span><span id=\"__span-5-22\"><a id=\"__codelineno-5-22\" name=\"__codelineno-5-22\" href=\"#__codelineno-5-22\"><\/a> &quot;urban planning&quot;, &quot;photo simulation&quot;, &quot;green spaces&quot;, &quot;climate change&quot;, <\/span><span id=\"__span-5-23\"><a id=\"__codelineno-5-23\" name=\"__codelineno-5-23\" href=\"#__codelineno-5-23\"><\/a> &quot;pedestrian streets&quot;, &quot;traffic congestion&quot;, &quot;sustainability policies&quot; <\/span><span id=\"__span-5-24\"><a id=\"__codelineno-5-24\" name=\"__codelineno-5-24\" href=\"#__codelineno-5-24\"><\/a>} <\/span><span id=\"__span-5-25\"><a id=\"__codelineno-5-25\" name=\"__codelineno-5-25\" href=\"#__codelineno-5-25\"><\/a> <\/span><span id=\"__span-5-26\"><a id=\"__codelineno-5-26\" name=\"__codelineno-5-26\" href=\"#__codelineno-5-26\"><\/a># Text cleaning and tokenization <\/span><span id=\"__span-5-27\"><a id=\"__codelineno-5-27\" name=\"__codelineno-5-27\" href=\"#__codelineno-5-27\"><\/a>def clean_and_tokenize(text): <\/span><span id=\"__span-5-28\"><a id=\"__codelineno-5-28\" name=\"__codelineno-5-28\" href=\"#__codelineno-5-28\"><\/a> text = text.lower() <\/span><span id=\"__span-5-29\"><a id=\"__codelineno-5-29\" name=\"__codelineno-5-29\" href=\"#__codelineno-5-29\"><\/a> text = re.sub(r&quot;\\bwww\\.|\\S+\\.\\w{2,3}\\b&quot;, &quot; &quot;, text) <\/span><span id=\"__span-5-30\"><a id=\"__codelineno-5-30\" name=\"__codelineno-5-30\" href=\"#__codelineno-5-30\"><\/a> text = re.sub(r&quot;\\b(et|et\\s+al|et\\sal)\\b&quot;, &quot; &quot;, text) <\/span><span id=\"__span-5-31\"><a id=\"__codelineno-5-31\" name=\"__codelineno-5-31\" href=\"#__codelineno-5-31\"><\/a> text = re.sub(r&quot;\\b\\d+(st|nd|rd|th)\\b&quot;, &quot; &quot;, text) <\/span><span id=\"__span-5-32\"><a id=\"__codelineno-5-32\" name=\"__codelineno-5-32\" href=\"#__codelineno-5-32\"><\/a> text = re.sub(r&quot;[^a-z\\s]&quot;, &quot; &quot;, text) <\/span><span id=\"__span-5-33\"><a id=\"__codelineno-5-33\" name=\"__codelineno-5-33\" href=\"#__codelineno-5-33\"><\/a> text = re.sub(r&quot;\\b[a-z]{1,2}\\b&quot;, &quot; &quot;, text) <\/span><span id=\"__span-5-34\"><a id=\"__codelineno-5-34\" name=\"__codelineno-5-34\" href=\"#__codelineno-5-34\"><\/a> return word_tokenize(text) <\/span><\/code><\/pre><\/div><\/p> <h3 id=\"bigrams-and-colocations-compound-words-and-solutions-to-getting-them\">Bigrams and Colocations: Compound words and solutions to getting them<\/h3> <p><strong>Code<\/strong> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-6-1\"><a id=\"__codelineno-6-1\" name=\"__codelineno-6-1\" href=\"#__codelineno-6-1\"><\/a># Define a threshold for frequent bigrams <\/span><span id=\"__span-6-2\"><a id=\"__codelineno-6-2\" name=\"__codelineno-6-2\" href=\"#__codelineno-6-2\"><\/a>frequent_bigrams = { <\/span><span id=\"__span-6-3\"><a id=\"__codelineno-6-3\" name=\"__codelineno-6-3\" href=\"#__codelineno-6-3\"><\/a> &quot;_&quot;.join(bg) for bg, freq in bigram_freq.items() <\/span><span id=\"__span-6-4\"><a id=\"__codelineno-6-4\" name=\"__codelineno-6-4\" href=\"#__codelineno-6-4\"><\/a> if freq &gt; 5 and is_valid_bigram(bg) <\/span><span id=\"__span-6-5\"><a id=\"__codelineno-6-5\" name=\"__codelineno-6-5\" href=\"#__codelineno-6-5\"><\/a>} <\/span><span id=\"__span-6-6\"><a id=\"__codelineno-6-6\" name=\"__codelineno-6-6\" href=\"#__codelineno-6-6\"><\/a> <\/span><span id=\"__span-6-7\"><a id=\"__codelineno-6-7\" name=\"__codelineno-6-7\" href=\"#__codelineno-6-7\"><\/a># Merge detected bigrams + predefined collocations <\/span><span id=\"__span-6-8\"><a id=\"__codelineno-6-8\" name=\"__codelineno-6-8\" href=\"#__codelineno-6-8\"><\/a>all_collocations = frequent_bigrams.union(custom_collocations) <\/span><span id=\"__span-6-9\"><a id=\"__codelineno-6-9\" name=\"__codelineno-6-9\" href=\"#__codelineno-6-9\"><\/a> <\/span><span id=\"__span-6-10\"><a id=\"__codelineno-6-10\" name=\"__codelineno-6-10\" href=\"#__codelineno-6-10\"><\/a># Reconstruct tokens with collocations <\/span><span id=\"__span-6-11\"><a id=\"__codelineno-6-11\" name=\"__codelineno-6-11\" href=\"#__codelineno-6-11\"><\/a>i = 0 <\/span><span id=\"__span-6-12\"><a id=\"__codelineno-6-12\" name=\"__codelineno-6-12\" href=\"#__codelineno-6-12\"><\/a>merged_tokens = [] <\/span><span id=\"__span-6-13\"><a id=\"__codelineno-6-13\" name=\"__codelineno-6-13\" href=\"#__codelineno-6-13\"><\/a> <\/span><span id=\"__span-6-14\"><a id=\"__codelineno-6-14\" name=\"__codelineno-6-14\" href=\"#__codelineno-6-14\"><\/a>while i &lt; len(tokens) - 1: <\/span><span id=\"__span-6-15\"><a id=\"__codelineno-6-15\" name=\"__codelineno-6-15\" href=\"#__codelineno-6-15\"><\/a> bigram = f&quot;{tokens[i]}_{tokens[i+1]}&quot; <\/span><span id=\"__span-6-16\"><a id=\"__codelineno-6-16\" name=\"__codelineno-6-16\" href=\"#__codelineno-6-16\"><\/a> if bigram in all_collocations: <\/span><span id=\"__span-6-17\"><a id=\"__codelineno-6-17\" name=\"__codelineno-6-17\" href=\"#__codelineno-6-17\"><\/a> merged_tokens.append(bigram) <\/span><span id=\"__span-6-18\"><a id=\"__codelineno-6-18\" name=\"__codelineno-6-18\" href=\"#__codelineno-6-18\"><\/a> i += 2 <\/span><span id=\"__span-6-19\"><a id=\"__codelineno-6-19\" name=\"__codelineno-6-19\" href=\"#__codelineno-6-19\"><\/a> else: <\/span><span id=\"__span-6-20\"><a id=\"__codelineno-6-20\" name=\"__codelineno-6-20\" href=\"#__codelineno-6-20\"><\/a> merged_tokens.append(tokens[i]) <\/span><span id=\"__span-6-21\"><a id=\"__codelineno-6-21\" name=\"__codelineno-6-21\" href=\"#__codelineno-6-21\"><\/a> i += 1 <\/span><span id=\"__span-6-22\"><a id=\"__codelineno-6-22\" name=\"__codelineno-6-22\" href=\"#__codelineno-6-22\"><\/a> <\/span><span id=\"__span-6-23\"><a id=\"__codelineno-6-23\" name=\"__codelineno-6-23\" href=\"#__codelineno-6-23\"><\/a># Append the last token if it wasn&#39;t part of a bigram <\/span><span id=\"__span-6-24\"><a id=\"__codelineno-6-24\" name=\"__codelineno-6-24\" href=\"#__codelineno-6-24\"><\/a>if i == len(tokens) - 1: <\/span><span id=\"__span-6-25\"><a id=\"__codelineno-6-25\" name=\"__codelineno-6-25\" href=\"#__codelineno-6-25\"><\/a> merged_tokens.append(tokens[i]) <\/span><\/code><\/pre><\/div> Bigrams: pairs of consecutive words. If the bigrams are used often, chances are they are legitimate compound words. Therefore, we merge those with high frequencies. Essentially, we check the current iteration and its next element. If the frequency Ex: [\"Machine\", \"Learning\", \"is\", \"fun\" ], the output is : [\"Machine_Learning\", \"is\", \"fun\" ]!<\/p> <h3 id=\"convert-to-dictionary-token-count-file\">Convert to Dictionary {Token : Count} File<\/h3> <p>After we cleaning, we convert all the words we get into dictionary, also count the frequency of each word, Here are the top 20 word frequencies, and top 20 compound words frequencies.<\/p> <p><img alt=\"word_freq\" src=\"Figure\/word_freq.png\" \/> <img alt=\"Compound_words_freq\" src=\"Figure\/Compound_words_freq.png\" \/> <\/p> <h3 id=\"labeling-keys-with-respective-category\">Labeling Keys with Respective Category<\/h3> <p>We utilize pre-trained Hugging Face NLP model and manual labeling\u00a0to classify the words from the pdf cleaning into 4 category: - Urban Built Environment - Environment Factors - Mental Health and Well-Being - Measure<\/p> <p>Based on the relationship between each categories, we explore: - In neuroarchitecture, the association between different environmental factors and different urban built environments. - Which urban built environment or environment factors are popular in mental health and well-being and which one are less affected.<\/p> <h3 id=\"visualization\">Visualization<\/h3> <h4 id=\"method-flow-chart\">Method Flow Chart<\/h4> <p><img alt=\"v_method\" src=\"Figure\/Visualization_Method.png\" \/> <\/p> <p>After cleaning the PDFs, the resulting word dictionary is sorted in descending order of term frequency and saved as <a href=\"Visualization_input_data\/sorted_final_combined_dict.txt\">voc.txt<\/a>. This vocabulary file is then fed into a Word2Vec model to train the word embeddings, producing <a href=\"Visualization_input_data\/sorted_final_combined_dict.emb\">embedding_vec.emb<\/a>. The high\u2011dimensional embeddings are further reduced with PCA, UMAP, and t\u2011SNE, and the low\u2011dimensional coordinates are stored in <a href=\"Visualization_input_data\/sorted_final_combined_dict.json\">bookmark.json<\/a>.<\/p> <p>For visualization, we generates:<\/p> <ul> <li> <p>N\u2011gram similarity matrix heat map<\/p> <\/li> <li> <p>Correlation matrix heat map<\/p> <\/li> <li> <p>Hierarchical agglomerative clustering dendrogram<\/p> <\/li> <li> <p>Cross\u2011correlation matrix<\/p> <\/li> <li> <p>Distance\u2011threshold projection<\/p> <\/li> <li> <p>2D relation\u2011projection clusters using Louvain community detection.<\/p> <\/li> <\/ul> <h4 id=\"ngram-similarity-matrix-heat-map\">N\u2011gram similarity matrix heat map<\/h4> <p>1.First ,whwn we input <a href=\"Visualization_input_data\/sorted_final_combined_dict.emb\">embedding_vec.emb<\/a>\uff0cWe use N-gram Co\u2011occurrence Frequency, which is shown as below, in order to counts how many times each adjacent word pair appear. When frequency is greater than 5, both of two words will be the compound words(bigram), which are included in the row and column with other words we collected. (Check for missing compond words)<\/p> <div class=\"arithmatex\">\\[ \\text{freq}(W_a,W_b) \\;=\\ \\sum_{t=1}^{T-1} \\mathbf{1}\\bigl[w_t = W_a\\land\\ w_{t+1} = W_b\\bigr]&gt;5 \\]<\/div> <p>2.Second, using the embedding vectors of each word, we compute the cosine similarity between every row word and every column word to obtain the similarity scores. When a similarity score exceeds 0.05, the corresponding word pair is treated as related, and the score is recorded as the cell value and color intensity in the heat\u2011map; scores below the threshold are left blank.<\/p> <div class=\"arithmatex\">\\[ \\cos(\\mathbf v_{W_a}\\, \\mathbf v_{W_b}) = \\frac{\\mathbf v_{W_a}\\cdot \\mathbf v_{W_b}} {\\lVert \\mathbf v_{W_a}\\rVert\\lVert \\mathbf v_{W_b}\\rVert} \\&gt;0.05 \\]<\/div> <ol> <li>Finally, the resulting similarity matrix is rendered as a <a href=\"N-gram_similarity_matrix\/heatmap\">heat map<\/a>, (the relation between urban built environment and mental health or well-being shown below),and generate <a href=\"N-gram_similarity_matrix\/csv\">*.csv file<\/a>of each relationship<\/li> <\/ol> <p><img alt=\"N-gram\" src=\"N-gram_similarity_matrix\/heatmap\/mental_health_and_well_being-urban_built_environment_clusterd-01.png\" \/><\/p> <h4 id=\"hierarchical-agglomerative-clustering-and-corelation-matrix\">Hierarchical Agglomerative Clustering and Corelation Matrix<\/h4> <ol> <li>First, extract all nodes from the N\u2011gram similarity matrix heat map and write their 300\u2011dimensional word vectors to <a href=\"Hierarchical_Agglomerative_Clustering_and_Corelation_Matrix\/embedding_matrix.tsv\">embedding_matrix.tsv<\/a>, then read<a href=\"N-gram_similarity_matrix\/csv\">*.csv file<\/a>of each relationship retrieve the 300 D vector for every column word, and perform hierarchical clustering with Ward\u2019s method and Euclidean distance (minimizing within\u2011cluster variance). The resulting <a href=\"Hierarchical_Agglomerative_Clustering_and_Corelation_Matrix\/dendrogram_groups\">dendrogram groups<\/a> semantically similar words into clusters and automatically assigns a distinct colour to each branch for the legend.<\/li> <\/ol> <p>Euclidean distance\u00a0\u2013 input to Ward\u2019s algorithm\uff1a For any two 300\u2011dimensional word embeddings <span class=\"arithmatex\">\\(<span class=\"arithmatex\">\\(\\mathbf{x}_i\\)<\/span>\\)<\/span> and <span class=\"arithmatex\">\\(<span class=\"arithmatex\">\\(\\mathbf{x}_j\\)<\/span>\\)<\/span>,<\/p> <div class=\"arithmatex\">\\[ d(\\mathbf x_i,\\mathbf x_j) = \\lVert \\mathbf x_i - \\mathbf x_j \\rVert_{2} \\]<\/div> <p>Ward linkage cost<br \/> (extra within\u2011cluster sum\u2011of\u2011squares created by merging clusters\u00a0(A) and\u00a0(B))<\/p> <div class=\"arithmatex\">\\[ \\Delta(A,B) = \\frac{|A||B|}{|A|+|B|} \\bigl\\lVert \\mu_A - \\mu_B \\bigr\\rVert_2^{2} \\]<\/div> <p>where $${\\mu}_A $$ and analogously $${\\mu}_B $$ is the centroid of cluster\u00a0(A).<\/p> <p>2.Second, reorder the rows and columns according to the dendrogram\u2019s leaf order, then compute the column\u2011wise Pearson correlation coefficients and display them in a red scale <a href=\"Hierarchical_Agglomerative_Clustering_and_Corelation_Matrix\/Coreltaion_heatmap\">heat map<\/a>, exporting the reordered original matrix to a <a href=\"Hierarchical_Agglomerative_Clustering_and_Corelation_Matrix\/csv\">CSV file<\/a>.<\/p> <p>Pearson correlation coefficient (heat\u2011map cell value)<\/p> <p>For two column vectors <span class=\"arithmatex\">\\(<span class=\"arithmatex\">\\(X_i\\)<\/span>\\)<\/span> and <span class=\"arithmatex\">\\(<span class=\"arithmatex\">\\(X_j\\)<\/span>\\)<\/span>:<\/p> <div class=\"arithmatex\">\\[ r_{ij}= \\frac{\\displaystyle\\sum_{k=1}^{n}(X_{ik}-\\bar X_i)(X_{jk}-\\bar X_j)} {\\sqrt{\\displaystyle\\sum_{k=1}^{n}(X_{ik}-\\bar X_i)^2}\\ \\sqrt{\\displaystyle\\sum_{k=1}^{n}(X_{jk}-\\bar X_j)^2}} \\in[-1,1] \\]<\/div> <p>The script maps each <span class=\"arithmatex\">\\(<span class=\"arithmatex\">\\(r_{ij}\\)<\/span>\\)<\/span> onto a red colour scale in the range (0-1):<br \/> 0\u00a0= white (weak correlation), 1\u00a0= dark red (strong correlation).<\/p> <p>Take the correlation matrix map (urban_built_environment)as an example: <img alt=\"corelation\" src=\"Hierarchical_Agglomerative_Clustering_and_Corelation_Matrix\/urban_built_environment-mental_health_and_well_being-01.png\" \/><\/p> <h4 id=\"cross-correlation-matrix-heat-map\">Cross-correlation matrix heat map<\/h4> <p>For each cross\u2011category correlation <a href=\"Hierarchical_Agglomerative_Clustering_and_Corelation_Matrix\/csv\">CSV<\/a>, the script reorders the matrix according to the specified relationships, recomputes the cosine similarity, maps the resulting values to a red gradient scale from 0\u202f(white) to\u202f1\u202f(dark red), and produces a <a href=\"Cross_relation_matrix\">cross\u2011correlation heat map<\/a> that visualizes the strength of the relationships between different categories.<\/p> <p>Take the cross correlationship heatmap of mental health-urban built environment with dendrogram_groups as an example: <img alt=\"cross\" src=\"Cross_relation_matrix\/Cross.jpg\" \/><\/p> <h4 id=\"2d-relationprojection-clusters-and-distancethreshold-projection\">2D relation\u2011projection clusters and Distance\u2011threshold projection<\/h4> <p>1.<strong>Distance thresold<\/strong>:Write the 300\u2011dimensional word vectors to <a href=\"Hierarchical_Agglomerative_Clustering_and_Corelation_Matrix\/embedding_matrix.tsv\">embedding_matrix.tsv<\/a>, classify them into our predefined categories to create <a href=\"2d_projecton\/labels.tsv\">labels.tsv<\/a>, and use these two files\u2014together with <a href=\"Visualization_input_data\/sorted_final_combined_dict.json\">bookmark.json<\/a>\u2014as the input data for generating the 2\u2011D distance\u2011threshold projection.Each word is assigned a fixed position, a colour that reflects its predefined category, and a node size to its graph degree.\u202fNetworkX then builds a fully connected graph on these nodes, and Matplotlib draws a distance\u2011threshold projection: colored nodes are plotted at their 2D positions, the four main vocabularies are labelled, and overlapping labels are automatically nudged apart.\u202fThe resulting cluster map is exported as graph_embeddings_projection, providing a visual overview of how the classified word embeddings distribute across the reduced dimensional space.<\/p> <p><img alt=\"graph_embeddings_projection\" src=\"2d_projecton\/graph_embeddings_projection_with_edges.svg\" \/><\/p> <p>2.<strong>Louvain Cluster<\/strong>:The Louvain algorithm (community_louvain.best_partition) to network, iteratively maximizing the modularity Q and thus determining the number of communities k automatically. Each community is then assigned a distinct color, producing node_colors. Next,Fruchterman\u2011Reingold computes the final node coordinates, pulling nodes within the same community closer together. Only words from the four main relationships are labelled, and adjust text is used to prevent label overlap.<\/p> <p>The Louvain algorithm iteratively maximises the modularity\u202f$ Q $:<\/p> <div class=\"arithmatex\">\\[ Q =\\frac{1}{2m} \\sum_{i,j} \\Bigl(A_{ij} - \\frac{k_i k_j}{2m}\\Bigr)\\ \\delta(c_i, c_j) \\]<\/div> <p>where<br \/> <span class=\"arithmatex\">\\(A_{ij}\\)<\/span> is the adjacency\u2011matrix element,<br \/> <span class=\"arithmatex\">\\(k_i\\)<\/span> is the degree of node\u202f$ i $,<br \/> <span class=\"arithmatex\">\\(m\\)<\/span> is the total number of edges, and<br \/> <span class=\"arithmatex\">\\(\\delta(c_i,c_j)\\)<\/span> is\u00a01 if nodes\u202f<span class=\"arithmatex\">\\(i\\)<\/span> and\u202f<span class=\"arithmatex\">\\(j\\)<\/span> are in the same community and\u00a00 otherwise.<\/p> <p>Fruchterman\u2013Reingold spring layout Iterative force model:<\/p> <div class=\"arithmatex\">\\[ F_{\\text{rep}}(r)=\\frac{k^{2}}{r} \\qquad F_{\\text{att}}(r)=\\frac{r^{2}}{k} \\qquad k = c\\sqrt{\\frac{A}{n}} \\]<\/div> <p>'nx.spring_layout' embeds the graph in\u00a02\u2011D, iterating until the attractive force <span class=\"arithmatex\">\\(F_{\\text{att}}\\)<\/span> balances the repulsive force <span class=\"arithmatex\">\\(F_{\\text{rep}}\\)<\/span>, thereby keeping each community visually compact while forcing distinct communities apart.<\/p> <p><img alt=\"graph_embeddings_projection\" src=\"2d_projecton\/graph_embeddings_projection_with_communities.svg\" \/><\/p> <h3 id=\"repository-structure\">Repository Structure<\/h3> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-7-1\"><a id=\"__codelineno-7-1\" name=\"__codelineno-7-1\" href=\"#__codelineno-7-1\"><\/a>\ud83d\udce6 &lt;repo\u2011root&gt; <\/span><span id=\"__span-7-2\"><a id=\"__codelineno-7-2\" name=\"__codelineno-7-2\" href=\"#__codelineno-7-2\"><\/a>\u251c\u2500\u2500 paper_json_after_initial_cleaning\/ # JSON dictionaries produced after the initial PDF cleaning <\/span><span id=\"__span-7-3\"><a id=\"__codelineno-7-3\" name=\"__codelineno-7-3\" href=\"#__codelineno-7-3\"><\/a>\u2502 \u2514\u2500\u2500 *.json <\/span><span id=\"__span-7-4\"><a id=\"__codelineno-7-4\" name=\"__codelineno-7-4\" href=\"#__codelineno-7-4\"><\/a>\u2502 <\/span><span id=\"__span-7-5\"><a id=\"__codelineno-7-5\" name=\"__codelineno-7-5\" href=\"#__codelineno-7-5\"><\/a>\u251c\u2500\u2500 Visualization_input_data\/ # Visualization Input Data <\/span><span id=\"__span-7-6\"><a id=\"__codelineno-7-6\" name=\"__codelineno-7-6\" href=\"#__codelineno-7-6\"><\/a>\u2502 \u251c\u2500\u2500 sorted_final_combined_dict.emb # Transfer dictionary after cleaning to word\u2011embedding vectors <\/span><span id=\"__span-7-7\"><a id=\"__codelineno-7-7\" name=\"__codelineno-7-7\" href=\"#__codelineno-7-7\"><\/a>\u2502 \u251c\u2500\u2500 sorted_final_combined_dict.txt # dictionary after cleaning and sorting <\/span><span id=\"__span-7-8\"><a id=\"__codelineno-7-8\" name=\"__codelineno-7-8\" href=\"#__codelineno-7-8\"><\/a>\u251c \u251c\u2500\u2500 final_combined_dict.txt # dictionary after cleaning but unsorting <\/span><span id=\"__span-7-9\"><a id=\"__codelineno-7-9\" name=\"__codelineno-7-9\" href=\"#__codelineno-7-9\"><\/a>\u2502 \u2514\u2500\u2500 sorted_final_combined_dict.json # PCA\/UMAP\/t\u2011SNE low\u2011dimensional coordinates <\/span><span id=\"__span-7-10\"><a id=\"__codelineno-7-10\" name=\"__codelineno-7-10\" href=\"#__codelineno-7-10\"><\/a>\u2502 <\/span><span id=\"__span-7-11\"><a id=\"__codelineno-7-11\" name=\"__codelineno-7-11\" href=\"#__codelineno-7-11\"><\/a>\u251c\u2500\u2500 N\u2011gram_similarity_matrix\/ # Per\u2011topic similarity heat maps and raw tables <\/span><span id=\"__span-7-12\"><a id=\"__codelineno-7-12\" name=\"__codelineno-7-12\" href=\"#__codelineno-7-12\"><\/a>\u2502 \u251c\u2500\u2500 csv\/ # Original similarity matrices <\/span><span id=\"__span-7-13\"><a id=\"__codelineno-7-13\" name=\"__codelineno-7-13\" href=\"#__codelineno-7-13\"><\/a>\u2502 \u2502 \u2514\u2500\u2500 &lt;topic&gt;.csv <\/span><span id=\"__span-7-14\"><a id=\"__codelineno-7-14\" name=\"__codelineno-7-14\" href=\"#__codelineno-7-14\"><\/a>\u2502 \u2514\u2500\u2500 heatmap\/ # Corresponding heat\u2011map plots <\/span><span id=\"__span-7-15\"><a id=\"__codelineno-7-15\" name=\"__codelineno-7-15\" href=\"#__codelineno-7-15\"><\/a>\u2502 \u2514\u2500\u2500 &lt;topic&gt;_clusterd.svg <\/span><span id=\"__span-7-16\"><a id=\"__codelineno-7-16\" name=\"__codelineno-7-16\" href=\"#__codelineno-7-16\"><\/a>\u2502 <\/span><span id=\"__span-7-17\"><a id=\"__codelineno-7-17\" name=\"__codelineno-7-17\" href=\"#__codelineno-7-17\"><\/a>\u251c\u2500\u2500 Hierarchical_Agglomerative_Clustering_and_Correlation_Matrix\/ <\/span><span id=\"__span-7-18\"><a id=\"__codelineno-7-18\" name=\"__codelineno-7-18\" href=\"#__codelineno-7-18\"><\/a>\u2502 \u251c\u2500\u2500 dendrogram_groups\/ # Word\u2011vector dendrograms with colour legends <\/span><span id=\"__span-7-19\"><a id=\"__codelineno-7-19\" name=\"__codelineno-7-19\" href=\"#__codelineno-7-19\"><\/a>\u2502 \u2502 \u2514\u2500\u2500 &lt;topic&gt;_clusterd_with_legend.svg <\/span><span id=\"__span-7-20\"><a id=\"__codelineno-7-20\" name=\"__codelineno-7-20\" href=\"#__codelineno-7-20\"><\/a>\u2502 \u251c\u2500\u2500 csv\/ # Matrices reordered by cluster order <\/span><span id=\"__span-7-21\"><a id=\"__codelineno-7-21\" name=\"__codelineno-7-21\" href=\"#__codelineno-7-21\"><\/a>\u2502 \u2502 \u2514\u2500\u2500 &lt;topic&gt;.csv <\/span><span id=\"__span-7-22\"><a id=\"__codelineno-7-22\" name=\"__codelineno-7-22\" href=\"#__codelineno-7-22\"><\/a>\u2502 \u251c\u2500\u2500 embedding_matrix.tsv # 300\u2011dimensional word\u2011embedding matrix <\/span><span id=\"__span-7-23\"><a id=\"__codelineno-7-23\" name=\"__codelineno-7-23\" href=\"#__codelineno-7-23\"><\/a>\u2502 \u2514\u2500\u2500 Corelation_heatmap\/ # Pearson\u2011correlation heat maps <\/span><span id=\"__span-7-24\"><a id=\"__codelineno-7-24\" name=\"__codelineno-7-24\" href=\"#__codelineno-7-24\"><\/a>\u2502 \u2514\u2500\u2500 &lt;topic&gt;.svg <\/span><span id=\"__span-7-25\"><a id=\"__codelineno-7-25\" name=\"__codelineno-7-25\" href=\"#__codelineno-7-25\"><\/a>\u2502 <\/span><span id=\"__span-7-26\"><a id=\"__codelineno-7-26\" name=\"__codelineno-7-26\" href=\"#__codelineno-7-26\"><\/a>\u251c\u2500\u2500 Cross_relation_matrix\/ # Cross\u2011category similarity heat map <\/span><span id=\"__span-7-27\"><a id=\"__codelineno-7-27\" name=\"__codelineno-7-27\" href=\"#__codelineno-7-27\"><\/a>\u2502 \u2514\u2500\u2500 svg\/ # Cross\u2011relation heat\u2011map plots <\/span><span id=\"__span-7-28\"><a id=\"__codelineno-7-28\" name=\"__codelineno-7-28\" href=\"#__codelineno-7-28\"><\/a>\u2502 \u2514\u2500\u2500 &lt;A\u2011B&gt;_cross_rel.svg <\/span><span id=\"__span-7-29\"><a id=\"__codelineno-7-29\" name=\"__codelineno-7-29\" href=\"#__codelineno-7-29\"><\/a>\u2502 <\/span><span id=\"__span-7-30\"><a id=\"__codelineno-7-30\" name=\"__codelineno-7-30\" href=\"#__codelineno-7-30\"><\/a>\u251c\u2500\u2500 2d_projection\/ # 2\u2011D projection and distance\u2011threshold graphs <\/span><span id=\"__span-7-31\"><a id=\"__codelineno-7-31\" name=\"__codelineno-7-31\" href=\"#__codelineno-7-31\"><\/a>\u2502 \u251c\u2500\u2500 graph_embeddings_projection-with_edges.svg <\/span><span id=\"__span-7-32\"><a id=\"__codelineno-7-32\" name=\"__codelineno-7-32\" href=\"#__codelineno-7-32\"><\/a>\u2502 \u251c\u2500\u2500 labels.tsv # Mapping from word to predefined category <\/span><span id=\"__span-7-33\"><a id=\"__codelineno-7-33\" name=\"__codelineno-7-33\" href=\"#__codelineno-7-33\"><\/a>\u2502 \u2514\u2500\u2500 graph_embeddings_projection_with_communities.svg <\/span><span id=\"__span-7-34\"><a id=\"__codelineno-7-34\" name=\"__codelineno-7-34\" href=\"#__codelineno-7-34\"><\/a>\u2502 <\/span><span id=\"__span-7-35\"><a id=\"__codelineno-7-35\" name=\"__codelineno-7-35\" href=\"#__codelineno-7-35\"><\/a>\u251c\u2500\u2500 Figure\/ # Figures collected for readme <\/span><span id=\"__span-7-36\"><a id=\"__codelineno-7-36\" name=\"__codelineno-7-36\" href=\"#__codelineno-7-36\"><\/a>\u2502 <\/span><span id=\"__span-7-37\"><a id=\"__codelineno-7-37\" name=\"__codelineno-7-37\" href=\"#__codelineno-7-37\"><\/a>\u251c\u2500\u2500 code\/ # Main scripts <\/span><span id=\"__span-7-38\"><a id=\"__codelineno-7-38\" name=\"__codelineno-7-38\" href=\"#__codelineno-7-38\"><\/a>\u2502 \u251c\u2500\u2500 clean_pdf.py <\/span><span id=\"__span-7-39\"><a id=\"__codelineno-7-39\" name=\"__codelineno-7-39\" href=\"#__codelineno-7-39\"><\/a>\u2502 \u251c\u2500\u2500 build_ngram_matrix.py <\/span><span id=\"__span-7-40\"><a id=\"__codelineno-7-40\" name=\"__codelineno-7-40\" href=\"#__codelineno-7-40\"><\/a>\u2502 \u251c\u2500\u2500 cluster_and_heatmap.py <\/span><span id=\"__span-7-41\"><a id=\"__codelineno-7-41\" name=\"__codelineno-7-41\" href=\"#__codelineno-7-41\"><\/a>\u2502 \u2514\u2500\u2500 projection_and_louvain.py <\/span><span id=\"__span-7-42\"><a id=\"__codelineno-7-42\" name=\"__codelineno-7-42\" href=\"#__codelineno-7-42\"><\/a>\u2502 <\/span><span id=\"__span-7-43\"><a id=\"__codelineno-7-43\" name=\"__codelineno-7-43\" href=\"#__codelineno-7-43\"><\/a>\u2514\u2500\u2500 README.md # Project overview (method, formulas, sample plots) <\/span><\/code><\/pre><\/div> <h2 id=\"plan\">Plan<\/h2> <h3 id=\"paper-publish\">Paper Publish<\/h3> <ul> <li>Compare the data extraction template from each member and summarize into one data extraction template .<\/li> <li>Analyze the different categories in the data extraction and the literature summary, and conduct a review<\/li> <li>Draft it into the \u201cfinding\u201d part of the paper draft<\/li> <\/ul> <h3 id=\"text-mining\">Text Mining<\/h3> <ul> <li>Continue to manually filter the words in each category to ensure that they are concise and accurate.<\/li> <li>Analyze the visualization data and explore research questions<\/li> <li>Paper draft<\/li> <\/ul> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=Pwu-RV_udrI\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/Pwu-RV_udrI\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>Department<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Changda Ma<\/td> <td>Masters<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td><a href=\"https:\/\/github.com\/changdama\">changdama<\/a><\/td> <\/tr> <tr> <td>Catherine Wallis<\/td> <td>Senior<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td><a href=\"https:\/\/github.com\/cgwallis\">cgwallis<\/a><\/td> <\/tr> <tr> <td>Sydney Dai<\/td> <td>Freshman<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td><a href=\"https:\/\/github.com\/SydneyGT\">SydneyGT<\/a><\/td> <\/tr> <tr> <td>Ze Yu Jiang<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td><a href=\"https:\/\/github.com\/zeyujiang8800\">zeyujiang8800<\/a><\/td> <\/tr> <tr> <td>Sam Edwards<\/td> <td>RA<\/td> <td>Medical Research<\/td> <td>PSYCH<\/td> <td><a href=\"https:\/\/github.com\/sedwards42\">sedwards42<\/a><\/td> <\/tr> <tr> <td>Bailey Todtfeld<\/td> <td>RA<\/td> <td>Medical Research<\/td> <td>PSYCH<\/td> <td>N\/A<\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25sp-neuroarchitecture\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:48 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25sp-neuroarchitecture\/#__comments","guid":"https:\/\/vip-smur.github.io\/25sp-neuroarchitecture\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25sp-neuroarchitecture\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Sp-MPONC","description":"<h1 id=\"modeling-processes-of-neighborhood-change-mponc\">Modeling Processes of Neighborhood Change (MPONC)<\/h1> <h2 id=\"reference-paper\">Reference paper<\/h2> <div class=\"language-bibtex highlight\"><pre><span><\/span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"><\/a><span class=\"nc\">@misc<\/span><span class=\"p\">{<\/span><span class=\"nl\">mori2024modelingprocessesneighborhoodchange<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-2\"><a id=\"__codelineno-0-2\" name=\"__codelineno-0-2\" href=\"#__codelineno-0-2\"><\/a><span class=\"w\"> <\/span><span class=\"na\">title<\/span><span class=\"p\">=<\/span><span class=\"s\">{Modeling Processes of Neighborhood Change}<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span> <\/span><span id=\"__span-0-3\"><a id=\"__codelineno-0-3\" name=\"__codelineno-0-3\" href=\"#__codelineno-0-3\"><\/a><span class=\"w\"> <\/span><span class=\"na\">author<\/span><span class=\"p\">=<\/span><span class=\"s\">{J. Carlos Mart\u00ednez Mori and Zhanzhan Zhao}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-4\"><a id=\"__codelineno-0-4\" name=\"__codelineno-0-4\" href=\"#__codelineno-0-4\"><\/a><span class=\"w\"> <\/span><span class=\"na\">year<\/span><span class=\"p\">=<\/span><span class=\"s\">{2024}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-5\"><a id=\"__codelineno-0-5\" name=\"__codelineno-0-5\" href=\"#__codelineno-0-5\"><\/a><span class=\"w\"> <\/span><span class=\"na\">eprint<\/span><span class=\"p\">=<\/span><span class=\"s\">{2401.03307}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-6\"><a id=\"__codelineno-0-6\" name=\"__codelineno-0-6\" href=\"#__codelineno-0-6\"><\/a><span class=\"w\"> <\/span><span class=\"na\">archivePrefix<\/span><span class=\"p\">=<\/span><span class=\"s\">{arXiv}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-7\"><a id=\"__codelineno-0-7\" name=\"__codelineno-0-7\" href=\"#__codelineno-0-7\"><\/a><span class=\"w\"> <\/span><span class=\"na\">primaryClass<\/span><span class=\"p\">=<\/span><span class=\"s\">{cs.MA}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-8\"><a id=\"__codelineno-0-8\" name=\"__codelineno-0-8\" href=\"#__codelineno-0-8\"><\/a><span class=\"w\"> <\/span><span class=\"na\">url<\/span><span class=\"p\">=<\/span><span class=\"s\">{https:\/\/arxiv.org\/abs\/2401.03307}<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span> <\/span><span id=\"__span-0-9\"><a id=\"__codelineno-0-9\" name=\"__codelineno-0-9\" href=\"#__codelineno-0-9\"><\/a><span class=\"p\">}<\/span> <\/span><\/code><\/pre><\/div> <h2 id=\"setup\">Setup<\/h2> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-1-1\"><a id=\"__codelineno-1-1\" name=\"__codelineno-1-1\" href=\"#__codelineno-1-1\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>25Sp-MPONC\/modeling_processes_of_neighborhood_change_new <\/span><span id=\"__span-1-2\"><a id=\"__codelineno-1-2\" name=\"__codelineno-1-2\" href=\"#__codelineno-1-2\"><\/a>conda<span class=\"w\"> <\/span>create<span class=\"w\"> <\/span>-n<span class=\"w\"> <\/span>mponc<span class=\"w\"> <\/span><span class=\"nv\">python<\/span><span class=\"o\">=<\/span><span class=\"m\">3<\/span>.10.16 <\/span><span id=\"__span-1-3\"><a id=\"__codelineno-1-3\" name=\"__codelineno-1-3\" href=\"#__codelineno-1-3\"><\/a>conda<span class=\"w\"> <\/span>activate<span class=\"w\"> <\/span>mponc <\/span><span id=\"__span-1-4\"><a id=\"__codelineno-1-4\" name=\"__codelineno-1-4\" href=\"#__codelineno-1-4\"><\/a>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>-r<span class=\"w\"> <\/span>requirements.txt <\/span><span id=\"__span-1-5\"><a id=\"__codelineno-1-5\" name=\"__codelineno-1-5\" href=\"#__codelineno-1-5\"><\/a>python<span class=\"w\"> <\/span>main.py <\/span><\/code><\/pre><\/div> <h2 id=\"abstract\">Abstract<\/h2> <blockquote> <p>This research project simulates the impact of the Atlanta Beltline on the surrounding metropolitan area using game theory. The simulation models agent movement across census tracts within the Atlanta-Sandy Springs-Roswell metro region, with agents seeking to move optimally (seeking 'attractive' census tracts) based on various factors.<\/p> <\/blockquote> <h2 id=\"intro-and-description\">Intro and Description<\/h2> <p>This project is based on the reference paper created by Dr. Martinez and Dr. Zhao, which aims to address the following: <\/p> <ul> <li>How does the layout of transportation infrastructure affect the demographics of nearby neighborhoods? <\/li> <li>Does the creation of these infrastructure actually benefit everyone equally; is it fair? <\/li> <li>Can we predict the effects on surrounding communities before these structures are actually built? <\/li> <\/ul> <p>These questions are primarily motivated by the issue of gentrification, an issue prevalent in many major cities. We utilized concepts in game theory, more specifically no-regret dynamics, in order to simulate the effects of the Atlanta Beltline on gentrification. To summarize our approach with no-regret dynamics:<\/p> <ul> <li>People, or 'agents', randomly move from region to region. Depending the region's attributes, a <strong>'cost'<\/strong> value is assigned to each action. <\/li> <li><em>'Cost' is a function of region attractiveness, affordability, and community.<\/em> <\/li> <li>The higher the cost, the less likely an agent is to visit that census tract in the future. <\/li> <li>This process is repeated until the probability distribution of visting census tracts converges - an equilibrium is reached, and further actions make no difference. <\/li> <li>We compute the simulation convergance using the <em>total\u2011variation distance<\/em> between two sliding windows of recent agent\u2011distributions: <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-2-1\"><a id=\"__codelineno-2-1\" name=\"__codelineno-2-1\" href=\"#__codelineno-2-1\"><\/a>\\mathrm{TV}(p,q)\\;=\\;\\tfrac12\\sum_{c}\\lvert\\,p(c)-q(c)\\rvert\\,. <\/span><\/code><\/pre><\/div> If TV\u00a0\u2264\u00a0<code>EPS_CONVERGENCE<\/code> (default\u202f=\u202f0.005) the system is deemed converged and the run halts automatically. All thresholds are configurable in <code>config.py<\/code>.<\/li> <li>Alternatively, we can use a hardcoded runtime.<\/li> <\/ul> <h2 id=\"cost-function\">Cost Function<\/h2> <p>Every agent evaluates a tract with a cost defined as<\/p> <blockquote> <p><strong>cost = 1\u00a0\u2013\u00a0(affordability\u00a0\u00d7\u00a0attractiveness\u00a0\u00d7\u00a0community)<\/strong><\/p> <\/blockquote> <table> <thead> <tr> <th>Factor<\/th> <th>Scale<\/th> <th>Quick intuition<\/th> <\/tr> <\/thead> <tbody> <tr> <td><strong>Affordability<\/strong><\/td> <td>0\u00a0or\u00a01<\/td> <td>1 if the tract still has room <em>or<\/em> the agent is randomly selected to be an inhabitants (weight scales with relative wealth); 0 otherwise.<\/td> <\/tr> <tr> <td><strong>Attractiveness<\/strong><\/td> <td>0\u20131<\/td> <td>How nice the tract is to live in (see sub\u2011components below).<\/td> <\/tr> <tr> <td><strong>Community<\/strong><\/td> <td>0\u20131<\/td> <td>How close the agent\u2019s income is to the local average\u2014closer \u21d2 higher score.<\/td> <\/tr> <\/tbody> <\/table> <h3 id=\"attractiveness-upkeep-amenity_access-beltline_factor\">Attractiveness\u00a0=\u00a0upkeep\u00a0\u00d7\u00a0amenity_access\u00a0\u00d7\u00a0beltline_factor<\/h3> <table> <thead> <tr> <th>Sub\u2011component<\/th> <th>Range<\/th> <th>What it captures<\/th> <\/tr> <\/thead> <tbody> <tr> <td><strong>Upkeep<\/strong><\/td> <td>0\u00a0or\u00a01<\/td> <td>0 if the tract is abandoned (no residents); 1 otherwise.<\/td> <\/tr> <tr> <td><strong>Amenity\u00a0access<\/strong><\/td> <td>0\u20131<\/td> <td>Density of key POIs (restaurants, shops, transit stops, etc) weighted by distance.<\/td> <\/tr> <tr> <td><strong>BeltLine factor\u202f\u03b2<\/strong><\/td> <td>\u2264\u202f1<\/td> <td>Extra accessibility for tracts in the BeltLine zone: \u03b2\u202f=\u202f1.00 at \u2264\u202f800\u202fm, tapering linearly to \u03b2\u202f=\u202f0.917 (1.10\/1.20) at 1.6\u202fkm, then \u03b2\u202f=\u202f0.833 (1.0\/1.20).<\/td> <\/tr> <\/tbody> <\/table> <p>*\u00a0Amenity list adapted from <strong><a href=\"https:\/\/vip-smur.github.io\/24sp-mobility-seg\/\">24Sp\u2011Mobility\u2011Seg<\/a><\/strong>; we omit several tags such as \u201cshed\u201d, \u201cguardhouse\u201d, \u201cferry_terminal\u201d, \u201cgarages\u201d, and \u201cbridge\u201d.<\/p> <h4 id=\"implemented-amenities-weights-openstreetmap-labels\">Implemented Amenities &amp; weights (OpenStreetMap labels):<\/h4> <p><div class=\"language-python highlight\"><pre><span><\/span><code><span id=\"__span-3-1\"><a id=\"__codelineno-3-1\" name=\"__codelineno-3-1\" href=\"#__codelineno-3-1\"><\/a><span class=\"n\">AMENITY_TAGS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <\/span><span id=\"__span-3-2\"><a id=\"__codelineno-3-2\" name=\"__codelineno-3-2\" href=\"#__codelineno-3-2\"><\/a> <span class=\"s1\">&#39;amenity&#39;<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;bus_station|cafe|college|fast_food|food_court|fuel|library|restaurant|train_station|university|parking|school|hospital&quot;<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">),<\/span> <\/span><span id=\"__span-3-3\"><a id=\"__codelineno-3-3\" name=\"__codelineno-3-3\" href=\"#__codelineno-3-3\"><\/a> <span class=\"s1\">&#39;shop&#39;<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;supermarket|food|general|department_store|mall|wholesale&quot;<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">),<\/span> <\/span><span id=\"__span-3-4\"><a id=\"__codelineno-3-4\" name=\"__codelineno-3-4\" href=\"#__codelineno-3-4\"><\/a> <span class=\"s1\">&#39;landuse&#39;<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;residential|industrial|commercial|retail&quot;<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-3-5\"><a id=\"__codelineno-3-5\" name=\"__codelineno-3-5\" href=\"#__codelineno-3-5\"><\/a><span class=\"p\">}<\/span> <\/span><\/code><\/pre><\/div> * We operationalize <strong>\u03b2<\/strong> by giving tracts within <strong>800\u202fm<\/strong> of the BeltLine a <strong>+20\u202f%<\/strong> boost to their Attractiveness score (\u03b2\u202f=\u202f1.20\/1.20); the boost then tapers linearly to <strong>+10\u202f%<\/strong> at <strong>1.6\u202fkm<\/strong>, and falls to \u03b2\u202f=\u202f1.00\/1.20 beyond that distance. These concrete percentages and distance bands approximate the BeltLine\u2019s observed catchment zone and its predicted effect on nearby housing prices.<\/p> <h3 id=\"community-score-local-morans-i\">Community Score (Local Moran\u2019s I)<\/h3> <p>We quantify how well an agent\u2019s income matches its neighbours using Local Moran\u2019s I:<\/p> <div class=\"arithmatex\">\\[ I_c = \\frac{(w_c - \\bar w)}{S^2} \\sum_{j \\in N(c)} w_{cj}\\,(w_j - \\bar w), \\quad S^2 = \\frac{1}{n}\\sum_{k=1}^n (w_k - \\bar w)^2 \\]<\/div> <ul> <li><code>w_c<\/code> = average income in tract c <\/li> <li><code>w\u0304<\/code> = regional mean income <\/li> <li><code>w_{cj}<\/code> = spatial weight (1 for adjacent tracts, 0 otherwise) <\/li> <li><code>N(c)<\/code> = neighbouring tracts of c <\/li> <\/ul> <p>Each agent i with income <code>w_i<\/code> converts this statistic into a smooth score:<\/p> <div class=\"arithmatex\">\\[ \\mathrm{Community}_i(c) = \\exp\\bigl(-\\alpha\\,\\lvert w_i - I_c\\rvert\\bigr) \\]<\/div> <p>where <code>\u03b1<\/code> is set in <code>config.py<\/code>.<br \/> A closer match \u21d2 value near 1 \u21d2 lower cost.<\/p> <h3 id=\"weighting-amenity-access-vs-community\">Weighting amenity access vs\u202fcommunity (\u03bb)<\/h3> <p>A tunable parameter <strong>\u03bb\u00a0\u2208\u00a0[0,\u202f1]<\/strong> lets you emphasize either amenity access (high\u202f\u03bb) or community match (low\u202f\u03bb).<br \/> Internally we rewrite<br \/> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-4-1\"><a id=\"__codelineno-4-1\" name=\"__codelineno-4-1\" href=\"#__codelineno-4-1\"><\/a>cost = 1 - [[Affordability] \u00d7 [Upkeep x (\u03bb \u00d7 AmenityAccess)] \u00d7 [(1-\u03bb) \u00d7 Community]] <\/span><\/code><\/pre><\/div><\/p> <h2 id=\"the-four-step-model\">The Four-Step Model<\/h2> <p>Given that the agents move across various subregions in our simulation, one of the critical steps is determining the mode of transport of each agent. To do this in a way that accurately represents real-world distributions, we turned to the four-step model, a common trip generation algorithm: <\/p> <p><img width=\"758\" alt=\"Screenshot 2024-12-03 at 2 19 28\u202fPM\" src=\".\/Figures\/FourStepModel.png\"><\/p> <p>The model has four components:<\/p> <ol> <li>Trip Generation: This part of the model estimates the number of trips originating from or destined for a specific area. It focuses on understanding how many trips are generated rather than specific travel patterns. This process usually involves some type of data pertaining to the area at hand, such as demographics, income, or land usage.<\/li> <li>Trip Distribution; This part of the model estimates the number of trips for routes that go from an area to another, as determined in the trip generation step. This process is typically done using the gravity model, which assumes that the number of trips are positively correlated with the attractiveness of an area and inversely correlated to distance.<\/li> <li>Mode Choice: This part of the model determines the mode of transporation used to make the trips. This is typically done by considering demographic data (such as the percentage of people with cars) in an area.<\/li> <li>Route Assignment: This part of the model determines the routes travelers take between origins and destinations. This is typically done by considering the route that takes the shorted possible time, and following that. <\/li> <\/ol> <p>Our approach closely follows these four components. We first generate trips by considering the amenity density of areas. We sum up all amenity densities, and divide each area's density by this sum to generate a probability. We then utilize a Poisson Distribution to generate the number of trips by multipling a base number of trips by the probability. We then consider trip distribution through a modified gravity model. The equation for our model is the following, given that we aim to go from area\/region i to j:<\/p> <p><img width=\"686\" alt=\"Screenshot 2024-12-03 at 2 37 56\u202fPM\" src=\".\/Figures\/GravityModel.png\"><\/p> <p>We essentially multiply the total number of trips from area i to area j with the net amenity score for the destination j times transportation cost for that specific trip from area i to j, divided by the net amenity score for area j times the transportation cost from area i to j summed up over all destination j's. <\/p> <p>For our modal split, we assume that the car ownership rate is 0.7, and that the transit rate is 0.3. Each region's trips are split based on this. We then assign these routes based on the shortest possible distance.<\/p> <p>Through this process, we were able to have a methodical way of distributing the agents across Atlanta based on area factors such as amenity density.<\/p> <h3 id=\"tigerline-geodatabases-shapefiles\">TIGER\/Line Geodatabases shapefiles:<\/h3> <p><img alt=\"Alt text\" src=\"Figures\/ZIP_URLs.png\" \/><\/p> <h2 id=\"project-status\">Project status<\/h2> <h3 id=\"outputs-configuration\">Outputs &amp; configuration<\/h3> <p>Our code outputs a GIF to visualize agent behavior over time. Each circle represents the centroid of a census tract - green signifying those in the Atlanta Beltline - and the encircled number is the agent population. Our code also outputs a CSV file containing all the simulated data at every individual timestep.<\/p> <ul> <li><em>Data contained in CSV's: Census tract name, agent population, raw average income, average income reported by census, normalized average incomes, and amenity density.<\/em><\/li> <li><em>Note: 'Timestep' refers to a single instance agent action (relocation); 20,000 timesteps mean the agents relocate a total of 20,000 times during the simulation.<\/em><\/li> <\/ul> <h4 id=\"gif\">GIF<\/h4> <p>This GIF shows the behavior of 1,000 agents up to 20,000 timesteps, frames being captured every 400 timesteps. Rho=1, alpha=0.25. <img alt=\"Alt text\" src=\"Figures\/SimulationGIF2025.gif\" \/><\/p> <h3 id=\"runtimes\">Runtimes<\/h3> <blockquote> <p>(1000 agents, 349 census tracts) - Simulation (x8): ~19.6 minutes - GIF creation (x8), 50 frames: ~13 min * Graph, amenities, and centroids are cached after first build<\/p> <\/blockquote> <h2 id=\"census-based-approach\">Census-based approach<\/h2> <p>Our project utilizes US Census data in that: - The geographical regions our agents inhabit correspond directly to US census tracts (can correspond to any other census-defined geographic unit, i.e. zip codes, housing districts, and school districts). - Each 'agent' is assigned a 'wealth' value in our simulation. We create this distribution of wealth using Census data (population &amp; median incomes), to represent real-world demographics.<\/p> <h2 id=\"atlanta-beltline-in-our-simulation\">Atlanta Beltline in our Simulation<\/h2> <p>We automate the process of labelling certain regions as 'in the Atlanta Beltline' by using commuting paths from OpenStreetMap that correspond to the Atlanta Beltline - namely, a bike trail and a railway. To experiment with a different beltline, such as a beltline that spanned across Atlanta horizontally, or simply expanded north by x miles, we would acquire the OpenStreetMap ID's of existing paths (bike trails, walking paths, roads, etc.) corresponding to our desired Beltline, and paste these into <strong>config.py<\/strong>. Alternatively, we can create a such path ourselves in OpenStreetMap. Then, any region containing segments of these trails would automatically be marked as \"In the Atlanta Beltline\". <\/p> <p>In <strong>config.py<\/strong> - bike trail and railroad OpenStreetMap ID's for the beltline are as follows:<\/p> <div class=\"language-python highlight\"><pre><span><\/span><code><span id=\"__span-5-1\"><a id=\"__codelineno-5-1\" name=\"__codelineno-5-1\" href=\"#__codelineno-5-1\"><\/a><span class=\"sd\">&quot;&quot;&quot; Beltline &#39;relation&#39; IDs from Open Street Map &quot;&quot;&quot;<\/span> <\/span><span id=\"__span-5-2\"><a id=\"__codelineno-5-2\" name=\"__codelineno-5-2\" href=\"#__codelineno-5-2\"><\/a><span class=\"n\">RELATION_IDS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"mi\">8408433<\/span><span class=\"p\">,<\/span> <span class=\"mi\">13048389<\/span><span class=\"p\">]<\/span> <\/span><\/code><\/pre><\/div> <table> <thead> <tr> <th style=\"text-align: center;\">Bike Trail<\/th> <th style=\"text-align: center;\">Railroad<\/th> <\/tr> <\/thead> <tbody> <tr> <td style=\"text-align: center;\"><img src=\".\/Figures\/BeltlineBikeTrail.png\" width=\"300\"><\/td> <td style=\"text-align: center;\"><img src=\".\/Figures\/BeltlineRailroad.png\" width=\"300\"><\/td> <\/tr> <\/tbody> <\/table> <p>Compare with Atlanta Beltline geography:<\/p> <p><img src=\".\/Figures\/AtlantaBeltlineVisual.jpg\" width=\"250\"><\/p> <h2 id=\"adapting-the-model-to-other-cities\">Adapting the Model to Other Cities<\/h2> <p>Although Atlanta serves as our case study, every pipeline stage\u2014census shapefiles, OSM\u2011derived amenities, cost parameters, and even the BeltLine decision\u2011agent\u2014can be swapped for a different region:<\/p> <ol> <li> <p><strong>Geometry &amp; Demographics<\/strong><br \/> \u2022 Replace the Fulton\/DeKalb TIGER\/Line shapefiles with those of your target city.<br \/> \u2022 Point the <code>MEDIAN_INCOME_URL<\/code> and <code>POP_URL<\/code> in <code>config.py<\/code> to that city\u2019s American Community Survey \"ACS\" tables.<\/p> <\/li> <li> <p><strong>Transit\u2011Ring Definition<\/strong><br \/> \u2022 Identify (or sketch in OSM) the planned loop \/ BRT corridor \/ rail spur you want to study, then list its OSM relation IDs in <code>config.py<\/code>.<br \/> \u2022 The same \u03b2\u2011taper and DecisionAgent logic will assign accessibility boosts and density bonuses around the new corridor.<\/p> <\/li> <li> <p><strong>Policy Levers<\/strong><br \/> \u2022 Tweak <code>RHO_SCALAR<\/code> to explore how strong the up\u2011zoning response should be for the above transit ring.<\/p> <\/li> <\/ol> <p>Because the simulation is purely data\u2011driven, you can rapidly prototype \u201cwhat\u2011if\u201d BeltLine analogues for <strong>anywhere with open census and OSM data while measuring potential community shifts\/gentrification before shovels hit the ground.<\/strong> Example: <img alt=\"Alt text\" src=\"Figures\/OldZipURL.png\" \/> * By changing the above URL, we get the following:<\/p> <p><img src=\".\/Figures\/AtlantaBeltlineCloseupGraph.png\" alt=\"Alt text\" width=\"250\" \/><\/p> <h2 id=\"policy-scenarios-vertical-vs-horizontal-scaling\">Policy Scenarios: Vertical vs Horizontal Scaling<\/h2> <p>The simulation now supports two high-level policy experiments:<\/p> <h3 id=\"1-vertical-scaling-decision-making-agent-learns-m\">1. Vertical Scaling \u2014 Decision-Making Agent learns <span class=\"arithmatex\">\\(m\\)<\/span><\/h3> <p>A dedicated <code>DecisionAgent<\/code> treats \u201chow aggressively should we up-zone?\u201d as a learning problem:<\/p> <ul> <li><strong>Action space<\/strong>:<br><\/li> <\/ul> <div class=\"arithmatex\">\\[ m \\in \\{0.00,\\,0.01,\\,\\dots,\\,1.00\\} \\]<\/div> <p>sampled each timestep by multiplicative\u2011weights\u00a0(no\u2011regret).<\/p> <ul> <li><strong>Base capacity curve<\/strong>:<br><\/li> <\/ul> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-6-1\"><a id=\"__codelineno-6-1\" name=\"__codelineno-6-1\" href=\"#__codelineno-6-1\"><\/a>U_c = 1 + \\frac{\\texttt{beltline\\_score}_c - \\texttt{BL\\_LOW}}{\\texttt{BL\\_HIGH} - \\texttt{BL\\_LOW}} \\times \\bigl(\\texttt{RHO\\_SCALAR}_{max} - 1\\bigr) <\/span><\/code><\/pre><\/div> <h4 id=\"effective-multiplier\">Effective multiplier<\/h4> <div class=\"arithmatex\">\\[ \\rho_c \\;\\leftarrow\\; \\rho_c \\times \\bigl[1 + m\\,(U_c - 1)\\bigr] \\]<\/div> <p>Two alternative utility metrics guide learning:<\/p> <table> <thead> <tr> <th><code>UTILITY_METRIC<\/code><\/th> <th>Algorithm maximises<\/th> <th>Real\u2011world analogy<\/th> <\/tr> <\/thead> <tbody> <tr> <td><code>0<\/code> <em>(default)<\/em><\/td> <td><strong>average utility<\/strong> (mean\u00a0well\u2011being across all agents)<\/td> <td>\u201cGreatest good for the greatest number.\u201d<\/td> <\/tr> <tr> <td><code>1<\/code><\/td> <td><strong>minimum utility<\/strong> (well\u2011being of the worst\u2011off agent)<\/td> <td>Rawlsian \/ max\u2011min fairness.<\/td> <\/tr> <\/tbody> <\/table> <p>The DecisionAgent reinforces actions that raise the chosen utility, gradually converging to an ideal <em>m<\/em> for the current policy goal. <\/p> <p>These \u201cconcrete zoning\u2011bonus percentages and distance bands\u201d are the literal numbers (+20\u202f%, +10\u202f%, 800\u202fm, 1600\u202fm) encoded in <code>DecisionAgent.py<\/code>. Feel free to edit them in <code>config.py<\/code>.<\/p> <h3 id=\"2-horizontal-scaling-complete-beltline-from-day-0\">2.\u202fHorizontal\u202fScaling\u00a0(complete BeltLine from day\u202f0)<\/h3> <p>All census tracts whose centroids fall inside the 1.6\u202fkm BeltLine catchment zone begin with <strong>BeltLine factor \u03b2\u202f&gt;\u202f1<\/strong> (default \u03b2\u202f=\u202f1.20, editable in <code>config.py<\/code>).<br \/> Tracts outside that zone keep \u03b2\u202f=\u202f1.00.\u00a0This models an \u201call\u2011at\u2011once\u201d completion of the transit loop.<\/p> <h2 id=\"sobol-sensitivity-analysis\">Sobol Sensitivity Analysis<\/h2> <p>During calibration we ran a Sobol variance\u2011decomposition on six candidate features<br \/> (Affordability, Attractiveness, Community, Location, BeltLine, Upkeep).<\/p> <table> <thead> <tr> <th>Feature<\/th> <th>1<sup>st<\/sup>\u2011order index<\/th> <th>Total\u2011order index<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Affordability<\/td> <td>0.42<\/td> <td>0.45<\/td> <\/tr> <tr> <td>Attractiveness<\/td> <td>0.31<\/td> <td>0.36<\/td> <\/tr> <tr> <td>Community<\/td> <td>0.18<\/td> <td>0.22<\/td> <\/tr> <tr> <td><em>Others<\/em><\/td> <td>&lt;\u202f0.05<\/td> <td>&lt;\u202f0.10<\/td> <\/tr> <\/tbody> <\/table> <p>Because the cumulative contribution of the remaining three factors was &lt;\u202f10\u202f%, we compressed the cost function to the product <strong>Affordability\u202f\u00d7\u202fAttractiveness\u202f\u00d7\u202fCommunity<\/strong>. The full Jupyter notebook lives in <code>notebooks\/sensitivity_sobol.ipynb<\/code>.<\/p> <h2 id=\"strengths-and-weaknesses\">Strengths and Weaknesses<\/h2> <h3 id=\"strengths\">Strengths<\/h3> <p>Our approach is very modularized. For instance, our code can easily be ran on other regions, with customizable 'Beltlines' and the definitio. It simply needs lists of agents, a NetworkX graph, and other generalized parameters to operate. Furthermore, Our approach is backed by established human behavior approaches (no-regret dynamics), utilizes a distribution system that is also established (four-step model). We are able to produce dynamic visuals (GIFs).<\/p> <h3 id=\"weaknesses\">Weaknesses<\/h3> <p>Our simulation also assumes that there is no immigration\/emigration in Atlanta, as we set a fixed number of agents. We also limit transportation choices to cars and public transportation, despite other modes of transport being popular (walking or biking) Additionally, our runtimes are relatively long due to the computationally expensive nature of the simulation. Ideally, our simulation would be ran in just a couple minutes or even seconds.<\/p> <h3 id=\"next-steps\">Next Steps<\/h3> <p>We hope to publish this research paper by this coming Fall semester. Most notably, we hope to improve the readability of our GIF's, improve the runtime of the simulation, validate our simulation's accuracy, and include additional visualizations of our results to better communicate our analysis during discussion. <\/p> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=0sxJBZpCphA\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/0sxJBZpCphA\/maxresdefault.jpg\" width=\"480\" alt=\"Final Presentation --- 25Sp --- Modeling Processes of Neighborhood Change (MPONC)\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Matthew Lim<\/td> <td>Sophomore<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/mlim70\">mlim70<\/a><\/td> <\/tr> <tr> <td>Justin Xu<\/td> <td>Sophomore<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/JXU037\">JXU037<\/a><\/td> <\/tr> <tr> <td>Devam Mondal<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/Dodesimo\">Dodesimo<\/a><\/td> <\/tr> <tr> <td>Nithish Sabapathy<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/nithish101\">nithish101<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25sp-mponc\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:48 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25sp-mponc\/#__comments","guid":"https:\/\/vip-smur.github.io\/25sp-mponc\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25sp-mponc\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Fa-Mobility","description":"<h1 id=\"pedestrian-environment-index-pei-documentation\">Pedestrian Environment Index (PEI) Documentation<\/h1> <p><a href=\"https:\/\/vip-pei-app-2.onrender.com\/\"><img alt=\"Demo\" src=\"https:\/\/img.shields.io\/badge\/demo-render-brightgreen?logo=render&amp;logoColor=white\" \/><\/a><\/p> <p>This project implements the Pedestrian Environment Index (PEI) methodology as developed at the University of Illinois Chicago (see the research paper: <a href=\"https:\/\/www.sciencedirect.com\/science\/article\/pii\/S0966692314001343\">https:\/\/www.sciencedirect.com\/science\/article\/pii\/S0966692314001343<\/a>). The PEI provides a composite measure of the walkability of an environment, incorporating the following subindices:<\/p> <ul> <li>Population Density Index (PDI)<\/li> <li>Commercial Density Index (CDI)<\/li> <li>Intersection Density Index (IDI)<\/li> <li>Land-use Diversity Index (LDI)<\/li> <\/ul> <h2 id=\"1-motivation-and-introduction\">1. Motivation and Introduction<\/h2> <p>The <strong>Pedestrian Environment Index (PEI)<\/strong> is a composite measure of walkability that combines four key subindices to evaluate pedestrian-friendly environments. This implementation of the PEI is useful for researchers aiming to:<\/p> <ul> <li>Assess the current walkability of neighborhoods or regions.<\/li> <li>Compare walkability across different areas.<\/li> <li>Identify areas with potential for improvement.<\/li> <\/ul> <hr \/> <h2 id=\"2-getting-started\">2. Getting Started<\/h2> <h3 id=\"prerequisites\"><strong>Prerequisites<\/strong><\/h3> <ol> <li> <p><strong>Python 3.x<\/strong>:<br \/> Ensure Python is installed and available in your system path. Check using: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"><\/a>python<span class=\"w\"> <\/span>--version <\/span><\/code><\/pre><\/div><\/p> <\/li> <li> <p><strong>Required Libraries<\/strong>:<br \/> Install the following Python libraries:<\/p> <\/li> <li>osmnx<\/li> <li>pandas<\/li> <li>numpy<\/li> <li>matplotlib.pyplot<\/li> <li>csv<\/li> <li> <p>census<\/p> <\/li> <li> <p><strong>Census API Key<\/strong>:<br \/> Obtain a Census API key from <a href=\"https:\/\/api.census.gov\/data\/key_signup.html\">Census API Key Signup<\/a>.<br \/> Save the key in a text file named <code>census_api_key.txt<\/code> in the same directory as <code>PDI_generator.ipynb<\/code>.<\/p> <\/li> <\/ol> <h3 id=\"installation\"><strong>Installation<\/strong><\/h3> <p>Install the required libraries using pip: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-1-1\"><a id=\"__codelineno-1-1\" name=\"__codelineno-1-1\" href=\"#__codelineno-1-1\"><\/a>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>osmnx<span class=\"w\"> <\/span>pandas<span class=\"w\"> <\/span>numpy<span class=\"w\"> <\/span>matplotlib<span class=\"w\"> <\/span>csv<span class=\"w\"> <\/span>census <\/span><\/code><\/pre><\/div><\/p> <hr \/> <h2 id=\"3-core-subindices\">3. Core Subindices<\/h2> <h3 id=\"population-density-index-pdi\"><strong>Population Density Index (PDI)<\/strong><\/h3> <ul> <li><strong>Definition<\/strong>: Measures residential population density within defined areas.<\/li> <li><strong>Data Source<\/strong>: Population and area data are downloaded from the Missouri Census Data Center.<\/li> <li> <p><strong>Calculation<\/strong>:<\/p> <p><span class=\"arithmatex\">\\(\\text{Population Density} = \\frac{\\text{Total Population}}{\\text{Total Area (Square Miles)}}\\)<\/span><br \/> - <strong>PDI<\/strong>: Percentile rank of Population Density across all years and cities.<\/p> <\/li> <\/ul> <h3 id=\"commercial-density-index-cdi\"><strong>Commercial Density Index (CDI)<\/strong><\/h3> <ul> <li><strong>Definition<\/strong>: Evaluates the density of commercial establishments per block group.<\/li> <li><strong>Data Source<\/strong>: Data is sourced using the Overpass API.<\/li> <li><strong>Method<\/strong>:<\/li> <li>Tags used include shops, restaurants, cafes, banks, schools, cinemas, parks, sports centers, and stadiums.<\/li> <li> <p>Area is derived from census tracts in the US Census GeoJSON files.<\/p> <p><span class=\"arithmatex\">\\(\\text{Commercial Density} = \\frac{\\text{Count of Commercial POIs}}{\\text{Total Land Area (Square Miles)}}\\)<\/span><br \/> - <strong>CDI<\/strong>: Percentile rank of Commercial Density across all years and cities.<\/p> <\/li> <\/ul> <h3 id=\"intersection-density-index-idi\"><strong>Intersection Density Index (IDI)<\/strong><\/h3> <ul> <li><strong>Definition<\/strong>: Quantifies the density of intersections in a given area.<\/li> <li><strong>Data Source<\/strong>: Retrieved using the Overpass API.<\/li> <li><strong>Method<\/strong>: <span class=\"arithmatex\">\\(\\text{Intersection Density} = \\frac{\\text{Number of Nodes Part of More than One Way (Intersections)}}{\\text{Area (Square Miles)}}\\)<\/span> <\/li> <li><strong>IDI<\/strong>: Percentile rank of Intersection Densities across all years and cities.<\/li> <\/ul> <h3 id=\"land-use-diversity-index-ldi\"><strong>Land-use Diversity Index (LDI)<\/strong><\/h3> <ul> <li><strong>Definition<\/strong>: Analyzes the diversity of land-use types within an area.<\/li> <li><strong>Data Source<\/strong>: Land-use data is retrieved from OpenStreetMap using the Overpass API with the \"landuse\" tag.<\/li> <li><strong>Method<\/strong>: <span class=\"arithmatex\">\\(\\text{Entropy} = \\sum \\left( \\frac{\\text{Area of Land Use Type}}{\\text{Total Area}} \\cdot \\ln \\left( \\frac{\\text{Area of Land Use Type}}{\\text{Total Area}} \\right) \\right)\\)<\/span> (for all land-use types with non-zero area). <ul> <li>Normalized by: <span class=\"arithmatex\">\\(\\frac{\\text{Entropy}}{\\ln(\\text{Number of Land Use Types with Non-Zero Area})}\\)<\/span> <\/li> <li><strong>LDI<\/strong>: Percentile rank of Entropies across all years and cities.<\/li> <\/ul> <\/li> <\/ul> <hr \/> <h2 id=\"4-pei-formula\">4. PEI Formula<\/h2> <p>The PEI is calculated using the following formula:<\/p> <div class=\"arithmatex\">\\[ PEI = \\frac{{(1 + PDI) \\cdot (1 + IDI) \\cdot (1 + LDI) \\cdot (1 + CDI)}}{16} \\]<\/div> <hr \/> <h2 id=\"5-implementation-workflow\">5. Implementation Workflow<\/h2> <h3 id=\"step-1-files\">Step 1: Files<\/h3> <ul> <li>Download population data files from the Missouri Census Data Center (MCDC) for each required year.<\/li> <li>Download block group and census tract files from the US Census Bureau website.<\/li> <\/ul> <h3 id=\"step-2-subindex-calculation\">Step 2: Subindex Calculation<\/h3> <ul> <li>Run individual generator scripts (e.g., <code>&lt;subindex&gt;_&lt;city&gt;_&lt;year&gt;.ipynb<\/code>) for each subindex.<\/li> <li>Outputs include CSV and GeoJSON files with fields for block group, year, and the \"raw subindex\" values:<\/li> <li>Population Density<\/li> <li>Commercial Density<\/li> <li>Intersection Density<\/li> <li>Entropy<\/li> <li>Append all results to master files (<code>all_PDI<\/code>, <code>all_CDI<\/code>, <code>all_IDI<\/code>, <code>all_LDI<\/code>) for comprehensive cross-year\/city comparison.<\/li> <\/ul> <h3 id=\"step-3-normalization\">Step 3: Normalization<\/h3> <ul> <li>Normalize raw subindex data - between 1 and 0:<\/li> <li>This normalization is done by taking each block group\/tract's percentile rank for each \"raw subindex\" versus every other city and every other year:<\/li> <li>Because we normalize across all cities and years, our subindex values can be compared seamlessly against any other block group regardless of time\/location.<\/li> <li>We are able to normalize across all cities and years thanks to these aforementioned 4 files - <code>all_PDI.csv<\/code>, <code>all_CDI.csv<\/code>, <code>all_IDI.csv<\/code>, <code>all_LDI.csv<\/code> - which contain raw data for all years\/cities.<\/li> <li>Once we normalize the raw subindex we can now call it an actual subindex - e.g. the normalized <code>Commercial Density<\/code> becomes <code>CDI<\/code>, normalized <code>Entropy<\/code> becomes <code>LDI<\/code>, etc.<\/li> <li> <p>The file also updates the CSV &amp; GeoJSON files for each subindex and city with a new field - one of <code>CDI<\/code>, <code>LDI<\/code>, <code>PDI<\/code>, <code>IDI<\/code>.<\/p> <\/li> <li> <p>Now we finally have finalized CSV and GeoJSON files for the 4 subindexes:<\/p> <ul> <li><code>&lt;subindex&gt;_&lt;city&gt;_&lt;year&gt;.csv\/geojson<\/code><\/li> <\/ul> <\/li> <\/ul> <h3 id=\"step-4-pei-calculation\">Step 4: PEI Calculation<\/h3> <ul> <li>Combine normalized subindices using the PEI formula for each block group\/tract.<\/li> <li>Generate CSV and GeoJSON files (<code>PEI_&lt;city&gt;_&lt;year&gt;.csv\/geojson<\/code>).<\/li> <\/ul> <h3 id=\"step-5-web-app-integration\">Step 5: Web App Integration<\/h3> <ul> <li>Upload finalized GeoJSON files to AWS S3 buckets.<\/li> <li>Implement and visualize data on the web app.<\/li> <\/ul> <hr \/> <h2 id=\"6-usage\">6. Usage<\/h2> <h3 id=\"inside-the-fall24-folder-you-will-find-3-folders\">Inside the Fall24 folder you will find 3 folders:<\/h3> <ul> <li>Tract_Files - we mainly used this folder for testing:<\/li> <li>This contains the relevant <code>ipynb<\/code> files for creating the subindexes.<\/li> <li> <p>It also contains <code>tracts.geojson<\/code> which has the first 10 rows of tracts in the US - useful for testing. - Please download full tract files from https:\/\/www.census.gov\/cgi-bin\/geo\/shapefiles\/index.php, or contact abeesen3@gatech.edu for full files.<\/p> <\/li> <li> <p>BlockGroup_Files:<\/p> <\/li> <li>This contains the relevant <code>ipynb<\/code> files for creating the subindexes. (In the PDI file, only run code blocks after the <code>#NEW<\/code> comment).<\/li> <li>It also contains <code>block_groups.geojson<\/code> which has the first 10 rows of blockgroups in Atlanta - useful for testing. - Please create the full files using the <code>.\/Spring24\/Blockgroup GeoJSON Generator<\/code> folder (you need to rename the output of this to <code>block_groups.geojson<\/code>), downlaod the full files from https:\/\/www.census.gov\/cgi-bin\/geo\/shapefiles\/index.php, or contact abeesen3@gatech.edu for full files.<\/li> <\/ul> <h3 id=\"step-1-data-download\">Step 1: Data Download<\/h3> <p>Download the required data files from the following sources: - <strong>Population Data<\/strong>: Obtain CSV files from <a href=\"https:\/\/mcdc.missouri.edu\/cgi-bin\/uexplore?\/data\">Missouri Census Data Center (MCDC)<\/a>. - <strong>Census Block Groups\/Tract GeoJSON<\/strong>: Retrieve the required GeoJSON files from the US Census Bureau or relevant sources: - As described above, download files from https:\/\/www.census.gov\/cgi-bin\/geo\/shapefiles\/index.php, or contact abeesen3@gatech.edu for full files.<\/p> <h3 id=\"step-2-update-generator-scripts\">Step 2: Update Generator Scripts<\/h3> <p>Modify the generator scripts (<code>PDI_Generator.ipynb<\/code>, <code>CDI_Generator.ipynb<\/code>, <code>LDI_Generator.ipynb<\/code>, <code>IDI_Generator.ipynb<\/code>) to include your specific file paths and input parameters. For all the subindex files, they will have a portion like the code shown below. This is the only part you must update as required:<\/p> <div class=\"language-python highlight\"><pre><span><\/span><code><span id=\"__span-2-1\"><a id=\"__codelineno-2-1\" name=\"__codelineno-2-1\" href=\"#__codelineno-2-1\"><\/a><span class=\"n\">calculate_<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">subindex<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span> <\/span><span id=\"__span-2-2\"><a id=\"__codelineno-2-2\" name=\"__codelineno-2-2\" href=\"#__codelineno-2-2\"><\/a> <span class=\"n\">input_geojson<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;path_to_your_geojson_file.geojson&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># Replace with your census tract or blockgroup GeoJSON file<\/span> <\/span><span id=\"__span-2-3\"><a id=\"__codelineno-2-3\" name=\"__codelineno-2-3\" href=\"#__codelineno-2-3\"><\/a> <span class=\"n\">output_prefix<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;tracts&gt; or &lt;block_groups&gt;&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># tracts or bg based on if we are analyzing tracts or blockgroups<\/span> <\/span><span id=\"__span-2-4\"><a id=\"__codelineno-2-4\" name=\"__codelineno-2-4\" href=\"#__codelineno-2-4\"><\/a> <span class=\"n\">year<\/span><span class=\"o\">=<\/span><span class=\"mi\">2013<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-2-5\"><a id=\"__codelineno-2-5\" name=\"__codelineno-2-5\" href=\"#__codelineno-2-5\"><\/a> <span class=\"n\">aggregate_file<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;subindex&gt;_&lt;tract\/bg&gt;_all.csv&quot;<\/span> <span class=\"c1\"># update the &lt;subindex&gt; and choose tracts or bg<\/span> <\/span><span id=\"__span-2-6\"><a id=\"__codelineno-2-6\" name=\"__codelineno-2-6\" href=\"#__codelineno-2-6\"><\/a><span class=\"p\">)<\/span> <\/span><span id=\"__span-2-7\"><a id=\"__codelineno-2-7\" name=\"__codelineno-2-7\" href=\"#__codelineno-2-7\"><\/a> <\/span><span id=\"__span-2-8\"><a id=\"__codelineno-2-8\" name=\"__codelineno-2-8\" href=\"#__codelineno-2-8\"><\/a><span class=\"n\">calculate_<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">subindex<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span> <\/span><span id=\"__span-2-9\"><a id=\"__codelineno-2-9\" name=\"__codelineno-2-9\" href=\"#__codelineno-2-9\"><\/a> <span class=\"n\">input_geojson<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;path_to_your_geojson_file.geojson&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># Replace with your census tract or blockgroup GeoJSON file<\/span> <\/span><span id=\"__span-2-10\"><a id=\"__codelineno-2-10\" name=\"__codelineno-2-10\" href=\"#__codelineno-2-10\"><\/a> <span class=\"n\">output_prefix<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;tracts&gt; or &lt;block_groups&gt;&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># tracts or bg based on if we are analyzing tracts or blockgroups<\/span> <\/span><span id=\"__span-2-11\"><a id=\"__codelineno-2-11\" name=\"__codelineno-2-11\" href=\"#__codelineno-2-11\"><\/a> <span class=\"n\">year<\/span><span class=\"o\">=<\/span><span class=\"mi\">2017<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-2-12\"><a id=\"__codelineno-2-12\" name=\"__codelineno-2-12\" href=\"#__codelineno-2-12\"><\/a> <span class=\"n\">aggregate_file<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;subindex&gt;_&lt;tract\/bg&gt;_all.csv&quot;<\/span> <span class=\"c1\"># update the &lt;subindex&gt; and choose tracts or bg<\/span> <\/span><span id=\"__span-2-13\"><a id=\"__codelineno-2-13\" name=\"__codelineno-2-13\" href=\"#__codelineno-2-13\"><\/a><span class=\"p\">)<\/span> <\/span><span id=\"__span-2-14\"><a id=\"__codelineno-2-14\" name=\"__codelineno-2-14\" href=\"#__codelineno-2-14\"><\/a> <\/span><span id=\"__span-2-15\"><a id=\"__codelineno-2-15\" name=\"__codelineno-2-15\" href=\"#__codelineno-2-15\"><\/a><span class=\"n\">calculate_<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">subindex<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span> <\/span><span id=\"__span-2-16\"><a id=\"__codelineno-2-16\" name=\"__codelineno-2-16\" href=\"#__codelineno-2-16\"><\/a> <span class=\"n\">input_geojson<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;path_to_your_geojson_file.geojson&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># Replace with your census tract or blockgroup GeoJSON file<\/span> <\/span><span id=\"__span-2-17\"><a id=\"__codelineno-2-17\" name=\"__codelineno-2-17\" href=\"#__codelineno-2-17\"><\/a> <span class=\"n\">output_prefix<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;tracts&gt; or &lt;block_groups&gt;&quot;<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># tracts or bg based on if we are analyzing tracts or blockgroups<\/span> <\/span><span id=\"__span-2-18\"><a id=\"__codelineno-2-18\" name=\"__codelineno-2-18\" href=\"#__codelineno-2-18\"><\/a> <span class=\"n\">year<\/span><span class=\"o\">=<\/span><span class=\"mi\">2022<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-2-19\"><a id=\"__codelineno-2-19\" name=\"__codelineno-2-19\" href=\"#__codelineno-2-19\"><\/a> <span class=\"n\">aggregate_file<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;&lt;subindex&gt;_&lt;tract\/bg&gt;_all.csv&quot;<\/span> <span class=\"c1\"># update the &lt;subindex&gt; and choose tracts or bg<\/span> <\/span><span id=\"__span-2-20\"><a id=\"__codelineno-2-20\" name=\"__codelineno-2-20\" href=\"#__codelineno-2-20\"><\/a><span class=\"p\">)<\/span> <\/span><\/code><\/pre><\/div> <h3 id=\"step-3-run-scripts-in-the-following-order\">Step 3: Run Scripts in the Following Order<\/h3> <ol> <li><strong>Run the Subindex Generators<\/strong>:<br \/> Execute the following scripts to calculate raw subindices:<\/li> <li><code>CDI_Generator.ipynb<\/code><\/li> <li><code>LDI_Generator.ipynb<\/code><\/li> <li> <p><code>IDI_Generator.ipynb<\/code><br \/> These can be run in any order.<\/p> <\/li> <li> <p><strong>Run PDI<\/strong><\/p> <\/li> <li>For small input files (not many tracts or geojsons), run our current <code>PDI_Generator.ipynb<\/code>.<\/li> <li> <p>For larger files, a custom approach using CSV files from <a href=\"https:\/\/mcdc.missouri.edu\/cgi-bin\/uexplore?\/data\">Missouri Census Data Center (MCDC)<\/a> is requied: - For this, please contact cnguyen369@gatech.edu<\/p> <\/li> <li> <p><strong>Normalize Subindices<\/strong>:<br \/> Run <code>Normalizer.ipynb<\/code> to normalize the raw subindices across all years and cities.<\/p> <\/li> <li> <p><strong>Generate PEI<\/strong>:<br \/> Finally, run <code>PEI_Generator.ipynb<\/code> to calculate the Pedestrian Environment Index.<\/p> <\/li> <\/ol> <h3 id=\"step-4-output\">Step 4: Output<\/h3> <ul> <li>This process will output normalized subindex files and the final PEI results as CSV and GeoJSON files.<\/li> <li>The file format will be:<ul> <li><code>&lt;subindex&gt;_&lt;city&gt;_&lt;year&gt;.csv\/geojson<\/code><\/li> <\/ul> <\/li> <li>Utilize the <code>Subindex_Visualizer.ipynb<\/code> file to visualize your geojson file output!<\/li> <\/ul> <hr \/> <h2 id=\"7-challenges\">7. Challenges<\/h2> <h3 id=\"the-biggest-challege-in-our-statistic-generators-was-developing-the-pdi-generator\">The biggest challege in our statistic generators was developing the PDI Generator.<\/h3> <ul> <li> <p>While most of our subindexes - <code>CDI<\/code>, <code>LDI<\/code>, <code>IDI<\/code> - use the <code>Overpass API (OSM data)<\/code> to gather data, this is not possible for the <code>PDI<\/code> as population data is not provided by OSM.<\/p> <\/li> <li> <p>Because of this, we were forced to utilize the <code>Census API<\/code>, which had 2 main issues:<\/p> <ul> <li>It often returned simply the latest data i.e. 2024 data - even when we requested historical population data.<\/li> <li>On large geoJSONs, where we have to make hundreds and thousands of API calls, the Census API frequently errored due to API call limits.<ul> <li>This became a considerable problem when running our files using <code>PACE<\/code> to generate Census Tract data for Dr Ku. Our code would run for 10 or so hours and then fail - as we would run out of API tokens.<\/li> <\/ul> <\/li> <\/ul> <\/li> <li> <p>We got over this challenge by downloading population data by tract\/block group directly - from <a href=\"https:\/\/mcdc.missouri.edu\/cgi-bin\/uexplore?\/data\">Missouri Census Data Center (MCDC)<\/a><\/p> <\/li> <li>We could then easily calculate <code>Population Density<\/code> and hence <code>PDI<\/code> by block_group\/tract by merging this data with our block_groups\/tracts geoJSON files - which contain an area column.<\/li> <\/ul> <hr \/> <h2 id=\"fall-2025-additions-summary\"><strong>Fall 2025 Additions Summary<\/strong><\/h2> <p>We had 3 main goals this semester: - Adding new subindexes to the overall PEI, to flesh out the statistic and ensure it is as comprehensive as possible. - Update the web app with a few new features: namely allowing for \"sliders\", so that users can customize subindex weights (as well as potentially figuring out how to display our 100mb+ nationwide data onto the web app). - Continuing to work alongside Dr Ku with both data generation and tool creation for his research linking mental health issues to walkability.<\/p> <hr \/> <h2 id=\"8-fall-2025-additions-bike-infrastructure-index-bii\">8. Fall 2025 Additions - Bike Infrastructure Index (BII)<\/h2> <h3 id=\"overview\">Overview<\/h3> <p>The Bike Infrastructure index scores an area based on the quantity and quality of bike infrastructure.<\/p> <p><strong>Motivation:<\/strong> Research has shown how closely related bike-ability and walkability are to a well designed urban environment. Our current approach to PEI ignored biking as a factor, so we wanted to develop a new index that incorporates biking. <\/p> <h3 id=\"central-idea\">Central Idea<\/h3> <p>Map out all bikeable roads in a given area. Then categorize these roads by how beneficial they are as biking infrastructure. Finally find the distance that the infrastructure covers relative to area.<\/p> <h3 id=\"methodology\">Methodology<\/h3> <h4 id=\"1-weight-each-major-category-of-bike-infrastructure-from-osm-data\">1) Weight each major category of bike infrastructure from OSM data.<\/h4> <div class=\"arithmatex\">\\[ \\text{Separate\/Protected\/Path\/Cycle Streets} = \\text{0.5} $$ $$ \\text{Painted Lanes} = \\text{0.25} $$ $$ \\text{Shared Roads} = \\text{0.15} $$ $$ \\text{Local Roads} = \\text{0.1} \\]<\/div> <h4 id=\"2-score-each-piece-of-infrastructure-based-on-length-and-weight\">2) Score each piece of infrastructure based on length and weight<\/h4> <div class=\"arithmatex\">\\[ \\text{Infrastructure Score} = \\text{Category weight} * \\text{Infrastructure distance} \\]<\/div> <h4 id=\"3-sum-score-for-a-given-area\">3) Sum score for a given area<\/h4> <div class=\"arithmatex\">\\[ \\text{AreaScore} = \\sum_{i=1}^{n} \\text{Infrastructure Score}_i \\]<\/div> <h4 id=\"4-normalize-by-area-size\">4) Normalize by area size<\/h4> <div class=\"arithmatex\">\\[ \\text{BII} = \\frac{\\text{AreaScore}}{\\text{AreaSize}} \\]<\/div> <h3 id=\"data-collection\">Data Collection<\/h3> <p>We used <strong>OpenStreetMap (OSM)<\/strong> to identify and extract bike infrastructure through relevant polygon-based tags, including:<\/p> <ul> <li>\"bicycle\": True, \"bicycle:conditional\": True, \"bicycle_road\": True, \"cyclestreet\": True,<\/li> <li>\"cycleway\": True, \"cycleway:segregated\": True, \"cycleway:both\": True,<\/li> <li>\"cycleway:both:segregated\": True, \"cycleway:left\": True, \"cycleway:left:oneway\": True,<\/li> <li>\"cycleway:left:segregated\": True, \"cycleway:right\": True, \"cycleway:right:oneway\": True,<\/li> <li>\"cycleway:right:segregated\": True, \"oneway\": True, \"oneway:bicycle\": True,<\/li> <li>\"direction\": True, \"ramp:bicycle\": True, \"segregated\": True, \"highway\": True, \"access\": True,<\/li> <li>\"access:conditional\": True, \"foot\": True, \"route\": True, \"network\": True, \"ref\": True<\/li> <\/ul> <p>After collecting this data we had to do a lot of filtering to make sure roads were only counted once, to make sure only roads that had the bike tag were included, and to make sure no roads for only cars were included.<\/p> <h3 id=\"results-visualization\">Results &amp; Visualization<\/h3> <p>We were able to generate BII across 2013, 2017, and 2022 for Atlanta. The percent change of BII across all three years is shown below. <\/p> <p align=\"center\"> <img src=\"BikeInfrastructureIndex\/BII_percentchange.png\" width=\"500\" alt=\"Atlanta BII\"> <\/p> <p>The image suggests that Atlanta has become more bikeable over time. This analysis perfects algins with the continued investment into bike infrastructure projects by the city of Atlanta.<\/p> <p>The next steps of BII is to generate data across the US so that it can properly be integrated into the website and PEI database.<\/p> <h2 id=\"9-fall-2025-additions-road-safety-index-rsi\">9. Fall 2025 Additions - Road Safety index (RSI)<\/h2> <h3 id=\"overview_1\">Overview<\/h3> <p>The Road Safety Index quantifies how safe (and therefore how walkable) an area is <strong>based on the speed limits of its roads<\/strong>.<\/p> <p><strong>Motivation:<\/strong> Research consistently shows a strong relationship between <strong>road speed<\/strong> and <strong>pedestrian injury severity and pedestrian safety<\/strong>. Thus, we wanted to develop an index that accounts for how road speeds in neighborhoods can affect pedestrian safety, and consequently that area's walkability.<\/p> <h3 id=\"central-idea_1\">Central Idea<\/h3> <p>We treated <strong>higher road speeds as higher risk<\/strong> for pedestrians. RSI computes a <strong>risk score per road segment<\/strong>, then aggregates to an <strong>area-level score<\/strong> (e.g., census block group \/ tract) to visualize relative safety\/walkability.<\/p> <h3 id=\"methodology_1\">Methodology<\/h3> <h4 id=\"1-risk-from-speed-nilssons-power-model\">1) Risk from speed: Nilsson\u2019s Power Model<\/h4> <p>We used <strong>Nilsson\u2019s Power Model<\/strong> to translate traffic speed into expected changes in crash outcomes.<\/p> <div class=\"arithmatex\">\\[ R_{\\text{road}} = \\left(\\frac{v}{v_0}\\right)^{\\beta} \\]<\/div> <h4 id=\"2-road-level-safety-score-baseline-20-mph\">2) Road-level safety score (baseline = 20 mph)<\/h4> <p>Using a baseline speed of <strong>20 mph<\/strong>, we compute a risk score per road segment:<\/p> <div class=\"arithmatex\">\\[ \\text{RiskScore} = \\left(\\frac{\\text{RoadSpeed}}{20}\\right)^{1.5} \\]<\/div> <h4 id=\"3-weight-by-road-segment-length\">3) Weight by road segment length<\/h4> <p>Longer roads should contribute more to an area\u2019s overall safety score, so we weight each segment by its length:<\/p> <div class=\"arithmatex\">\\[ \\text{SegmentRisk} = \\text{SegmentLength} \\cdot \\text{RiskScore} \\]<\/div> <h4 id=\"4-aggregate-to-area-block-group-tract\">4) Aggregate to area (block group \/ tract)<\/h4> <p>We aggregate all segment contributions inside each area:<\/p> <div class=\"arithmatex\">\\[ \\text{AreaScore} = \\sum_{i=1}^{n} \\text{SegmentRisk}_i \\]<\/div> <h4 id=\"5-optional-normalization-by-area-size\">5) Optional normalization by area size<\/h4> <p>To compare areas of different sizes, we optionally normalize by geographic area:<\/p> <div class=\"arithmatex\">\\[ \\text{FinalRSI} = \\frac{\\text{AreaScore}}{\\text{AreaSize}} \\]<\/div> <h3 id=\"data-collection_1\">Data Collection<\/h3> <h4 id=\"challenge-missing-speed-limits-in-openstreetmap\">Challenge: Missing speed limits in OpenStreetMap<\/h4> <p>OpenStreetMap (OSM) does <strong>not<\/strong> have comprehensive <code>maxspeed<\/code> data across all roads. To address this, we used a <strong>policy-driven approach<\/strong>:<\/p> <ol> <li>Research <strong>state legal documentation<\/strong> for default speed limits by road type <\/li> <li>Match default limits to roads using <strong>OSM highway tags<\/strong> <\/li> <li>Assign inferred speeds where <code>maxspeed<\/code> is missing<\/li> <\/ol> <p>We focused on OSM highway tags that are most likely to affect pedestrian environments: - <code>tertiary<\/code> - <code>residential<\/code> - <code>unclassified<\/code><\/p> <h3 id=\"results-visualization_1\">Results &amp; Visualization<\/h3> <p>This semester, we focused on producing RSI data for the Atlanta area. Below, you will find a graph visualizing how walkable Atlanta is based on our RSI calculations. Note: Lower RSI scores means an area is more walkable.<\/p> <p align=\"center\"> <img src=\"RoadSafetyIndex\/atlanta_rsi_map.png\" width=\"500\" alt=\"Atlanta Road Safety Index Map\"> <\/p> <p>Several of the highest-safety block groups identified by RSI correspond to: - Smaller\/local streets<br \/> - Greener residential environments<br \/> - Lower-speed road networks<\/p> <p>There are still improvements that we are interested in making to RSI such as taking into account roads with other highway tags on OSM into our calculations and looking into decreasing the risk score for road segements that have an attached sidewalk.<\/p> <hr \/> <h2 id=\"10-fall-2025-additions-social-greenspace-index-sgi\">10. Fall 2025 Additions \u2013 Social Greenspace Index (SGI)<\/h2> <h3 id=\"overview_2\">Overview<\/h3> <p>The <strong>Social Greenspace Index (SGI)<\/strong> introduces a new dimension of walkability to the Pedestrian Environment Index (PEI) by quantifying <strong>access to outdoor social greenspaces<\/strong> within a given area.<\/p> <p><strong>Motivation:<\/strong> While greenspace is often measured through environmental indicators such as tree canopy coverage, air quality, or climate conditions, this subindex focuses specifically on <strong>man-made, social outdoor spaces<\/strong>\u2014places where people actively gather, recreate, and spend time outdoors. We hypothesize that <strong>areas with more accessible social greenspaces are inherently more walkable<\/strong>, as these spaces both encourage and require pedestrian activity.<\/p> <h3 id=\"central-idea_2\">Central Idea<\/h3> <p>SGI treats <strong>social greenspace area as a proxy for pedestrian-oriented urban design<\/strong>. Rather than counting the number of greenspace features, the index measures the <strong>total area of social greenspaces<\/strong> within a census tract relative to the tract\u2019s total land area.<\/p> <p>This approach prioritizes: - Parks and playgrounds<br \/> - Dog parks and recreational fields<br \/> - Stadiums and other outdoor gathering spaces <\/p> <p>The underlying assumption is that <strong>the more space a neighborhood devotes to outdoor social activity, the more conducive it is to walking<\/strong>.<\/p> <hr \/> <h3 id=\"methodology_2\">Methodology<\/h3> <h4 id=\"1-defining-social-greenspace\">1) Defining Social Greenspace<\/h4> <p>SGI began as a broader <strong>Environmental Index<\/strong>, initially exploring factors such as: - Tree canopy coverage<br \/> - Climate variation<br \/> - Air quality (e.g., CDC air quality datasets)<\/p> <p>However, the scope was narrowed to focus on <strong>social greenspace<\/strong>, as this more directly reflects pedestrian use and walkability rather than environmental conditions alone.<\/p> <h4 id=\"2-data-source-openstreetmap-osm\">2) Data source: OpenStreetMap (OSM)<\/h4> <p>We used <strong>OpenStreetMap (OSM)<\/strong> to identify and extract social greenspaces through relevant polygon-based tags, including:<\/p> <ul> <li><code>leisure<\/code>: <code>park<\/code>, <code>playground<\/code>, <code>dog_park<\/code>, <code>stadium<\/code>, <code>common<\/code><\/li> <li><code>natural<\/code>: <code>grassland<\/code>, <code>wood<\/code>, <code>fell<\/code><\/li> <li><code>landuse<\/code>: <code>meadow<\/code>, <code>vineyard<\/code><\/li> <\/ul> <p>Unlike count-based indices, SGI relies on <strong>area-based polygons<\/strong>, allowing us to capture the actual spatial footprint of greenspaces.<\/p> <h4 id=\"3-area-based-scoring\">3) Area-based scoring<\/h4> <p>For each census tract, the Social Greenspace Index is computed as:<\/p> <div class=\"arithmatex\">\\[ \\text{SGI} = \\frac{\\text{Total Social Greenspace Area}}{\\text{Total Tract Area}} \\]<\/div> <p>This produces a <strong>normalized score between 0 and 1<\/strong>, enabling comparison across tracts of different sizes.<\/p> <h4 id=\"4-integration-with-existing-pei-structure\">4) Integration with existing PEI structure<\/h4> <p>SGI was designed to align with the existing PEI framework and methodology, adapting concepts from prior density-based subindices (e.g., CDI) while shifting from <strong>point counts to polygonal area aggregation<\/strong>.<\/p> <hr \/> <h3 id=\"results-visualization_2\">Results &amp; Visualization<\/h3> <p>This semester, SGI was implemented and visualized for the <strong>Atlanta metropolitan area<\/strong>, with results shown for census tracts across multiple years (2013, 2017, and 2022). This is the visualization for 2022:<\/p> <p align=\"center\"> <img src=\"SocialGreenspaceIndex\/greenspace_fraction_2022map.png\" width=\"500\" alt=\"Atlanta Social Greenspace Index Maps (2013\u20132022)\"> <\/p> <p>Across the three time periods, the visualizations suggest that <strong>Atlanta has become more walkable over time when evaluated through the lens of social greenspace availability<\/strong>. Several tracts show noticeable increases in greenspace fraction, particularly in areas surrounding large parks and recreational corridors.<\/p> <hr \/> <h3 id=\"limitations-future-work\">Limitations &amp; Future Work<\/h3> <p>While SGI provides a meaningful new perspective on walkability, several limitations remain and will be addressed in future work:<\/p> <ol> <li><strong>Polygon overlay verification<\/strong> <\/li> <li> <p>A full validation of the spatial overlay process is needed to ensure all greenspace polygons are correctly intersected with census tract boundaries.<\/p> <\/li> <li> <p><strong>Computational efficiency<\/strong> <\/p> <\/li> <li> <p>Area-based polygon processing is computationally intensive. Future iterations will focus on optimizing spatial operations to support <strong>nationwide implementation<\/strong>.<\/p> <\/li> <li> <p><strong>Comparison with original Environmental Index concept<\/strong> <\/p> <\/li> <li>A formal comparison between the initial Environmental Index (tree canopy, air quality, climate) and SGI will be conducted to evaluate their relative explanatory power for walkability outcomes.<\/li> <\/ol> <hr \/> <h2 id=\"11-fall-2025-additions-dr-ku-research-updates\">11. Fall 2025 Additions \u2014 Dr. Ku Research Updates<\/h2> <h3 id=\"pei-analysis-updates\">PEI Analysis Updates<\/h3> <p>This semester included several important research updates from Dr. Ku\u2019s group. As shown below, the analysis found a <strong>strong association between census tract\u2013level Pedestrian Environment Index (PEI) and distressing Psychotic-Like Experiences (PLEs)<\/strong>. Notably, this relationship remained significant after adjusting for a comprehensive set of individual- and neighborhood-level covariates, including:<\/p> <ul> <li>Age <\/li> <li>Sex <\/li> <li>Race\/ethnicity <\/li> <li>Parental education <\/li> <li>Family history of psychosis <\/li> <li>Financial adversity <\/li> <li>Neighborhood crime <\/li> <li>Neighborhood population density <\/li> <\/ul> <p align=\"center\"> <img src=\"NeighborhoodMatcher\/PEI_Association.png\" width=\"500\" alt=\"PEI association results\"> <\/p> <hr \/> <h3 id=\"neighborhood-matching-tool-paper-code\">Neighborhood Matching Tool \u2014 Paper &amp; Code<\/h3> <p>In parallel with this analysis, we completed a paper this semester describing the design and implementation of our <strong>Neighborhood Matching tool<\/strong>, which enables privacy-preserving linkage between participant-level data and census tract\u2013level neighborhood measures.<\/p> <p><strong>Code repository:<\/strong><br \/> \ud83d\udd17 https:\/\/github.com\/SustainableUrbanSystemsLab\/NeighborhoodMatcher<\/p> <hr \/> <h2 id=\"12-overall-future-work\">12. Overall Future Work<\/h2> <p>To improve the comprehensiveness of the Public Infrastructure Environment (PIE) framework, a major future goal is to expand the number of subindices beyond the current set.<br \/> If we were to do this, we also want to make sure that they are properly integrated into PEI.<\/p> <p>Planned improvements include:<\/p> <ul> <li> <p><strong>More New Subindices<\/strong>:<\/p> <ul> <li>The more the merrier! Because we have shifted to a \"slider\" approach, where users customize their subindex weights towards overall PEI based on their personal needs. Adding new subindices will only further improve on not only the comprehensiveness of PEI, but also on the customizability of our product. <\/li> <\/ul> <\/li> <li> <p><strong>Integrate the Subindices fully with our current PEI<\/strong>:<\/p> <ul> <li>As mentioned above we now have data for Atlanta for 4 new subindices, but we now must re-run our PEI generation pipeline to fully integrate these 4 into our nationwide datasets. Additionally, we will work towards adding the 4 new subindices to our web app.<\/li> <\/ul> <\/li> <li> <p><strong>Web App Expansion<\/strong>:<\/p> <ul> <li>While we have nationwide datasets, our web app still only displays Atlanta data. We will work on adding new cities and potentially even adding nationwide data. We also want <\/li> <\/ul> <\/li> <li> <p><strong>Official Publication<\/strong>:<\/p> <ul> <li>Publish our research officially and publicly to help advance urban sustainability.<\/li> <\/ul> <\/li> <li> <p><strong>Ground-Truthing<\/strong>: <\/p> <ul> <li>Conduct surveys and other research to validate PEI accuracy and compare with other walkability models.<\/li> <\/ul> <\/li> <\/ul> <hr \/> <h2 id=\"13-contributing\">13. Contributing<\/h2> <p>We welcome contributions to this project. <\/p> <h3 id=\"steps-to-contribute\">Steps to Contribute:<\/h3> <ol> <li>Fork the repository.<\/li> <li>Create a feature branch: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-3-1\"><a id=\"__codelineno-3-1\" name=\"__codelineno-3-1\" href=\"#__codelineno-3-1\"><\/a>git<span class=\"w\"> <\/span>checkout<span class=\"w\"> <\/span>-b<span class=\"w\"> <\/span>feature\/new-feature <\/span><\/code><\/pre><\/div><\/li> <li>Push your changes and submit a pull request.<\/li> <\/ol> <hr \/> <h2 id=\"14-license\">14. License<\/h2> <p>This project is shared for research and educational purposes. Please do not redistribute for commercial use.<\/p> <hr \/> <h1 id=\"web-app-documentation\">Web App Documentation<\/h1> <p>The web app is currently deployed at this link: https:\/\/vip-pei-app-2.onrender.com\/ \ud83d\ude0a<\/p> <p>This deployment is dynamic and so any updates to our codebase (https:\/\/github.com\/AtharvaBeesen\/vip-pei-app-2) will automatically be displayed.<\/p> <h2 id=\"1-introduction\">1. Introduction<\/h2> <ul> <li><strong>App Name<\/strong>: VIP SMUR PEI Proof of Concept<\/li> <li><strong>Purpose<\/strong>: Visualize the work we have done in creating the aforementioned subindexes. We also wanted to allow the data we generate to be available online in a visually appealing, paletable, and easy-to-download way.<\/li> <\/ul> <h3 id=\"key-features\">Key Features:<\/h3> <ul> <li>Interactive map with GeoJSON visualization for the subindexes - PDI, IDI, CDI, LDI, PEI - across different cities and years.<\/li> <li>Dynamic city, statistic, and year selection.<\/li> <li>Ability to download CSV and GeoJSON files for selected data.<\/li> <\/ul> <h3 id=\"technology-stack\">Technology Stack:<\/h3> <ul> <li><strong>Frontend<\/strong>: React, JavaScript, HTML, CSS<\/li> <li><strong>Backend<\/strong>: All functionality contained within JavaScript<\/li> <li><strong>Mapping Library<\/strong>: Leaflet<\/li> <li><strong>Data Source<\/strong>: Amazon S3 Buckets<\/li> <\/ul> <h2 id=\"2-getting-started_1\">2. Getting Started<\/h2> <h3 id=\"prerequisites_1\">Prerequisites<\/h3> <ol> <li> <p><strong>Node.js and npm\/yarn<\/strong>:<br \/> Ensure Node.js and npm (or yarn) are installed on your system. You can check this by running: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-4-1\"><a id=\"__codelineno-4-1\" name=\"__codelineno-4-1\" href=\"#__codelineno-4-1\"><\/a>node<span class=\"w\"> <\/span>-v <\/span><span id=\"__span-4-2\"><a id=\"__codelineno-4-2\" name=\"__codelineno-4-2\" href=\"#__codelineno-4-2\"><\/a>npm<span class=\"w\"> <\/span>-v <\/span><\/code><\/pre><\/div> If not installed, download them from <a href=\"https:\/\/nodejs.org\/\">Node.js official site<\/a>.<\/p> <\/li> <li> <p><strong>Code Editor (Optional)<\/strong>:<br \/> Install a code editor like <a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a>.<\/p> <\/li> <li> <p><strong>Browser<\/strong>:<br \/> A modern browser like Chrome, Firefox, or Edge to test your app.<\/p> <\/li> <li> <p><strong>Git<\/strong>:<br \/> Install Git for cloning the repository. Check installation by running: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-5-1\"><a id=\"__codelineno-5-1\" name=\"__codelineno-5-1\" href=\"#__codelineno-5-1\"><\/a>git<span class=\"w\"> <\/span>--version <\/span><\/code><\/pre><\/div><\/p> <\/li> <li> <p><strong>Leaflet Library Dependencies<\/strong>:<br \/> The app uses Leaflet for maps, which requires:<\/p> <\/li> <li>A valid internet connection to download Leaflet assets via npm or yarn.<\/li> <li>Ensure the browser supports Leaflet.<\/li> <\/ol> <h3 id=\"installation_1\">Installation<\/h3> <ol> <li>Clone the repository: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-6-1\"><a id=\"__codelineno-6-1\" name=\"__codelineno-6-1\" href=\"#__codelineno-6-1\"><\/a>git<span class=\"w\"> <\/span>clone<span class=\"w\"> <\/span>https:\/\/github.com\/AtharvaBeesen\/vip-pei-app-2.git <\/span><\/code><\/pre><\/div><\/li> <li>Install dependencies: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-7-1\"><a id=\"__codelineno-7-1\" name=\"__codelineno-7-1\" href=\"#__codelineno-7-1\"><\/a>npm<span class=\"w\"> <\/span>install <\/span><\/code><\/pre><\/div><\/li> <li>Ensure Leaflet is installed: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-8-1\"><a id=\"__codelineno-8-1\" name=\"__codelineno-8-1\" href=\"#__codelineno-8-1\"><\/a>npm<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>leaflet <\/span><\/code><\/pre><\/div><\/li> <li>Run the application: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-9-1\"><a id=\"__codelineno-9-1\" name=\"__codelineno-9-1\" href=\"#__codelineno-9-1\"><\/a>npm<span class=\"w\"> <\/span>start <\/span><\/code><\/pre><\/div><\/li> <li>Access the app at <code>http:\/\/localhost:3000<\/code>.<\/li> <\/ol> <h3 id=\"deployment\">Deployment<\/h3> <ul> <li>Already deployed! We deployed using <code>Render<\/code>:<br \/> <a href=\"https:\/\/vip-pei-app-2.onrender.com\/\">https:\/\/vip-pei-app-2.onrender.com\/<\/a> <\/li> <\/ul> <hr \/> <h2 id=\"3-features\">3. Features<\/h2> <h3 id=\"31-interactive-map\">3.1 Interactive Map<\/h3> <ul> <li>Displays GeoJSON data visualized on a Leaflet map.<\/li> <li>Map dynamically updates based on city, statistic, and year selections.<\/li> <\/ul> <h3 id=\"32-city-statistic-and-year-selection\">3.2 City, Statistic, and Year Selection<\/h3> <ul> <li>Dropdown menus for users to select:<\/li> <li><strong>Cities<\/strong>: Atlanta, New York, Los Angeles.<\/li> <li><strong>Statistics<\/strong>: IDI, PDI, CDI, LDI, PEI.<\/li> <li><strong>Years<\/strong>: 2022, 2013.<\/li> <\/ul> <h3 id=\"33-file-downloads\">3.3 File Downloads<\/h3> <ul> <li>CSV and GeoJSON files for the selected data can be downloaded with a single click.<\/li> <\/ul> <hr \/> <h2 id=\"4-components\">4. Components<\/h2> <h3 id=\"41-appjs\">4.1 App.js<\/h3> <ul> <li>The main entry point for the application.<\/li> <li>Manages state for selected city, statistic, and year.<\/li> <li>Renders <code>CitySelector<\/code>, <code>DownloadButton<\/code>, and <code>MapComponent<\/code>.<\/li> <\/ul> <h3 id=\"42-cityselectorjs\">4.2 CitySelector.js<\/h3> <ul> <li>Dropdown menus for selecting city, statistic, and year.<\/li> <li>Capitalizes city names and statistics for user-friendly display.<\/li> <\/ul> <h3 id=\"43-mapcomponentjs\">4.3 MapComponent.js<\/h3> <ul> <li>Displays the Leaflet map and GeoJSON data.<\/li> <li>Dynamically fetches data from S3 Buckets based on user selections (more on this below).<\/li> <li>Highlights GeoJSON features with a color-coded scheme based on statistic values.<\/li> <\/ul> <h3 id=\"44-downloadbuttonjs\">4.4 DownloadButton.js<\/h3> <ul> <li>Provides buttons to download CSV and GeoJSON files from S3.<\/li> <li>Dynamically constructs download URLs based on user selections.<\/li> <\/ul> <hr \/> <h2 id=\"5-api-integration\">5. API Integration<\/h2> <p>The app dynamically fetches GeoJSON data from an Amazon S3 bucket: - URL format:<br \/> <code>https:\/\/vip-censusdata.s3.us-east-2.amazonaws.com\/{city}_blockgroup_{statistic}_{year}.geojson<\/code><\/p> <h3 id=\"example\">Example:<\/h3> <p>For Atlanta, IDI, and 2022:<br \/> <code>https:\/\/vip-censusdata.s3.us-east-2.amazonaws.com\/atlanta_blockgroup_IDI_2022.geojson<\/code><\/p> <hr \/> <h2 id=\"5-city-comparison-tool-spring-2025\">5. City Comparison Tool (Spring 2025)<\/h2> <h3 id=\"1-overview\"><strong>1. Overview<\/strong><\/h3> <p>We created a City Comparison Tool MVP to allow users to dynamically compare changes in walkability-related subindices (IDI, PDI, CDI, LDI, PEI) between two different years for a selected city.<\/p> <p>This tool calculates and visualizes the <strong>percentage change<\/strong> in the selected statistic for each census block group, helping to identify areas that have improved or declined over time.<\/p> <h3 id=\"2-key-features\"><strong>2. Key Features<\/strong><\/h3> <ul> <li> <p><strong>City Selection<\/strong>:<br \/> Compare changes for Atlanta, New York, or Los Angeles.<\/p> <\/li> <li> <p><strong>Statistic Selection<\/strong>:<br \/> Choose one of the following subindices to analyze:<\/p> <\/li> <li>Intersection Density Index (IDI)<\/li> <li>Population Density Index (PDI)<\/li> <li>Commercial Density Index (CDI)<\/li> <li>Land-use Diversity Index (LDI)<\/li> <li> <p>Pedestrian Environment Index (PEI)<\/p> <\/li> <li> <p><strong>Year Selection<\/strong>:<br \/> Select two different years to calculate the percent change.<\/p> <\/li> <li> <p><strong>Dynamic GeoJSON Visualization<\/strong>:<br \/> The map displays block groups color-coded by the percentage change in the selected statistic.<\/p> <\/li> <li> <p><strong>Interactive Tooltips<\/strong>:<br \/> Hovering over a block group shows its GEOID and computed percent change.<\/p> <\/li> <li> <p><strong>Custom Color Scale<\/strong>:<br \/> The visualization uses a diverging color scheme to easily distinguish between positive and negative changes.<\/p> <\/li> <\/ul> <hr \/> <h3 id=\"3-technical-workflow\"><strong>3. Technical Workflow<\/strong><\/h3> <ul> <li> <p><strong>Data Fetching<\/strong>:<br \/> The tool fetches the respective city's GeoJSON files for both selected years from the Amazon S3 bucket.<\/p> <\/li> <li> <p><strong>Difference Calculation<\/strong>: <\/p> <\/li> <li> <p>For most subindices (IDI, PDI, CDI, PEI), block groups are matched by <strong>GEOID<\/strong>.<\/p> <\/li> <li> <p><strong>Percent Change Computation<\/strong>:<br \/> The percent change for each block group is calculated as:<\/p> <\/li> <\/ul> <div class=\"arithmatex\">\\[ \\text{Percent Change} = \\frac{(\\text{After Value} - \\text{Before Value})}{\\text{Before Value}} \\times 100 \\]<\/div> <ul> <li><strong>Visualization<\/strong>:<\/li> <li>Block groups are shaded according to the magnitude of their percent change.<\/li> <li> <p>Tooltips display the block group ID and the exact percent change.<\/p> <\/li> <li> <p><strong>Robust Edge Case Handling<\/strong>:<\/p> <\/li> <li>If both before and after values are zero, the percent change is set to 0.<\/li> <li>If a before value is zero and after is nonzero, the block group is highlighted accordingly without division errors.<\/li> <\/ul> <hr \/> <h3 id=\"4-known-limitations\"><strong>4. Known Limitations<\/strong><\/h3> <ul> <li>Only a few cities and years are currently available.<\/li> <\/ul> <hr \/> <h3 id=\"5-future-work\"><strong>5. Future Work<\/strong><\/h3> <ul> <li>Add more cities and historical years to expand the tool\u2019s coverage.<\/li> <li>Improve LDI data quality by assigning proper GEOIDs.<\/li> <li>Integrate this comparison tool directly into the main PEI web app navigation.<\/li> <li>Add multi-year trend graphs and regional aggregation for deeper urban insights.<\/li> <li>Allow users to select multiple subindices at once for richer comparisons.<\/li> <\/ul> <hr \/> <h2 id=\"6-metric-weighting-composite-score-tool-spring-2025\">6. Metric Weighting &amp; Composite Score Tool (Spring 2025)<\/h2> <h3 id=\"1-overview_1\"><strong>1. Overview<\/strong><\/h3> <p>We built a Metric Weighting and Composite Score tool that lets users control how different walkability subindices contribute to an overall score at the census block group level.<\/p> <p>Instead of showing a single fixed index, this feature allows users to adjust the importance of each subindex using sliders and immediately see how those choices change the map. This makes it easier to explore how different definitions of \u201cwalkability\u201d affect walkability patterns across a city.<\/p> <hr \/> <h3 id=\"2-key-features_1\"><strong>2. Key Features<\/strong><\/h3> <ul> <li><strong>Interactive Metric Sliders<\/strong><br \/> Users can adjust the relative weight (0\u2013100%) of each subindex:<\/li> <li>Intersection Density Index (IDI)<\/li> <li>Land-use Diversity Index (LDI)<\/li> <li>Population Density Index (PDI)<\/li> <li> <p>Commercial Density Index (CDI)<\/p> <\/li> <li> <p><strong>Live Map Updates<\/strong><br \/> Any change to a slider instantly recalculates scores and updates the map.<\/p> <\/li> <li> <p><strong>Weighted Composite Scores<\/strong><br \/> Each block group receives a composite score based on the selected weights.<\/p> <\/li> <li> <p><strong>Color-Coded Visualization<\/strong><br \/> Block groups are shaded using a green\u2013yellow\u2013red scale, where higher values indicate more favorable pedestrian environments.<\/p> <\/li> <li> <p><strong>Informative Tooltips<\/strong><br \/> Hovering over a block group displays:<\/p> <\/li> <li>GEOID<\/li> <li>Composite score<\/li> <li>Individual subindex values used in the calculation<\/li> <\/ul> <hr \/> <h3 id=\"3-technical-workflow_1\"><strong>3. Technical Workflow<\/strong><\/h3> <ul> <li><strong>Data Loading<\/strong><br \/> For the selected city and year, the app fetches four separate GeoJSON files (one per subindex) from an Amazon S3 bucket:<\/li> <li><code>{city}_blockgroup_IDI_{year}.geojson<\/code><\/li> <li><code>{city}_blockgroup_LDI_{year}.geojson<\/code><\/li> <li><code>{city}_blockgroup_PDI_{year}.geojson<\/code><\/li> <li> <p><code>{city}_blockgroup_CDI_{year}.geojson<\/code><\/p> <\/li> <li> <p><strong>GEOID Matching<\/strong><br \/> Subindex values are aligned across datasets using the block group GEOID to ensure consistency.<\/p> <\/li> <li> <p><strong>Composite Score Calculation<\/strong><br \/> For each block group, the composite score is calculated as a weighted average:<\/p> <\/li> <\/ul> <div class=\"arithmatex\">\\[ \\text{Composite Score} = \\frac{\\sum_{m} w_m \\cdot v_m}{\\sum_{m} w_m} \\]<\/div> <p>where: - <span class=\"arithmatex\">\\(v_m\\)<\/span> is the block group\u2019s value for metric <span class=\"arithmatex\">\\(m\\)<\/span> - <span class=\"arithmatex\">\\(w_m\\)<\/span> is the user-defined weight for metric <span class=\"arithmatex\">\\(m\\)<\/span><\/p> <p>If all weights are set to zero, no composite score is shown to avoid misleading results.<\/p> <ul> <li><strong>Map Rendering<\/strong> <\/li> <li>Recalculating scores triggers a map re-render.<\/li> <li>A custom color scale maps composite values to shades of green, yellow, and red.<\/li> <li>Tooltips are updated to reflect the new composite and individual metric values.<\/li> <\/ul> <hr \/> <h3 id=\"4-design-rationale\"><strong>4. Design Rationale<\/strong><\/h3> <p>This feature is designed to make the index construction process transparent. By letting users control metric weights, the tool shows how assumptions about what matters for walkability can change the results. This is particularly useful for researchers who may be targeting specific elements of walkability more than others (for example, researchers more interested in the effects of higher land use variation may adjust so that LDI is higher weighted).<\/p> <p>Rather than presenting a single \u201ccorrect\u201d score, the interface encourages exploration and comparison of different weighting choices.<\/p> <hr \/> <h3 id=\"5-known-limitations\"><strong>5. Known Limitations<\/strong><\/h3> <ul> <li>Composite scores depend on how the underlying subindices are scaled.<\/li> <li>Only Atlanta data is currently available.<\/li> <\/ul> <hr \/> <h3 id=\"6-future-work\"><strong>6. Future Work<\/strong><\/h3> <ul> <li>Include new subindices we have created recently to be sider options (such as our transit, biking, road safety, and greenspace subindexes).<\/li> <li>Allow users to save and share custom weighting presets.<\/li> <li>Support side-by-side comparison of different weighting schemes.<\/li> <\/ul> <hr \/> <h2 id=\"7-future-work\">7. Future Work<\/h2> <h3 id=\"there-are-3-key-goals-we-hope-to-achieve\">There are 3 key goals we hope to achieve:<\/h3> <ol> <li> <p><strong>Increase the number of cities and years supported<\/strong>:<br \/> This would simply require us to continue running our subindex generators over the course of the next semester(s) in order to continue to grow the size of our database.<\/p> <\/li> <li> <p><strong>Seek Collaboration\/Monetization Opportunities<\/strong>:<br \/> As we grow the site and our footprint in the space, we could seek to replicate WalkScore's monetization and collaboration business model:<\/p> <\/li> <li> <p><strong>Collaborate with products\/sites<\/strong>:<br \/> Work with products or sites that require walkability statistics (e.g., Zillow and City Planning Companies) to create customized statistics at a cost.<\/p> <\/li> <li> <p><strong>Direct collaboration with local government<\/strong>:<br \/> Assist local governments in achieving their goals of improving walkability in urban areas.<\/p> <\/li> <li> <p><strong>Developing a for-cost API<\/strong>:<br \/> Create an API that allows third-party researchers to use our data. <\/p> <ul> <li>For Example: Collaborating with researchers like Dr. Ku, who uses our data to enhance his psychology research.<\/li> <\/ul> <\/li> <\/ol> <hr \/> <h2 id=\"8-contributing\">8. Contributing<\/h2> <ul> <li>Please contact abeesen3@gatech.edu before doing so.<\/li> <li>Example of how to contribute:<\/li> <li>Fork the repository (https:\/\/github.com\/AtharvaBeesen\/vip-pei-app-2)<\/li> <li>Create a feature branch: <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-10-1\"><a id=\"__codelineno-10-1\" name=\"__codelineno-10-1\" href=\"#__codelineno-10-1\"><\/a>git<span class=\"w\"> <\/span>checkout<span class=\"w\"> <\/span>-b<span class=\"w\"> <\/span>feature\/new-feature <\/span><\/code><\/pre><\/div><\/li> <li>Push your changes and submit a pull request.<\/li> <\/ul> <h2 id=\"9-license\">9. License<\/h2> <p>This project is shared for research and educational purposes. Please do not redistribute for commercial use.<\/p> <hr \/> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=II8eYLK199c\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/II8eYLK199c\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Atharva Beesen<\/td> <td>Senior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/AtharvaBeesen\">AtharvaBeesen<\/a><\/td> <\/tr> <tr> <td>Mason Dewitt<\/td> <td>Sophomore<\/td> <td>Computer Engineering<\/td> <td>ECE<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/Masonrd\">Masonrd<\/a><\/td> <\/tr> <tr> <td>Katherine Davis<\/td> <td>Sophomore<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/katherine-el-davis\">katherine-el-davis<\/a><\/td> <\/tr> <tr> <td>Lucy Chai<\/td> <td>Freshman<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/lucymchai\">lucymchai<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25fa-mobility\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:48 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25fa-mobility\/#__comments","guid":"https:\/\/vip-smur.github.io\/25fa-mobility\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25fa-mobility\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Fa-Microclimate-Outdoor+","description":"<h1 id=\"25fa-microclimate-umcf\">25Fa-Microclimate-UMCF<\/h1> <p align=\"center\"> <img src=\"figures\/umcf.gif\" width=\"1000\" alt=\"UMCF \/ Outdoor+ workflow overview\"> <\/p> <h3 id=\"umcf\">UMCF<\/h3> <p>A collection of components to use the<br \/> <strong>urbanMicroclimateFoam<\/strong> solver.<\/p> <h2 id=\"a-grasshopper-plugin-for-microclimate-simulations\">A Grasshopper plugin for microclimate simulations<\/h2> <p><img alt=\"language\" src=\"https:\/\/img.shields.io\/badge\/language-C%23-555\" \/> <img alt=\"status\" src=\"https:\/\/img.shields.io\/badge\/status-beta-2ea44f\" \/><\/p> <p>The plugin is based on the <strong>urbanMicroclimateFoam<\/strong> open-source solver based on <strong>OpenFOAM<\/strong>,<br \/> developed by the <strong>Chair of Building Physics at ETH Z\u00fcrich<\/strong>.<\/p> <ul> <li><strong>GitHub repository:<\/strong> https:\/\/github.com\/OpenFOAM-BuildingPhysics\/urbanMicroclimateFoam <\/li> <\/ul> <h2 id=\"overview\">Overview<\/h2> <p><strong>urbanMicroclimateFoam (uMFoam)<\/strong> is an open-source solver built on <strong>OpenFOAM<\/strong> for modeling urban microclimates.<br \/> It simulates multiple coupled physical processes, including:<\/p> <ul> <li>Turbulent airflow <\/li> <li>Heat and moisture transport in air <\/li> <li>Radiative heat exchange (shortwave and longwave) <\/li> <li>Heat and moisture storage in building materials (<strong>HAM model<\/strong>) <\/li> <li>Urban vegetation heat balance <\/li> <\/ul> <p>Learn more at the official repository:<br \/> \ud83d\udd17 <strong><a href=\"https:\/\/github.com\/OpenFOAM-BuildingPhysics\/urbanMicroclimateFoam\">urbanMicroclimateFoam GitHub<\/a><\/strong><\/p> <h2 id=\"key-features\">Key Features<\/h2> <h3 id=\"cfd-computational-fluid-dynamics-model\">\ud83c\udf0a CFD \u2014 Computational Fluid Dynamics Model<\/h3> <ul> <li>Solves turbulent, convective airflow <\/li> <li>Handles heat and moisture transport in the air subdomain <\/li> <\/ul> <h3 id=\"ham-heat-and-moisture-transport-model\">\ud83c\udfd7\ufe0f HAM \u2014 Heat and Moisture Transport Model<\/h3> <ul> <li>Manages absorption and transport <\/li> <li>Controls storage of heat and moisture in porous building materials <\/li> <\/ul> <h3 id=\"rad-radiation-model\">\u2600\ufe0f RAD \u2014 Radiation Model<\/h3> <ul> <li>Calculates net longwave and shortwave radiative heat fluxes <\/li> <li>Uses view factor approach <\/li> <\/ul> <h3 id=\"veg-vegetation-model\">\ud83c\udf33 VEG \u2014 Vegetation Model<\/h3> <ul> <li>Solves heat balance for urban trees <\/li> <li>Handles green surfaces <\/li> <\/ul> <h2 id=\"prerequisites\">Prerequisites<\/h2> <h3 id=\"1-install-openfoam-windows\">1. Install OpenFOAM (Windows)<\/h3> <p>Install <strong>blueCFD-Core 2020<\/strong>, which includes <strong>OpenFOAM 8<\/strong>.<\/p> <ul> <li>Download: <code>blueCFD-Core-2020-1-win64-setup.exe<\/code><\/li> <\/ul> <h3 id=\"2-install-umcf-plugin-for-grasshopper-rhino\">2. Install UMCF Plugin for Grasshopper (Rhino)<\/h3> <ol> <li>Open <strong>Rhinoceros<\/strong><\/li> <li>Run the <code>PackageManager<\/code> command<\/li> <li>Search for <strong>UMCF<\/strong><\/li> <li>Enable <strong>\u201cInclude pre-releases\u201d<\/strong><\/li> <li>Click <strong>Install<\/strong> and restart Rhino<\/li> <\/ol> <h2 id=\"fall-2025-additions-urban-morphology-microclimate-tokyo-case-study\">Fall 2025 Additions \u2013 Urban Morphology &amp; Microclimate (Tokyo Case Study)<\/h2> <h3 id=\"overview_1\">Overview<\/h3> <p>This case study evaluates how <strong>urban morphology<\/strong> influences <strong>temperature and wind-related variables<\/strong> within the urban microclimate. Using <strong>Tokyo, Japan<\/strong> as a case study, we investigate the relationship between dense urban form, geometric complexity, and microclimate behavior through CFD simulations.<\/p> <h3 id=\"motivation\">Motivation<\/h3> <p>Urban morphology\u2014such as building density, height variation, and street canyon geometry\u2014plays a critical role in shaping microclimate conditions. Tokyo\u2019s dense and heterogeneous urban fabric, characterized by narrow streets and sharp transitions between open and enclosed spaces, presents a challenging yet valuable context for examining these effects.<\/p> <p>This study aims to understand how urban form affects microclimate performance, while also identifying technical limitations related to geometry handling and mesh generation in high-density environments.<\/p> <h3 id=\"central-idea\">Central Idea<\/h3> <p>We treat urban morphology as a primary driver of microclimate variation.<br \/> By constructing a detailed 3D urban model of Tokyo and running iterative simulations, we assess how temperature and wind patterns respond to spatial configuration, mesh resolution, and model setup.<\/p> <h3 id=\"methodology\">Methodology<\/h3> <h4 id=\"1-urban-morphology-modeling\">1) Urban Morphology Modeling<\/h4> <ul> <li>Construct a detailed 3D urban model of selected Tokyo areas<\/li> <li>Capture key morphological characteristics, including:<\/li> <li>Narrow street canyons<\/li> <li>High building density<\/li> <li>Sharp transitions between open and enclosed spaces<\/li> <\/ul> <h4 id=\"2-simulation-and-iterative-refinement\">2) Simulation and Iterative Refinement<\/h4> <ul> <li>Run simulations using <strong>urbanMicroclimateFoam (UMCF)<\/strong><\/li> <li>Analyze temperature and wind-related outputs<\/li> <li>Iteratively refine the computational mesh and model configuration based on simulation behavior and numerical stability<\/li> <\/ul> <h3 id=\"data-collection\">Data Collection<\/h3> <h4 id=\"urban-geometry-and-morphology\">Urban Geometry and Morphology<\/h4> <ul> <li>Building footprints and heights were collected from <strong>PLATEAU (MLIT, Japan)<\/strong><br \/> https:\/\/www.mlit.go.jp\/plateau\/en\/<\/li> <li>PLATEAU CityGML data were converted into a Rhinoceros-compatible format using a custom <strong>Grasshopper (GML reader) workflow<\/strong>, enabling geometry preprocessing and inspection within Rhino.<\/li> <\/ul> <h3 id=\"challenges\">Challenges<\/h3> <h4 id=\"mesh-generation-and-computational-cost\">Mesh Generation and Computational Cost<\/h4> <p>The large number of objects and high geometric complexity made mesh generation a critical and persistent challenge.<\/p> <p>High-density urban geometry requires fine meshes to accurately resolve wind flow and temperature gradients. However, finer meshes significantly increase computational cost, necessitating trade-offs between accuracy, numerical stability, and feasibility.<\/p> <p>Mesh-related errors occurred repeatedly and were not fully resolved within the project timeframe.<\/p> <p>Several basic geometric conditions were identified as necessary for stable simulations: - All buildings must touch the same <strong>XY ground plane<\/strong> (no floating geometries) - Vegetation objects must be sufficiently <strong>distanced from buildings<\/strong> - The bottom face of all buildings must be removed - The mesh must exhibit a well-formed topology, with small, uniform, and evenly distributed triangular faces<\/p> <h3 id=\"future-improvements\">Future Improvements<\/h3> <p>Potential future directions include: - Developing more robust mesh-cleaning and validation workflows - Simplifying urban geometry while preserving key morphological characteristics - Establishing quantitative metrics to compare simulation stability across mesh resolutions - Expanding analysis to multiple Tokyo districts with contrasting urban forms<\/p> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=AnX9a9fqACU\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/AnX9a9fqACU\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Marcelo \u00c1lvarez<\/td> <td>Masters<\/td> <td>Architecture (DC)<\/td> <td>ARCH<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/alvarezdmarch\">alvarezdmarch<\/a><\/td> <\/tr> <tr> <td>Mallika Champaneria<\/td> <td>Masters<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/mallikachampaneria\">mallikachampaneria<\/a><\/td> <\/tr> <tr> <td>Aiko Hayashi<\/td> <td>Sophomore<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/AnneTotoro\">AnneTotoro<\/a><\/td> <\/tr> <tr> <td>Sina Rahimi<\/td> <td>PhD<\/td> <td>Architectural Science<\/td> <td>ARCH<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/sinarhm\">sinarahimi<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25fa-microclimate-outdoorplus\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:48 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25fa-microclimate-outdoorplus\/#__comments","guid":"https:\/\/vip-smur.github.io\/25fa-microclimate-outdoorplus\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25fa-microclimate-outdoorplus\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Fa-Microclimate-ML","description":"<h1 id=\"microclimate-weather-prediction-with-deep-learning\">Microclimate Weather Prediction with Deep Learning<\/h1> <blockquote> <p><strong>Georgia Tech VIP-SMUR Project<\/strong> | Fall 2025<br \/> High-resolution microclimate weather prediction combining FusionLSTM deep learning architecture, Regression Kriging, and spatial analysis<\/p> <\/blockquote> <p><a href=\"https:\/\/www.python.org\/downloads\/\"><img src=\"https:\/\/img.shields.io\/badge\/python-3.8+-blue.svg\" alt=\"Python 3.8+\" max-width=\"600\" \/><\/a> <a href=\"https:\/\/pytorch.org\/\"><img src=\"https:\/\/img.shields.io\/badge\/PyTorch-2.0+-red.svg\" alt=\"PyTorch\" max-width=\"600\" \/><\/a> <a href=\"LICENSE\"><img src=\"https:\/\/img.shields.io\/badge\/license-MIT-green.svg\" alt=\"License\" max-width=\"600\" \/><\/a><\/p> <h2 id=\"overview\">Overview<\/h2> <p>This project combines multiple advanced techniques to predict microclimate weather patterns at Georgia Tech campus with high spatial and temporal resolution. The pipeline integrates <strong>FusionLSTM<\/strong> (a TFT-inspired architecture featuring multi-scale LSTM branches with attention) for time series prediction with <strong>Regression Kriging<\/strong> to generate campus-wide maps. The model predicts <strong>Temperature<\/strong> and <strong>Relative Humidity<\/strong> at <strong>100,283 grid points<\/strong> using multi-variate time series and geospatial features.<\/p> <p>The model successfully captures extreme weather conditions across Georgia Tech campus. Below are comparison maps showing model predictions vs. actual station observations for four representative scenarios:<\/p> <table> <thead> <tr> <th>Scenario<\/th> <th>Conditions<\/th> <th>Visualization<\/th> <\/tr> <\/thead> <tbody> <tr> <td><strong>\ud83d\udd25 Hottest<\/strong><\/td> <td>37.30\u00b0C avg, 34.56% RH<br>2016-06-25 16:10<\/td> <td><img src=\".\/4_Inference_and_Visualization\/figures\/HOTTEST_comparison_map.png\" alt=\"Hottest\" max-width=\"600\" \/><\/td> <\/tr> <tr> <td><strong>\u2744\ufe0f Coldest<\/strong><\/td> <td>8.45\u00b0C avg, 89.61% RH<br>2017-05-06 06:30<\/td> <td><img src=\".\/4_Inference_and_Visualization\/figures\/COLDEST_comparison_map.png\" alt=\"Coldest\" max-width=\"600\" \/><\/td> <\/tr> <tr> <td><strong>\ud83c\udfdc\ufe0f Driest<\/strong><\/td> <td>18.13\u00b0C avg, 17.95% RH<br>2015-04-04 18:30<\/td> <td><img src=\".\/4_Inference_and_Visualization\/figures\/DRIEST_comparison_map.png\" alt=\"Driest\" max-width=\"600\" \/><\/td> <\/tr> <tr> <td><strong>\ud83d\udca7 Most Humid<\/strong><\/td> <td>16.73\u00b0C avg, 99.50% RH<br>2015-04-18 04:40<\/td> <td><img src=\".\/4_Inference_and_Visualization\/figures\/MOST_HUMID_comparison_map.png\" alt=\"Most Humid\" max-width=\"600\" \/><\/td> <\/tr> <\/tbody> <\/table> <p><em>Each comparison map shows side-by-side temperature (left) and relative humidity (right) predictions with station observations overlaid as square markers.<\/em><\/p> <h3 id=\"why-fusionlstm\">Why FusionLSTM?<\/h3> <p>We adapted core TFT components (Gated Residual Networks, Variable Selection, Multi-Head Attention) with three key modifications optimized for microclimate forecasting:<\/p> <ol> <li><strong>Single-step point prediction<\/strong> - Better Kriging integration, avoids compounding uncertainty<\/li> <li><strong>Parallel multi-scale LSTM branches<\/strong> - Explicitly captures both rapid fluctuations and diurnal cycles <\/li> <li><strong>Physics-aware features only<\/strong> - No station IDs, enabling generalization to unseen locations<\/li> <\/ol> <p>See <a href=\"docs\/PROJECT_PLAN.md\"><code>docs\/PROJECT_PLAN.md<\/code><\/a> for detailed design rationale.<\/p> <h3 id=\"key-features\">Key Features<\/h3> <ul> <li><strong>FusionLSTM Model<\/strong> - Multi-scale LSTM with attention for single-step iterative forecasting (+10 minutes ahead)<\/li> <li><strong>16-Station Warm-Season Training<\/strong> - April\u2013September data with station holdout validation<\/li> <li><strong>Physics-Aware Features<\/strong> - Solar angles and time encodings (no station IDs for generalization)<\/li> <li><strong>High-Resolution Spatial Mapping<\/strong> - 100,283 grid points across campus (~3.5 km\u00b2)<\/li> <li><strong>Regression Kriging<\/strong> - PyKrige spatial interpolation with 16-station stability<\/li> <li><strong>Baseline Comparisons<\/strong> - Persistence, Linear Regression, Vanilla LSTM<\/li> <li><strong>Publication-Ready Visualizations<\/strong> - 300 DPI high-resolution maps<\/li> <li><strong>HPC Integration<\/strong> - SLURM scripts for Phoenix cluster (GPU\/CPU)<\/li> <\/ul> <h2 id=\"quick-start\">Quick Start<\/h2> <h3 id=\"local-machine\">Local Machine<\/h3> <h4 id=\"step-1-installation\">Step 1: Installation<\/h4> <p><strong>Option A: Using UV (Recommended)<\/strong><\/p> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"><\/a><span class=\"c1\"># Clone the repository (requires GitHub SSH key for private repo)<\/span> <\/span><span id=\"__span-0-2\"><a id=\"__codelineno-0-2\" name=\"__codelineno-0-2\" href=\"#__codelineno-0-2\"><\/a>git<span class=\"w\"> <\/span>clone<span class=\"w\"> <\/span>git@github.com:VIP-SMUR\/25Fa-Microclimate-ML.git <\/span><span id=\"__span-0-3\"><a id=\"__codelineno-0-3\" name=\"__codelineno-0-3\" href=\"#__codelineno-0-3\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>25Fa-Microclimate-ML <\/span><span id=\"__span-0-4\"><a id=\"__codelineno-0-4\" name=\"__codelineno-0-4\" href=\"#__codelineno-0-4\"><\/a> <\/span><span id=\"__span-0-5\"><a id=\"__codelineno-0-5\" name=\"__codelineno-0-5\" href=\"#__codelineno-0-5\"><\/a><span class=\"c1\"># Install UV<\/span> <\/span><span id=\"__span-0-6\"><a id=\"__codelineno-0-6\" name=\"__codelineno-0-6\" href=\"#__codelineno-0-6\"><\/a>curl<span class=\"w\"> <\/span>-LsSf<span class=\"w\"> <\/span>https:\/\/astral.sh\/uv\/install.sh<span class=\"w\"> <\/span><span class=\"p\">|<\/span><span class=\"w\"> <\/span>sh <\/span><span id=\"__span-0-7\"><a id=\"__codelineno-0-7\" name=\"__codelineno-0-7\" href=\"#__codelineno-0-7\"><\/a><span class=\"nb\">export<\/span><span class=\"w\"> <\/span><span class=\"nv\">PATH<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;<\/span><span class=\"nv\">$HOME<\/span><span class=\"s2\">\/.local\/bin:<\/span><span class=\"nv\">$PATH<\/span><span class=\"s2\">&quot;<\/span> <\/span><span id=\"__span-0-8\"><a id=\"__codelineno-0-8\" name=\"__codelineno-0-8\" href=\"#__codelineno-0-8\"><\/a> <\/span><span id=\"__span-0-9\"><a id=\"__codelineno-0-9\" name=\"__codelineno-0-9\" href=\"#__codelineno-0-9\"><\/a><span class=\"c1\"># Create environment and install dependencies<\/span> <\/span><span id=\"__span-0-10\"><a id=\"__codelineno-0-10\" name=\"__codelineno-0-10\" href=\"#__codelineno-0-10\"><\/a>uv<span class=\"w\"> <\/span>venv <\/span><span id=\"__span-0-11\"><a id=\"__codelineno-0-11\" name=\"__codelineno-0-11\" href=\"#__codelineno-0-11\"><\/a><span class=\"nb\">source<\/span><span class=\"w\"> <\/span>.venv\/bin\/activate <\/span><span id=\"__span-0-12\"><a id=\"__codelineno-0-12\" name=\"__codelineno-0-12\" href=\"#__codelineno-0-12\"><\/a>uv<span class=\"w\"> <\/span>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>-r<span class=\"w\"> <\/span>requirements.txt <\/span><\/code><\/pre><\/div> <p><strong>Option B: Using pip<\/strong><\/p> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-1-1\"><a id=\"__codelineno-1-1\" name=\"__codelineno-1-1\" href=\"#__codelineno-1-1\"><\/a><span class=\"c1\"># Clone the repository (requires GitHub SSH key for private repo)<\/span> <\/span><span id=\"__span-1-2\"><a id=\"__codelineno-1-2\" name=\"__codelineno-1-2\" href=\"#__codelineno-1-2\"><\/a>git<span class=\"w\"> <\/span>clone<span class=\"w\"> <\/span>git@github.com:VIP-SMUR\/25Fa-Microclimate-ML.git <\/span><span id=\"__span-1-3\"><a id=\"__codelineno-1-3\" name=\"__codelineno-1-3\" href=\"#__codelineno-1-3\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>25Fa-Microclimate-ML <\/span><span id=\"__span-1-4\"><a id=\"__codelineno-1-4\" name=\"__codelineno-1-4\" href=\"#__codelineno-1-4\"><\/a> <\/span><span id=\"__span-1-5\"><a id=\"__codelineno-1-5\" name=\"__codelineno-1-5\" href=\"#__codelineno-1-5\"><\/a><span class=\"c1\"># Create virtual environment<\/span> <\/span><span id=\"__span-1-6\"><a id=\"__codelineno-1-6\" name=\"__codelineno-1-6\" href=\"#__codelineno-1-6\"><\/a>python<span class=\"w\"> <\/span>-m<span class=\"w\"> <\/span>venv<span class=\"w\"> <\/span>.venv <\/span><span id=\"__span-1-7\"><a id=\"__codelineno-1-7\" name=\"__codelineno-1-7\" href=\"#__codelineno-1-7\"><\/a><span class=\"nb\">source<\/span><span class=\"w\"> <\/span>.venv\/bin\/activate<span class=\"w\"> <\/span><span class=\"c1\"># On Windows: .venv\\Scripts\\activate<\/span> <\/span><span id=\"__span-1-8\"><a id=\"__codelineno-1-8\" name=\"__codelineno-1-8\" href=\"#__codelineno-1-8\"><\/a> <\/span><span id=\"__span-1-9\"><a id=\"__codelineno-1-9\" name=\"__codelineno-1-9\" href=\"#__codelineno-1-9\"><\/a><span class=\"c1\"># Install dependencies<\/span> <\/span><span id=\"__span-1-10\"><a id=\"__codelineno-1-10\" name=\"__codelineno-1-10\" href=\"#__codelineno-1-10\"><\/a>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>-r<span class=\"w\"> <\/span>requirements.txt <\/span><\/code><\/pre><\/div> <h4 id=\"step-2-download-required-data\">Step 2: Download Required Data<\/h4> <p><strong>A. Weather Data (Required for Training)<\/strong><\/p> <p>Download the 16-station weather data with solar angles:<\/p> <p><strong><a href=\"https:\/\/huggingface.co\/datasets\/yupengtang\/gatech_10_min_long_format_sun_angles\">Download from Hugging Face<\/a><\/strong> (~112 MB)<\/p> <p>Place in: <code>2_Data\/gatech_16_stations_10_min_long_format_sun_angles.csv<\/code><\/p> <p><strong>B. Pre-trained Model (Required for Inference)<\/strong><\/p> <p>Download the trained model weights from Hugging Face:<\/p> <p><strong><a href=\"https:\/\/huggingface.co\/yupengtang\/TFT_weather_model\/resolve\/main\/TFT_weather_model.pth\">Download Model (TFT_weather_model.pth)<\/a><\/strong> (1.4 MB)<\/p> <p>Or visit: https:\/\/huggingface.co\/yupengtang\/TFT_weather_model<\/p> <p>Place in: <code>3_Training_Model\/weights\/<\/code> or <code>3_Training_Model\/weights_4heads\/<\/code><\/p> <h4 id=\"step-3-run-inference\">Step 3: Run Inference<\/h4> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-2-1\"><a id=\"__codelineno-2-1\" name=\"__codelineno-2-1\" href=\"#__codelineno-2-1\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>4_Inference_and_Visualization <\/span><span id=\"__span-2-2\"><a id=\"__codelineno-2-2\" name=\"__codelineno-2-2\" href=\"#__codelineno-2-2\"><\/a> <\/span><span id=\"__span-2-3\"><a id=\"__codelineno-2-3\" name=\"__codelineno-2-3\" href=\"#__codelineno-2-3\"><\/a><span class=\"c1\"># Run inference<\/span> <\/span><span id=\"__span-2-4\"><a id=\"__codelineno-2-4\" name=\"__codelineno-2-4\" href=\"#__codelineno-2-4\"><\/a>python<span class=\"w\"> <\/span>_1_fusionlstm_inference_kriging.py<span class=\"w\"> <\/span>--target_time<span class=\"w\"> <\/span><span class=\"s2\">&quot;2017-06-25 14:00:00&quot;<\/span> <\/span><span id=\"__span-2-5\"><a id=\"__codelineno-2-5\" name=\"__codelineno-2-5\" href=\"#__codelineno-2-5\"><\/a><span class=\"c1\"># \u2192 Generates: outputs\/FusionLSTM_kriging_predictions_20170625_140000.csv<\/span> <\/span><span id=\"__span-2-6\"><a id=\"__codelineno-2-6\" name=\"__codelineno-2-6\" href=\"#__codelineno-2-6\"><\/a> <\/span><span id=\"__span-2-7\"><a id=\"__codelineno-2-7\" name=\"__codelineno-2-7\" href=\"#__codelineno-2-7\"><\/a><span class=\"c1\"># Create visualization maps<\/span> <\/span><span id=\"__span-2-8\"><a id=\"__codelineno-2-8\" name=\"__codelineno-2-8\" href=\"#__codelineno-2-8\"><\/a>python<span class=\"w\"> <\/span>_2_mapping_visualization.py <\/span><span id=\"__span-2-9\"><a id=\"__codelineno-2-9\" name=\"__codelineno-2-9\" href=\"#__codelineno-2-9\"><\/a><span class=\"c1\"># \u2192 Generates: figures\/temperature_map_*.png, humidity_map_*.png, comparison_map_*.png<\/span> <\/span><span id=\"__span-2-10\"><a id=\"__codelineno-2-10\" name=\"__codelineno-2-10\" href=\"#__codelineno-2-10\"><\/a> <\/span><span id=\"__span-2-11\"><a id=\"__codelineno-2-11\" name=\"__codelineno-2-11\" href=\"#__codelineno-2-11\"><\/a><span class=\"c1\"># Analyze LULC feature importance (optional)<\/span> <\/span><span id=\"__span-2-12\"><a id=\"__codelineno-2-12\" name=\"__codelineno-2-12\" href=\"#__codelineno-2-12\"><\/a>python<span class=\"w\"> <\/span>_3_lulc_analysis.py <\/span><span id=\"__span-2-13\"><a id=\"__codelineno-2-13\" name=\"__codelineno-2-13\" href=\"#__codelineno-2-13\"><\/a><span class=\"c1\"># \u2192 Generates: figures\/FusionLSTM_kriging_predictions_*_lulc_importance.png<\/span> <\/span><span id=\"__span-2-14\"><a id=\"__codelineno-2-14\" name=\"__codelineno-2-14\" href=\"#__codelineno-2-14\"><\/a> <\/span><span id=\"__span-2-15\"><a id=\"__codelineno-2-15\" name=\"__codelineno-2-15\" href=\"#__codelineno-2-15\"><\/a><span class=\"c1\"># Generate extreme scenario maps (automatic scenario detection)<\/span> <\/span><span id=\"__span-2-16\"><a id=\"__codelineno-2-16\" name=\"__codelineno-2-16\" href=\"#__codelineno-2-16\"><\/a>python<span class=\"w\"> <\/span>_4_generate_representative_scenarios.py<span class=\"w\"> <\/span>--device<span class=\"w\"> <\/span>cuda<span class=\"w\"> <\/span>--dpi<span class=\"w\"> <\/span><span class=\"m\">300<\/span> <\/span><span id=\"__span-2-17\"><a id=\"__codelineno-2-17\" name=\"__codelineno-2-17\" href=\"#__codelineno-2-17\"><\/a><span class=\"c1\"># \u2192 Generates: figures\/HOTTEST_*.png, COLDEST_*.png, DRIEST_*.png, MOST_HUMID_*.png<\/span> <\/span><\/code><\/pre><\/div> <h3 id=\"on-phoenix-hpc-recommended-for-large-scale\">On Phoenix HPC (Recommended for Large-Scale)<\/h3> <p><strong>New to HPC?<\/strong> See <a href=\"PACE_PHOENIX_TUTORIAL.md\">PACE_PHOENIX_TUTORIAL.md<\/a> for complete beginner's guide including VPN setup and SSH connection.<\/p> <p><strong>Note<\/strong>: This is a private repository. <a href=\"#github-ssh-key-setup-for-private-repo\">Configure GitHub SSH key<\/a> first if you haven't already.<\/p> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-3-1\"><a id=\"__codelineno-3-1\" name=\"__codelineno-3-1\" href=\"#__codelineno-3-1\"><\/a><span class=\"c1\"># Connect to Phoenix<\/span> <\/span><span id=\"__span-3-2\"><a id=\"__codelineno-3-2\" name=\"__codelineno-3-2\" href=\"#__codelineno-3-2\"><\/a>ssh<span class=\"w\"> <\/span>&lt;your_gt_username&gt;@login-phoenix.pace.gatech.edu <\/span><span id=\"__span-3-3\"><a id=\"__codelineno-3-3\" name=\"__codelineno-3-3\" href=\"#__codelineno-3-3\"><\/a> <\/span><span id=\"__span-3-4\"><a id=\"__codelineno-3-4\" name=\"__codelineno-3-4\" href=\"#__codelineno-3-4\"><\/a><span class=\"c1\"># Navigate to your home directory (recommended for code)<\/span> <\/span><span id=\"__span-3-5\"><a id=\"__codelineno-3-5\" name=\"__codelineno-3-5\" href=\"#__codelineno-3-5\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span><span class=\"nv\">$HOME<\/span> <\/span><span id=\"__span-3-6\"><a id=\"__codelineno-3-6\" name=\"__codelineno-3-6\" href=\"#__codelineno-3-6\"><\/a><span class=\"c1\"># Alternative: Use scratch for large temporary files<\/span> <\/span><span id=\"__span-3-7\"><a id=\"__codelineno-3-7\" name=\"__codelineno-3-7\" href=\"#__codelineno-3-7\"><\/a><span class=\"c1\"># cd \/storage\/scratch1\/&lt;your_gt_username&gt;<\/span> <\/span><span id=\"__span-3-8\"><a id=\"__codelineno-3-8\" name=\"__codelineno-3-8\" href=\"#__codelineno-3-8\"><\/a> <\/span><span id=\"__span-3-9\"><a id=\"__codelineno-3-9\" name=\"__codelineno-3-9\" href=\"#__codelineno-3-9\"><\/a><span class=\"c1\"># Clone repository (requires GitHub access)<\/span> <\/span><span id=\"__span-3-10\"><a id=\"__codelineno-3-10\" name=\"__codelineno-3-10\" href=\"#__codelineno-3-10\"><\/a>git<span class=\"w\"> <\/span>clone<span class=\"w\"> <\/span>git@github.com:VIP-SMUR\/25Fa-Microclimate-ML.git <\/span><span id=\"__span-3-11\"><a id=\"__codelineno-3-11\" name=\"__codelineno-3-11\" href=\"#__codelineno-3-11\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>25Fa-Microclimate-ML <\/span><span id=\"__span-3-12\"><a id=\"__codelineno-3-12\" name=\"__codelineno-3-12\" href=\"#__codelineno-3-12\"><\/a> <\/span><span id=\"__span-3-13\"><a id=\"__codelineno-3-13\" name=\"__codelineno-3-13\" href=\"#__codelineno-3-13\"><\/a><span class=\"c1\"># ===== TRAINING =====<\/span> <\/span><span id=\"__span-3-14\"><a id=\"__codelineno-3-14\" name=\"__codelineno-3-14\" href=\"#__codelineno-3-14\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>3_Training_Model <\/span><span id=\"__span-3-15\"><a id=\"__codelineno-3-15\" name=\"__codelineno-3-15\" href=\"#__codelineno-3-15\"><\/a>sbatch<span class=\"w\"> <\/span>phoenix_gpu_train.sbatch<span class=\"w\"> <\/span><span class=\"c1\"># GPU: A100, 4 attention heads, ~2-4 hours<\/span> <\/span><span id=\"__span-3-16\"><a id=\"__codelineno-3-16\" name=\"__codelineno-3-16\" href=\"#__codelineno-3-16\"><\/a><span class=\"c1\"># OR<\/span> <\/span><span id=\"__span-3-17\"><a id=\"__codelineno-3-17\" name=\"__codelineno-3-17\" href=\"#__codelineno-3-17\"><\/a>sbatch<span class=\"w\"> <\/span>phoenix_cpu_train.sbatch<span class=\"w\"> <\/span><span class=\"c1\"># CPU: 8 cores, 2 attention heads, ~24-48 hours<\/span> <\/span><span id=\"__span-3-18\"><a id=\"__codelineno-3-18\" name=\"__codelineno-3-18\" href=\"#__codelineno-3-18\"><\/a> <\/span><span id=\"__span-3-19\"><a id=\"__codelineno-3-19\" name=\"__codelineno-3-19\" href=\"#__codelineno-3-19\"><\/a><span class=\"c1\"># ===== INFERENCE &amp; VISUALIZATION =====<\/span> <\/span><span id=\"__span-3-20\"><a id=\"__codelineno-3-20\" name=\"__codelineno-3-20\" href=\"#__codelineno-3-20\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>..\/4_Inference_and_Visualization <\/span><span id=\"__span-3-21\"><a id=\"__codelineno-3-21\" name=\"__codelineno-3-21\" href=\"#__codelineno-3-21\"><\/a> <\/span><span id=\"__span-3-22\"><a id=\"__codelineno-3-22\" name=\"__codelineno-3-22\" href=\"#__codelineno-3-22\"><\/a><span class=\"c1\"># Step 1: Inference (~2 min 10 sec)<\/span> <\/span><span id=\"__span-3-23\"><a id=\"__codelineno-3-23\" name=\"__codelineno-3-23\" href=\"#__codelineno-3-23\"><\/a>sbatch<span class=\"w\"> <\/span>_1_inference.sbatch <\/span><span id=\"__span-3-24\"><a id=\"__codelineno-3-24\" name=\"__codelineno-3-24\" href=\"#__codelineno-3-24\"><\/a><span class=\"c1\"># \u2192 outputs\/FusionLSTM_kriging_predictions_*.csv (31 MB)<\/span> <\/span><span id=\"__span-3-25\"><a id=\"__codelineno-3-25\" name=\"__codelineno-3-25\" href=\"#__codelineno-3-25\"><\/a><span class=\"c1\"># \u2192 outputs\/FusionLSTM_kriging_predictions_*_models.pkl (169 KB)<\/span> <\/span><span id=\"__span-3-26\"><a id=\"__codelineno-3-26\" name=\"__codelineno-3-26\" href=\"#__codelineno-3-26\"><\/a> <\/span><span id=\"__span-3-27\"><a id=\"__codelineno-3-27\" name=\"__codelineno-3-27\" href=\"#__codelineno-3-27\"><\/a><span class=\"c1\"># Step 2: Visualization (~1 min 31 sec)<\/span> <\/span><span id=\"__span-3-28\"><a id=\"__codelineno-3-28\" name=\"__codelineno-3-28\" href=\"#__codelineno-3-28\"><\/a>sbatch<span class=\"w\"> <\/span>_2_visualization.sbatch <\/span><span id=\"__span-3-29\"><a id=\"__codelineno-3-29\" name=\"__codelineno-3-29\" href=\"#__codelineno-3-29\"><\/a><span class=\"c1\"># \u2192 figures\/temperature_map_*.png (1.7 MB)<\/span> <\/span><span id=\"__span-3-30\"><a id=\"__codelineno-3-30\" name=\"__codelineno-3-30\" href=\"#__codelineno-3-30\"><\/a><span class=\"c1\"># \u2192 figures\/humidity_map_*.png (1.6 MB)<\/span> <\/span><span id=\"__span-3-31\"><a id=\"__codelineno-3-31\" name=\"__codelineno-3-31\" href=\"#__codelineno-3-31\"><\/a><span class=\"c1\"># \u2192 figures\/comparison_map_*.png (2.1 MB)<\/span> <\/span><span id=\"__span-3-32\"><a id=\"__codelineno-3-32\" name=\"__codelineno-3-32\" href=\"#__codelineno-3-32\"><\/a> <\/span><span id=\"__span-3-33\"><a id=\"__codelineno-3-33\" name=\"__codelineno-3-33\" href=\"#__codelineno-3-33\"><\/a><span class=\"c1\"># Step 3: LULC Analysis (~34 sec, optional)<\/span> <\/span><span id=\"__span-3-34\"><a id=\"__codelineno-3-34\" name=\"__codelineno-3-34\" href=\"#__codelineno-3-34\"><\/a>sbatch<span class=\"w\"> <\/span>_3_lulc.sbatch <\/span><span id=\"__span-3-35\"><a id=\"__codelineno-3-35\" name=\"__codelineno-3-35\" href=\"#__codelineno-3-35\"><\/a><span class=\"c1\"># \u2192 figures\/FusionLSTM_kriging_predictions_*_lulc_importance.png (237 KB)<\/span> <\/span><span id=\"__span-3-36\"><a id=\"__codelineno-3-36\" name=\"__codelineno-3-36\" href=\"#__codelineno-3-36\"><\/a> <\/span><span id=\"__span-3-37\"><a id=\"__codelineno-3-37\" name=\"__codelineno-3-37\" href=\"#__codelineno-3-37\"><\/a><span class=\"c1\"># Step 4: Generate representative scenario maps (~3 min, recommended for publication)<\/span> <\/span><span id=\"__span-3-38\"><a id=\"__codelineno-3-38\" name=\"__codelineno-3-38\" href=\"#__codelineno-3-38\"><\/a>sbatch<span class=\"w\"> <\/span>_4_representative_scenarios.sbatch <\/span><span id=\"__span-3-39\"><a id=\"__codelineno-3-39\" name=\"__codelineno-3-39\" href=\"#__codelineno-3-39\"><\/a><span class=\"c1\"># \u2192 figures\/HOTTEST_*.png, COLDEST_*.png, DRIEST_*.png, MOST_HUMID_*.png<\/span> <\/span><span id=\"__span-3-40\"><a id=\"__codelineno-3-40\" name=\"__codelineno-3-40\" href=\"#__codelineno-3-40\"><\/a> <\/span><span id=\"__span-3-41\"><a id=\"__codelineno-3-41\" name=\"__codelineno-3-41\" href=\"#__codelineno-3-41\"><\/a><span class=\"c1\"># Monitor jobs<\/span> <\/span><span id=\"__span-3-42\"><a id=\"__codelineno-3-42\" name=\"__codelineno-3-42\" href=\"#__codelineno-3-42\"><\/a>squeue<span class=\"w\"> <\/span>-u<span class=\"w\"> <\/span><span class=\"nv\">$USER<\/span> <\/span><span id=\"__span-3-43\"><a id=\"__codelineno-3-43\" name=\"__codelineno-3-43\" href=\"#__codelineno-3-43\"><\/a>tail<span class=\"w\"> <\/span>-f<span class=\"w\"> <\/span>logs\/inference_*.out <\/span><\/code><\/pre><\/div> <h2 id=\"complete-workflow\">Complete Workflow<\/h2> <h3 id=\"option-a-use-pre-trained-model-recommended\">Option A: Use Pre-trained Model (Recommended)<\/h3> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-4-1\"><a id=\"__codelineno-4-1\" name=\"__codelineno-4-1\" href=\"#__codelineno-4-1\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>4_Inference_and_Visualization <\/span><span id=\"__span-4-2\"><a id=\"__codelineno-4-2\" name=\"__codelineno-4-2\" href=\"#__codelineno-4-2\"><\/a> <\/span><span id=\"__span-4-3\"><a id=\"__codelineno-4-3\" name=\"__codelineno-4-3\" href=\"#__codelineno-4-3\"><\/a><span class=\"c1\"># 1. Run inference with trained model<\/span> <\/span><span id=\"__span-4-4\"><a id=\"__codelineno-4-4\" name=\"__codelineno-4-4\" href=\"#__codelineno-4-4\"><\/a>python<span class=\"w\"> <\/span>_1_fusionlstm_inference_kriging.py<span class=\"w\"> <\/span>--target_time<span class=\"w\"> <\/span><span class=\"s2\">&quot;2017-06-25 14:00:00&quot;<\/span> <\/span><span id=\"__span-4-5\"><a id=\"__codelineno-4-5\" name=\"__codelineno-4-5\" href=\"#__codelineno-4-5\"><\/a><span class=\"c1\"># Output: outputs\/FusionLSTM_kriging_predictions_20170625_140000.csv (100,283 points)<\/span> <\/span><span id=\"__span-4-6\"><a id=\"__codelineno-4-6\" name=\"__codelineno-4-6\" href=\"#__codelineno-4-6\"><\/a> <\/span><span id=\"__span-4-7\"><a id=\"__codelineno-4-7\" name=\"__codelineno-4-7\" href=\"#__codelineno-4-7\"><\/a><span class=\"c1\"># 2. Create high-resolution visualization maps<\/span> <\/span><span id=\"__span-4-8\"><a id=\"__codelineno-4-8\" name=\"__codelineno-4-8\" href=\"#__codelineno-4-8\"><\/a>python<span class=\"w\"> <\/span>_2_mapping_visualization.py<span class=\"w\"> <\/span>--dpi<span class=\"w\"> <\/span><span class=\"m\">300<\/span> <\/span><span id=\"__span-4-9\"><a id=\"__codelineno-4-9\" name=\"__codelineno-4-9\" href=\"#__codelineno-4-9\"><\/a><span class=\"c1\"># Output: <\/span> <\/span><span id=\"__span-4-10\"><a id=\"__codelineno-4-10\" name=\"__codelineno-4-10\" href=\"#__codelineno-4-10\"><\/a><span class=\"c1\"># - figures\/temperature_map_20170625_140000.png<\/span> <\/span><span id=\"__span-4-11\"><a id=\"__codelineno-4-11\" name=\"__codelineno-4-11\" href=\"#__codelineno-4-11\"><\/a><span class=\"c1\"># - figures\/humidity_map_20170625_140000.png<\/span> <\/span><span id=\"__span-4-12\"><a id=\"__codelineno-4-12\" name=\"__codelineno-4-12\" href=\"#__codelineno-4-12\"><\/a><span class=\"c1\"># - figures\/comparison_map_20170625_140000.png<\/span> <\/span><span id=\"__span-4-13\"><a id=\"__codelineno-4-13\" name=\"__codelineno-4-13\" href=\"#__codelineno-4-13\"><\/a> <\/span><span id=\"__span-4-14\"><a id=\"__codelineno-4-14\" name=\"__codelineno-4-14\" href=\"#__codelineno-4-14\"><\/a><span class=\"c1\"># 3. Analyze spatial feature importance (optional)<\/span> <\/span><span id=\"__span-4-15\"><a id=\"__codelineno-4-15\" name=\"__codelineno-4-15\" href=\"#__codelineno-4-15\"><\/a>python<span class=\"w\"> <\/span>_3_lulc_analysis.py <\/span><span id=\"__span-4-16\"><a id=\"__codelineno-4-16\" name=\"__codelineno-4-16\" href=\"#__codelineno-4-16\"><\/a><span class=\"c1\"># Output: figures\/FusionLSTM_kriging_predictions_20170625_140000_lulc_importance.png<\/span> <\/span><span id=\"__span-4-17\"><a id=\"__codelineno-4-17\" name=\"__codelineno-4-17\" href=\"#__codelineno-4-17\"><\/a> <\/span><span id=\"__span-4-18\"><a id=\"__codelineno-4-18\" name=\"__codelineno-4-18\" href=\"#__codelineno-4-18\"><\/a><span class=\"c1\"># 4. Generate extreme scenario maps (automatic scenario detection)<\/span> <\/span><span id=\"__span-4-19\"><a id=\"__codelineno-4-19\" name=\"__codelineno-4-19\" href=\"#__codelineno-4-19\"><\/a>python<span class=\"w\"> <\/span>_4_generate_representative_scenarios.py<span class=\"w\"> <\/span>--device<span class=\"w\"> <\/span>cuda<span class=\"w\"> <\/span>--dpi<span class=\"w\"> <\/span><span class=\"m\">300<\/span> <\/span><span id=\"__span-4-20\"><a id=\"__codelineno-4-20\" name=\"__codelineno-4-20\" href=\"#__codelineno-4-20\"><\/a><span class=\"c1\"># Output: figures\/HOTTEST_*.png, COLDEST_*.png, DRIEST_*.png, MOST_HUMID_*.png<\/span> <\/span><\/code><\/pre><\/div> <h3 id=\"option-b-train-your-own-model\">Option B: Train Your Own Model<\/h3> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-5-1\"><a id=\"__codelineno-5-1\" name=\"__codelineno-5-1\" href=\"#__codelineno-5-1\"><\/a><span class=\"c1\"># Step 1: Train the model<\/span> <\/span><span id=\"__span-5-2\"><a id=\"__codelineno-5-2\" name=\"__codelineno-5-2\" href=\"#__codelineno-5-2\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>3_Training_Model <\/span><span id=\"__span-5-3\"><a id=\"__codelineno-5-3\" name=\"__codelineno-5-3\" href=\"#__codelineno-5-3\"><\/a> <\/span><span id=\"__span-5-4\"><a id=\"__codelineno-5-4\" name=\"__codelineno-5-4\" href=\"#__codelineno-5-4\"><\/a><span class=\"c1\"># GPU training (recommended)<\/span> <\/span><span id=\"__span-5-5\"><a id=\"__codelineno-5-5\" name=\"__codelineno-5-5\" href=\"#__codelineno-5-5\"><\/a>python<span class=\"w\"> <\/span>_5_main.py<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-6\"><a id=\"__codelineno-5-6\" name=\"__codelineno-5-6\" href=\"#__codelineno-5-6\"><\/a><span class=\"w\"> <\/span>--data_path<span class=\"w\"> <\/span>..\/2_Data\/gatech_16_stations_10_min_long_format_sun_angles.csv<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-7\"><a id=\"__codelineno-5-7\" name=\"__codelineno-5-7\" href=\"#__codelineno-5-7\"><\/a><span class=\"w\"> <\/span>--device<span class=\"w\"> <\/span>cuda<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-8\"><a id=\"__codelineno-5-8\" name=\"__codelineno-5-8\" href=\"#__codelineno-5-8\"><\/a><span class=\"w\"> <\/span>--attention_heads<span class=\"w\"> <\/span><span class=\"m\">4<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-9\"><a id=\"__codelineno-5-9\" name=\"__codelineno-5-9\" href=\"#__codelineno-5-9\"><\/a><span class=\"w\"> <\/span>--save_dir<span class=\"w\"> <\/span>.\/weights_4heads <\/span><span id=\"__span-5-10\"><a id=\"__codelineno-5-10\" name=\"__codelineno-5-10\" href=\"#__codelineno-5-10\"><\/a> <\/span><span id=\"__span-5-11\"><a id=\"__codelineno-5-11\" name=\"__codelineno-5-11\" href=\"#__codelineno-5-11\"><\/a><span class=\"c1\"># OR CPU training<\/span> <\/span><span id=\"__span-5-12\"><a id=\"__codelineno-5-12\" name=\"__codelineno-5-12\" href=\"#__codelineno-5-12\"><\/a>python<span class=\"w\"> <\/span>_5_main.py<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-13\"><a id=\"__codelineno-5-13\" name=\"__codelineno-5-13\" href=\"#__codelineno-5-13\"><\/a><span class=\"w\"> <\/span>--data_path<span class=\"w\"> <\/span>..\/2_Data\/gatech_16_stations_10_min_long_format_sun_angles.csv<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-14\"><a id=\"__codelineno-5-14\" name=\"__codelineno-5-14\" href=\"#__codelineno-5-14\"><\/a><span class=\"w\"> <\/span>--device<span class=\"w\"> <\/span>cpu<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-15\"><a id=\"__codelineno-5-15\" name=\"__codelineno-5-15\" href=\"#__codelineno-5-15\"><\/a><span class=\"w\"> <\/span>--attention_heads<span class=\"w\"> <\/span><span class=\"m\">2<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-16\"><a id=\"__codelineno-5-16\" name=\"__codelineno-5-16\" href=\"#__codelineno-5-16\"><\/a><span class=\"w\"> <\/span>--save_dir<span class=\"w\"> <\/span>.\/weights <\/span><span id=\"__span-5-17\"><a id=\"__codelineno-5-17\" name=\"__codelineno-5-17\" href=\"#__codelineno-5-17\"><\/a> <\/span><span id=\"__span-5-18\"><a id=\"__codelineno-5-18\" name=\"__codelineno-5-18\" href=\"#__codelineno-5-18\"><\/a><span class=\"c1\"># Step 2: Run inference with your model<\/span> <\/span><span id=\"__span-5-19\"><a id=\"__codelineno-5-19\" name=\"__codelineno-5-19\" href=\"#__codelineno-5-19\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>..\/4_Inference_and_Visualization <\/span><span id=\"__span-5-20\"><a id=\"__codelineno-5-20\" name=\"__codelineno-5-20\" href=\"#__codelineno-5-20\"><\/a>python<span class=\"w\"> <\/span>_1_fusionlstm_inference_kriging.py<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-21\"><a id=\"__codelineno-5-21\" name=\"__codelineno-5-21\" href=\"#__codelineno-5-21\"><\/a><span class=\"w\"> <\/span>--model_path<span class=\"w\"> <\/span>..\/3_Training_Model\/weights_4heads\/TFT_weather_model.pth<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-5-22\"><a id=\"__codelineno-5-22\" name=\"__codelineno-5-22\" href=\"#__codelineno-5-22\"><\/a><span class=\"w\"> <\/span>--target_time<span class=\"w\"> <\/span><span class=\"s2\">&quot;2017-06-25 14:00:00&quot;<\/span> <\/span><span id=\"__span-5-23\"><a id=\"__codelineno-5-23\" name=\"__codelineno-5-23\" href=\"#__codelineno-5-23\"><\/a> <\/span><span id=\"__span-5-24\"><a id=\"__codelineno-5-24\" name=\"__codelineno-5-24\" href=\"#__codelineno-5-24\"><\/a><span class=\"c1\"># Step 3: Create visualizations<\/span> <\/span><span id=\"__span-5-25\"><a id=\"__codelineno-5-25\" name=\"__codelineno-5-25\" href=\"#__codelineno-5-25\"><\/a>python<span class=\"w\"> <\/span>_2_mapping_visualization.py <\/span><\/code><\/pre><\/div> <h2 id=\"project-structure\">Project Structure<\/h2> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-6-1\"><a id=\"__codelineno-6-1\" name=\"__codelineno-6-1\" href=\"#__codelineno-6-1\"><\/a>25Fa-Microclimate-ML\/ <\/span><span id=\"__span-6-2\"><a id=\"__codelineno-6-2\" name=\"__codelineno-6-2\" href=\"#__codelineno-6-2\"><\/a>\u2502 <\/span><span id=\"__span-6-3\"><a id=\"__codelineno-6-3\" name=\"__codelineno-6-3\" href=\"#__codelineno-6-3\"><\/a>\u251c\u2500\u2500 1_Urban_Features\/ # Geospatial feature extraction <\/span><span id=\"__span-6-4\"><a id=\"__codelineno-6-4\" name=\"__codelineno-6-4\" href=\"#__codelineno-6-4\"><\/a>\u2502 \u251c\u2500\u2500 grid_generator.py # Generate prediction grid <\/span><span id=\"__span-6-5\"><a id=\"__codelineno-6-5\" name=\"__codelineno-6-5\" href=\"#__codelineno-6-5\"><\/a>\u2502 \u251c\u2500\u2500 get_osm_utils.py # OpenStreetMap data processing <\/span><span id=\"__span-6-6\"><a id=\"__codelineno-6-6\" name=\"__codelineno-6-6\" href=\"#__codelineno-6-6\"><\/a>\u2502 \u2514\u2500\u2500 ... <\/span><span id=\"__span-6-7\"><a id=\"__codelineno-6-7\" name=\"__codelineno-6-7\" href=\"#__codelineno-6-7\"><\/a>\u2502 <\/span><span id=\"__span-6-8\"><a id=\"__codelineno-6-8\" name=\"__codelineno-6-8\" href=\"#__codelineno-6-8\"><\/a>\u251c\u2500\u2500 2_Data\/ # Weather data and features <\/span><span id=\"__span-6-9\"><a id=\"__codelineno-6-9\" name=\"__codelineno-6-9\" href=\"#__codelineno-6-9\"><\/a>\u2502 \u251c\u2500\u2500 gatech_16_stations_10_min_long_format_sun_angles.csv # Main dataset (~947K rows, 16 stations) <\/span><span id=\"__span-6-10\"><a id=\"__codelineno-6-10\" name=\"__codelineno-6-10\" href=\"#__codelineno-6-10\"><\/a>\u2502 \u251c\u2500\u2500 gatech_gridpoint.csv # Grid data (100,283 points) <\/span><span id=\"__span-6-11\"><a id=\"__codelineno-6-11\" name=\"__codelineno-6-11\" href=\"#__codelineno-6-11\"><\/a>\u2502 \u2514\u2500\u2500 ... <\/span><span id=\"__span-6-12\"><a id=\"__codelineno-6-12\" name=\"__codelineno-6-12\" href=\"#__codelineno-6-12\"><\/a>\u2502 <\/span><span id=\"__span-6-13\"><a id=\"__codelineno-6-13\" name=\"__codelineno-6-13\" href=\"#__codelineno-6-13\"><\/a>\u251c\u2500\u2500 3_Training_Model\/ # Model training pipeline <\/span><span id=\"__span-6-14\"><a id=\"__codelineno-6-14\" name=\"__codelineno-6-14\" href=\"#__codelineno-6-14\"><\/a>\u2502 \u251c\u2500\u2500 _1_model_architecture.py # Single-step TFT implementation <\/span><span id=\"__span-6-15\"><a id=\"__codelineno-6-15\" name=\"__codelineno-6-15\" href=\"#__codelineno-6-15\"><\/a>\u2502 \u251c\u2500\u2500 _2_data_preprocessing.py # Data cleaning &amp; sequences <\/span><span id=\"__span-6-16\"><a id=\"__codelineno-6-16\" name=\"__codelineno-6-16\" href=\"#__codelineno-6-16\"><\/a>\u2502 \u251c\u2500\u2500 _3_model_training.py # Training pipeline <\/span><span id=\"__span-6-17\"><a id=\"__codelineno-6-17\" name=\"__codelineno-6-17\" href=\"#__codelineno-6-17\"><\/a>\u2502 \u251c\u2500\u2500 _4_model_evaluation.py # Metrics &amp; visualization <\/span><span id=\"__span-6-18\"><a id=\"__codelineno-6-18\" name=\"__codelineno-6-18\" href=\"#__codelineno-6-18\"><\/a>\u2502 \u251c\u2500\u2500 _5_main.py # Main training script (CLI) <\/span><span id=\"__span-6-19\"><a id=\"__codelineno-6-19\" name=\"__codelineno-6-19\" href=\"#__codelineno-6-19\"><\/a>\u2502 \u251c\u2500\u2500 _6_example_usage.py # Usage examples <\/span><span id=\"__span-6-20\"><a id=\"__codelineno-6-20\" name=\"__codelineno-6-20\" href=\"#__codelineno-6-20\"><\/a>\u2502 \u251c\u2500\u2500 phoenix_gpu_train.sbatch # SLURM: GPU training (A100) <\/span><span id=\"__span-6-21\"><a id=\"__codelineno-6-21\" name=\"__codelineno-6-21\" href=\"#__codelineno-6-21\"><\/a>\u2502 \u251c\u2500\u2500 phoenix_cpu_train.sbatch # SLURM: CPU training <\/span><span id=\"__span-6-22\"><a id=\"__codelineno-6-22\" name=\"__codelineno-6-22\" href=\"#__codelineno-6-22\"><\/a>\u2502 \u251c\u2500\u2500 weights\/ # CPU trained models <\/span><span id=\"__span-6-23\"><a id=\"__codelineno-6-23\" name=\"__codelineno-6-23\" href=\"#__codelineno-6-23\"><\/a>\u2502 \u251c\u2500\u2500 weights_4heads\/ # GPU trained models <\/span><span id=\"__span-6-24\"><a id=\"__codelineno-6-24\" name=\"__codelineno-6-24\" href=\"#__codelineno-6-24\"><\/a>\u2502 \u251c\u2500\u2500 training_plots\/ # Loss curves, LR schedule <\/span><span id=\"__span-6-25\"><a id=\"__codelineno-6-25\" name=\"__codelineno-6-25\" href=\"#__codelineno-6-25\"><\/a>\u2502 \u251c\u2500\u2500 evaluation_plots\/ # Predictions, residuals <\/span><span id=\"__span-6-26\"><a id=\"__codelineno-6-26\" name=\"__codelineno-6-26\" href=\"#__codelineno-6-26\"><\/a>\u2502 \u251c\u2500\u2500 logs\/ # SLURM job logs <\/span><span id=\"__span-6-27\"><a id=\"__codelineno-6-27\" name=\"__codelineno-6-27\" href=\"#__codelineno-6-27\"><\/a>\u2502 \u2514\u2500\u2500 README.md # Training documentation <\/span><span id=\"__span-6-28\"><a id=\"__codelineno-6-28\" name=\"__codelineno-6-28\" href=\"#__codelineno-6-28\"><\/a>\u2502 <\/span><span id=\"__span-6-29\"><a id=\"__codelineno-6-29\" name=\"__codelineno-6-29\" href=\"#__codelineno-6-29\"><\/a>\u251c\u2500\u2500 4_Inference_and_Visualization\/ # Inference &amp; visualization <\/span><span id=\"__span-6-30\"><a id=\"__codelineno-6-30\" name=\"__codelineno-6-30\" href=\"#__codelineno-6-30\"><\/a>\u2502 \u251c\u2500\u2500 _1_fusionlstm_inference_kriging.py # FusionLSTM inference + Kriging <\/span><span id=\"__span-6-31\"><a id=\"__codelineno-6-31\" name=\"__codelineno-6-31\" href=\"#__codelineno-6-31\"><\/a>\u2502 \u251c\u2500\u2500 _2_mapping_visualization.py # Create spatial maps <\/span><span id=\"__span-6-32\"><a id=\"__codelineno-6-32\" name=\"__codelineno-6-32\" href=\"#__codelineno-6-32\"><\/a>\u2502 \u251c\u2500\u2500 _3_lulc_analysis.py # LULC feature importance <\/span><span id=\"__span-6-33\"><a id=\"__codelineno-6-33\" name=\"__codelineno-6-33\" href=\"#__codelineno-6-33\"><\/a>\u2502 \u251c\u2500\u2500 _4_generate_representative_scenarios.py # Auto-generate extreme scenarios <\/span><span id=\"__span-6-34\"><a id=\"__codelineno-6-34\" name=\"__codelineno-6-34\" href=\"#__codelineno-6-34\"><\/a>\u2502 \u251c\u2500\u2500 _1_inference.sbatch # SLURM: Inference (A100 GPU) <\/span><span id=\"__span-6-35\"><a id=\"__codelineno-6-35\" name=\"__codelineno-6-35\" href=\"#__codelineno-6-35\"><\/a>\u2502 \u251c\u2500\u2500 _2_visualization.sbatch # SLURM: Visualization (CPU) <\/span><span id=\"__span-6-36\"><a id=\"__codelineno-6-36\" name=\"__codelineno-6-36\" href=\"#__codelineno-6-36\"><\/a>\u2502 \u251c\u2500\u2500 _3_lulc.sbatch # SLURM: LULC analysis (CPU) <\/span><span id=\"__span-6-37\"><a id=\"__codelineno-6-37\" name=\"__codelineno-6-37\" href=\"#__codelineno-6-37\"><\/a>\u2502 \u251c\u2500\u2500 _4_representative_scenarios.sbatch # SLURM: Generate all scenarios (GPU) <\/span><span id=\"__span-6-38\"><a id=\"__codelineno-6-38\" name=\"__codelineno-6-38\" href=\"#__codelineno-6-38\"><\/a>\u2502 \u251c\u2500\u2500 outputs\/ # Prediction CSV + PKL files <\/span><span id=\"__span-6-39\"><a id=\"__codelineno-6-39\" name=\"__codelineno-6-39\" href=\"#__codelineno-6-39\"><\/a>\u2502 \u251c\u2500\u2500 figures\/ # Generated maps (PNG) <\/span><span id=\"__span-6-40\"><a id=\"__codelineno-6-40\" name=\"__codelineno-6-40\" href=\"#__codelineno-6-40\"><\/a>\u2502 \u251c\u2500\u2500 logs\/ # SLURM job logs <\/span><span id=\"__span-6-41\"><a id=\"__codelineno-6-41\" name=\"__codelineno-6-41\" href=\"#__codelineno-6-41\"><\/a>\u2502 \u2514\u2500\u2500 README.md # Inference documentation <\/span><span id=\"__span-6-42\"><a id=\"__codelineno-6-42\" name=\"__codelineno-6-42\" href=\"#__codelineno-6-42\"><\/a>\u2502 <\/span><span id=\"__span-6-43\"><a id=\"__codelineno-6-43\" name=\"__codelineno-6-43\" href=\"#__codelineno-6-43\"><\/a>\u251c\u2500\u2500 5_Optional_Frontend\/ # Interactive dashboard (optional) <\/span><span id=\"__span-6-44\"><a id=\"__codelineno-6-44\" name=\"__codelineno-6-44\" href=\"#__codelineno-6-44\"><\/a>\u2502 \u251c\u2500\u2500 streamlit_dashboard.py # Main dashboard app <\/span><span id=\"__span-6-45\"><a id=\"__codelineno-6-45\" name=\"__codelineno-6-45\" href=\"#__codelineno-6-45\"><\/a>\u2502 \u2514\u2500\u2500 README.md # Dashboard documentation <\/span><span id=\"__span-6-46\"><a id=\"__codelineno-6-46\" name=\"__codelineno-6-46\" href=\"#__codelineno-6-46\"><\/a>\u2502 <\/span><span id=\"__span-6-47\"><a id=\"__codelineno-6-47\" name=\"__codelineno-6-47\" href=\"#__codelineno-6-47\"><\/a>\u251c\u2500\u2500 requirements.txt # Python dependencies <\/span><span id=\"__span-6-48\"><a id=\"__codelineno-6-48\" name=\"__codelineno-6-48\" href=\"#__codelineno-6-48\"><\/a>\u2514\u2500\u2500 README.md # This file <\/span><\/code><\/pre><\/div> <h2 id=\"model-architecture\">Model Architecture<\/h2> <h3 id=\"fusionlstm-multi-scale-lstm-with-attention\">FusionLSTM: Multi-Scale LSTM with Attention<\/h3> <p><strong>Core Components<\/strong>: - <strong>Variable Selection Networks<\/strong> \u2192 Adaptive feature importance learning - <strong>Multi-scale LSTM<\/strong> \u2192 Parallel short-term (1 layer) + long-term (2 layers) branches - <strong>Multi-head Attention<\/strong> \u2192 Temporal dependency modeling (2 heads, optimized for efficiency) - <strong>Gated Residual Networks<\/strong> \u2192 Complex feature interactions with stable gradients - <strong>Position Encoding<\/strong> \u2192 Learnable temporal embeddings<\/p> <p><strong>Input Features (12 dimensions)<\/strong>: 1. <strong>Weather Observations<\/strong> (2): Temperature (\u00b0C), Relative Humidity (%) 2. <strong>Solar Geometry<\/strong> (4): Altitude\/azimuth angles (sin\/cos encoding) - Physics-aware features 3. <strong>Temporal Features<\/strong> (6): - Hour of day (sin\/cos, 24-hour cycle) - Day of year (sin\/cos, 365-day cycle) - Minute (sin\/cos, 10-minute resolution)<\/p> <p><strong>Output Targets (2 dimensions)<\/strong>: - Temperature (\u00b0C) - Relative Humidity (%)<\/p> <p><strong>Sequence Configuration<\/strong>: - Historical window: 144 timesteps (24 hours @ 10-minute resolution) - Prediction: Next timestep (+10 minutes) - Training: Warm season only (April\u2013September) for focused heat stress modeling<\/p> <h3 id=\"spatial-interpolation-regression-kriging-with-16-stations\">Spatial Interpolation: Regression Kriging with 16 Stations<\/h3> <p><strong>Method: Regression Kriging<\/strong> (PyKrige) - <strong>Station Coverage<\/strong>: 16 stations provide robust spatial coverage and stable variogram estimation - <strong>Variogram<\/strong>: Spherical model with empirical fitting (sill, range, nugget) - <strong>Spatial Covariates<\/strong>: Elevation, building density\/height, distances to features, shadow ratios - <strong>Stability<\/strong>: 16 stations eliminate the need for IDW fallback (previously required with only 3 stations)<\/p> <p><strong>Process<\/strong>: 1. FusionLSTM generates predictions at all 16 weather station locations 2. Regression Kriging interpolates to 100,283 grid points using spatial covariates 3. Campus boundary overlay from OpenStreetMap (via OSMnx) 4. Adaptive map boundaries fitted to campus extent<\/p> <h2 id=\"dataset-coverage\">Dataset &amp; Coverage<\/h2> <p><strong>Weather Stations<\/strong>: 16 stations - <strong>Time Range<\/strong>: 2015-2019 (warm season: April\u2013September) - <strong>Resolution<\/strong>: 10-minute intervals - <strong>Total Records<\/strong>: ~947,000 warm-season observations - <strong>File Size<\/strong>: ~112 MB - <strong>Variables<\/strong>: Temperature, Relative Humidity, Dew Point, Solar Angles - <strong>Download<\/strong>: <a href=\"https:\/\/huggingface.co\/datasets\/yupengtang\/gatech_10_min_long_format_sun_angles\">Hugging Face Dataset<\/a> (see <code>2_Data\/README.md<\/code>)<\/p> <p><strong>Spatial Grid<\/strong>: 100,283 points - <strong>Area<\/strong>: Georgia Tech campus (~3.5 km\u00b2) - <strong>Average Spacing<\/strong>: ~5.9 meters - <strong>Spatial Features<\/strong>: 24 features including distances, elevation, building metrics, shadow ratios<\/p> <p><strong>Station Holdout Protocol<\/strong>: Station 10635579 (61,556 records) held out for testing; remaining 15 stations used for training\/validation with 90\/10 time-based split<\/p> <h2 id=\"performance\">Performance<\/h2> <h3 id=\"model-performance-fusionlstm-architecture\">Model Performance (FusionLSTM Architecture)<\/h3> <p><strong>Validation Model<\/strong> (15 stations training + 1 held-out for testing):<\/p> <table> <thead> <tr> <th>Variable<\/th> <th>RMSE<\/th> <th>MAE<\/th> <th>MAPE<\/th> <th>R\u00b2<\/th> <th>Max Error<\/th> <\/tr> <\/thead> <tbody> <tr> <td><strong>Temperature<\/strong><\/td> <td><strong>0.43\u00b0C<\/strong><\/td> <td><strong>0.29\u00b0C<\/strong><\/td> <td><strong>1.15%<\/strong><\/td> <td><strong>0.9928<\/strong><\/td> <td>6.98\u00b0C<\/td> <\/tr> <tr> <td><strong>Relative Humidity<\/strong><\/td> <td><strong>1.28%<\/strong><\/td> <td><strong>0.90%<\/strong><\/td> <td><strong>1.51%<\/strong><\/td> <td><strong>0.9952<\/strong><\/td> <td>22.23%<\/td> <\/tr> <\/tbody> <\/table> <p><strong>Generalization Analysis<\/strong> (Test\/Train Ratio): - Temperature: 1.057 (excellent - minimal overfitting) - Relative Humidity: 1.074 (excellent - minimal overfitting) - <strong>Average<\/strong>: 1.065 (healthy generalization)<\/p> <p><strong>Training Summary<\/strong>: - Best Validation Loss: 0.000161 - Total Parameters: 337,742 - Training Time: ~23 minutes (A100 GPU) - Status: Excellent fit with healthy generalization<\/p> <h3 id=\"feature-importance-analysis\">Feature Importance Analysis<\/h3> <p><strong>Top Contributing Features<\/strong> (by RMSE impact when removed):<\/p> <table> <thead> <tr> <th>Rank<\/th> <th>Feature<\/th> <th>RMSE Change<\/th> <th>Category<\/th> <\/tr> <\/thead> <tbody> <tr> <td>1<\/td> <td>RH (Relative Humidity)<\/td> <td>+2789.47%<\/td> <td>Weather Observations<\/td> <\/tr> <tr> <td>2<\/td> <td>Temp (Temperature)<\/td> <td>+371.97%<\/td> <td>Weather Observations<\/td> <\/tr> <tr> <td>3<\/td> <td>hour_sin<\/td> <td>+6.98%<\/td> <td>Temporal (Diurnal Cycle)<\/td> <\/tr> <tr> <td>4<\/td> <td>altitude_sin<\/td> <td>+6.46%<\/td> <td>Solar Geometry<\/td> <\/tr> <tr> <td>5<\/td> <td>hour_cos<\/td> <td>+2.44%<\/td> <td>Temporal (Diurnal Cycle)<\/td> <\/tr> <tr> <td>6<\/td> <td>azimuth_sin<\/td> <td>+2.02%<\/td> <td>Solar Geometry<\/td> <\/tr> <\/tbody> <\/table> <p><strong>Key Insights<\/strong>: - <strong>Weather observations<\/strong> dominate predictions (expected for autoregressive model) - <strong>Solar angles<\/strong> contribute significantly (+2.38% avg) - validates physics-aware design - <strong>Temporal features<\/strong> (hour encoding) capture diurnal patterns (+4.71% combined) - <strong>Day-of-year encoding<\/strong> captures seasonal variations effectively<\/p> <h3 id=\"computational-requirements\">Computational Requirements<\/h3> <p><strong>Training<\/strong> (Phoenix cluster, A100 GPU): - <strong>Validation Model<\/strong> (15 stations): ~23 minutes, 32.7 GB RAM - <strong>Deployment Model<\/strong> (16 stations): ~26 minutes, 34.0 GB RAM - CPU alternative (8 cores): ~24-48 hours, 64 GB RAM<\/p> <p><strong>Inference<\/strong> (single timestamp, 100,283 points): - GPU: ~2 min 10 sec (measured on A100) - CPU: ~10-15 minutes (estimated)<\/p> <p><strong>Visualization<\/strong> (100k+ points, DPI 300): - ~1 min 31 sec for 3 maps (measured)<\/p> <p><strong>LULC Analysis<\/strong> (permutation importance): - ~34 seconds (measured)<\/p> <p><strong>Extreme Scenarios<\/strong> (all 4 scenarios): - ~3 min 4 sec total (measured on A100)<\/p> <h2 id=\"usage-examples\">Usage Examples<\/h2> <h3 id=\"example-1-complete-pipeline-local\">Example 1: Complete Pipeline (Local)<\/h3> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-7-1\"><a id=\"__codelineno-7-1\" name=\"__codelineno-7-1\" href=\"#__codelineno-7-1\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>4_Inference_and_Visualization <\/span><span id=\"__span-7-2\"><a id=\"__codelineno-7-2\" name=\"__codelineno-7-2\" href=\"#__codelineno-7-2\"><\/a> <\/span><span id=\"__span-7-3\"><a id=\"__codelineno-7-3\" name=\"__codelineno-7-3\" href=\"#__codelineno-7-3\"><\/a><span class=\"c1\"># Run inference<\/span> <\/span><span id=\"__span-7-4\"><a id=\"__codelineno-7-4\" name=\"__codelineno-7-4\" href=\"#__codelineno-7-4\"><\/a>python<span class=\"w\"> <\/span>_1_fusionlstm_inference_kriging.py<span class=\"w\"> <\/span>--target_time<span class=\"w\"> <\/span><span class=\"s2\">&quot;2017-06-25 14:00:00&quot;<\/span><span class=\"w\"> <\/span>--device<span class=\"w\"> <\/span>cuda <\/span><span id=\"__span-7-5\"><a id=\"__codelineno-7-5\" name=\"__codelineno-7-5\" href=\"#__codelineno-7-5\"><\/a> <\/span><span id=\"__span-7-6\"><a id=\"__codelineno-7-6\" name=\"__codelineno-7-6\" href=\"#__codelineno-7-6\"><\/a><span class=\"c1\"># Create maps with custom settings<\/span> <\/span><span id=\"__span-7-7\"><a id=\"__codelineno-7-7\" name=\"__codelineno-7-7\" href=\"#__codelineno-7-7\"><\/a>python<span class=\"w\"> <\/span>_2_mapping_visualization.py<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-7-8\"><a id=\"__codelineno-7-8\" name=\"__codelineno-7-8\" href=\"#__codelineno-7-8\"><\/a><span class=\"w\"> <\/span>--dpi<span class=\"w\"> <\/span><span class=\"m\">300<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-7-9\"><a id=\"__codelineno-7-9\" name=\"__codelineno-7-9\" href=\"#__codelineno-7-9\"><\/a><span class=\"w\"> <\/span>--marker-size<span class=\"w\"> <\/span><span class=\"m\">8<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-7-10\"><a id=\"__codelineno-7-10\" name=\"__codelineno-7-10\" href=\"#__codelineno-7-10\"><\/a><span class=\"w\"> <\/span>--marker-alpha<span class=\"w\"> <\/span><span class=\"m\">0<\/span>.7 <\/span><span id=\"__span-7-11\"><a id=\"__codelineno-7-11\" name=\"__codelineno-7-11\" href=\"#__codelineno-7-11\"><\/a> <\/span><span id=\"__span-7-12\"><a id=\"__codelineno-7-12\" name=\"__codelineno-7-12\" href=\"#__codelineno-7-12\"><\/a><span class=\"c1\"># Analyze LULC feature importance<\/span> <\/span><span id=\"__span-7-13\"><a id=\"__codelineno-7-13\" name=\"__codelineno-7-13\" href=\"#__codelineno-7-13\"><\/a>python<span class=\"w\"> <\/span>_3_lulc_analysis.py <\/span><\/code><\/pre><\/div> <h3 id=\"example-2-hpc-workflow-phoenix\">Example 2: HPC Workflow (Phoenix)<\/h3> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-8-1\"><a id=\"__codelineno-8-1\" name=\"__codelineno-8-1\" href=\"#__codelineno-8-1\"><\/a><span class=\"c1\"># Navigate to project directory<\/span> <\/span><span id=\"__span-8-2\"><a id=\"__codelineno-8-2\" name=\"__codelineno-8-2\" href=\"#__codelineno-8-2\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span><span class=\"nv\">$HOME<\/span>\/25Fa-Microclimate-ML\/4_Inference_and_Visualization <\/span><span id=\"__span-8-3\"><a id=\"__codelineno-8-3\" name=\"__codelineno-8-3\" href=\"#__codelineno-8-3\"><\/a> <\/span><span id=\"__span-8-4\"><a id=\"__codelineno-8-4\" name=\"__codelineno-8-4\" href=\"#__codelineno-8-4\"><\/a><span class=\"c1\"># Submit all jobs sequentially<\/span> <\/span><span id=\"__span-8-5\"><a id=\"__codelineno-8-5\" name=\"__codelineno-8-5\" href=\"#__codelineno-8-5\"><\/a>sbatch<span class=\"w\"> <\/span>_1_inference.sbatch <\/span><span id=\"__span-8-6\"><a id=\"__codelineno-8-6\" name=\"__codelineno-8-6\" href=\"#__codelineno-8-6\"><\/a><span class=\"c1\"># Wait ~2 min 10 sec for inference to complete<\/span> <\/span><span id=\"__span-8-7\"><a id=\"__codelineno-8-7\" name=\"__codelineno-8-7\" href=\"#__codelineno-8-7\"><\/a> <\/span><span id=\"__span-8-8\"><a id=\"__codelineno-8-8\" name=\"__codelineno-8-8\" href=\"#__codelineno-8-8\"><\/a>sbatch<span class=\"w\"> <\/span>_2_visualization.sbatch<span class=\"w\"> <\/span><span class=\"c1\"># ~1 min 31 sec<\/span> <\/span><span id=\"__span-8-9\"><a id=\"__codelineno-8-9\" name=\"__codelineno-8-9\" href=\"#__codelineno-8-9\"><\/a>sbatch<span class=\"w\"> <\/span>_3_lulc.sbatch<span class=\"w\"> <\/span><span class=\"c1\"># ~34 sec<\/span> <\/span><span id=\"__span-8-10\"><a id=\"__codelineno-8-10\" name=\"__codelineno-8-10\" href=\"#__codelineno-8-10\"><\/a> <\/span><span id=\"__span-8-11\"><a id=\"__codelineno-8-11\" name=\"__codelineno-8-11\" href=\"#__codelineno-8-11\"><\/a><span class=\"c1\"># Optional: Generate extreme scenarios<\/span> <\/span><span id=\"__span-8-12\"><a id=\"__codelineno-8-12\" name=\"__codelineno-8-12\" href=\"#__codelineno-8-12\"><\/a>sbatch<span class=\"w\"> <\/span>_4_representative_scenarios.sbatch<span class=\"w\"> <\/span><span class=\"c1\"># ~3 min 4 sec<\/span> <\/span><span id=\"__span-8-13\"><a id=\"__codelineno-8-13\" name=\"__codelineno-8-13\" href=\"#__codelineno-8-13\"><\/a> <\/span><span id=\"__span-8-14\"><a id=\"__codelineno-8-14\" name=\"__codelineno-8-14\" href=\"#__codelineno-8-14\"><\/a><span class=\"c1\"># Check status<\/span> <\/span><span id=\"__span-8-15\"><a id=\"__codelineno-8-15\" name=\"__codelineno-8-15\" href=\"#__codelineno-8-15\"><\/a>squeue<span class=\"w\"> <\/span>-u<span class=\"w\"> <\/span><span class=\"nv\">$USER<\/span> <\/span><span id=\"__span-8-16\"><a id=\"__codelineno-8-16\" name=\"__codelineno-8-16\" href=\"#__codelineno-8-16\"><\/a> <\/span><span id=\"__span-8-17\"><a id=\"__codelineno-8-17\" name=\"__codelineno-8-17\" href=\"#__codelineno-8-17\"><\/a><span class=\"c1\"># View results<\/span> <\/span><span id=\"__span-8-18\"><a id=\"__codelineno-8-18\" name=\"__codelineno-8-18\" href=\"#__codelineno-8-18\"><\/a>ls<span class=\"w\"> <\/span>-lh<span class=\"w\"> <\/span>outputs\/ <\/span><span id=\"__span-8-19\"><a id=\"__codelineno-8-19\" name=\"__codelineno-8-19\" href=\"#__codelineno-8-19\"><\/a>ls<span class=\"w\"> <\/span>-lh<span class=\"w\"> <\/span>figures\/ <\/span><\/code><\/pre><\/div> <h3 id=\"example-3-custom-training\">Example 3: Custom Training<\/h3> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-9-1\"><a id=\"__codelineno-9-1\" name=\"__codelineno-9-1\" href=\"#__codelineno-9-1\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>3_Training_Model <\/span><span id=\"__span-9-2\"><a id=\"__codelineno-9-2\" name=\"__codelineno-9-2\" href=\"#__codelineno-9-2\"><\/a> <\/span><span id=\"__span-9-3\"><a id=\"__codelineno-9-3\" name=\"__codelineno-9-3\" href=\"#__codelineno-9-3\"><\/a>python<span class=\"w\"> <\/span>_5_main.py<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-4\"><a id=\"__codelineno-9-4\" name=\"__codelineno-9-4\" href=\"#__codelineno-9-4\"><\/a><span class=\"w\"> <\/span>--data_path<span class=\"w\"> <\/span>..\/2_Data\/gatech_16_stations_10_min_long_format_sun_angles.csv<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-5\"><a id=\"__codelineno-9-5\" name=\"__codelineno-9-5\" href=\"#__codelineno-9-5\"><\/a><span class=\"w\"> <\/span>--sequence_length<span class=\"w\"> <\/span><span class=\"m\">144<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-6\"><a id=\"__codelineno-9-6\" name=\"__codelineno-9-6\" href=\"#__codelineno-9-6\"><\/a><span class=\"w\"> <\/span>--epochs<span class=\"w\"> <\/span><span class=\"m\">200<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-7\"><a id=\"__codelineno-9-7\" name=\"__codelineno-9-7\" href=\"#__codelineno-9-7\"><\/a><span class=\"w\"> <\/span>--patience<span class=\"w\"> <\/span><span class=\"m\">20<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-8\"><a id=\"__codelineno-9-8\" name=\"__codelineno-9-8\" href=\"#__codelineno-9-8\"><\/a><span class=\"w\"> <\/span>--hidden_dim<span class=\"w\"> <\/span><span class=\"m\">128<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-9\"><a id=\"__codelineno-9-9\" name=\"__codelineno-9-9\" href=\"#__codelineno-9-9\"><\/a><span class=\"w\"> <\/span>--num_layers<span class=\"w\"> <\/span><span class=\"m\">2<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-10\"><a id=\"__codelineno-9-10\" name=\"__codelineno-9-10\" href=\"#__codelineno-9-10\"><\/a><span class=\"w\"> <\/span>--dropout<span class=\"w\"> <\/span><span class=\"m\">0<\/span>.3<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-11\"><a id=\"__codelineno-9-11\" name=\"__codelineno-9-11\" href=\"#__codelineno-9-11\"><\/a><span class=\"w\"> <\/span>--attention_heads<span class=\"w\"> <\/span><span class=\"m\">4<\/span><span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-12\"><a id=\"__codelineno-9-12\" name=\"__codelineno-9-12\" href=\"#__codelineno-9-12\"><\/a><span class=\"w\"> <\/span>--weight_decay<span class=\"w\"> <\/span>1e-3<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-13\"><a id=\"__codelineno-9-13\" name=\"__codelineno-9-13\" href=\"#__codelineno-9-13\"><\/a><span class=\"w\"> <\/span>--learning_rate<span class=\"w\"> <\/span><span class=\"m\">0<\/span>.001<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-14\"><a id=\"__codelineno-9-14\" name=\"__codelineno-9-14\" href=\"#__codelineno-9-14\"><\/a><span class=\"w\"> <\/span>--device<span class=\"w\"> <\/span>cuda<span class=\"w\"> <\/span><span class=\"se\">\\<\/span> <\/span><span id=\"__span-9-15\"><a id=\"__codelineno-9-15\" name=\"__codelineno-9-15\" href=\"#__codelineno-9-15\"><\/a><span class=\"w\"> <\/span>--save_dir<span class=\"w\"> <\/span>.\/weights_4heads <\/span><\/code><\/pre><\/div> <h3 id=\"example-4-batch-processing-multiple-times\">Example 4: Batch Processing Multiple Times<\/h3> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-10-1\"><a id=\"__codelineno-10-1\" name=\"__codelineno-10-1\" href=\"#__codelineno-10-1\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>4_Inference_and_Visualization <\/span><span id=\"__span-10-2\"><a id=\"__codelineno-10-2\" name=\"__codelineno-10-2\" href=\"#__codelineno-10-2\"><\/a> <\/span><span id=\"__span-10-3\"><a id=\"__codelineno-10-3\" name=\"__codelineno-10-3\" href=\"#__codelineno-10-3\"><\/a><span class=\"c1\"># Loop through multiple timestamps<\/span> <\/span><span id=\"__span-10-4\"><a id=\"__codelineno-10-4\" name=\"__codelineno-10-4\" href=\"#__codelineno-10-4\"><\/a><span class=\"k\">for<\/span><span class=\"w\"> <\/span><span class=\"nb\">time<\/span><span class=\"w\"> <\/span><span class=\"k\">in<\/span><span class=\"w\"> <\/span><span class=\"s2\">&quot;2017-06-25 14:00:00&quot;<\/span><span class=\"w\"> <\/span><span class=\"s2\">&quot;2016-06-25 16:10:00&quot;<\/span><span class=\"w\"> <\/span><span class=\"s2\">&quot;2015-04-04 18:30:00&quot;<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"k\">do<\/span> <\/span><span id=\"__span-10-5\"><a id=\"__codelineno-10-5\" name=\"__codelineno-10-5\" href=\"#__codelineno-10-5\"><\/a><span class=\"w\"> <\/span>python<span class=\"w\"> <\/span>_1_fusionlstm_inference_kriging.py<span class=\"w\"> <\/span>--target_time<span class=\"w\"> <\/span><span class=\"s2\">&quot;<\/span><span class=\"nv\">$time<\/span><span class=\"s2\">&quot;<\/span><span class=\"w\"> <\/span>--device<span class=\"w\"> <\/span>cuda <\/span><span id=\"__span-10-6\"><a id=\"__codelineno-10-6\" name=\"__codelineno-10-6\" href=\"#__codelineno-10-6\"><\/a><span class=\"w\"> <\/span>python<span class=\"w\"> <\/span>_2_mapping_visualization.py <\/span><span id=\"__span-10-7\"><a id=\"__codelineno-10-7\" name=\"__codelineno-10-7\" href=\"#__codelineno-10-7\"><\/a><span class=\"k\">done<\/span> <\/span><\/code><\/pre><\/div> <h2 id=\"output-files\">Output Files<\/h2> <h3 id=\"inference-outputs\">Inference Outputs<\/h3> <p><strong>Directory<\/strong>: <code>4_Inference_and_Visualization\/outputs\/<\/code><\/p> <table> <thead> <tr> <th>File<\/th> <th>Size<\/th> <th>Description<\/th> <\/tr> <\/thead> <tbody> <tr> <td><code>FusionLSTM_kriging_predictions_TIMESTAMP.csv<\/code><\/td> <td>~31 MB<\/td> <td>100,283 points \u00d7 26 columns<\/td> <\/tr> <tr> <td><code>FusionLSTM_kriging_predictions_TIMESTAMP_models.pkl<\/code><\/td> <td><strong>169 KB<\/strong><\/td> <td>Regression Kriging models (Temperature + RH)<\/td> <\/tr> <\/tbody> <\/table> <p><strong>CSV Columns<\/strong>: - Coordinates: <code>latitude<\/code>, <code>longitude<\/code>, <code>point_id<\/code> - Spatial features: 9 LULC features - Predictions: <code>KrigingPrediction_Tem<\/code>, <code>KrigingPrediction_RH<\/code><\/p> <h3 id=\"visualization-outputs\">Visualization Outputs<\/h3> <p><strong>Directory<\/strong>: <code>4_Inference_and_Visualization\/figures\/<\/code><\/p> <table> <thead> <tr> <th>File<\/th> <th>Size<\/th> <th>Resolution<\/th> <th>Description<\/th> <\/tr> <\/thead> <tbody> <tr> <td><code>temperature_map_TIMESTAMP.png<\/code><\/td> <td>~1.7 MB<\/td> <td>4800\u00d73600 px<\/td> <td>Temperature spatial map<\/td> <\/tr> <tr> <td><code>humidity_map_TIMESTAMP.png<\/code><\/td> <td>~1.4 MB<\/td> <td>4800\u00d73600 px<\/td> <td>Humidity spatial map<\/td> <\/tr> <tr> <td><code>comparison_map_TIMESTAMP.png<\/code><\/td> <td>~2.1 MB<\/td> <td>7200\u00d73000 px<\/td> <td>Side-by-side comparison<\/td> <\/tr> <tr> <td><code>*_lulc_importance.png<\/code><\/td> <td><strong>237 KB<\/strong><\/td> <td>4800\u00d71800 px<\/td> <td>LULC feature importance analysis<\/td> <\/tr> <tr> <td><code>HOTTEST_*.png<\/code>, <code>COLDEST_*.png<\/code>, etc.<\/td> <td>~1-2 MB each<\/td> <td>4800\u00d73600 px<\/td> <td>Extreme scenario maps<\/td> <\/tr> <\/tbody> <\/table> <h3 id=\"training-outputs\">Training Outputs<\/h3> <p><strong>Directory<\/strong>: <code>3_Training_Model\/<\/code><\/p> <ul> <li><code>weights\/TFT_weather_model.pth<\/code> - CPU trained model<\/li> <li><code>weights_4heads\/TFT_weather_model.pth<\/code> - GPU trained model<\/li> <li><code>training_plots\/<\/code> - Loss curves, LR schedule<\/li> <li><code>evaluation_plots\/<\/code> - Predictions, residuals, scatter plots<\/li> <li><code>logs\/<\/code> - SLURM job outputs<\/li> <\/ul> <h2 id=\"dependencies\">Dependencies<\/h2> <h3 id=\"core-requirements\">Core Requirements<\/h3> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-11-1\"><a id=\"__codelineno-11-1\" name=\"__codelineno-11-1\" href=\"#__codelineno-11-1\"><\/a># Deep Learning <\/span><span id=\"__span-11-2\"><a id=\"__codelineno-11-2\" name=\"__codelineno-11-2\" href=\"#__codelineno-11-2\"><\/a>torch&gt;=2.3.1 <\/span><span id=\"__span-11-3\"><a id=\"__codelineno-11-3\" name=\"__codelineno-11-3\" href=\"#__codelineno-11-3\"><\/a>numpy&gt;=1.26.4,&lt;2.0.0 <\/span><span id=\"__span-11-4\"><a id=\"__codelineno-11-4\" name=\"__codelineno-11-4\" href=\"#__codelineno-11-4\"><\/a>pandas==2.2.2 <\/span><span id=\"__span-11-5\"><a id=\"__codelineno-11-5\" name=\"__codelineno-11-5\" href=\"#__codelineno-11-5\"><\/a>scikit-learn==1.7.2 <\/span><span id=\"__span-11-6\"><a id=\"__codelineno-11-6\" name=\"__codelineno-11-6\" href=\"#__codelineno-11-6\"><\/a> <\/span><span id=\"__span-11-7\"><a id=\"__codelineno-11-7\" name=\"__codelineno-11-7\" href=\"#__codelineno-11-7\"><\/a># Spatial Analysis <\/span><span id=\"__span-11-8\"><a id=\"__codelineno-11-8\" name=\"__codelineno-11-8\" href=\"#__codelineno-11-8\"><\/a>pykrige==1.7.0 <\/span><span id=\"__span-11-9\"><a id=\"__codelineno-11-9\" name=\"__codelineno-11-9\" href=\"#__codelineno-11-9\"><\/a>contextily==1.6.2 <\/span><span id=\"__span-11-10\"><a id=\"__codelineno-11-10\" name=\"__codelineno-11-10\" href=\"#__codelineno-11-10\"><\/a> <\/span><span id=\"__span-11-11\"><a id=\"__codelineno-11-11\" name=\"__codelineno-11-11\" href=\"#__codelineno-11-11\"><\/a># Visualization <\/span><span id=\"__span-11-12\"><a id=\"__codelineno-11-12\" name=\"__codelineno-11-12\" href=\"#__codelineno-11-12\"><\/a>matplotlib==3.10.3 <\/span><span id=\"__span-11-13\"><a id=\"__codelineno-11-13\" name=\"__codelineno-11-13\" href=\"#__codelineno-11-13\"><\/a>seaborn==0.13.2 <\/span><span id=\"__span-11-14\"><a id=\"__codelineno-11-14\" name=\"__codelineno-11-14\" href=\"#__codelineno-11-14\"><\/a> <\/span><span id=\"__span-11-15\"><a id=\"__codelineno-11-15\" name=\"__codelineno-11-15\" href=\"#__codelineno-11-15\"><\/a># Utilities <\/span><span id=\"__span-11-16\"><a id=\"__codelineno-11-16\" name=\"__codelineno-11-16\" href=\"#__codelineno-11-16\"><\/a>tqdm==4.67.1 <\/span><\/code><\/pre><\/div> <h3 id=\"installation-options\">Installation Options<\/h3> <p><strong>Using UV (Recommended):<\/strong> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-12-1\"><a id=\"__codelineno-12-1\" name=\"__codelineno-12-1\" href=\"#__codelineno-12-1\"><\/a>uv<span class=\"w\"> <\/span>venv<span class=\"w\"> <\/span><span class=\"o\">&amp;&amp;<\/span><span class=\"w\"> <\/span><span class=\"nb\">source<\/span><span class=\"w\"> <\/span>.venv\/bin\/activate <\/span><span id=\"__span-12-2\"><a id=\"__codelineno-12-2\" name=\"__codelineno-12-2\" href=\"#__codelineno-12-2\"><\/a>uv<span class=\"w\"> <\/span>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>-r<span class=\"w\"> <\/span>requirements.txt <\/span><\/code><\/pre><\/div><\/p> <p><strong>Using pip:<\/strong> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-13-1\"><a id=\"__codelineno-13-1\" name=\"__codelineno-13-1\" href=\"#__codelineno-13-1\"><\/a>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>-r<span class=\"w\"> <\/span>requirements.txt <\/span><\/code><\/pre><\/div><\/p> <p><strong>Why UV?<\/strong> UV provides 10-100x faster package installation compared to pip, with deterministic dependency resolution for reproducible environments. All SLURM scripts use UV by default for efficient HPC resource utilization.<\/p> <h2 id=\"package-management-with-uv\">Package Management with UV<\/h2> <p>This project uses <a href=\"https:\/\/github.com\/astral-sh\/uv\">UV<\/a> for fast and reliable Python package management.<\/p> <h3 id=\"installation\">Installation<\/h3> <p><strong>One-time setup:<\/strong> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-14-1\"><a id=\"__codelineno-14-1\" name=\"__codelineno-14-1\" href=\"#__codelineno-14-1\"><\/a><span class=\"c1\"># Install UV<\/span> <\/span><span id=\"__span-14-2\"><a id=\"__codelineno-14-2\" name=\"__codelineno-14-2\" href=\"#__codelineno-14-2\"><\/a>curl<span class=\"w\"> <\/span>-LsSf<span class=\"w\"> <\/span>https:\/\/astral.sh\/uv\/install.sh<span class=\"w\"> <\/span><span class=\"p\">|<\/span><span class=\"w\"> <\/span>sh <\/span><span id=\"__span-14-3\"><a id=\"__codelineno-14-3\" name=\"__codelineno-14-3\" href=\"#__codelineno-14-3\"><\/a><span class=\"nb\">export<\/span><span class=\"w\"> <\/span><span class=\"nv\">PATH<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;<\/span><span class=\"nv\">$HOME<\/span><span class=\"s2\">\/.local\/bin:<\/span><span class=\"nv\">$PATH<\/span><span class=\"s2\">&quot;<\/span> <\/span><span id=\"__span-14-4\"><a id=\"__codelineno-14-4\" name=\"__codelineno-14-4\" href=\"#__codelineno-14-4\"><\/a> <\/span><span id=\"__span-14-5\"><a id=\"__codelineno-14-5\" name=\"__codelineno-14-5\" href=\"#__codelineno-14-5\"><\/a><span class=\"c1\"># Make permanent (add to ~\/.bashrc)<\/span> <\/span><span id=\"__span-14-6\"><a id=\"__codelineno-14-6\" name=\"__codelineno-14-6\" href=\"#__codelineno-14-6\"><\/a><span class=\"nb\">echo<\/span><span class=\"w\"> <\/span><span class=\"s1\">&#39;export PATH=&quot;$HOME\/.local\/bin:$PATH&quot;&#39;<\/span><span class=\"w\"> <\/span>&gt;&gt;<span class=\"w\"> <\/span>~\/.bashrc <\/span><\/code><\/pre><\/div><\/p> <h3 id=\"usage-on-hpc-phoenix-cluster\">Usage on HPC (Phoenix Cluster)<\/h3> <p>All SLURM scripts automatically use UV for dependency installation:<\/p> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-15-1\"><a id=\"__codelineno-15-1\" name=\"__codelineno-15-1\" href=\"#__codelineno-15-1\"><\/a><span class=\"ch\">#!\/bin\/bash<\/span> <\/span><span id=\"__span-15-2\"><a id=\"__codelineno-15-2\" name=\"__codelineno-15-2\" href=\"#__codelineno-15-2\"><\/a><span class=\"c1\">#SBATCH --account=gts-pkastner3<\/span> <\/span><span id=\"__span-15-3\"><a id=\"__codelineno-15-3\" name=\"__codelineno-15-3\" href=\"#__codelineno-15-3\"><\/a> <\/span><span id=\"__span-15-4\"><a id=\"__codelineno-15-4\" name=\"__codelineno-15-4\" href=\"#__codelineno-15-4\"><\/a>module<span class=\"w\"> <\/span>load<span class=\"w\"> <\/span>anaconda3 <\/span><span id=\"__span-15-5\"><a id=\"__codelineno-15-5\" name=\"__codelineno-15-5\" href=\"#__codelineno-15-5\"><\/a><span class=\"nb\">export<\/span><span class=\"w\"> <\/span><span class=\"nv\">PATH<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;<\/span><span class=\"nv\">$HOME<\/span><span class=\"s2\">\/.local\/bin:<\/span><span class=\"nv\">$PATH<\/span><span class=\"s2\">&quot;<\/span> <\/span><span id=\"__span-15-6\"><a id=\"__codelineno-15-6\" name=\"__codelineno-15-6\" href=\"#__codelineno-15-6\"><\/a> <\/span><span id=\"__span-15-7\"><a id=\"__codelineno-15-7\" name=\"__codelineno-15-7\" href=\"#__codelineno-15-7\"><\/a><span class=\"c1\"># UV automatically used (10-100x faster than pip)<\/span> <\/span><span id=\"__span-15-8\"><a id=\"__codelineno-15-8\" name=\"__codelineno-15-8\" href=\"#__codelineno-15-8\"><\/a>uv<span class=\"w\"> <\/span>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>-r<span class=\"w\"> <\/span>requirements.txt<span class=\"w\"> <\/span>--system <\/span><span id=\"__span-15-9\"><a id=\"__codelineno-15-9\" name=\"__codelineno-15-9\" href=\"#__codelineno-15-9\"><\/a> <\/span><span id=\"__span-15-10\"><a id=\"__codelineno-15-10\" name=\"__codelineno-15-10\" href=\"#__codelineno-15-10\"><\/a>python<span class=\"w\"> <\/span>your_script.py <\/span><\/code><\/pre><\/div> <p><strong>Performance:<\/strong> UV reduces package installation time from ~45 seconds (pip) to ~2 seconds (cached), saving over 1 hour for 100 job submissions.<\/p> <h3 id=\"local-development\">Local Development<\/h3> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-16-1\"><a id=\"__codelineno-16-1\" name=\"__codelineno-16-1\" href=\"#__codelineno-16-1\"><\/a><span class=\"c1\"># Create virtual environment<\/span> <\/span><span id=\"__span-16-2\"><a id=\"__codelineno-16-2\" name=\"__codelineno-16-2\" href=\"#__codelineno-16-2\"><\/a>uv<span class=\"w\"> <\/span>venv <\/span><span id=\"__span-16-3\"><a id=\"__codelineno-16-3\" name=\"__codelineno-16-3\" href=\"#__codelineno-16-3\"><\/a><span class=\"nb\">source<\/span><span class=\"w\"> <\/span>.venv\/bin\/activate <\/span><span id=\"__span-16-4\"><a id=\"__codelineno-16-4\" name=\"__codelineno-16-4\" href=\"#__codelineno-16-4\"><\/a> <\/span><span id=\"__span-16-5\"><a id=\"__codelineno-16-5\" name=\"__codelineno-16-5\" href=\"#__codelineno-16-5\"><\/a><span class=\"c1\"># Install dependencies<\/span> <\/span><span id=\"__span-16-6\"><a id=\"__codelineno-16-6\" name=\"__codelineno-16-6\" href=\"#__codelineno-16-6\"><\/a>uv<span class=\"w\"> <\/span>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>-r<span class=\"w\"> <\/span>requirements.txt <\/span><\/code><\/pre><\/div> <p>UV is a drop-in replacement for pip with identical command syntax and significantly improved performance.<\/p> <h2 id=\"documentation\">Documentation<\/h2> <p>Detailed guides for each module:<\/p> <ul> <li><strong><a href=\"3_Training_Model\/README.md\">3_Training_Model\/README.md<\/a><\/strong> - Complete training guide<\/li> <li>Single-step architecture details<\/li> <li>SLURM job configuration<\/li> <li>Hyperparameter tuning<\/li> <li> <p>Performance optimization<\/p> <\/li> <li> <p><strong><a href=\"4_Inference_and_Visualization\/README.md\">4_Inference_and_Visualization\/README.md<\/a><\/strong> - Inference &amp; visualization<\/p> <\/li> <li>Inference workflow<\/li> <li>Kriging vs IDW fallback<\/li> <li>Visualization settings<\/li> <li> <p>LULC analysis<\/p> <\/li> <li> <p><strong><a href=\"PACE_PHOENIX_TUTORIAL.md\">PACE_PHOENIX_TUTORIAL.md<\/a><\/strong> - Complete beginner's guide<\/p> <\/li> <li>Step-by-step SSH connection<\/li> <li>GlobalProtect VPN setup<\/li> <li>File upload\/download<\/li> <li>Complete workflow examples<\/li> <\/ul> <h2 id=\"github-ssh-key-setup-for-private-repo\">GitHub SSH Key Setup (For Private Repo)<\/h2> <p>This repository is private. Set up SSH key for access:<\/p> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-17-1\"><a id=\"__codelineno-17-1\" name=\"__codelineno-17-1\" href=\"#__codelineno-17-1\"><\/a><span class=\"c1\"># On Phoenix (or local machine)<\/span> <\/span><span id=\"__span-17-2\"><a id=\"__codelineno-17-2\" name=\"__codelineno-17-2\" href=\"#__codelineno-17-2\"><\/a><span class=\"c1\"># 1. Generate SSH key<\/span> <\/span><span id=\"__span-17-3\"><a id=\"__codelineno-17-3\" name=\"__codelineno-17-3\" href=\"#__codelineno-17-3\"><\/a>ssh-keygen<span class=\"w\"> <\/span>-t<span class=\"w\"> <\/span>ed25519<span class=\"w\"> <\/span>-C<span class=\"w\"> <\/span><span class=\"s2\">&quot;your_email@gatech.edu&quot;<\/span> <\/span><span id=\"__span-17-4\"><a id=\"__codelineno-17-4\" name=\"__codelineno-17-4\" href=\"#__codelineno-17-4\"><\/a><span class=\"c1\"># Press Enter for default location, optionally set passphrase<\/span> <\/span><span id=\"__span-17-5\"><a id=\"__codelineno-17-5\" name=\"__codelineno-17-5\" href=\"#__codelineno-17-5\"><\/a> <\/span><span id=\"__span-17-6\"><a id=\"__codelineno-17-6\" name=\"__codelineno-17-6\" href=\"#__codelineno-17-6\"><\/a><span class=\"c1\"># 2. Display public key<\/span> <\/span><span id=\"__span-17-7\"><a id=\"__codelineno-17-7\" name=\"__codelineno-17-7\" href=\"#__codelineno-17-7\"><\/a>cat<span class=\"w\"> <\/span>~\/.ssh\/id_ed25519.pub <\/span><span id=\"__span-17-8\"><a id=\"__codelineno-17-8\" name=\"__codelineno-17-8\" href=\"#__codelineno-17-8\"><\/a> <\/span><span id=\"__span-17-9\"><a id=\"__codelineno-17-9\" name=\"__codelineno-17-9\" href=\"#__codelineno-17-9\"><\/a><span class=\"c1\"># 3. Copy the output (starts with ssh-ed25519)<\/span> <\/span><span id=\"__span-17-10\"><a id=\"__codelineno-17-10\" name=\"__codelineno-17-10\" href=\"#__codelineno-17-10\"><\/a><span class=\"c1\"># 4. Add to GitHub: Settings \u2192 SSH and GPG keys \u2192 New SSH key<\/span> <\/span><span id=\"__span-17-11\"><a id=\"__codelineno-17-11\" name=\"__codelineno-17-11\" href=\"#__codelineno-17-11\"><\/a><span class=\"c1\"># 5. Paste key and save<\/span> <\/span><span id=\"__span-17-12\"><a id=\"__codelineno-17-12\" name=\"__codelineno-17-12\" href=\"#__codelineno-17-12\"><\/a> <\/span><span id=\"__span-17-13\"><a id=\"__codelineno-17-13\" name=\"__codelineno-17-13\" href=\"#__codelineno-17-13\"><\/a><span class=\"c1\"># Test connection<\/span> <\/span><span id=\"__span-17-14\"><a id=\"__codelineno-17-14\" name=\"__codelineno-17-14\" href=\"#__codelineno-17-14\"><\/a>ssh<span class=\"w\"> <\/span>-T<span class=\"w\"> <\/span>git@github.com <\/span><span id=\"__span-17-15\"><a id=\"__codelineno-17-15\" name=\"__codelineno-17-15\" href=\"#__codelineno-17-15\"><\/a><span class=\"c1\"># Should see: &quot;Hi USERNAME! You&#39;ve successfully authenticated&quot;<\/span> <\/span><\/code><\/pre><\/div> <h2 id=\"model-validation-generalization\">Model Validation &amp; Generalization<\/h2> <h3 id=\"overfitting-analysis\">Overfitting Analysis<\/h3> <p>The model demonstrates <strong>excellent generalization<\/strong> with minimal overfitting:<\/p> <p><strong>Test\/Train RMSE Ratios<\/strong>: - Temperature: 1.057 (5.7% increase) - Relative Humidity: 1.074 (7.4% increase) - <strong>Average: 1.065<\/strong> \u2705 (healthy - indicates robust generalization)<\/p> <p><strong>Interpretation<\/strong>: - Ratio &lt; 1.10: Excellent generalization - Ratio 1.10-1.20: Good generalization - Ratio &gt; 1.20: Potential overfitting<\/p> <p><strong>Why This Works<\/strong>: - Strong regularization (dropout=0.3, weight_decay=1e-3) - Early stopping (patience=20) prevents overtraining - Station holdout validation ensures spatial generalization - 24-hour sequence length with proper regularization<\/p> <h3 id=\"training-stability\">Training Stability<\/h3> <p><strong>Loss Analysis<\/strong>: - Best Validation Loss: 0.000161 - Final Train Loss: 0.000835 - Train\/Val Ratio: 5.17 (expected for scaled targets)<\/p> <p><strong>Convergence<\/strong>: - Smooth loss curves indicate stable training - Early stopping triggered appropriately - No gradient explosion or vanishing<\/p> <h2 id=\"tips-for-best-results\">Tips for Best Results<\/h2> <ol> <li><strong>GPU Acceleration<\/strong>: Use <code>--device cuda<\/code> for 10x faster training\/inference (~23 min vs ~24-48 hours)<\/li> <li><strong>Data Quality<\/strong>: Ensure clean, temporally ordered data with proper datetime format<\/li> <li><strong>Target Time Selection<\/strong>: Use timestamps within warm season 2015-2019 (e.g., 2017-06-25 14:00:00 for summer afternoon)<\/li> <li><strong>Visualization Quality<\/strong>: <\/li> <li>DPI 300 for standard quality<\/li> <li>DPI 600 for high-quality posters<\/li> <li>Adjust marker size\/alpha for data density<\/li> <li><strong>LULC Analysis<\/strong>: <\/li> <li>Works with 16-station Regression Kriging<\/li> <li>Random Forest permutation importance shows which spatial features matter most<\/li> <li>Visualizes feature importance across temperature and humidity predictions<\/li> <li><strong>Model Performance<\/strong>:<\/li> <li>Temperature predictions: Sub-0.5\u00b0C RMSE, &gt;99% R\u00b2<\/li> <li>Humidity predictions: ~1.3% RMSE, &gt;99% R\u00b2<\/li> <li>Excellent generalization (test\/train ratio ~1.065)<\/li> <li><strong>HPC Usage<\/strong>: <\/li> <li>Use GPU partition for training (100x faster: 23 min vs 24+ hours)<\/li> <li>Use CPU partition for visualization<\/li> <li>Monitor job status with <code>squeue -u $USER<\/code><\/li> <li>Set <code>UV_CACHE_DIR<\/code> to scratch to avoid disk quota issues<\/li> <\/ol> <h2 id=\"known-limitations\">Known Limitations<\/h2> <h3 id=\"data-constraints\">Data Constraints<\/h3> <ul> <li><strong>Temporal Coverage<\/strong>: Warm season only (April\u2013September, 2015-2019)<\/li> <li>Model optimized for heat stress conditions<\/li> <li> <p>Not validated for cold season (October\u2013March)<\/p> <\/li> <li> <p><strong>Spatial Extent<\/strong>: Georgia Tech campus only (~3.5 km\u00b2)<\/p> <\/li> <li>Generalization to other locations requires retraining or transfer learning<\/li> <\/ul> <h3 id=\"technical-constraints\">Technical Constraints<\/h3> <ul> <li><strong>Grid Density<\/strong>: 100,283 points \u2192 moderate memory requirements (~2-4 GB)<\/li> <li><strong>Computational<\/strong>: GPU recommended for training (CPU training 10-20x slower)<\/li> <li><strong>Real-time<\/strong>: No live data integration yet (historical data only)<\/li> <\/ul> <h2 id=\"troubleshooting\">Troubleshooting<\/h2> <h3 id=\"common-issues\">Common Issues<\/h3> <p><strong>Q: No prediction files found<\/strong><br \/> A: Run inference first: <code>python _1_fusionlstm_inference_kriging.py<\/code> or <code>sbatch _1_inference.sbatch<\/code><\/p> <p><strong>Q: Model file not found<\/strong><br \/> A: Train the model first (<code>sbatch phoenix_gpu_train.sbatch<\/code>) or download pre-trained weights from Hugging Face<\/p> <p><strong>Q: Weather data file not found<\/strong><br \/> A: Download the 16-station dataset from <a href=\"https:\/\/huggingface.co\/datasets\/yupengtang\/gatech_10_min_long_format_sun_angles\">Hugging Face<\/a> and place as <code>2_Data\/gatech_16_stations_10_min_long_format_sun_angles.csv<\/code> (see <code>2_Data\/README.md<\/code>)<\/p> <p><strong>Q: CUDA out of memory<\/strong><br \/> A: Use <code>--device cpu<\/code> or reduce batch size (default: 1024)<\/p> <p><strong>Q: ModuleNotFoundError<\/strong><br \/> A: Install dependencies: <code>uv pip install -r requirements.txt<\/code> or <code>pip install -r requirements.txt<\/code><\/p> <p><strong>Q: Visualization too slow<\/strong><br \/> A: Reduce DPI (<code>--dpi 150<\/code>) or use GPU for inference<\/p> <p><strong>Q: Training job pending too long<\/strong><br \/> A: Check queue status with <code>squeue -p gpu-a100<\/code>. A100 partition may have high demand; consider using A40 partition or CPU training<\/p> <h3 id=\"getting-help\">Getting Help<\/h3> <ul> <li>Check module-specific READMEs<\/li> <li><a href=\"https:\/\/github.com\/VIP-SMUR\/25Fa-Microclimate-ML\/issues\">GitHub Issues<\/a><\/li> <li>Review <a href=\"https:\/\/github.com\/VIP-SMUR\/25Fa-Microclimate-ML\/issues\/12\">Known Issues<\/a><\/li> <\/ul> <h2 id=\"research-context\">Research Context<\/h2> <p>This project is part of the <strong>Georgia Tech VIP-SMUR<\/strong> (Vertically Integrated Projects - Sustainable Microclimate Urban Research) initiative, focusing on understanding and predicting microclimate variations in urban environments for improved sustainability and resilience.<\/p> <h3 id=\"use-cases\">Use Cases<\/h3> <ul> <li><strong>Urban Planning<\/strong>: Heat island effect analysis and mitigation<\/li> <li><strong>Climate Research<\/strong>: Fine-grained microclimate pattern studies <\/li> <li><strong>Smart Campus<\/strong>: Weather-aware systems and applications<\/li> <li><strong>Education<\/strong>: Teaching tool for ML and spatial weather modeling<\/li> <\/ul> <h3 id=\"architecture-inspiration\">Architecture Inspiration<\/h3> <p>The single-step iterative prediction approach demonstrates superior long-term forecasting performance compared to multi-step architectures by maintaining consistent input-output distribution and avoiding temporal distribution gaps.<\/p> <h2 id=\"future-work\">Future Work<\/h2> <ul class=\"task-list\"> <li class=\"task-list-item\"><label class=\"task-list-control\"><input type=\"checkbox\" disabled checked\/><span class=\"task-list-indicator\"><\/span><\/label> <del>Increase weather station coverage (&gt;3 stations) for robust Kriging<\/del> <strong>\u2705 Completed: 16 stations<\/strong><\/li> <li class=\"task-list-item\"><label class=\"task-list-control\"><input type=\"checkbox\" disabled\/><span class=\"task-list-indicator\"><\/span><\/label> Extend temporal coverage to full year (currently warm season 2015-2019)<\/li> <li class=\"task-list-item\"><label class=\"task-list-control\"><input type=\"checkbox\" disabled\/><span class=\"task-list-indicator\"><\/span><\/label> Add more spatial features (vegetation density, sky view factor)<\/li> <li class=\"task-list-item\"><label class=\"task-list-control\"><input type=\"checkbox\" disabled\/><span class=\"task-list-indicator\"><\/span><\/label> Real-time prediction with live weather data integration<\/li> <li class=\"task-list-item\"><label class=\"task-list-control\"><input type=\"checkbox\" disabled\/><span class=\"task-list-indicator\"><\/span><\/label> Multi-location model generalization (transfer learning to other campuses)<\/li> <li class=\"task-list-item\"><label class=\"task-list-control\"><input type=\"checkbox\" disabled\/><span class=\"task-list-indicator\"><\/span><\/label> Integration with IoT sensor networks for real-time validation<\/li> <li class=\"task-list-item\"><label class=\"task-list-control\"><input type=\"checkbox\" disabled\/><span class=\"task-list-indicator\"><\/span><\/label> Ensemble predictions with uncertainty quantification<\/li> <li class=\"task-list-item\"><label class=\"task-list-control\"><input type=\"checkbox\" disabled\/><span class=\"task-list-indicator\"><\/span><\/label> Extend to full-year prediction (cold season: October\u2013March)<\/li> <\/ul> <h2 id=\"citation\">Citation<\/h2> <p>If you use this project in your research, please cite:<\/p> <div class=\"language-bibtex highlight\"><pre><span><\/span><code><span id=\"__span-18-1\"><a id=\"__codelineno-18-1\" name=\"__codelineno-18-1\" href=\"#__codelineno-18-1\"><\/a><span class=\"nc\">@software<\/span><span class=\"p\">{<\/span><span class=\"nl\">gatech_microclimate_2025<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-18-2\"><a id=\"__codelineno-18-2\" name=\"__codelineno-18-2\" href=\"#__codelineno-18-2\"><\/a><span class=\"w\"> <\/span><span class=\"na\">title<\/span><span class=\"w\"> <\/span><span class=\"p\">=<\/span><span class=\"w\"> <\/span><span class=\"s\">{FusionLSTM: Multi-Scale Fusion LSTM with Attention for Urban Microclimate Prediction}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-18-3\"><a id=\"__codelineno-18-3\" name=\"__codelineno-18-3\" href=\"#__codelineno-18-3\"><\/a><span class=\"w\"> <\/span><span class=\"na\">author<\/span><span class=\"w\"> <\/span><span class=\"p\">=<\/span><span class=\"w\"> <\/span><span class=\"s\">{Georgia Tech VIP-SMUR Team}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-18-4\"><a id=\"__codelineno-18-4\" name=\"__codelineno-18-4\" href=\"#__codelineno-18-4\"><\/a><span class=\"w\"> <\/span><span class=\"na\">year<\/span><span class=\"w\"> <\/span><span class=\"p\">=<\/span><span class=\"w\"> <\/span><span class=\"s\">{2025}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-18-5\"><a id=\"__codelineno-18-5\" name=\"__codelineno-18-5\" href=\"#__codelineno-18-5\"><\/a><span class=\"w\"> <\/span><span class=\"na\">url<\/span><span class=\"w\"> <\/span><span class=\"p\">=<\/span><span class=\"w\"> <\/span><span class=\"s\">{https:\/\/github.com\/VIP-SMUR\/25Fa-Microclimate-ML}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-18-6\"><a id=\"__codelineno-18-6\" name=\"__codelineno-18-6\" href=\"#__codelineno-18-6\"><\/a><span class=\"w\"> <\/span><span class=\"na\">note<\/span><span class=\"w\"> <\/span><span class=\"p\">=<\/span><span class=\"w\"> <\/span><span class=\"s\">{TFT-inspired architecture with parallel LSTM branches for warm-season microclimate forecasting}<\/span> <\/span><span id=\"__span-18-7\"><a id=\"__codelineno-18-7\" name=\"__codelineno-18-7\" href=\"#__codelineno-18-7\"><\/a><span class=\"p\">}<\/span> <\/span><\/code><\/pre><\/div> <h2 id=\"license\">License<\/h2> <p>This project is part of Georgia Tech research. See individual files for specific licensing.<\/p> <h2 id=\"contributing\">Contributing<\/h2> <p>This is an active research project. For contributions or questions, please:<\/p> <ol> <li>Check existing documentation in module READMEs<\/li> <li>Review open <a href=\"https:\/\/github.com\/VIP-SMUR\/25Fa-Microclimate-ML\/issues\">GitHub Issues<\/a><\/li> <li>Follow existing code style and structure<\/li> <li>Document new features thoroughly<\/li> <\/ol> <h2 id=\"acknowledgments\">Acknowledgments<\/h2> <ul> <li><strong>Georgia Tech VIP Program<\/strong> - Project support and infrastructure<\/li> <li><strong>PACE Phoenix Cluster<\/strong> - Computational resources<\/li> <li><strong>PyTorch Team<\/strong> - Deep learning framework<\/li> <li><strong>OpenStreetMap Contributors<\/strong> - Geospatial data<\/li> <\/ul> <hr \/> <p><strong>Project Status<\/strong>: Active Development | <strong>Last Updated<\/strong>: November 20, 2024<\/p> <p><strong>Pipeline Version<\/strong>: 2.0 (Single-step architecture, SLURM integration, structured outputs)<\/p> <p>For detailed usage instructions, see module-specific READMEs: - <a href=\"3_Training_Model\/README.md\">Training Guide<\/a> - <a href=\"4_Inference_and_Visualization\/README.md\">Inference &amp; Visualization Guide<\/a> - <a href=\"PACE_PHOENIX_TUTORIAL.md\">Phoenix HPC Tutorial<\/a><\/p> <ul> <li> <h1 id=\"microclimate-ml-geo-lstm-kriging\">Microclimate-ML (Geo-LSTM-Kriging)<\/h1> <\/li> <\/ul> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=oyDra0_vdQ0\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/oyDra0_vdQ0\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Thanasarn Changnawa<\/td> <td>PhD<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/Thanasarn-Changnawa\">Thanasarn-Changnawa<\/a><\/td> <\/tr> <tr> <td>Han-Syun Shih<\/td> <td>Masters<\/td> <td>Architecture (HBP)<\/td> <td>ARCH<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/Benjaminhansyun\">Benjaminhansyun<\/a><\/td> <\/tr> <tr> <td>Edzel Sutanto<\/td> <td>Sophomore<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/Edzelandika\">Edzelandika<\/a><\/td> <\/tr> <tr> <td>Roshan Cerejo<\/td> <td>Junior<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/rcerejo\">rcerejo<\/a><\/td> <\/tr> <tr> <td>Vikram Renganathan<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/viren108\">viren108<\/a><\/td> <\/tr> <tr> <td>Yupeng Tang<\/td> <td>Masters<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/yupengtang\">yupengtang<\/a><\/td> <\/tr> <tr> <td>Ze Yu Jiang<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>4<\/td> <td><a href=\"https:\/\/github.com\/zeyujiang8800\">zeyujiang8800<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25fa-microclimate-ml\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:48 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25fa-microclimate-ml\/#__comments","guid":"https:\/\/vip-smur.github.io\/25fa-microclimate-ml\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25fa-microclimate-ml\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Fa-Energy","description":"<h1 id=\"enhancing-data-driven-urban-building-energy-model-with-multi-dimensional-data-resourcesmicroclimate-and-demographic-perspectives\">Enhancing Data-Driven Urban Building Energy Model with Multi-Dimensional Data Resources:Microclimate and Demographic Perspectives<\/h1> <h1 id=\"introduction\">Introduction<\/h1> <p><img src=\"images\/1130_preprocess diagram-01.png\" width=\"1000\"><\/p> <p>The traditional Urban Building Energy Modeling (UBEM) approach predominantly relies on archetype-based simulations, which generalize building characteristics and operational patterns to estimate energy demand across urban areas. While effective for large-scale assessments, these methods often overlook the influence of microclimatic conditions\u2014such as localized air temperature, humidity, solar radiation, and wind flow\u2014which can vary significantly across urban environments due to morphological heterogeneity. This simplification limits the accuracy of energy predictions, particularly in dense and diverse urban contexts where microclimate dynamics play a critical role in shaping building energy performance. Recent studies have underscored the importance of integrating microclimate factors into UBEM, noting that urban heat island intensity, surface radiation balance, and convective conditions can substantially alter thermal loads at the building level. However, the lack of standardized methods for extracting and quantifying microclimatic variables at scale has constrained their application in mainstream UBEM workflows. To address this gap, this research develops a standardized data pipeline to systematically construct urban-scale datasets that incorporate both building attributes and localized microclimate indicators. Leveraging this dataset, statistical modeling techniques are employed to evaluate the relative influence of various microclimatic factors on building energy consumption. This work not only enhances our understanding of the interplay between urban form, climate, and energy use, but also offers a methodological foundation for future data-driven UBEM studies seeking to improve predictive accuracy and inform resilient urban energy planning.<\/p> <h1 id=\"satellite-data-collection\">Satellite data collection<\/h1> <ul> <li><strong>Method<\/strong><\/li> <\/ul> <p>The satellite data acquisition pipeline is adapted and enhanced from the methodological framework proposed in prior New York City studies (Dougherty &amp; Jain, 2023). For each building, local environmental conditions are characterized within a 100 m radius to capture neighborhood-scale microclimatic influences. Specifically, the original building footprint is first simplified using a convex hull algorithm to reduce geometric complexity while preserving its spatial extent. A 100 m radial buffer is then generated around the convex hull to define the final sampling domain for microclimate feature extraction. Satellite-derived environmental variables with native spatial resolutions ranging from 10 m to 2.5 km are processed and resampled within Google Earth Engine to a unified 100 m spatial scale. This resampling strategy ensures spatial consistency across heterogeneous data sources and guarantees that each building-level buffer reliably captures representative pixel-level microclimate information. <\/p> <ul> <li><strong>Microclimate information<\/strong><\/li> <\/ul> <p>We place particular emphasis on vegetation coverage in the surroundings of each building. In a previous study, we investigated the relationship between the urban tree canopy ratio and building energy consumption (Xu et al. 2025). In the present work, we adopt the Normalized Difference Vegetation Index (NDVI) as the primary indicator to characterize the greenness of the local built environment. Compared with canopy ratio metrics derived from land-cover classifications, NDVI offers a key advantage in its ability to explicitly capture seasonal variations in vegetation phenology, which is critical for subsequent analyses under representative summer and winter conditions. NDVI data are obtained from the ECOSTRESS Tiled Ancillary NDVI and Albedo L2 Global 70 m V002 product. <\/p> <p>For integrated microclimatic conditions surrounding each building, including air temperature, humidity, and wind speed, we utilize data from RTMA (Real-Time Mesoscale Analysis), a high-resolution near-surface atmospheric analysis system provided by NOAA and generated through real-time data assimilation of surface observations and numerical weather prediction outputs. In addition, to characterize nocturnal urban activity and radiative intensity, which serve as indirect proxies for urban vitality and anthropogenic carbon emissions, we employ the VIIRS Stray Light Corrected Nighttime Day\/Night Band Composites Version 1 product to extract nighttime radiance information. <\/p> <p>Our completed dataset can be found <a href=\"data\/2025_1120_Microclimate%20data.xlsx\">here<\/a>, and an introduction to each variable can be found <a href=\"data\/Mircoclimate%data%introduction.docx\">here<\/a>.<\/p> <ul> <li><strong>Preliminary UTCI Observations<\/strong><\/li> <\/ul> <p>We conducted an initial exploration of the Universal Thermal Climate Index (UTCI) to combine air temperature, humidity, wind speed, and radiation into a single thermal stress metric. UTCI was calculated at the building-neighborhood scale using the same buffered satellite and reanalysis data. Early results show clear spatial variation in UTCI across nearby buildings, suggesting that localized microclimate effects may influence building energy use. This analysis is ongoing and motivates the inclusion of UTCI as an additional microclimate feature in later modeling.<\/p> <ul> <li><strong>Sky view factor<\/strong><\/li> <\/ul> <h1 id=\"building-facade-data-collection\">Building facade data collection<\/h1> <h1 id=\"reference\">Reference<\/h1> <p>Dougherty, T. R., &amp; Jain, R. K. (2023). Invisible walls: Exploration of microclimate effects on building energy consumption in New York City. Sustainable Cities and Society, 90, 104364.<\/p> <p>Xu, H., Li, C., Kastner, P., &amp; Dogan, T. (2024) Understand Urban Building Energy Consumption with Explainable Machine Learning Approaches.<\/p> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=DCX57r3rBbM\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/DCX57r3rBbM\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Yichao Shi<\/td> <td>PhD<\/td> <td>Architecture (DC)<\/td> <td>ARCH<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/SHIyichao98\">SHIyichao98<\/a><\/td> <\/tr> <tr> <td>Hang Xu<\/td> <td>PhD<\/td> <td>Architecture (HBP)<\/td> <td>ARCH<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/HangXXXu\">HangXXXu<\/a><\/td> <\/tr> <tr> <td>Jiayi Li<\/td> <td>Senior<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/jli3307\">jli3307<\/a><\/td> <\/tr> <tr> <td>Aryan Bolakond<\/td> <td>Senior<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/AryanBolakond\">AryanBolakond<\/a><\/td> <\/tr> <tr> <td>Breno Veiga<\/td> <td>PhD<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/veigab3\">veigab3<\/a><\/td> <\/tr> <tr> <td>Nishanth Giridharan<\/td> <td>Junior<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/NishanthG05\">NishanthG05<\/a><\/td> <\/tr> <tr> <td>Sameer Jain<\/td> <td>Sophomore<\/td> <td>Industrial Engineering<\/td> <td>ISYE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/sameerjain06\">sameerjain06<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25fa-energyinbuildings\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:47 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25fa-energyinbuildings\/#__comments","guid":"https:\/\/vip-smur.github.io\/25fa-energyinbuildings\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25fa-energyinbuildings\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Fa-MPONC","description":"<h1 id=\"modeling-processes-of-neighborhood-change-mponc\">Modeling Processes of Neighborhood Change (MPONC)<\/h1> <h2 id=\"reference-paper\">Reference paper<\/h2> <div class=\"language-bibtex highlight\"><pre><span><\/span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"><\/a><span class=\"nc\">@misc<\/span><span class=\"p\">{<\/span><span class=\"nl\">mori2024modelingprocessesneighborhoodchange<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-2\"><a id=\"__codelineno-0-2\" name=\"__codelineno-0-2\" href=\"#__codelineno-0-2\"><\/a><span class=\"w\"> <\/span><span class=\"na\">title<\/span><span class=\"p\">=<\/span><span class=\"s\">{Modeling Processes of Neighborhood Change}<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span> <\/span><span id=\"__span-0-3\"><a id=\"__codelineno-0-3\" name=\"__codelineno-0-3\" href=\"#__codelineno-0-3\"><\/a><span class=\"w\"> <\/span><span class=\"na\">author<\/span><span class=\"p\">=<\/span><span class=\"s\">{J. Carlos Mart\u00ednez Mori and Zhanzhan Zhao}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-4\"><a id=\"__codelineno-0-4\" name=\"__codelineno-0-4\" href=\"#__codelineno-0-4\"><\/a><span class=\"w\"> <\/span><span class=\"na\">year<\/span><span class=\"p\">=<\/span><span class=\"s\">{2024}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-5\"><a id=\"__codelineno-0-5\" name=\"__codelineno-0-5\" href=\"#__codelineno-0-5\"><\/a><span class=\"w\"> <\/span><span class=\"na\">eprint<\/span><span class=\"p\">=<\/span><span class=\"s\">{2401.03307}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-6\"><a id=\"__codelineno-0-6\" name=\"__codelineno-0-6\" href=\"#__codelineno-0-6\"><\/a><span class=\"w\"> <\/span><span class=\"na\">archivePrefix<\/span><span class=\"p\">=<\/span><span class=\"s\">{arXiv}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-7\"><a id=\"__codelineno-0-7\" name=\"__codelineno-0-7\" href=\"#__codelineno-0-7\"><\/a><span class=\"w\"> <\/span><span class=\"na\">primaryClass<\/span><span class=\"p\">=<\/span><span class=\"s\">{cs.MA}<\/span><span class=\"p\">,<\/span> <\/span><span id=\"__span-0-8\"><a id=\"__codelineno-0-8\" name=\"__codelineno-0-8\" href=\"#__codelineno-0-8\"><\/a><span class=\"w\"> <\/span><span class=\"na\">url<\/span><span class=\"p\">=<\/span><span class=\"s\">{https:\/\/arxiv.org\/abs\/2401.03307}<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span> <\/span><span id=\"__span-0-9\"><a id=\"__codelineno-0-9\" name=\"__codelineno-0-9\" href=\"#__codelineno-0-9\"><\/a><span class=\"p\">}<\/span> <\/span><\/code><\/pre><\/div> <h2 id=\"setup\">Setup<\/h2> <div class=\"language-bash highlight\"><pre><span><\/span><code><span id=\"__span-1-1\"><a id=\"__codelineno-1-1\" name=\"__codelineno-1-1\" href=\"#__codelineno-1-1\"><\/a><span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>25Sp-MPONC\/modeling_processes_of_neighborhood_change_new <\/span><span id=\"__span-1-2\"><a id=\"__codelineno-1-2\" name=\"__codelineno-1-2\" href=\"#__codelineno-1-2\"><\/a>conda<span class=\"w\"> <\/span>create<span class=\"w\"> <\/span>-n<span class=\"w\"> <\/span>mponc<span class=\"w\"> <\/span><span class=\"nv\">python<\/span><span class=\"o\">=<\/span><span class=\"m\">3<\/span>.10.16 <\/span><span id=\"__span-1-3\"><a id=\"__codelineno-1-3\" name=\"__codelineno-1-3\" href=\"#__codelineno-1-3\"><\/a>conda<span class=\"w\"> <\/span>activate<span class=\"w\"> <\/span>mponc <\/span><span id=\"__span-1-4\"><a id=\"__codelineno-1-4\" name=\"__codelineno-1-4\" href=\"#__codelineno-1-4\"><\/a>pip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>-r<span class=\"w\"> <\/span>requirements.txt <\/span><span id=\"__span-1-5\"><a id=\"__codelineno-1-5\" name=\"__codelineno-1-5\" href=\"#__codelineno-1-5\"><\/a>python<span class=\"w\"> <\/span>main.py <\/span><\/code><\/pre><\/div> <h2 id=\"abstract\">Abstract<\/h2> <blockquote> <p>This research project simulates the impact of the Atlanta Beltline on the surrounding neighborhoods using no-regret-dynamics game theory. The simulation models agent movement across census tracts within Atlanta, GA's Fulton and Dekalb counties, with agents seeking to move optimally (prioritizing real-life incentives) based on several census tract attributes.<\/p> <\/blockquote> <h2 id=\"intro-and-description\">Intro and Description<\/h2> <p>This project is based on the reference paper created by Dr. Martinez and Dr. Zhao, which aims to address the following: <\/p> <ul> <li>How does the layout of transportation infrastructure affect the demographics of nearby neighborhoods? <\/li> <li>Does the creation of these infrastructure actually benefit everyone equally; is it fair? <\/li> <li>Can we predict the effects on surrounding communities before these structures are actually built? <\/li> <\/ul> <p>These questions are primarily motivated by the issue of gentrification, an issue prevalent in many major cities. We utilized concepts in game theory, more specifically no-regret dynamics, in order to simulate the effects of the Atlanta Beltline on gentrification. To summarize our approach with no-regret dynamics:<\/p> <ul> <li>People, or 'agents', repeatedly select census tracts for relocation, from an initially uniform probability distribution. Computed from the tract's attributes, a <strong>'cost'<\/strong> value is assigned to the taken action, and the agent negates this cost from the chosen tract's selection probability. <\/li> <li><em>'Cost' is a function of region affordability, upkeep, and attractiveness.<\/em> <\/li> <li>The higher the cost, the less likely an agent is to visit that census tract in the future. <\/li> <li>This process is repeated until the probability distribution of visting census tracts converges - an equilibrium is reached, and agents have successfully 'learned' the attractiveness of each tract. Further actions make negligible difference to the probability distribution. <\/li> <li>This semester, we have changed the way we compute simulation convergence by using the <em>maximum best-action regret<\/em> across all agents between two sliding windows of recent agent\u2011distributions: <\/li> <\/ul> <div class=\"arithmatex\">\\[ r = \\frac{1}{T} \\big(\\sum_{t = 1}^{T} c_t(a_t) - \\sum_{t = 1}^{T} c_t(a_t^*) \\big) \\]<\/div> <p>where <span class=\"arithmatex\">\\(c_t(a_t)\\)<\/span> denotes the cost of action <span class=\"arithmatex\">\\(a_t\\)<\/span> and <span class=\"arithmatex\">\\(a_t^*\\)<\/span> is the optimal action in hindsight at timestep <span class=\"arithmatex\">\\(t\\)<\/span>. If <span class=\"arithmatex\">\\(r\u00a0\u2264\u00a0\\epsilon\\)<\/span> (default\u202f=\u202f0.01) the system is deemed converged and the run halts automatically. All thresholds are configurable in <code>config.py<\/code>. - For practical purposes, an upper limit of <span class=\"arithmatex\">\\(T = \\frac{4 \\ln{A}}{\\epsilon^2}\\)<\/span> timesteps is set for each simulation, where <span class=\"arithmatex\">\\(A\\)<\/span> is the size of the action space. <\/p> <h2 id=\"cost-function\">Cost Function<\/h2> <p>Every agent evaluates a tract with a cost defined as<\/p> <blockquote> <p><strong>cost = 1\u00a0\u2013\u00a0(affordability\u00a0\u00d7\u00a0upkeep x attractiveness)<\/strong><\/p> <\/blockquote> <table> <thead> <tr> <th>Factor<\/th> <th>Scale<\/th> <th>Quick intuition<\/th> <\/tr> <\/thead> <tbody> <tr> <td><strong>Affordability<\/strong><\/td> <td>0 or 1<\/td> <td>1 if the tract still has room <em>or<\/em> the agent is selected from an income-weighted lottery when the tract is overpopulated; 0 otherwise.<\/td> <\/tr> <tr> <td><strong>Upkeep<\/strong><\/td> <td>0\u20131<\/td> <td>How \u201cmaintained\u201d and inhabited the tract is, based on the fraction of its resident capacity currently filled.<\/td> <\/tr> <tr> <td><strong>Attractiveness<\/strong><\/td> <td>0\u20131<\/td> <td>How nice the tract is to live in, combining amenity access and community similarity (see sub-components below).<\/td> <\/tr> <\/tbody> <\/table> <h3 id=\"attractiveness-upkeep-amenity_access-beltline_factor\">Attractiveness\u00a0=\u00a0upkeep\u00a0\u00d7\u00a0amenity_access\u00a0\u00d7\u00a0beltline_factor<\/h3> <table> <thead> <tr> <th>Sub\u2011component<\/th> <th>Range<\/th> <th>What it captures<\/th> <\/tr> <\/thead> <tbody> <tr> <td><strong>Amenity access<\/strong><\/td> <td>0\u20131<\/td> <td>Density of key POIs (restaurants, shops, transit stops, etc.), spatially smoothed over neighbouring tracts and modified by BeltLine factor \u03b2.<\/td> <\/tr> <tr> <td><strong>Community<\/strong><\/td> <td>0\u20131<\/td> <td>How well an agent\u2019s income matches incomes in the surrounding tracts\u2014closer \u21d2 higher score.<\/td> <\/tr> <tr> <td><strong>BeltLine factor \u03b2<\/strong><\/td> <td>\u2265 1<\/td> <td>Extra accessibility for tracts in the BeltLine catchment area: \u03b2 = B (max boost) on the BeltLine, tapering linearly down to 1 at radius R, and staying 1 outside R.<\/td> <\/tr> <\/tbody> <\/table> <p>*\u00a0Amenity list adapted from <strong><a href=\"https:\/\/vip-smur.github.io\/24sp-mobility-seg\/\">24Sp\u2011Mobility\u2011Seg<\/a><\/strong>; we omit several tags such as \u201cshed\u201d, \u201cguardhouse\u201d, \u201cferry_terminal\u201d, \u201cgarages\u201d, and \u201cbridge\u201d.<\/p> <h3 id=\"spatial-smoothing-of-amenity-data\">Spatial Smoothing of Amenity Data<\/h3> <p>To ensure that the amenity component of a tract's Attractiveness score accurately reflects the <em>true<\/em> environment and facilitates realistic agent decision-making, we employ a spatial smoothing strategy. Direct raw counts from OpenStreetMap (OSM) frequently register zero amenities in certain census tracts. Allowing these zero values to persist would be misleading, as agents rarely perceive their neighborhood's amenities as strictly limited to their immediate tract boundary; instead, they consider nearby shops, parks, and transit.<\/p> <p>To counteract this data sparsity and noise, we use <strong>Queen contiguity weights<\/strong> to define the neighborhood structure. This definition is inclusive, considering two tracts to be neighbors if they share any common border <em>or<\/em> a single corner point. Leveraging the PySAL library, we then compute a <strong>spatial lag<\/strong> on the raw amenity densities. Conceptually, this process calculates a weighted average for each tract's amenity score, blending its own raw density with the densities of all its Queen-contiguous neighbors. This produces a smoothed, more plausible amenity distribution across the region, which is essential for governing agents' relocation decisions and ultimately modeling gentrification dynamics accurately.<\/p> <h4 id=\"implemented-amenities-weights-openstreetmap-labels\">Implemented Amenities &amp; weights (OpenStreetMap labels):<\/h4> <p><div class=\"language-python highlight\"><pre><span><\/span><code><span id=\"__span-2-1\"><a id=\"__codelineno-2-1\" name=\"__codelineno-2-1\" href=\"#__codelineno-2-1\"><\/a><span class=\"n\">AMENITY_TAGS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <\/span><span id=\"__span-2-2\"><a id=\"__codelineno-2-2\" name=\"__codelineno-2-2\" href=\"#__codelineno-2-2\"><\/a> <span class=\"s1\">&#39;amenity&#39;<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;bus_station|cafe|college|fast_food|food_court|fuel|library|restaurant|train_station|university|parking|school|hospital&quot;<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">),<\/span> <\/span><span id=\"__span-2-3\"><a id=\"__codelineno-2-3\" name=\"__codelineno-2-3\" href=\"#__codelineno-2-3\"><\/a> <span class=\"s1\">&#39;shop&#39;<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;supermarket|food|general|department_store|mall|wholesale&quot;<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">),<\/span> <\/span><span id=\"__span-2-4\"><a id=\"__codelineno-2-4\" name=\"__codelineno-2-4\" href=\"#__codelineno-2-4\"><\/a> <span class=\"s1\">&#39;landuse&#39;<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;residential|industrial|commercial|retail&quot;<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-2-5\"><a id=\"__codelineno-2-5\" name=\"__codelineno-2-5\" href=\"#__codelineno-2-5\"><\/a><span class=\"p\">}<\/span> <\/span><\/code><\/pre><\/div> * We operationalize <strong>\u03b2<\/strong> by giving tracts within <strong>800\u202fm<\/strong> of the BeltLine a <strong>+20\u202f%<\/strong> boost to their Attractiveness score (\u03b2\u202f=\u202f1.20\/1.20); the boost then tapers linearly to <strong>+10\u202f%<\/strong> at <strong>1.6\u202fkm<\/strong>, and falls to \u03b2\u202f=\u202f1.00\/1.20 beyond that distance. This <strong>\u03b2<\/strong> is applied as an exponent: each tract\u2019s amenity density is raised to the power <span class=\"arithmatex\">\\(1\/\u03b2_c\\)<\/span>. This provides a stronger <em>relative<\/em> boost to low-amenity tracts and milder gains for amenity-rich tracts, approximating the diminishing-returns effect of BeltLine\u2019s observed proximity on nearby housing prices.<\/p> <h3 id=\"community-score-local-morans-i\">Community Score (Local Moran\u2019s I)<\/h3> <p>Due to the difficulties with Moran's, we are using a simplified implementation of the Community Score calculation. Community ties <span class=\"arithmatex\">\\(<span class=\"arithmatex\">\\((Community_a(c))\\)<\/span>\\)<\/span> model socioeconomic affinity by measuring how closely a specific agent's endowment matches the endowments of nearby agents. For each agent, we compute a community endowment defined as the mean income of the tract the agent currently occupies along with all tracts adjacent to it. The model uses PySAL to calculate the average income of the tract and its neighbors for whichever year is selected.<\/p> <p>The community endowment is computed as:<\/p> <div class=\"arithmatex\">\\[ \\bar{E}_c = \\frac{1}{N_c} \\sum_{i \\in \\{c \\cup \\text{Neighbors}(c)\\}} E_i \\]<\/div> <p>The agent\u2019s community-tie value is then calculated as the difference between the agent\u2019s own endowment and this community endowment:<\/p> <div class=\"arithmatex\">\\[ \\mathrm{Community}_a(c) = E_a - \\bar{E}_c \\]<\/div> <p>Agents whose incomes closely match the incomes of their surrounding tracts receive stronger community-tie scores, while those whose incomes differ substantially receive weaker ties. A closer match \u21d2 value near 1 \u21d2 lower cost.<\/p> <p>For a deep explanation of how Moran's works, why it isn't implemented into the paper yet, and the next steps, please see the Spatial Autocorrelation portion of the readme.<\/p> <h3 id=\"weighting-amenity-access-vs-community\">Weighting amenity access vs\u202fcommunity (\u03bb)<\/h3> <p>A tunable parameter <strong>\u03bb\u00a0\u2208\u00a0[0,\u202f1]<\/strong> lets you emphasize either amenity access (high\u202f\u03bb) or community match (low\u202f\u03bb).<br \/> Internally we rewrite<br \/> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-3-1\"><a id=\"__codelineno-3-1\" name=\"__codelineno-3-1\" href=\"#__codelineno-3-1\"><\/a>cost = 1 - [[Affordability] \u00d7 [Upkeep x (\u03bb \u00d7 AmenityAccess)] \u00d7 [(1-\u03bb) \u00d7 Community]] <\/span><\/code><\/pre><\/div><\/p> <h3 id=\"tigerline-geodatabases-shapefiles\">TIGER\/Line Geodatabases shapefiles:<\/h3> <p><img src=\".\/Figures\/ZIP_URLs.png\" alt=\"Alt text\" max-width=\"600\" \/><\/p> <h2 id=\"project-status\">Project status<\/h2> <h3 id=\"outputs-configuration\">Outputs &amp; configuration<\/h3> <p>Our code outputs a GIF to visualize agent behavior over time. Each circle represents the centroid of a census tract - green signifying those in the Atlanta Beltline - and the encircled number is the agent population. Our code also outputs a CSV file containing all the simulated data at every individual timestep.<\/p> <ul> <li><em>Data contained in CSV's: Census tract name, agent population, raw average income, average income reported by census, normalized average incomes, and amenity density.<\/em><\/li> <li><em>Note: 'Timestep' refers to a single instance agent action (relocation); 20,000 timesteps mean the agents relocate a total of 20,000 times during the simulation.<\/em><\/li> <\/ul> <h4 id=\"gif\">GIF<\/h4> <p>This GIF shows the behavior of 1,000 agents up to 20,000 timesteps, frames being captured every 400 timesteps. Rho=1, alpha=0.25. <img src=\".\/Figures\/SimulationGIF2025.gif\" alt=\"Alt text\" max-width=\"600\" \/><\/p> <h3 id=\"runtimes\">Runtimes<\/h3> <blockquote> <p>(1000 agents, 349 census tracts) - Simulation: 3 min * Graph, amenities, and centroids are cached after first build<\/p> <\/blockquote> <h2 id=\"census-based-approach\">Census-based approach<\/h2> <p>Our project utilizes US Census data in that: - The geographical regions our agents inhabit correspond directly to US census tracts (can correspond to any other census-defined geographic unit, i.e. zip codes, housing districts, and school districts). - Each 'agent' is assigned a 'wealth' value in our simulation. We create this distribution of wealth using Census data (population &amp; median incomes), to represent real-world demographics.<\/p> <h2 id=\"atlanta-beltline-in-our-simulation\">Atlanta Beltline in our Simulation<\/h2> <p>We automate the process of labelling certain regions as 'within the Atlanta Beltline's catchment zone' by using commuting paths from OpenStreetMap that correspond to the Atlanta Beltline - namely, a bike trail and a railway. To experiment with a different beltline, such as a beltline that spanned across Atlanta horizontally, or simply expanded north by x miles, we would acquire the OpenStreetMap ID's of existing paths (bike trails, walking paths, roads, etc.) corresponding to our desired Beltline, and paste these into <strong>config.py<\/strong>. Alternatively, we can create a such path ourselves in OpenStreetMap. Then, any region containing segments of these trails would automatically receive a \"Beltline Score\" which boosts its perceived attractiveness by agents. <\/p> <p>In <strong>config.py<\/strong> - bike trail and railroad OpenStreetMap ID's for the beltline are as follows:<\/p> <div class=\"language-python highlight\"><pre><span><\/span><code><span id=\"__span-4-1\"><a id=\"__codelineno-4-1\" name=\"__codelineno-4-1\" href=\"#__codelineno-4-1\"><\/a><span class=\"sd\">&quot;&quot;&quot; Beltline &#39;relation&#39; IDs from Open Street Map &quot;&quot;&quot;<\/span> <\/span><span id=\"__span-4-2\"><a id=\"__codelineno-4-2\" name=\"__codelineno-4-2\" href=\"#__codelineno-4-2\"><\/a><span class=\"n\">RELATION_IDS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"mi\">8408433<\/span><span class=\"p\">,<\/span> <span class=\"mi\">13048389<\/span><span class=\"p\">]<\/span> <\/span><\/code><\/pre><\/div> <table> <thead> <tr> <th style=\"text-align: center;\">Bike Trail<\/th> <th style=\"text-align: center;\">Railroad<\/th> <\/tr> <\/thead> <tbody> <tr> <td style=\"text-align: center;\"><img src=\".\/Figures\/BeltlineBikeTrail.png\" width=\"300\"><\/td> <td style=\"text-align: center;\"><img src=\".\/Figures\/BeltlineRailroad.png\" width=\"300\"><\/td> <\/tr> <\/tbody> <\/table> <p>Compare with Atlanta Beltline geography:<\/p> <p><img src=\".\/Figures\/AtlantaBeltlineVisual.jpg\" width=\"250\"><\/p> <h2 id=\"adapting-the-model-to-other-cities\">Adapting the Model to Other Cities<\/h2> <p>Although Atlanta serves as our case study, every pipeline stage\u2014census shapefiles, OSM\u2011derived amenities, cost parameters, and even the BeltLine decision\u2011agent\u2014can be swapped for a different region:<\/p> <ol> <li> <p><strong>Geometry &amp; Demographics<\/strong><br \/> \u2022 Replace the Fulton\/DeKalb TIGER\/Line shapefiles with those of your target city.<br \/> \u2022 Point the <code>MEDIAN_INCOME_URL<\/code> and <code>POP_URL<\/code> in <code>config.py<\/code> to that city\u2019s American Community Survey \"ACS\" tables.<\/p> <\/li> <li> <p><strong>Transit\u2011Ring Definition<\/strong><br \/> \u2022 Identify (or sketch in OSM) the planned loop \/ BRT corridor \/ rail spur you want to study, then list its OSM relation IDs in <code>config.py<\/code>.<br \/> \u2022 The same \u03b2\u2011taper and DecisionAgent logic will assign accessibility boosts and density bonuses around the new corridor.<\/p> <\/li> <li> <p><strong>Policy Levers<\/strong><br \/> \u2022 Tweak <code>RHO_SCALAR<\/code> to explore how strong the up\u2011zoning response should be for the above transit ring.<\/p> <\/li> <\/ol> <p>Because the simulation is purely data\u2011driven, you can rapidly prototype \u201cwhat\u2011if\u201d BeltLine analogues for <strong>anywhere with open census and OSM data while measuring potential community shifts\/gentrification before shovels hit the ground.<\/strong> Example: <img src=\".\/Figures\/OldZipURL.png\" alt=\"Alt text\" max-width=\"600\" \/> * By changing the above URL, we get the following:<\/p> <p><img src=\".\/Figures\/AtlantaBeltlineCloseupGraph.png\" alt=\"Alt text\" width=\"250\" \/><\/p> <h2 id=\"policy-scenarios-vertical-vs-horizontal-scaling\">Policy Scenarios: Vertical vs Horizontal Scaling<\/h2> <p>The simulation now supports two high-level policy experiments:<\/p> <h3 id=\"1-vertical-scaling-decision-making-agent-learns-kappa\">1. Vertical Scaling \u2014 Decision-Making Agent learns <span class=\"arithmatex\">\\(\\kappa\\)<\/span><\/h3> <p>A dedicated <code>DecisionAgent<\/code> treats <strong>how aggressively to expand housing capacity near the Beltline<\/strong> as a no-regret learning problem:<\/p> <ul> <li><strong>Action space<\/strong>: <span class=\"arithmatex\">\\( \\kappa \\in \\{0.00, 0.01, \\dots, 1.00\\} \\)<\/span><\/li> <\/ul> <p>sampled each timestep by multiplicative\u2011weights\u00a0(no\u2011regret-dynamics).<\/p> <ul> <li><strong>Base capacity curve<\/strong>:<br><\/li> <\/ul> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-5-1\"><a id=\"__codelineno-5-1\" name=\"__codelineno-5-1\" href=\"#__codelineno-5-1\"><\/a>U_c = 1 + \\frac{\\texttt{beltline\\_score}_c - \\texttt{BL\\_LOW}}{\\texttt{BL\\_HIGH} - \\texttt{BL\\_LOW}} \\times \\bigl(\\texttt{RHO\\_SCALAR}_{max} - 1\\bigr) <\/span><\/code><\/pre><\/div> <h4 id=\"effective-multiplier\">Effective multiplier<\/h4> <div class=\"language-text highlight\"><pre><span><\/span><code><span id=\"__span-6-1\"><a id=\"__codelineno-6-1\" name=\"__codelineno-6-1\" href=\"#__codelineno-6-1\"><\/a>\\rho_c^{\\text{new}} <\/span><span id=\"__span-6-2\"><a id=\"__codelineno-6-2\" name=\"__codelineno-6-2\" href=\"#__codelineno-6-2\"><\/a> = \\rho_c^{\\text{base}} <\/span><span id=\"__span-6-3\"><a id=\"__codelineno-6-3\" name=\"__codelineno-6-3\" href=\"#__codelineno-6-3\"><\/a> \\times <\/span><span id=\"__span-6-4\"><a id=\"__codelineno-6-4\" name=\"__codelineno-6-4\" href=\"#__codelineno-6-4\"><\/a> \\left[1 + \\kappa\\,M_c\\right] <\/span><\/code><\/pre><\/div> <p>where <span class=\"arithmatex\">\\(M_c\\)<\/span> is the <strong>maximum permissible percent increase<\/strong> for tract <span class=\"arithmatex\">\\(c\\)<\/span> based on distance to the Beltline.<\/p> <p>Two alternative utility metrics guide learning:<\/p> <table> <thead> <tr> <th><code>UTILITY_METRIC<\/code><\/th> <th>Algorithm maximises<\/th> <th>Real\u2011world analogy<\/th> <\/tr> <\/thead> <tbody> <tr> <td><code>0<\/code> <em>(default)<\/em><\/td> <td><strong>average utility<\/strong> (mean\u00a0well\u2011being across all agents)<\/td> <td>\u201cGreatest good for the greatest number.\u201d<\/td> <\/tr> <tr> <td><code>1<\/code><\/td> <td><strong>minimum utility<\/strong> (well\u2011being of the worst\u2011off agent)<\/td> <td>Rawlsian \/ max\u2011min fairness.<\/td> <\/tr> <\/tbody> <\/table> <p>The DecisionAgent reinforces actions that raise the chosen utility, gradually converging to an ideal <em>m<\/em> for the current policy goal. <\/p> <p>These \u201cconcrete zoning\u2011bonus percentages and distance bands\u201d are the literal numbers (+20\u202f%, +10\u202f%, 800\u202fm, 1600\u202fm) encoded in <code>DecisionAgent.py<\/code>. Feel free to edit them in <code>config.py<\/code>.<\/p> <h3 id=\"2-horizontal-scaling-complete-beltline-from-day-0\">2.\u202fHorizontal\u202fScaling\u00a0(complete BeltLine from day\u202f0)<\/h3> <p>All census tracts whose centroids fall inside the Beltline\u2019s catchment radius begin with <strong>\u03b2_c &gt; 1<\/strong>, following the same taper function used in the baseline model.<br \/> Unlike vertical scaling, <strong>capacities do not change<\/strong>\u2014only the geography of Beltline-induced accessibility (amenity-attractiveness) changes.<\/p> <p>This models a scenario where the entire Beltline loop has been completed.<\/p> <h2 id=\"strengths-and-weaknesses\">Strengths and Weaknesses<\/h2> <h3 id=\"strengths\">Strengths<\/h3> <p>Our approach is very modularized. For instance, our code can easily be ran on other regions, with customizable 'Beltlines' and parameters. Furthermore, Our approach is backed by established human behavior approaches (no-regret dynamics) rather than pre-defined, non-adaptive agent behavior. We are also able to produce dynamic visuals (GIFs).<\/p> <h3 id=\"weaknesses\">Weaknesses<\/h3> <p>Our simulation also assumes that there is no immigration\/emigration in Atlanta, as we set a fixed number of agents which are able to exit, and hence re-enter, our defined area. We also limit transportation choices to cars and public transportation, despite other modes of transport being popular (walking or biking). Additionally, our runtimes may be relatively long due to the computationally expensive nature of the simulation (several minutes). Ideally, our simulation would be ran in just seconds.<\/p> <h3 id=\"next-steps\">Next Steps<\/h3> <p>We hope to improve the readability of our GIF's, improve the runtime of the simulation, and include additional visualizations of our results to better communicate our analysis during discussion. We also hope to run SOBOL sensitivity nalysis of our parameters once more.<\/p> <h1 id=\"spatial-autocorrelation\">Spatial Autocorrelation<\/h1> <p>This section serves as an explanation for the conceptual and applied framework for spatial autocorrelation in the MPONC simulation. I will begin by explaining the concepts necessary to understand spatial autocorrelation, specifically for Local Moran's I. It's important to understand that spatial autocorrelation is used to calculate the community score and if you are unsure what community score represents or the justification for it, then see the general readME. This readme is speficially for community score's implementation. <\/p> <hr \/> <h2 id=\"the-math\">The Math<\/h2> <h3 id=\"local-morans-i\">Local Moran's I<\/h3> <p>Spatial Autocorrelation is a geographic concept for finding clusters of similarity or dissimilarity in geographic data. The most common formula is <strong>Local Moran's I<\/strong>:<\/p> <div class=\"arithmatex\">\\[ I_i = \\frac{(x_i - \\bar{x})}{m_2} \\sum_{j=1}^{n} w_{ij} (x_j - \\bar{x}) \\]<\/div> <p>Where:<\/p> <ul> <li><span class=\"arithmatex\">\\(\\( x_i \\)\\)<\/span>: value of the variable at location <em>i<\/em> (agent endowments)<\/li> <li><span class=\"arithmatex\">\\(\\( \\bar{x} \\)\\)<\/span>: mean of all <span class=\"arithmatex\">\\( x \\)<\/span> values (average endowments of all agents)<\/li> <li><span class=\"arithmatex\">\\(\\( w_{ij} \\)\\)<\/span>: spatial weight between locations <em>i<\/em> and <em>j<\/em> (morans weights)<\/li> <li><span class=\"arithmatex\">\\(\\( n \\)\\)<\/span>: total number of observations<\/li> <li><span class=\"arithmatex\">\\(\\( m_2 = \\frac{1}{n} \\sum_{i=1}^{n} (x_i - \\bar{x})^2 \\)\\)<\/span>: variance normalization term<\/li> <\/ul> <p><span class=\"arithmatex\">\\(<span class=\"arithmatex\">\\(I_i\\)<\/span>\\)<\/span> represents the value of morans for the specific agent. In our case, we can obtain the \"community score\" by calculating the local moran's value for that agent and normalizing this value to be between 0 and 1. While this formula is how Moran's I runs, our simulation uses esda.local_moran, instead of manually implementing the math. In order to do this, we need to form our own weights value and way of tracking endowments for each agent to give to esda. <strong>Importantly, the weights matrix is per census tract and represents the weights between census tracts, while agent endowments are per agent.<\/strong><\/p> <h3 id=\"neighbors\">Neighbors<\/h3> <p>In the pure mathematical form of Local Moran's I, every node is compared with every other node in the set. However, this is computationally expensive and also causes odd behavior around edges (see Appendix A). The common alternate approach is to only consider neighbors. So if a census tract is touching 6 other census tracts, then that tract has 6 neighbors to compare with and effectively only those 6 neighbors impact the agent's community score. Another common approach is to use decay over the entire set of nodes. So every node is a \u201cneighbor,\u201d but the Moran\u2019s weights reflect that closer neighbors have a stronger impact on the community of a node.<\/p> <p>For our simulation we use a K-nearest neighbors approach, which sets a fixed set of neighbors - that we can configure for each simulation - and then uses decay. So if we set neighbors to 20, then the closest 20 nodes are neighbors with the closer ones counting more. We chose this because it\u2019s much faster than a full decay (with full decay you have to iterate over 500 nodes for every moran\u2019s calculation for each node), but reflects that people\u2019s perception of their neighborhood extends further than 10-20 minutes away from them. The decay should remain high.<\/p> <h3 id=\"normalization\">Normalization<\/h3> <p>Normalization is important for local morans because the raw values for morans can vary without range. They often are negative and they are not constrained to any range. Community score, however, does need to be constrained from 0 to 1. Therefore, we need a way to constrain our morans values to between 0 and 1. <\/p> <p>Our original approach was to use z-score-to-cdf. This means we first take the morans values we calculate and perform a z-score normalization (this is standard in statistics) and then map those values to [0,1] using CDF which conceptually is like saying \u201cthis is the 90<sup>th<\/sup> percentile value in our simulation so the value is really 0.9\u201d. The issue with this was that it causes more extreme values if the moran\u2019s values have a low standard deviation. <\/p> <p>The new approach is to use a direct mapping after z-score. The equation for that is simply:<\/p> <div class=\"arithmatex\">\\[ p_i = \\frac{z_i - \\min(z)}{\\max(z) - \\min(z)} \\]<\/div> <p><strong>IMPORTANT, this is currently not reflected in the main branch of the code. We\u2019ll need to update this if we go back to moran\u2019s<\/strong><\/p> <h2 id=\"the-simulation\">The Simulation<\/h2> <h2 id=\"morans_analysispy\">Morans_analysis.py<\/h2> <p>Let\u2019s go through the code one section at a time to review the design principles. <div class=\"language-python highlight\"><pre><span><\/span><code><span id=\"__span-7-1\"><a id=\"__codelineno-7-1\" name=\"__codelineno-7-1\" href=\"#__codelineno-7-1\"><\/a><span class=\"k\">def<\/span><span class=\"w\"> <\/span><span class=\"nf\">_library_spatial_autocorrelation<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">city<\/span><span class=\"p\">):<\/span> <\/span><span id=\"__span-7-2\"><a id=\"__codelineno-7-2\" name=\"__codelineno-7-2\" href=\"#__codelineno-7-2\"><\/a> <span class=\"c1\"># Prefer tract-level Moran&#39;s weights stored on the city (centroid-level).<\/span> <\/span><span id=\"__span-7-3\"><a id=\"__codelineno-7-3\" name=\"__codelineno-7-3\" href=\"#__codelineno-7-3\"><\/a> <span class=\"c1\"># If not present, build weights from cached distances below.<\/span> <\/span><span id=\"__span-7-4\"><a id=\"__codelineno-7-4\" name=\"__codelineno-7-4\" href=\"#__codelineno-7-4\"><\/a> <span class=\"n\">tract_W_mat<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">getattr<\/span><span class=\"p\">(<\/span><span class=\"n\">city<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;morans_weights&quot;<\/span><span class=\"p\">,<\/span> <span class=\"kc\">None<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-7-5\"><a id=\"__codelineno-7-5\" name=\"__codelineno-7-5\" href=\"#__codelineno-7-5\"><\/a> <span class=\"n\">agent_endowments<\/span> <span class=\"o\">=<\/span> <span class=\"n\">city<\/span><span class=\"o\">.<\/span><span class=\"n\">agt_dows<\/span> <\/span><span id=\"__span-7-6\"><a id=\"__codelineno-7-6\" name=\"__codelineno-7-6\" href=\"#__codelineno-7-6\"><\/a> <span class=\"n\">agent_positions<\/span> <span class=\"o\">=<\/span> <span class=\"n\">city<\/span><span class=\"o\">.<\/span><span class=\"n\">agent_positions<\/span> <\/span><span id=\"__span-7-7\"><a id=\"__codelineno-7-7\" name=\"__codelineno-7-7\" href=\"#__codelineno-7-7\"><\/a> <\/span><span id=\"__span-7-8\"><a id=\"__codelineno-7-8\" name=\"__codelineno-7-8\" href=\"#__codelineno-7-8\"><\/a> <span class=\"c1\"># If city provides a tract-level numpy matrix, convert to libpysal W<\/span> <\/span><span id=\"__span-7-9\"><a id=\"__codelineno-7-9\" name=\"__codelineno-7-9\" href=\"#__codelineno-7-9\"><\/a> <span class=\"k\">if<\/span> <span class=\"nb\">isinstance<\/span><span class=\"p\">(<\/span><span class=\"n\">tract_W_mat<\/span><span class=\"p\">,<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">ndarray<\/span><span class=\"p\">):<\/span> <\/span><span id=\"__span-7-10\"><a id=\"__codelineno-7-10\" name=\"__codelineno-7-10\" href=\"#__codelineno-7-10\"><\/a> <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">isfinite<\/span><span class=\"p\">(<\/span><span class=\"n\">tract_W_mat<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">all<\/span><span class=\"p\">():<\/span> <\/span><span id=\"__span-7-11\"><a id=\"__codelineno-7-11\" name=\"__codelineno-7-11\" href=\"#__codelineno-7-11\"><\/a> <span class=\"n\">nan_positions<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">where<\/span><span class=\"p\">(<\/span><span class=\"o\">~<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">isfinite<\/span><span class=\"p\">(<\/span><span class=\"n\">tract_W_mat<\/span><span class=\"p\">))<\/span> <\/span><span id=\"__span-7-12\"><a id=\"__codelineno-7-12\" name=\"__codelineno-7-12\" href=\"#__codelineno-7-12\"><\/a> <span class=\"k\">raise<\/span> <span class=\"ne\">ValueError<\/span><span class=\"p\">(<\/span><span class=\"sa\">f<\/span><span class=\"s2\">&quot;Found non-finite values in tract-level weights matrix at positions: <\/span><span class=\"si\">{<\/span><span class=\"n\">nan_positions<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-7-13\"><a id=\"__codelineno-7-13\" name=\"__codelineno-7-13\" href=\"#__codelineno-7-13\"><\/a> <span class=\"c1\"># build weights_dict expected by libpysal.W<\/span> <\/span><span id=\"__span-7-14\"><a id=\"__codelineno-7-14\" name=\"__codelineno-7-14\" href=\"#__codelineno-7-14\"><\/a> <span class=\"n\">weights_dict<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span> <\/span><span id=\"__span-7-15\"><a id=\"__codelineno-7-15\" name=\"__codelineno-7-15\" href=\"#__codelineno-7-15\"><\/a> <span class=\"n\">n_nodes<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tract_W_mat<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <\/span><span id=\"__span-7-16\"><a id=\"__codelineno-7-16\" name=\"__codelineno-7-16\" href=\"#__codelineno-7-16\"><\/a> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"n\">n_nodes<\/span><span class=\"p\">):<\/span> <\/span><span id=\"__span-7-17\"><a id=\"__codelineno-7-17\" name=\"__codelineno-7-17\" href=\"#__codelineno-7-17\"><\/a> <span class=\"n\">row<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tract_W_mat<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <\/span><span id=\"__span-7-18\"><a id=\"__codelineno-7-18\" name=\"__codelineno-7-18\" href=\"#__codelineno-7-18\"><\/a> <span class=\"n\">neigh<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"n\">j<\/span><span class=\"p\">:<\/span> <span class=\"nb\">float<\/span><span class=\"p\">(<\/span><span class=\"n\">row<\/span><span class=\"p\">[<\/span><span class=\"n\">j<\/span><span class=\"p\">])<\/span> <span class=\"k\">for<\/span> <span class=\"n\">j<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"n\">n_nodes<\/span><span class=\"p\">)<\/span> <span class=\"k\">if<\/span> <span class=\"n\">row<\/span><span class=\"p\">[<\/span><span class=\"n\">j<\/span><span class=\"p\">]<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">}<\/span> <\/span><span id=\"__span-7-19\"><a id=\"__codelineno-7-19\" name=\"__codelineno-7-19\" href=\"#__codelineno-7-19\"><\/a> <span class=\"n\">weights_dict<\/span><span class=\"p\">[<\/span><span class=\"n\">i<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">neigh<\/span> <\/span><span id=\"__span-7-20\"><a id=\"__codelineno-7-20\" name=\"__codelineno-7-20\" href=\"#__codelineno-7-20\"><\/a> <span class=\"n\">w_obj<\/span> <span class=\"o\">=<\/span> <span class=\"n\">W<\/span><span class=\"p\">(<\/span><span class=\"n\">weights_dict<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-7-21\"><a id=\"__codelineno-7-21\" name=\"__codelineno-7-21\" href=\"#__codelineno-7-21\"><\/a> <span class=\"n\">w_obj<\/span><span class=\"o\">.<\/span><span class=\"n\">transform<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">&quot;r&quot;<\/span> <\/span><span id=\"__span-7-22\"><a id=\"__codelineno-7-22\" name=\"__codelineno-7-22\" href=\"#__codelineno-7-22\"><\/a> <span class=\"n\">w<\/span> <span class=\"o\">=<\/span> <span class=\"n\">w_obj<\/span> <\/span><span id=\"__span-7-23\"><a id=\"__codelineno-7-23\" name=\"__codelineno-7-23\" href=\"#__codelineno-7-23\"><\/a> <span class=\"k\">else<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-7-24\"><a id=\"__codelineno-7-24\" name=\"__codelineno-7-24\" href=\"#__codelineno-7-24\"><\/a> <span class=\"n\">w<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">None<\/span> <\/span><span id=\"__span-7-25\"><a id=\"__codelineno-7-25\" name=\"__codelineno-7-25\" href=\"#__codelineno-7-25\"><\/a> <\/span><span id=\"__span-7-26\"><a id=\"__codelineno-7-26\" name=\"__codelineno-7-26\" href=\"#__codelineno-7-26\"><\/a> <span class=\"k\">if<\/span> <span class=\"n\">w<\/span> <span class=\"ow\">is<\/span> <span class=\"kc\">None<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-7-27\"><a id=\"__codelineno-7-27\" name=\"__codelineno-7-27\" href=\"#__codelineno-7-27\"><\/a> <span class=\"k\">if<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">cached_distances<\/span> <span class=\"ow\">is<\/span> <span class=\"kc\">None<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-7-28\"><a id=\"__codelineno-7-28\" name=\"__codelineno-7-28\" href=\"#__codelineno-7-28\"><\/a> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">cached_distances<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">load<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;neighbors.npy&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">mmap_mode<\/span><span class=\"o\">=<\/span><span class=\"s2\">&quot;r&quot;<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-7-29\"><a id=\"__codelineno-7-29\" name=\"__codelineno-7-29\" href=\"#__codelineno-7-29\"><\/a> <span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"sa\">f<\/span><span class=\"s2\">&quot;[MoransAnalyzer] Loaded cached centroid distances for <\/span><span class=\"si\">{<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">cached_distances<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"si\">}<\/span><span class=\"s2\"> centroids&quot;<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-7-30\"><a id=\"__codelineno-7-30\" name=\"__codelineno-7-30\" href=\"#__codelineno-7-30\"><\/a> <\/span><span id=\"__span-7-31\"><a id=\"__codelineno-7-31\" name=\"__codelineno-7-31\" href=\"#__codelineno-7-31\"><\/a> <span class=\"k\">if<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">cached_KNN<\/span> <span class=\"ow\">is<\/span> <span class=\"kc\">None<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-7-32\"><a id=\"__codelineno-7-32\" name=\"__codelineno-7-32\" href=\"#__codelineno-7-32\"><\/a> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">cached_KNN<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">argsort<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">cached_distances<\/span><span class=\"p\">,<\/span> <span class=\"n\">axis<\/span><span class=\"o\">=<\/span><span class=\"mi\">1<\/span><span class=\"p\">)[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">:<\/span><span class=\"n\">SPATIAL_K_NEIGHBORS<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <\/span><span id=\"__span-7-33\"><a id=\"__codelineno-7-33\" name=\"__codelineno-7-33\" href=\"#__codelineno-7-33\"><\/a> <span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"sa\">f<\/span><span class=\"s2\">&quot;[MoransAnalyzer] Cached KNN neighbors with k=<\/span><span class=\"si\">{<\/span><span class=\"n\">SPATIAL_K_NEIGHBORS<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-7-34\"><a id=\"__codelineno-7-34\" name=\"__codelineno-7-34\" href=\"#__codelineno-7-34\"><\/a> <\/span><span id=\"__span-7-35\"><a id=\"__codelineno-7-35\" name=\"__codelineno-7-35\" href=\"#__codelineno-7-35\"><\/a> <span class=\"k\">if<\/span> <span class=\"nb\">getattr<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;cached_W&quot;<\/span><span class=\"p\">,<\/span> <span class=\"kc\">None<\/span><span class=\"p\">)<\/span> <span class=\"ow\">is<\/span> <span class=\"kc\">None<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-7-36\"><a id=\"__codelineno-7-36\" name=\"__codelineno-7-36\" href=\"#__codelineno-7-36\"><\/a> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">_ensure_cached_W_from_distances<\/span><span class=\"p\">()<\/span> <\/span><span id=\"__span-7-37\"><a id=\"__codelineno-7-37\" name=\"__codelineno-7-37\" href=\"#__codelineno-7-37\"><\/a> <span class=\"c1\"># --- Step 3: Align agent_endowments with weight matrix ---<\/span> <\/span><span id=\"__span-7-38\"><a id=\"__codelineno-7-38\" name=\"__codelineno-7-38\" href=\"#__codelineno-7-38\"><\/a> <span class=\"n\">w<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">cached_W<\/span> <\/span><\/code><\/pre><\/div> Okay, let's review this. The library call accepts the entire city, which is not the most efficient, but otherwise we would need 4 or 5 input parameters from the city, so this is simpler. The code itself ensures that a spatial weights matrix (W) exists, which is essential for computing Local Moran\u2019s I.<\/p> <p>Spatial weights define which regions (or agents) are considered neighbors and how strongly they influence each other. The code first checks whether these weights already exist (as a tract-level NumPy matrix on the city object). If not, it dynamically builds them from cached distance data.<\/p> <ol> <li>Using Precomputed Tract Weights<\/li> <li>If the city object already provides a tract-level distance matrix (morans_weights):<\/li> <li>The code verifies that all values are finite (no NaNs or infinities).<\/li> <li>It converts the NumPy distance matrix into a Libpysal W object, the standard spatial weights format used by the PySAL ecosystem.<\/li> <li>Each tract\u2019s row is converted into a dictionary mapping neighbor indices \u2192 weight values.<\/li> <li>Finally, the matrix is row-standardized (w_obj.transform = \"r\"), so each row sums to 1.<\/li> <li> <p>This path is used when a ready-made Moran\u2019s weights matrix is already available (for example, from prior preprocessing or caching).<\/p> <\/li> <li> <p>Building Weights from Cached Distances<\/p> <\/li> <li> <p>If the city object doesn\u2019t have a precomputed weights matrix (w is None), the method builds one on the fly:<\/p> <\/li> <li>It loads a precomputed centroid distance matrix from neighbors.npy, which stores pairwise distances between tracts.<\/li> <li>It constructs a k-nearest-neighbor (KNN) structure (self.cached_KNN), where each tract is connected to its SPATIAL_K_NEIGHBORS closest neighbors.<\/li> <li>If a cached Libpysal W object (self.cached_W) doesn\u2019t exist yet, it calls _ensure_cached_W_from_distances() to create it.<\/li> <li>This helper computes inverse-distance weights, so closer tracts have stronger influence.<\/li> <li>The resulting matrix is also row-standardized.<\/li> <\/ol> <p>After these steps, the method guarantees that a valid Libpysal W object (w) exists \u2014 ready for use in the Local Moran\u2019s I calculation that follows.<\/p> <p><div class=\"language-python highlight\"><pre><span><\/span><code><span id=\"__span-8-1\"><a id=\"__codelineno-8-1\" name=\"__codelineno-8-1\" href=\"#__codelineno-8-1\"><\/a><span class=\"n\">values<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">array<\/span><span class=\"p\">(<\/span><span class=\"n\">agent_endowments<\/span><span class=\"p\">,<\/span> <span class=\"n\">dtype<\/span><span class=\"o\">=<\/span><span class=\"nb\">float<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-8-2\"><a id=\"__codelineno-8-2\" name=\"__codelineno-8-2\" href=\"#__codelineno-8-2\"><\/a> <span class=\"n\">n_agents<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">values<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-8-3\"><a id=\"__codelineno-8-3\" name=\"__codelineno-8-3\" href=\"#__codelineno-8-3\"><\/a> <span class=\"n\">n_nodes<\/span> <span class=\"o\">=<\/span> <span class=\"n\">w<\/span><span class=\"o\">.<\/span><span class=\"n\">n<\/span> <\/span><span id=\"__span-8-4\"><a id=\"__codelineno-8-4\" name=\"__codelineno-8-4\" href=\"#__codelineno-8-4\"><\/a> <\/span><span id=\"__span-8-5\"><a id=\"__codelineno-8-5\" name=\"__codelineno-8-5\" href=\"#__codelineno-8-5\"><\/a> <span class=\"c1\"># Adjust sizes<\/span> <\/span><span id=\"__span-8-6\"><a id=\"__codelineno-8-6\" name=\"__codelineno-8-6\" href=\"#__codelineno-8-6\"><\/a> <span class=\"k\">if<\/span> <span class=\"n\">n_agents<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">n_nodes<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-8-7\"><a id=\"__codelineno-8-7\" name=\"__codelineno-8-7\" href=\"#__codelineno-8-7\"><\/a> <span class=\"c1\"># pad missing nodes with mean value (not NaN to avoid broadcasting)<\/span> <\/span><span id=\"__span-8-8\"><a id=\"__codelineno-8-8\" name=\"__codelineno-8-8\" href=\"#__codelineno-8-8\"><\/a> <span class=\"n\">mean_val<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">mean<\/span><span class=\"p\">(<\/span><span class=\"n\">values<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-8-9\"><a id=\"__codelineno-8-9\" name=\"__codelineno-8-9\" href=\"#__codelineno-8-9\"><\/a> <span class=\"n\">padded<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">full<\/span><span class=\"p\">(<\/span><span class=\"n\">n_nodes<\/span><span class=\"p\">,<\/span> <span class=\"n\">mean_val<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-8-10\"><a id=\"__codelineno-8-10\" name=\"__codelineno-8-10\" href=\"#__codelineno-8-10\"><\/a> <span class=\"n\">padded<\/span><span class=\"p\">[:<\/span><span class=\"n\">n_agents<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">values<\/span> <\/span><span id=\"__span-8-11\"><a id=\"__codelineno-8-11\" name=\"__codelineno-8-11\" href=\"#__codelineno-8-11\"><\/a> <span class=\"n\">values<\/span> <span class=\"o\">=<\/span> <span class=\"n\">padded<\/span> <\/span><span id=\"__span-8-12\"><a id=\"__codelineno-8-12\" name=\"__codelineno-8-12\" href=\"#__codelineno-8-12\"><\/a> <span class=\"k\">elif<\/span> <span class=\"n\">n_agents<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">n_nodes<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-8-13\"><a id=\"__codelineno-8-13\" name=\"__codelineno-8-13\" href=\"#__codelineno-8-13\"><\/a> <span class=\"c1\"># truncate if too many agents: average agents into tract-level values.<\/span> <\/span><span id=\"__span-8-14\"><a id=\"__codelineno-8-14\" name=\"__codelineno-8-14\" href=\"#__codelineno-8-14\"><\/a> <span class=\"c1\"># Use the simulation&#39;s canonical number of tracts (centroids) rather than<\/span> <\/span><span id=\"__span-8-15\"><a id=\"__codelineno-8-15\" name=\"__codelineno-8-15\" href=\"#__codelineno-8-15\"><\/a> <span class=\"c1\"># deriving it from agent_positions, which can change as agents move.<\/span> <\/span><span id=\"__span-8-16\"><a id=\"__codelineno-8-16\" name=\"__codelineno-8-16\" href=\"#__codelineno-8-16\"><\/a> <span class=\"n\">num_tracts<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"nb\">getattr<\/span><span class=\"p\">(<\/span><span class=\"n\">city<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;centroids&quot;<\/span><span class=\"p\">,<\/span> <span class=\"p\">[]))<\/span> <\/span><span id=\"__span-8-17\"><a id=\"__codelineno-8-17\" name=\"__codelineno-8-17\" href=\"#__codelineno-8-17\"><\/a> <span class=\"n\">values<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">_average_agents_by_tract<\/span><span class=\"p\">(<\/span><span class=\"n\">agent_endowments<\/span><span class=\"p\">,<\/span> <span class=\"n\">agent_positions<\/span><span class=\"p\">,<\/span> <span class=\"n\">num_tracts<\/span><span class=\"o\">=<\/span><span class=\"n\">num_tracts<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-8-18\"><a id=\"__codelineno-8-18\" name=\"__codelineno-8-18\" href=\"#__codelineno-8-18\"><\/a> <\/span><span id=\"__span-8-19\"><a id=\"__codelineno-8-19\" name=\"__codelineno-8-19\" href=\"#__codelineno-8-19\"><\/a> <span class=\"c1\"># Replace NaNs with mean for stability<\/span> <\/span><span id=\"__span-8-20\"><a id=\"__codelineno-8-20\" name=\"__codelineno-8-20\" href=\"#__codelineno-8-20\"><\/a> <span class=\"n\">mean_val<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">nanmean<\/span><span class=\"p\">(<\/span><span class=\"n\">values<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-8-21\"><a id=\"__codelineno-8-21\" name=\"__codelineno-8-21\" href=\"#__codelineno-8-21\"><\/a> <span class=\"n\">values<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">nan_to_num<\/span><span class=\"p\">(<\/span><span class=\"n\">values<\/span><span class=\"p\">,<\/span> <span class=\"n\">nan<\/span><span class=\"o\">=<\/span><span class=\"n\">mean_val<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-8-22\"><a id=\"__codelineno-8-22\" name=\"__codelineno-8-22\" href=\"#__codelineno-8-22\"><\/a> <\/span><span id=\"__span-8-23\"><a id=\"__codelineno-8-23\" name=\"__codelineno-8-23\" href=\"#__codelineno-8-23\"><\/a> <span class=\"k\">if<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">values<\/span><span class=\"p\">)<\/span> <span class=\"o\">!=<\/span> <span class=\"n\">w<\/span><span class=\"o\">.<\/span><span class=\"n\">n<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-8-24\"><a id=\"__codelineno-8-24\" name=\"__codelineno-8-24\" href=\"#__codelineno-8-24\"><\/a> <span class=\"k\">raise<\/span> <span class=\"ne\">ValueError<\/span><span class=\"p\">(<\/span><span class=\"sa\">f<\/span><span class=\"s2\">&quot;Length mismatch: <\/span><span class=\"si\">{<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">values<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span><span class=\"s2\"> values vs <\/span><span class=\"si\">{<\/span><span class=\"n\">w<\/span><span class=\"o\">.<\/span><span class=\"n\">n<\/span><span class=\"si\">}<\/span><span class=\"s2\"> weights&quot;<\/span><span class=\"p\">)<\/span> <\/span><\/code><\/pre><\/div> To ensure the endowment vector and the spatial weights matrix are compatible in size, the function performs the following adjustments:<\/p> <p>Case 1: Fewer agents than spatial nodes If the number of agents (n_agents) is less than the number of spatial nodes (n_nodes), the missing nodes are padded with the mean endowment value.<\/p> <p>Mathematically:<\/p> <div class=\"arithmatex\">\\[ values[i] = \\begin{cases} agent\\_endowment[i], &amp; i &lt; n\\_{\\text{agents}} \\\\ \\bar{x}, &amp; i \\ge n\\_{\\text{agents}} \\end{cases} \\]<\/div> <p>where x\u0304 is the mean of all agent endowments. This ensures every spatial node has a corresponding endowment value.<\/p> <p>Case 2: More agents than spatial nodes If the number of agents (n_agents) exceeds the number of nodes (n_nodes), agents are aggregated by tract, and the mean endowment per tract is used.<\/p> <p>Mathematically:<\/p> <div class=\"arithmatex\">\\[ tract\\_value[j] = \\frac{1}{|A_j|} \\sum_{i \\in A_j} endowment\\_i \\]<\/div> <p>where A\u2c7c is the set of agents that belong to tract j. Each tract\u2019s endowment value becomes the average of all agents in that tract.<\/p> <p>Case 3: Handle missing or invalid values Any missing (NaN) or undefined values are replaced by the overall mean value x\u0304 to ensure numerical stability and prevent errors during computation.<\/p> <p>Final check After these adjustments, the endowment vector and the spatial weights matrix always have the same length:<\/p> <div class=\"arithmatex\">\\[ |values| = n_nodes = |W| \\]<\/div> <p>This guarantees proper alignment between endowments and spatial weights when computing Moran\u2019s I.<\/p> <div class=\"language-python highlight\"><pre><span><\/span><code><span id=\"__span-9-1\"><a id=\"__codelineno-9-1\" name=\"__codelineno-9-1\" href=\"#__codelineno-9-1\"><\/a><span class=\"c1\"># I need to check what 0 permutations actually means<\/span> <\/span><span id=\"__span-9-2\"><a id=\"__codelineno-9-2\" name=\"__codelineno-9-2\" href=\"#__codelineno-9-2\"><\/a> <span class=\"k\">if<\/span> <span class=\"n\">USE_SIMPLIFIED_COMMUNITY_SCORE<\/span> <span class=\"o\">==<\/span> <span class=\"s1\">&#39;morans&#39;<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-9-3\"><a id=\"__codelineno-9-3\" name=\"__codelineno-9-3\" href=\"#__codelineno-9-3\"><\/a> <span class=\"n\">lisa<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Moran_Local<\/span><span class=\"p\">(<\/span><span class=\"n\">values<\/span><span class=\"p\">,<\/span> <span class=\"n\">w<\/span><span class=\"p\">,<\/span> <span class=\"n\">permutations<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-9-4\"><a id=\"__codelineno-9-4\" name=\"__codelineno-9-4\" href=\"#__codelineno-9-4\"><\/a> <span class=\"n\">results<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lisa<\/span><span class=\"o\">.<\/span><span class=\"n\">Is<\/span> <\/span><span id=\"__span-9-5\"><a id=\"__codelineno-9-5\" name=\"__codelineno-9-5\" href=\"#__codelineno-9-5\"><\/a> <span class=\"k\">elif<\/span> <span class=\"n\">USE_SIMPLIFIED_COMMUNITY_SCORE<\/span> <span class=\"o\">==<\/span> <span class=\"s1\">&#39;gearys&#39;<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-9-6\"><a id=\"__codelineno-9-6\" name=\"__codelineno-9-6\" href=\"#__codelineno-9-6\"><\/a> <span class=\"n\">local_geary<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Geary_Local<\/span><span class=\"p\">(<\/span><span class=\"n\">w<\/span><span class=\"p\">,<\/span> <span class=\"n\">permutations<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-9-7\"><a id=\"__codelineno-9-7\" name=\"__codelineno-9-7\" href=\"#__codelineno-9-7\"><\/a> <span class=\"n\">local_geary<\/span> <span class=\"o\">=<\/span> <span class=\"n\">local_geary<\/span><span class=\"o\">.<\/span><span class=\"n\">fit<\/span><span class=\"p\">(<\/span><span class=\"n\">values<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-9-8\"><a id=\"__codelineno-9-8\" name=\"__codelineno-9-8\" href=\"#__codelineno-9-8\"><\/a> <span class=\"n\">results<\/span> <span class=\"o\">=<\/span> <span class=\"n\">local_geary<\/span><span class=\"o\">.<\/span><span class=\"n\">localG<\/span> <\/span><span id=\"__span-9-9\"><a id=\"__codelineno-9-9\" name=\"__codelineno-9-9\" href=\"#__codelineno-9-9\"><\/a> <span class=\"k\">else<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-9-10\"><a id=\"__codelineno-9-10\" name=\"__codelineno-9-10\" href=\"#__codelineno-9-10\"><\/a> <span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;invalid use_simplified_community_score value&quot;<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-9-11\"><a id=\"__codelineno-9-11\" name=\"__codelineno-9-11\" href=\"#__codelineno-9-11\"><\/a> <span class=\"k\">return<\/span> <span class=\"kc\">None<\/span> <\/span><span id=\"__span-9-12\"><a id=\"__codelineno-9-12\" name=\"__codelineno-9-12\" href=\"#__codelineno-9-12\"><\/a> <\/span><span id=\"__span-9-13\"><a id=\"__codelineno-9-13\" name=\"__codelineno-9-13\" href=\"#__codelineno-9-13\"><\/a> <span class=\"c1\">#Convert to NumPy array for consistency<\/span> <\/span><span id=\"__span-9-14\"><a id=\"__codelineno-9-14\" name=\"__codelineno-9-14\" href=\"#__codelineno-9-14\"><\/a> <span class=\"n\">results<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">array<\/span><span class=\"p\">(<\/span><span class=\"n\">results<\/span><span class=\"p\">,<\/span> <span class=\"n\">dtype<\/span><span class=\"o\">=<\/span><span class=\"nb\">float<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-9-15\"><a id=\"__codelineno-9-15\" name=\"__codelineno-9-15\" href=\"#__codelineno-9-15\"><\/a> <\/span><span id=\"__span-9-16\"><a id=\"__codelineno-9-16\" name=\"__codelineno-9-16\" href=\"#__codelineno-9-16\"><\/a> <span class=\"c1\"># Convert tract-level results to CDF-normalized scores<\/span> <\/span><span id=\"__span-9-17\"><a id=\"__codelineno-9-17\" name=\"__codelineno-9-17\" href=\"#__codelineno-9-17\"><\/a> <span class=\"n\">tract_scores<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">zscore_to_cdf<\/span><span class=\"p\">(<\/span><span class=\"n\">results<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># shape (C,)<\/span> <\/span><span id=\"__span-9-18\"><a id=\"__codelineno-9-18\" name=\"__codelineno-9-18\" href=\"#__codelineno-9-18\"><\/a> <\/span><span id=\"__span-9-19\"><a id=\"__codelineno-9-19\" name=\"__codelineno-9-19\" href=\"#__codelineno-9-19\"><\/a> <span class=\"c1\"># Map tract-level scores to per-agent scores so callers receive an (N,) array<\/span> <\/span><span id=\"__span-9-20\"><a id=\"__codelineno-9-20\" name=\"__codelineno-9-20\" href=\"#__codelineno-9-20\"><\/a> <span class=\"c1\"># (every agent in the same tract receives the same tract score).<\/span> <\/span><span id=\"__span-9-21\"><a id=\"__codelineno-9-21\" name=\"__codelineno-9-21\" href=\"#__codelineno-9-21\"><\/a> <span class=\"n\">agent_positions<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">asarray<\/span><span class=\"p\">(<\/span><span class=\"n\">agent_positions<\/span><span class=\"p\">,<\/span> <span class=\"n\">dtype<\/span><span class=\"o\">=<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">intp<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-9-22\"><a id=\"__codelineno-9-22\" name=\"__codelineno-9-22\" href=\"#__codelineno-9-22\"><\/a> <span class=\"k\">if<\/span> <span class=\"n\">agent_positions<\/span><span class=\"o\">.<\/span><span class=\"n\">size<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"p\">:<\/span> <\/span><span id=\"__span-9-23\"><a id=\"__codelineno-9-23\" name=\"__codelineno-9-23\" href=\"#__codelineno-9-23\"><\/a> <span class=\"c1\"># no agents present -&gt; return empty array<\/span> <\/span><span id=\"__span-9-24\"><a id=\"__codelineno-9-24\" name=\"__codelineno-9-24\" href=\"#__codelineno-9-24\"><\/a> <span class=\"k\">return<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">asarray<\/span><span class=\"p\">([],<\/span> <span class=\"n\">dtype<\/span><span class=\"o\">=<\/span><span class=\"nb\">float<\/span><span class=\"p\">)<\/span> <\/span><span id=\"__span-9-25\"><a id=\"__codelineno-9-25\" name=\"__codelineno-9-25\" href=\"#__codelineno-9-25\"><\/a> <\/span><span id=\"__span-9-26\"><a id=\"__codelineno-9-26\" name=\"__codelineno-9-26\" href=\"#__codelineno-9-26\"><\/a> <span class=\"c1\"># Direct mapping: assume agent_positions are valid tract indices.<\/span> <\/span><span id=\"__span-9-27\"><a id=\"__codelineno-9-27\" name=\"__codelineno-9-27\" href=\"#__codelineno-9-27\"><\/a> <span class=\"n\">agent_scores<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tract_scores<\/span><span class=\"p\">[<\/span><span class=\"n\">agent_positions<\/span><span class=\"p\">]<\/span> <\/span><span id=\"__span-9-28\"><a id=\"__codelineno-9-28\" name=\"__codelineno-9-28\" href=\"#__codelineno-9-28\"><\/a> <span class=\"k\">return<\/span> <span class=\"n\">agent_scores<\/span> <\/span><\/code><\/pre><\/div> <p>This is where the actual morans\/gearys happens. Here we determine which Spatial Autocorrelation algorithm to use and then run that using the library. The '0 permutations' means the library only runs once. You can set a higher amount of permutations and then calculate means, medians, standard deviations, etc... but we choose not to do this because every permutation slows the simulation down. Then we make sure the data is in the right format and uses the correct normalization. Then when we 'map tract-level scores to per-agent scores', this ensures that the agents recieve the correct score for their track.<\/p> <p>The issue with this is that all agents in the tract will recieve the same morans score. The library runs on a node basis not an agent basis, which means we have to manipulate the data to get the results we want. There's a few potential ways to convert tract-level morans to agent-level morans. Potentially, you can add a faux tract with the same distances as the real tract the agent is and then set the endowment of the faux tract to the endowment of the agent. The issue with this is it requires a loop for every agent which means if there's N agents, then you need to run the library-morans N times, which is far too slow to be useful.Another way is to not use the library and instead do the calculations manually, which leaves more error for potential coding issues and will also be slower than the regular library due to the library's optimizations.<\/p> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=V6XC36CP5ew\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/V6XC36CP5ew\/maxresdefault.jpg\" width=\"480\" class=\"off-glb\"> <\/a><\/p> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub Handle<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Matthew Lim<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/mlim70\">mlim70<\/a><\/td> <\/tr> <tr> <td>Justin Xu<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/JXU037\">JXU037<\/a><\/td> <\/tr> <tr> <td>Devam Mondal<\/td> <td>Senior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/Dodesimo\">Dodesimo<\/a><\/td> <\/tr> <tr> <td>Nithish Sabapathy<\/td> <td>Senior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/nithish101\">nithish101<\/a><\/td> <\/tr> <tr> <td>Ian Baracskay<\/td> <td>Senior<\/td> <td>Computer Engineering<\/td> <td>ECE<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/ianBaracskay\">ianBaracskay<\/a><\/td> <\/tr> <tr> <td>Jason Tran<\/td> <td>Junior<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>1<\/td> <td><a href=\"https:\/\/github.com\/JTran86\">JTran86<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25fa-mponc\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:47 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25fa-mponc\/#__comments","guid":"https:\/\/vip-smur.github.io\/25fa-mponc\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25fa-mponc\/README.png","type":"image\/png","length":"None"}}},{"title":"25-Fa-MedialAxis","description":"<h1 id=\"medial-axis-transformation-for-building-floor-plans\">Medial Axis Transformation for Building Floor Plans<\/h1> <p align=\"center\"> <img src=\"figures\/f25_visual_abstract.png\" width=\"1000\" alt=\"f25_visual_abstract\"> <\/p> <h2 id=\"overview\">Overview<\/h2> <p>The <strong>Medial Axis Transformation (MAT)<\/strong> is a method that converts the two-dimensional layout of a building's interior space into a one-dimensional representation. This transformation is crucial because it reduces the complexity of the data while preserving essential information about the space's structure, including both circulation and partition details. This simplification facilitates easier computational analysis of complex building geometries.<\/p> <p>This project implements the Medial Axis Transformation for building floor plans inside the <strong>Rhino \/ Grasshopper<\/strong> environment, with the goal of producing a robust, vector-based representation of interior space that supports downstream data-driven and machine learning applications.<\/p> <hr \/> <h2 id=\"motivation\">Motivation<\/h2> <p>One of the primary motivations for using the Medial Axis is that most modern buildings are unique, making systematic and automated analysis challenging. The Medial Axis provides an automated method for identifying the inherent structure of interior space.<\/p> <p>By capturing underlying structural and circulation information, the MAT opens up pathways for advanced applications in architecture, urbanism, and real estate, such as:<\/p> <ul> <li>Prediction of social or functional information (e.g., room usage levels)<\/li> <li>Classification of building layouts<\/li> <li>Generative design using <strong>Graph Neural Networks (GNNs)<\/strong><\/li> <\/ul> <hr \/> <h2 id=\"project-objective\">Project Objective<\/h2> <p>The core objective of this project is to develop a <strong>custom implementation of the Medial Axis Transformation<\/strong> capable of handling complex shapes commonly found in real building floor plans, particularly <strong>polygons with interior holes<\/strong>.<\/p> <p>Key requirements of the implementation include:<\/p> <ul> <li>A <strong>vector-based<\/strong> (non-raster) representation to maintain geometric precision <\/li> <li>Robust handling of highly symmetrical geometries without producing unstable results <\/li> <li>Seamless integration into the <strong>Rhinoceros\u2013Grasshopper<\/strong> environment <\/li> <li>A graph-based output suitable for computational and data-driven analysis <\/li> <\/ul> <hr \/> <h2 id=\"theoretical-background\">Theoretical Background<\/h2> <p>The Medial Axis of a polygon is closely related to the <strong>Voronoi diagram<\/strong> of its boundary geometry. For floor plans represented as line segments, the Voronoi diagram provides a natural computational foundation for extracting medial axis segments.<\/p> <p>However, Voronoi diagrams generated from boundary segments contain additional geometry that does not belong to the true medial axis. A substantial portion of this project therefore focuses on <strong>post-processing<\/strong>, classification, and filtering of Voronoi output to recover only the meaningful medial axis structure.<\/p> <hr \/> <h2 id=\"implementation-overview\">Implementation Overview<\/h2> <p>Two primary implementation paths were pursued in parallel.<\/p> <h2 id=\"method-1-pyvoronoi-based-implementation\">Method 1: PyVoronoi-Based Implementation<\/h2> <p>This approach leverages <strong>PyVoronoi<\/strong>, a Python wrapper around Boost\u2019s computational geometry algorithms, to generate Voronoi diagrams from floor plan line segments directly inside Grasshopper.<\/p> <h3 id=\"tools\">Tools<\/h3> <ul> <li>Custom Grasshopper Python component <\/li> <li><strong>Python 3<\/strong> <\/li> <li><strong>PyVoronoi<\/strong> (Python port of Boost C++ computational geometry) <\/li> <\/ul> <h3 id=\"input-representation\">Input Representation<\/h3> <ul> <li>Floor plans represented as integer-based line segments<\/li> <li>Includes both:<\/li> <li>Exterior polygon boundaries <\/li> <li>Interior holes and partitions <\/li> <\/ul> <h3 id=\"processing-pipeline\">Processing Pipeline<\/h3> <ol> <li> <p><strong>Voronoi Diagram Generation<\/strong><br \/> A 2D Voronoi diagram is computed from the floor plan boundary segments.<\/p> <\/li> <li> <p><strong>Voronoi Cell Classification<\/strong><br \/> Voronoi edges are classified based on the originating boundary feature types, including:<\/p> <\/li> <li>Concave <\/li> <li>Convex\u2013Convex <\/li> <li>Convex\u2013Line <\/li> <li> <p>Line\u2013Line <\/p> <\/li> <li> <p><strong>Medial Axis Extraction<\/strong><br \/> Voronoi geometry that does not correspond to the true medial axis is filtered out, leaving only valid medial axis segments.<\/p> <\/li> <li> <p><strong>Graph Construction<\/strong><br \/> The remaining medial axis segments are treated as nodes, adjacency relationships are computed, and a complete graph representation of the interior space is constructed.<\/p> <\/li> <\/ol> <h2 id=\"method-2-cgal-library-port\">Method 2: CGAL Library Port<\/h2> <p>The second implementation path focuses on utilizing <strong>CGAL (Computational Geometry Algorithms Library)<\/strong> to perform medial axis computation with greater robustness.<\/p> <h3 id=\"architecture\">Architecture<\/h3> <p>A multi-layered framework bridges native CGAL C++ code into Rhino\u2019s .NET environment:<\/p> <ol> <li> <p><strong>Native C++ Layer<\/strong><br \/> Selected CGAL algorithms are compiled and exposed through a stable Application Binary Interface (ABI).<\/p> <\/li> <li> <p><strong>Native Interop Layer (.NET)<\/strong><br \/> Platform Invocation (<strong>P\/Invoke<\/strong>) is used to call the native C++ functions.<\/p> <\/li> <li> <p><strong>.NET Bridge Layer<\/strong><br \/> CGAL data structures are converted into Rhino-compatible primitive types.<\/p> <\/li> <li> <p><strong>Grasshopper Component<\/strong><br \/> A user-facing component exposes the functionality within the Grasshopper interface.<\/p> <\/li> <\/ol> <h3 id=\"current-status\">Current Status<\/h3> <ul> <li>The full framework has been successfully established using <strong>.NET 7<\/strong>, which is compatible with Rhino.<\/li> <li>The next milestone is the integration of <strong>2D Voronoi segment computation<\/strong>, which forms the basis of the Medial Axis Transformation.<\/li> <li>More info here: https:\/\/github.com\/VIP-SMUR\/25Fa-MedialAxis\/blob\/main\/cgal_port_2\/README.md<\/li> <\/ul> <hr \/> <h2 id=\"graph-representation\">Graph Representation<\/h2> <p>Once the medial axis segments are extracted and classified, they are used to build a <strong>graph structure<\/strong> that encodes the connectivity and topology of the building\u2019s interior space.<\/p> <p>This graph representation captures: - Circulation paths<br \/> - Spatial adjacency<br \/> - Topological structure of interior partitions <\/p> <p>The resulting graph serves as the primary interface for downstream computational analysis and machine learning workflows.<\/p> <hr \/> <h2 id=\"future-work\">Future Work<\/h2> <h3 id=\"data-integration-and-machine-learning\">Data Integration and Machine Learning<\/h3> <p>Planned future work includes:<\/p> <ul> <li>Encoding semantic or social information directly onto the medial axis graph <\/li> <li>Converting graphs into <strong>Directed Acyclic Graphs (DAGs)<\/strong> where appropriate <\/li> <li>Training <strong>Graph Neural Networks (GNNs)<\/strong> for:<\/li> <li>Prediction tasks <\/li> <li>Building classification <\/li> <li>Generative architectural design <\/li> <\/ul> <hr \/> <h2 id=\"presentation\">Presentation<\/h2> <p><a href=\"https:\/\/www.youtube.com\/watch?v=GZbaGNxTMrI\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"https:\/\/img.youtube.com\/vi\/GZbaGNxTMrI\/maxresdefault.jpg\" width=\"480\"> <\/a><\/p> <hr \/> <h2 id=\"team\">Team<\/h2> <table> <thead> <tr> <th>Name<\/th> <th>Seniority<\/th> <th>Major<\/th> <th>School<\/th> <th># Semesters<\/th> <th>GitHub<\/th> <\/tr> <\/thead> <tbody> <tr> <td>Kavya Lalith<\/td> <td>Senior<\/td> <td>Computer Engineering<\/td> <td>ECE<\/td> <td>2<\/td> <td><a href=\"https:\/\/github.com\/kavya-oop\">kavya-oop<\/a><\/td> <\/tr> <tr> <td>Jessica Hernandez<\/td> <td>Masters<\/td> <td>Computer Science<\/td> <td>SCS<\/td> <td>3<\/td> <td><a href=\"https:\/\/github.com\/jhernandez312\">jhernandez312<\/a><\/td> <\/tr> <tr> <td>Gonzalo Vegas<\/td> <td>PhD<\/td> <td>Architecture<\/td> <td>ARCH<\/td> <td>4<\/td> <td><a href=\"https:\/\/github.com\/gvegasol\">gvegasol<\/a><\/td> <\/tr> <\/tbody> <\/table>","link":"https:\/\/vip-smur.github.io\/25fa-medialaxis\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:47 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/25fa-medialaxis\/#__comments","guid":"https:\/\/vip-smur.github.io\/25fa-medialaxis\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/25fa-medialaxis\/README.png","type":"image\/png","length":"None"}}},{"title":"26-Sp-Microclimate-Outdoor+","description":"<h1 id=\"26sp-microclimate-outdoorplus\">26Sp-Microclimate-OutdoorPlus<\/h1>","link":"https:\/\/vip-smur.github.io\/26sp-microclimate-outdoorplus\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:47 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/26sp-microclimate-outdoorplus\/#__comments","guid":"https:\/\/vip-smur.github.io\/26sp-microclimate-outdoorplus\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/26sp-microclimate-outdoorplus\/README.png","type":"image\/png","length":"None"}}},{"title":"26-Sp-MedialAxis","description":"<h1 id=\"26sp-medialaxis\">26Sp-MedialAxis<\/h1>","link":"https:\/\/vip-smur.github.io\/26sp-medialaxis\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:47 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/26sp-medialaxis\/#__comments","guid":"https:\/\/vip-smur.github.io\/26sp-medialaxis\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/26sp-medialaxis\/README.png","type":"image\/png","length":"None"}}},{"title":"26-Sp-WindComfort-ML","description":"<h1 id=\"26sp-windcomfort-ml\">26Sp-WindComfort-ML<\/h1>","link":"https:\/\/vip-smur.github.io\/26sp-windcomfort-ml\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:47 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/26sp-windcomfort-ml\/#__comments","guid":"https:\/\/vip-smur.github.io\/26sp-windcomfort-ml\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/26sp-windcomfort-ml\/README.png","type":"image\/png","length":"None"}}},{"title":"26-Sp-Mobility","description":"<h1 id=\"26sp-mobility\">26Sp-Mobility<\/h1>","link":"https:\/\/vip-smur.github.io\/26sp-mobility\/?utm_source=documentation&utm_medium=RSS&utm_campaign=feed-syndication","pubDate":"Wed, 11 Mar 2026 12:46:47 +0000","source":"Surrogate Modeling for Urban Regeneration (SMUR)","comments":"https:\/\/vip-smur.github.io\/26sp-mobility\/#__comments","guid":"https:\/\/vip-smur.github.io\/26sp-mobility\/","enclosure":{"@attributes":{"url":"https:\/\/vip-smur.github.io\/assets\/images\/social\/26sp-mobility\/README.png","type":"image\/png","length":"None"}}}]}}