[build-system] requires = ["setuptools>=77"] build-backend = "setuptools.build_meta" [project] name = "GridPath" dynamic = ["version"] description = "A versatile simulation and optimization platform for power-system planning and operations." readme = "README.md" license = "Apache-2.0" maintainers = [ { name = "Sylvan Energy Analytics LLC", email = "info@sylvan.energy" }, ] keywords = ["energy", "electricity", "power", "renewables", "planning", "operations"] requires-python = ">=3.11" dependencies = [ "Pyomo==6.10.1", # Optimization modeling language "pandas==3.0.3", # Data-processing "bokeh==3.9.1", # Visualization library "pscript==0.8.1", # Python to JavaScript compiler (for viz) "networkx==3.6.1", # network package for DC OPF "PyUtilib==6.0.0", # used for solver temp file management "highspy==1.15.1", # HiGHS Python interface (default solver) # HiGHS plugin shipping the BLAS/AMD/METIS libraries the HiPO parallel # interior-point algorithm needs; must always move together with the # highspy pin above. "highspy-extras==1.15.1", # HiPO dependencies for highspy "dill==0.4.1", # pickling "duckdb==1.5.4", # data-handling "sphinx-rtd-theme", # documentation theme ] [project.urls] Homepage = "https://www.gridpath.io" Discussions = "https://github.com/sylvan-energy/gridpath/discussions" Documentation = "https://gridpath.readthedocs.io/en/latest/" Issues = "https://github.com/sylvan-energy/gridpath/issues" "Source Code" = "https://github.com/sylvan-energy/gridpath" # Note: df2img (used only by doc/opchar_img_gen.py, a standalone script that # regenerates the checked-in opchar diagram images) is deliberately NOT # listed here: its pandas<3.0 constraint can never be satisfied alongside # GridPath's own pandas==3.0.3 pin in dependencies (extras are additive, # not a replacement). Read the Docs builds straight from doc/source/conf.py # and never touches df2img/opchar_img_gen.py, since the images are # pre-generated and committed to doc/graphics/. To regenerate them after # editing opchar_param_requirements.csv, install df2img in a separate # throwaway environment (e.g. its own venv with an older pandas) and run # opchar_img_gen.py there directly. [project.optional-dependencies] doc = [ "Sphinx==7.2.6", "sphinx-argparse==0.4.0", ] coverage = [ "coverage", # test coverage "coveralls", # automated coverage results ] gurobi = ["gurobipy"] # Gurobi Python interface parallel_tests = [ "pytest", # test runner (collects the unittest suite as is) "pytest-xdist", # parallel test execution (see scripts/run_tests_parallel.py) "pytest-cov", # coverage measurement that reaches the xdist workers ] all = [ "GridPath[doc,coverage,gurobi,parallel_tests]", "black", ] [project.scripts] gridpath = "gridpath.cli:main" gridpath_run = "gridpath.run_scenario:cli" gridpath_run_parallel = "gridpath.run_scenario_parallel:main" gridpath_run_e2e = "gridpath.run_end_to_end:cli" gridpath_get_inputs = "gridpath.get_scenario_inputs:main" gridpath_import_results = "gridpath.import_scenario_results:cli" gridpath_process_results = "gridpath.process_results:main" gridpath_validate = "gridpath.validate_inputs:main" gridpath_run_server = "ui.server.run_server:main" gridpath_run_queue_manager = "ui.server.run_queue_manager:main" gridpath_create_database = "db.create_database:main" gridpath_load_csvs = "db.utilities.port_csvs_to_db:main" gridpath_load_scenarios = "db.utilities.scenario:main" gridpath_get_pudl_data = "data_toolkit.raw_data.pudl.download_data_from_pudl:main" gridpath_pudl_to_gridpath_raw = "data_toolkit.raw_data.pudl.pudl_to_gridpath_raw_data:main" gridpath_get_pcm_demo_inputs = "data_toolkit.raw_data.get_pcm_demo_user_defined_inputs:main" gridpath_get_ra_toolkit_data_raw = "data_toolkit.raw_data.ra_toolkit.get_ra_toolkit_data:main" gridpath_run_data_toolkit = "data_toolkit.run_data_toolkit:main" gridpath_load_raw_data = "data_toolkit.load_raw_data:main" gridpath_manual_adjustments = "data_toolkit.manual_adjustments:main" gridpath_eiaaeo_to_fuel_chars_input_csvs = "data_toolkit.fuels.eiaaeo_to_fuel_chars_input_csvs:main" gridpath_eiaaeo_fuel_price_input_csvs = "data_toolkit.fuels.eiaaeo_fuel_price_input_csvs:main" gridpath_eia860_to_project_availability_input_csvs = "data_toolkit.project.availability.eia860_to_project_availability_input_csvs:main" gridpath_create_sync_gen_weather_derate_input_csvs = "data_toolkit.project.availability.weather_derates.create_sync_gen_weather_derate_input_csvs:main" gridpath_create_monte_carlo_gen_weather_derate_input_csvs = "data_toolkit.project.availability.weather_derates.create_monte_carlo_gen_weather_derate_input_csvs:main" gridpath_create_availability_iteration_input_csvs = "data_toolkit.project.availability.outages.create_availability_iteration_input_csvs:main" gridpath_eia860_to_project_specified_capacity_input_csvs = "data_toolkit.project.capacity_specified.eia860_to_project_specified_capacity_input_csvs:main" gridpath_eia860_to_project_fixed_cost_input_csvs = "data_toolkit.project.fixed_cost.eia860_to_project_fixed_cost_input_csvs:main" gridpath_eia860_to_project_load_zone_input_csvs = "data_toolkit.project.load_zones.eia860_to_project_load_zone_input_csvs:main" gridpath_eia860_to_project_opchar_input_csvs = "data_toolkit.project.opchar.eia860_to_project_opchar_input_csvs:main" gridpath_eia860_to_project_fuel_input_csvs = "data_toolkit.project.opchar.fuels.eia860_to_project_fuel_input_csvs:main" gridpath_eia860_to_project_heat_rate_input_csvs = "data_toolkit.project.opchar.heat_rates.eia860_to_project_heat_rate_input_csvs:main" gridpath_create_hydro_iteration_input_csvs = "data_toolkit.project.opchar.hydro.create_hydro_iteration_input_csvs:main" gridpath_create_sync_var_gen_input_csvs = "data_toolkit.project.opchar.var_profiles.create_sync_var_gen_input_csvs:main" gridpath_create_monte_carlo_var_gen_input_csvs = "data_toolkit.project.opchar.var_profiles.create_monte_carlo_var_gen_input_csvs:main" gridpath_eia860_to_project_portfolio_input_csvs = "data_toolkit.project.portfolios.eia860_to_project_portfolio_input_csvs:main" gridpath_eia930_load_zone_input_csvs = "data_toolkit.system.eia930_load_zone_input_csvs:main" gridpath_create_sync_load_input_csvs = "data_toolkit.system.create_sync_load_input_csvs:main" gridpath_create_monte_carlo_load_input_csvs = "data_toolkit.system.create_monte_carlo_load_input_csvs:main" gridpath_create_temporal_iteration_csv = "data_toolkit.temporal.create_temporal_iteration_csv:main" gridpath_create_temporal_scenarios = "data_toolkit.temporal.create_temporal_scenarios:main" gridpath_create_monte_carlo_weather_draws = "data_toolkit.temporal.create_monte_carlo_weather_draws:main" gridpath_create_monte_carlo_weather_draw_profiles = "data_toolkit.temporal.create_monte_carlo_weather_draw_profiles:main" gridpath_eia930_to_transmission_load_zone_input_csvs = "data_toolkit.transmission.load_zones.eia930_to_transmission_load_zone_input_csvs:main" gridpath_eia930_to_transmission_availability_input_csvs = "data_toolkit.transmission.availability.eia930_to_transmission_availability_input_csvs:main" gridpath_eia930_to_transmission_specified_capacity_input_csvs = "data_toolkit.transmission.capacity_specified.eia930_to_transmission_specified_capacity_input_csvs:main" gridpath_eia930_to_transmission_opchar_input_csvs = "data_toolkit.transmission.opchar.eia930_to_transmission_opchar_input_csvs:main" gridpath_eia930_to_transmission_portfolio_input_csvs = "data_toolkit.transmission.portfolios.eia930_to_transmission_portfolio_input_csvs:main" gridpath_viz_capacity_factor_plot = "viz.capacity_factor_plot:main" gridpath_viz_capacity_new_plot = "viz.capacity_new_plot:main" gridpath_viz_capacity_retired_plot = "viz.capacity_retired_plot:main" gridpath_viz_capacity_total_loadzone_comparison_plot = "viz.capacity_total_loadzone_comparison_plot:main" gridpath_viz_capacity_total_plot = "viz.capacity_total_plot:main" gridpath_viz_capacity_total_scenario_comparison_plot = "viz.capacity_total_scenario_comparison_plot:main" gridpath_viz_carbon_plot = "viz.carbon_plot:main" gridpath_viz_cost_plot = "viz.cost_plot:main" gridpath_viz_curtailment_hydro_heatmap_plot = "viz.curtailment_hydro_heatmap_plot:main" gridpath_viz_curtailment_variable_heatmap_plot = "viz.curtailment_variable_heatmap_plot:main" gridpath_viz_dispatch_plot = "viz.dispatch_plot:main" gridpath_viz_energy_plot = "viz.energy_plot:main" gridpath_viz_energy_target_plot = "viz.energy_target_plot:main" gridpath_viz_project_operations_plot = "viz.project_operations_plot:main" [tool.setuptools] include-package-data = true # so the DB metadata can record the version py-modules = ["version"] [tool.setuptools.packages.find] # Flat layout with multiple top-level packages — auto-discovery would error, # so list them explicitly. `ui` has no __init__.py and has never shipped in # the wheel (its entry points work only in editable installs); `tests` is # deliberately not packaged. include = ["gridpath*", "db*", "viz*", "data_toolkit*"] # find_packages() semantics: only dirs with __init__.py (the pyproject default # of namespaces = true would pull in e.g. db/csvs_test_examples/*/doc.py) namespaces = false [tool.setuptools.dynamic] version = { attr = "version.__version__" }