Full Code of pysal/spopt for AI

main 938a06485bd0 cached
135 files
39.0 MB
10.2M tokens
638 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (40,963K chars total). Download the full file to get everything.
Repository: pysal/spopt
Branch: main
Commit: 938a06485bd0
Files: 135
Total size: 39.0 MB

Directory structure:
gitextract_wl41rybo/

├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── dependabot.yml
│   ├── release.yml
│   └── workflows/
│       ├── build_docs.yml
│       ├── release_and_publish.yml
│       └── testing.yml
├── .gitignore
├── .pre-commit-config.yaml
├── LICENSE.txt
├── README.md
├── ci/
│   ├── 312-latest.yaml
│   ├── 312-oldest.yaml
│   ├── 313-latest.yaml
│   ├── 314-dev.yaml
│   └── 314-latest.yaml
├── codecov.yml
├── docs/
│   ├── Makefile
│   ├── _static/
│   │   ├── pysal-styles.css
│   │   └── references.bib
│   ├── api.rst
│   ├── conf.py
│   ├── index.rst
│   ├── installation.rst
│   ├── references.rst
│   └── tutorials.rst
├── environment.yml
├── notebooks/
│   ├── azp.ipynb
│   ├── component_policy.ipynb
│   ├── facloc-disperse-real-world.ipynb
│   ├── facloc-lscpb-real-world.ipynb
│   ├── facloc-real-world.ipynb
│   ├── flow.ipynb
│   ├── lscp.ipynb
│   ├── lscp_capacity.ipynb
│   ├── lscp_gis.ipynb
│   ├── lscpb.ipynb
│   ├── maxp.ipynb
│   ├── mclp.ipynb
│   ├── mclp_gis.ipynb
│   ├── p-center.ipynb
│   ├── p-dispersion.ipynb
│   ├── p-median.ipynb
│   ├── p-median_variations.ipynb
│   ├── randomregion.ipynb
│   ├── reg-k-means.ipynb
│   ├── sa3.ipynb
│   ├── skater.ipynb
│   └── ward.ipynb
├── paper/
│   ├── paper.bib
│   └── paper.md
├── pyproject.toml
└── spopt/
    ├── BaseClass.py
    ├── __init__.py
    ├── locate/
    │   ├── __init__.py
    │   ├── base.py
    │   ├── coverage.py
    │   ├── flow.py
    │   ├── p_center.py
    │   ├── p_dispersion.py
    │   ├── p_median.py
    │   └── util.py
    ├── region/
    │   ├── __init__.py
    │   ├── azp.py
    │   ├── azp_util.py
    │   ├── base.py
    │   ├── components.py
    │   ├── csgraph_utils.py
    │   ├── maxp.py
    │   ├── objective_function.py
    │   ├── random_region.py
    │   ├── region_k_means.py
    │   ├── sa3.py
    │   ├── skater.py
    │   ├── spenc.py
    │   ├── spenclib/
    │   │   ├── __init__.py
    │   │   ├── abstracts.py
    │   │   ├── scores.py
    │   │   └── utils.py
    │   ├── util.py
    │   └── ward.py
    └── tests/
        ├── __init__.py
        ├── conftest.py
        ├── test_locate/
        │   ├── data/
        │   │   ├── SF_demand_205_centroid_uniform_weight.csv
        │   │   ├── SF_network_distance_candidateStore_16_censusTract_205_new.csv
        │   │   ├── SF_store_site_16_longlat.csv
        │   │   ├── ServiceAreas_4.shp
        │   │   ├── ServiceAreas_4.shx
        │   │   ├── example_subject_schools.csv
        │   │   ├── example_subject_student_school_journeys.csv
        │   │   ├── example_subject_students.csv
        │   │   ├── flow_grid_network.pkl
        │   │   ├── lscp_cli2fac.pkl
        │   │   ├── lscp_fac2cli.pkl
        │   │   ├── lscp_geodataframe_cli2fac.pkl
        │   │   ├── lscp_geodataframe_fac2cli.pkl
        │   │   ├── lscp_preselected_loc_geodataframe_fac2cli.pkl
        │   │   ├── lscpb_cli2fac.pkl
        │   │   ├── lscpb_fac2cli.pkl
        │   │   ├── lscpb_geodataframe_cli2fac.pkl
        │   │   ├── lscpb_geodataframe_fac2cli.pkl
        │   │   ├── lscpb_preselected_loc_geodataframe_fac2cli.pkl
        │   │   ├── mclp_cli2fac.pkl
        │   │   ├── mclp_fac2cli.pkl
        │   │   ├── mclp_geodataframe_cli2fac.pkl
        │   │   ├── mclp_geodataframe_fac2cli.pkl
        │   │   ├── mclp_preselected_loc_geodataframe_fac2cli.pkl
        │   │   ├── pcenter_cli2fac.pkl
        │   │   ├── pcenter_fac2cli.pkl
        │   │   ├── pcenter_geodataframe_cli2fac.pkl
        │   │   ├── pcenter_geodataframe_fac2cli.pkl
        │   │   ├── pmedian_cli2fac.pkl
        │   │   ├── pmedian_fac2cli.pkl
        │   │   ├── pmedian_geodataframe_cli2fac.pkl
        │   │   └── pmedian_geodataframe_fac2cli.pkl
        │   ├── test_c_p_median.py
        │   ├── test_clscp-so.py
        │   ├── test_flow.py
        │   ├── test_knearest_p_median.py
        │   ├── test_locate_util.py
        │   ├── test_lscp.py
        │   ├── test_lscpb.py
        │   ├── test_mclp.py
        │   ├── test_p_center.py
        │   ├── test_p_dispersion.py
        │   └── test_p_median.py
        └── test_region/
            ├── test_azp.py
            ├── test_maxp.py
            ├── test_random_regions.py
            ├── test_region_k_means.py
            ├── test_region_util.py
            ├── test_sa3.py
            ├── test_skater.py
            ├── test_spenc.py
            └── test_ward.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.ipynb linguist-language=Python


================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing Guidelines for `spopt`

Thank you for your interest in contributing! We work primarily on Github. Please review the contributing procedures [here](http://pysal.org/getting_started#for-developers) and [here](https://github.com/pysal/pysal/wiki/GitHub-Standard-Operating-Procedures) so that we can accept your contributions! Alternatively, contact someone in the [development chat channel](https://gitter.im//pysal/pysal).


## Style and format

1. At the time of this writing, Python 3.10, 3.11, and 3.12 are the officially supported versions.
2. This project implements the linting and formatting conventions of [`ruff`](https://docs.astral.sh/ruff/) on all incoming Pull Requests. To ensure a PR is properly linted and formatted prior to creating a Pull Request, [install `pre-commit`](https://pre-commit.com/#installation) in your development environment and then [set up the configuration of pre-commit hooks](https://pre-commit.com/#3-install-the-git-hook-scripts). 


================================================
FILE: .github/dependabot.yml
================================================
 # To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "daily"
    reviewers:
      - "jGaboardi"
      - "xf37"

  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "daily"
    reviewers:
      - "jGaboardi"
      - "xf37"


================================================
FILE: .github/release.yml
================================================
changelog:
  exclude:
    labels:
      - ignore-for-release
    authors:
      - dependabot
  categories:
    - title: Bug Fixes
      labels:
        - bug
    - title: Enhancements
      labels:
        - enhancement
    - title: Regionalization
      labels:
        - region
    - title: Facility Location
      labels:
        - locate
    - title: Transportation & Routing
      labels:
        - transport
    - title: Other Changes
      labels:
        - "*"


================================================
FILE: .github/workflows/build_docs.yml
================================================
---
name: Build Docs
on:
  push:
    tags:
      - v*
  workflow_dispatch:
    inputs:
      version:
        description: Manual Doc Build Reason
        default: test
        required: false
jobs:
  docs:
    name: build & push docs
    runs-on: ${{ matrix.os }}
    timeout-minutes: 90
    strategy:
      matrix:
        os:
          - ubuntu-latest
        environment-file:
          - ci/314-latest.yaml
        experimental:
          - false
    defaults:
      run:
        shell: bash -l {0}
    steps:
      - name: checkout repo
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: setup micromamba
        uses: mamba-org/setup-micromamba@v3
        with:
          environment-file: ${{ matrix.environment-file }}
          micromamba-version: latest
      - name: install pulp via pip
        run: pip install pulp
      - name: install package
        run: pip install .
      - name: make docs
        run: cd docs; make html
      - name: Publish to Github Pages
        uses: peaceiris/actions-gh-pages@v4
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: docs/build/html/
          keep_files: false


================================================
FILE: .github/workflows/release_and_publish.yml
================================================
---
name: Release Package
on:
  push:
    tags:
      - v*
  workflow_dispatch:
    inputs:
      version:
        description: Manual Release
        default: test
        required: false
jobs:
  build:
    name: Create release & publish to PyPI
    runs-on: ubuntu-latest
    permissions:
      id-token: write  # MANDATORY for trusted publishing to PyPI
      contents: write  # MANDATORY for the Github release action
    steps:
      - name: Checkout repo
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Set up Python
        uses: actions/setup-python@v6
        with:
          python-version: 3.x
      - name: Install Dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install --upgrade build twine
          python -m build
          twine check --strict dist/*
      - name: Create Release Notes
        uses: actions/github-script@v8
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: >
            await github.request(`POST /repos/${{ github.repository }}/releases`, {
                tag_name: "${{ github.ref }}",
                generate_release_notes: true
            });
      - name: Publish distribution 📦 to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1


================================================
FILE: .github/workflows/testing.yml
================================================
---
name: Continuous Integration
on:
  push:
    branches: [main]
  pull_request:
    branches:
      - "*"
  schedule:
    - cron: 59 23 * * *
  workflow_dispatch:
    inputs:
      version:
        description: Manual CI Run
        default: test
        required: false
jobs:
  tests:
    name: ${{ matrix.os }}, ${{ matrix.environment-file }}
    runs-on: ${{ matrix.os }}
    timeout-minutes: 30
    strategy:
      matrix:
        os:
          - ubuntu-latest
        environment-file:
          - ci/312-oldest.yaml
          - ci/312-latest.yaml
          - ci/313-latest.yaml
          - ci/314-latest.yaml
          - ci/314-dev.yaml
        include:
          - environment-file: ci/314-latest.yaml
            os: macos-15-intel
          - environment-file: ci/314-latest.yaml
            os: macos-latest
          - environment-file: ci/314-latest.yaml
            os: windows-latest
      fail-fast: false
    defaults:
      run:
        shell: bash -l {0}
    steps:
      - name: checkout repo
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: setup micromamba
        uses: mamba-org/setup-micromamba@v3
        with:
          environment-file: ${{ matrix.environment-file }}
          micromamba-version: latest
      - name: environment info
        run: |
          micromamba info
          micromamba list
      - name: spatial versions
        run: python -c "import geopandas; geopandas.show_versions();"
      - name: Download test files
        run: |
          python -c '
          import libpysal
          libpysal.examples.fetch_all()
          '
      - name: run tests
        run: |
          pytest spopt \
          -v \
          -r a \
          -n logical \
          --color yes \
          --cov spopt \
          --cov-append \
          --cov-report term-missing \
          --cov-report xml .
      - name: codecov
        uses: codecov/codecov-action@v5


================================================
FILE: .gitignore
================================================
*.swp
*.pyc
.rope*
.idea/
notebooks/.ipynb_checkpoints/
.DS_Store
.ipynb_checkpoints/
*.bak
.eggs/
*.egg-info/

# Packages
*.egg
*.egg-info
dist
build
eggs
parts
bin
var
sdist
develop-eggs
.installed.cfg
lib
lib64
__pycache__

.coverage

.ruff_cache
.pytest_cache


================================================
FILE: .pre-commit-config.yaml
================================================
files: "spopt\/|notebooks\/"
repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: "v0.15.9"
    hooks:
      - id: ruff-check
      - id: ruff-format

ci:
  autofix_prs: false
  autoupdate_schedule: quarterly


================================================
FILE: LICENSE.txt
================================================
BSD 3-Clause License

Copyright 2018 pysal-spopt developers

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


================================================
FILE: README.md
================================================

<p align="center">
<img src="docs/_static/images/pysal_banner.svg" width="370" height="200" />
</p>

# `spopt`: Spatial Optimization

#### Regionalization, facility location, and transportation-oriented modeling

![tag](https://img.shields.io/github/v/release/pysal/spopt?include_prereleases&sort=semver)
[![Continuous Integration](https://github.com/pysal/spopt/actions/workflows/testing.yml/badge.svg)](https://github.com/pysal/spopt/actions/workflows/testing.yml)
[![codecov](https://codecov.io/gh/pysal/spopt/branch/main/graph/badge.svg)](https://codecov.io/gh/pysal/spopt)
[![Documentation](https://img.shields.io/static/v1.svg?label=docs&message=current&color=9cf)](http://pysal.org/spopt/)
[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![status](https://joss.theoj.org/papers/1413cf2c0cf3c561386949f2e1208563/status.svg)](https://joss.theoj.org/papers/1413cf2c0cf3c561386949f2e1208563)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4444156.svg)](https://doi.org/10.5281/zenodo.4444156)
[![Discord](https://img.shields.io/badge/Discord-join%20chat-7289da?style=flat&logo=discord&logoColor=cccccc&link=https://discord.gg/BxFTEPFFZn)](https://discord.gg/BxFTEPFFZn)

Spopt is an open-source Python library for solving optimization problems with spatial data. Originating from the `region` module in [PySAL (Python Spatial Analysis Library)](http://pysal.org), it is under active development for the inclusion of newly proposed models and methods for regionalization, facility location, and transportation-oriented solutions. 

### Regionalization

```python
import spopt, libpysal, geopandas, numpy
mexico = geopandas.read_file(libpysal.examples.get_path("mexicojoin.shp"))
mexico["count"] = 1
attrs = [f"PCGDP{year}" for year in range(1950, 2010, 10)]
w = libpysal.weights.Queen.from_dataframe(mexico)
mexico["count"], threshold_name, threshold, top_n = 1, "count", 4, 2
numpy.random.seed(123456)
model = spopt.region.MaxPHeuristic(mexico, w, attrs, threshold_name, threshold, top_n)
model.solve()
mexico["maxp_new"] = model.labels_
mexico.plot(column="maxp_new", categorical=True, figsize=(12,8), ec="w");
```

<p align="center">
<img src="docs/_static/images/maxp.svg" height="350" />
</p>

### Locate

```python
from spopt.locate import MCLP
from spopt.locate.util import simulated_geo_points
import numpy, geopandas, pulp, spaghetti

solver = pulp.PULP_CBC_CMD(msg=False, warmStart=True)
lattice = spaghetti.regular_lattice((0, 0, 10, 10), 9, exterior=True)
ntw = spaghetti.Network(in_data=lattice)
street = spaghetti.element_as_gdf(ntw, arcs=True)
street_buffered = geopandas.GeoDataFrame(
    geopandas.GeoSeries(street["geometry"].buffer(0.5).unary_union),
    crs=street.crs,
    columns=["geometry"],
)
client_points = simulated_geo_points(street_buffered, needed=100, seed=5)
ntw.snapobservations(client_points, "clients", attribute=True)
clients_snapped = spaghetti.element_as_gdf(
    ntw, pp_name="clients", snapped=True
)
facility_points = simulated_geo_points(street_buffered, needed=10, seed=6)
ntw.snapobservations(facility_points, "facilities", attribute=True)
facilities_snapped = spaghetti.element_as_gdf(
    ntw, pp_name="facilities", snapped=True
)
cost_matrix = ntw.allneighbordistances(
    sourcepattern=ntw.pointpatterns["clients"],
    destpattern=ntw.pointpatterns["facilities"],
)
numpy.random.seed(0)
ai = numpy.random.randint(1, 12, 100)
mclp_from_cost_matrix = MCLP.from_cost_matrix(cost_matrix, ai, 4, p_facilities=4)
mclp_from_cost_matrix = mclp_from_cost_matrix.solve(solver)
```

*see [notebook](https://github.com/pysal/spopt/blob/main/notebooks/mclp.ipynb) for plotting code*

<p align="center">
<img src="docs/_static/images/mclp.png" height="350" />
</p>

## Examples

More examples can be found in the [Tutorials](https://pysal.org/spopt/tutorials.html) section of the documentation.
- [Max-p-regions problem](https://pysal.org/spopt/notebooks/maxp.html)
- [Skater](https://pysal.org/spopt/notebooks/skater.html)
- [Region K means](https://pysal.org/spopt/notebooks/reg-k-means.html)
- [Facility Location Real World Problem](https://pysal.org/spopt/notebooks/facloc-real-world.html)

All examples can be run interactively by launching this repository as a [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/pysal/spopt/main).

## Requirements
- [scipy](http://scipy.github.io/devdocs/)
- [numpy](https://numpy.org/devdocs/)
- [pandas](https://pandas.pydata.org/docs/)
- [networkx](https://networkx.org/)
- [libpysal](https://pysal.org/libpysal/)
- [scikit-learn](https://scikit-learn.org/stable/)
- [geopandas](https://geopandas.org/)
- [pulp](https://coin-or.github.io/pulp/)
- [shapely](https://shapely.readthedocs.io/en/stable/)
- [spaghetti](https://github.com/pysal/spaghetti)

## Installation

spopt is available on the [Python Package Index](https://pypi.org/). Therefore, you can either install directly with pip from the command line:

```
$ pip install -U spopt
```

or download the source distribution (.tar.gz) and decompress it to your selected destination. Open a command shell and navigate to the decompressed folder. Type:

```
$ pip install .
```

You may also install the latest stable spopt via conda-forge channel by running:

```
$ conda install --channel conda-forge spopt
```

## Related packages

* Region
* Locate
  * [`allagash`](https://github.com/apulverizer/allagash)
  * [`maximum-coverage-location`](https://github.com/cyang-kth/maximum-coverage-location)
  * [`OR_classic_problem`](https://github.com/khamechian1987/OR_classic_problem)
  * [`p-center`](https://github.com/antoniomedrano/p-center)
  * [`pyspatialopt`](https://github.com/apulverizer/pyspatialopt)

## Contribute

PySAL-spopt is under active development and contributors are welcome.

If you have any suggestions, feature requests, or bug reports, please open new [issues](https://github.com/pysal/spopt/issues) on GitHub. To submit patches, please review [PySAL's documentation for developers](https://pysal.org/docs/devs/), the PySAL [development guidelines](https://github.com/pysal/pysal/wiki), the `spopt` [contributing guidelines](https://github.com/pysal/spopt/blob/main/.github/CONTRIBUTING.md) before  opening a [pull request](https://github.com/pysal/spopt/pulls). Once your changes get merged, you’ll automatically be added to the [Contributors List](https://github.com/pysal/spopt/graphs/contributors).

## Support

If you are having trouble, please [create an issue](https://github.com/pysal/spopt/issues), [start a discussion](https://github.com/pysal/spopt/discussions), or talk to us in [PySAL's Discord channel](https://discord.gg/BxFTEPFFZn).

## Code of Conduct

As a PySAL-federated project, `spopt` follows the [Code of Conduct](https://github.com/pysal/governance/blob/main/conduct/code_of_conduct.rst) under the [PySAL governance model](https://github.com/pysal/governance).

## License

The project is licensed under the [BSD 3-Clause license](https://github.com/pysal/spopt/blob/main/LICENSE.txt).

## Citation

If you use PySAL-spopt in a scientific publication, we would appreciate using the following citations:

```
@misc{spopt2021,
    author    = {Feng, Xin, and Gaboardi, James D. and Knaap, Elijah and
                Rey, Sergio J. and Wei, Ran},
    month     = {jan},
    year      = {2021},
    title     = {pysal/spopt},
    url       = {https://github.com/pysal/spopt},
    doi       = {10.5281/zenodo.4444156},
    keywords  = {python,regionalization,spatial-optimization,location-modeling}
}

@article{spopt2022,
    author    = {Feng, Xin and Barcelos, Germano and Gaboardi, James D. and
                Knaap, Elijah and Wei, Ran and Wolf, Levi J. and
                Zhao, Qunshan and Rey, Sergio J.},
    year      = {2022},
    title     = {spopt: a python package for solving spatial optimization problems in PySAL},
    journal   = {Journal of Open Source Software},
    publisher = {The Open Journal},
    volume    = {7},
    number    = {74},
    pages     = {3330},
    url       = {https://doi.org/10.21105/joss.03330},
    doi       = {10.21105/joss.03330},
}
```

## Funding

This project is/was partially funded through:

[<img align="middle" src="docs/_static/images/nsf_logo.png" width="75">](https://www.nsf.gov/index.jsp) National Science Foundation Award #1831615: [RIDIR: Scalable Geospatial Analytics for Social Science Research](https://www.nsf.gov/awardsearch/showAward?AWD_ID=1831615)


================================================
FILE: ci/312-latest.yaml
================================================
name: test
channels:
  - conda-forge
dependencies:
  - python=3.12
  - fast_hdbscan # for sa3
  - geopandas
  - libpysal
  - mapclassify
  - networkx
  - numba # for sa3
  - numpy
  - pandas
  - pointpats
  - scikit-learn
  - scipy
  - shapely
  - spaghetti
  - tqdm

  # testing
  - codecov
  - coverage
  - pytest
  - pytest-cov
  - pytest-xdist

  # with pip
  - pip
  - pip:
    - pulp


================================================
FILE: ci/312-oldest.yaml
================================================
name: py312_spopt-oldest
channels:
  - conda-forge
dependencies:
  - python=3.12
  - fast_hdbscan=0.2.2 # for sa3
  - geopandas=1.1.0
  - libpysal=4.12.0
  - mapclassify=2.9.0
  - networkx=3.4
  - numba # for sa3
  - numpy=2.0.0
  - pandas=2.3.0
  - pointpats=2.5.2
  - scikit-learn=1.5.0
  - scipy=1.14.0
  - shapely=2.1.0
  - spaghetti=1.7.4
  - tqdm=4.67.0
  
  # testing
  - codecov
  - coverage
  - pytest
  - pytest-cov
  - pytest-xdist

  # with pip
  - pip
  - pip:
    - pulp==3.2


================================================
FILE: ci/313-latest.yaml
================================================
name: test
channels:
  - conda-forge
dependencies:
  - python=3.13
  - fast_hdbscan # for sa3
  - geopandas
  - libpysal
  - mapclassify
  - networkx
  - numba # for sa3
  - numpy
  - pandas
  - pointpats
  - scikit-learn
  - scipy
  - shapely
  - spaghetti
  - tqdm

  # testing
  - codecov
  - coverage
  - pytest
  - pytest-cov
  - pytest-xdist

  # with pip
  - pip
  - pip:
    - pulp



================================================
FILE: ci/314-dev.yaml
================================================
name: test
channels:
  - conda-forge
dependencies:
  - python=3.14
  - fast_hdbscan # for sa3
  - folium # for geopandas.explore()
  - matplotlib # for geopandas.explore()
  - numba # for sa3
  - tqdm

  # testing
  - codecov
  - coverage
  - pytest
  - pytest-cov
  - pytest-xdist
  
  # with pip
  - pip
  - pip:
    # dev versions of packages
    - --pre \
      --index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple  \
      --extra-index-url https://pypi.org/simple
    - networkx
    - numpy
    - pandas
    - pulp
    - scikit-learn
    - scipy
    - shapely
    - git+https://github.com/geopandas/geopandas.git
    - git+https://github.com/pysal/libpysal.git
    - git+https://github.com/pysal/mapclassify.git
    - git+https://github.com/pysal/pointpats.git
    - git+https://github.com/pysal/spaghetti.git


================================================
FILE: ci/314-latest.yaml
================================================
name: test
channels:
  - conda-forge
dependencies:
  - python=3.14
  - fast_hdbscan # for sa3
  - geopandas
  - libpysal
  - mapclassify
  - networkx
  - numba # for sa3
  - numpy
  - pandas
  - pointpats
  - scikit-learn
  - scipy
  - shapely
  - spaghetti
  - tqdm

  # testing
  - codecov
  - coverage
  - pytest
  - pytest-cov
  - pytest-xdist

  # docs - only this env
  - nbsphinx
  - numpydoc
  - sphinx
  - sphinxcontrib-bibtex
  - sphinx_bootstrap_theme

  # with pip
  - pip
  - pip:
    - pulp



================================================
FILE: codecov.yml
================================================
codecov:
  notify:
    after_n_builds: 5
coverage:
  range: 50..95
  round: nearest
  precision: 1
  status:
    project:
      default:
        threshold: 5%
    patch:
      default:
        threshold: 20%
        target: 60%
  ignore:
    - "tests/*"
comment:
  layout: "reach, diff, files"
  behavior: once
  after_n_builds: 5
  require_changes: true


================================================
FILE: docs/Makefile
================================================
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
SPHINXPROJ    = PACKAGE_NAME
SOURCEDIR     = .
BUILDDIR      = build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@rsync -r --exclude '.ipynb_checkpoints/' ../notebooks/ ./notebooks/
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

github:
	@make html

clean:
	rm -rf $(BUILDDIR)/*
	rm -rf auto_examples/


================================================
FILE: docs/_static/pysal-styles.css
================================================
/* Make thumbnails with equal heights */
@media only screen and (min-width : 500px) {
    .row.equal-height {
        display: flex;
        flex-wrap: wrap;
    }
    .row.equal-height > [class*='col-'] {
        display: flex;
        flex-direction: row, column;
    }
    .row.equal-height.row:after,
    .row.equal-height.row:before {
        display: flex;
    }

    .row.equal-height > [class*='col-'] > .thumbnail,
    .row.equal-height > [class*='col-'] > .thumbnail > .caption {
        display: flex;
        flex: .9 .1 auto;
        flex-direction: column;
    }
    .row.equal-height > [class*='col-'] > .thumbnail > .caption > .flex-text {
        flex-grow: 1;
    }
    .row.equal-height > [class*='col-'] > .thumbnail > img {
        width: 300px;
        height: 300px; /* force image's height */
        /* fheight: 100%; */

        /* force image fit inside it's "box" */
        -webkit-object-fit: cover;
           -moz-object-fit: cover;
            -ms-object-fit: cover;
             -o-object-fit: cover;
                object-fit: cover;
    }
}

.row.extra-bottom-padding{
    margin-bottom: 20px;
}


.topnavicons {
    margin-left: 10% !important;
}

.topnavicons li {
    margin-left: 0px !important;
    min-width: 100px;
    text-align: center;
}

.topnavicons .thumbnail {
    margin-right: 10px;
    border: none;
    box-shadow: none;
    text-align: center;
    font-size: 85%;
    font-weight: bold;
    line-height: 10px;
    height: 100px;
}

.topnavicons .thumbnail img {
    display: block;
    margin-left: auto;
    margin-right: auto;
}


/* Table with a scrollbar */
.bodycontainer { max-height: 800px; width: 100%; margin: 0; padding: 0; overflow-y: auto; }
.table-scrollable { margin: 0; padding: 0; }
  
   .label {
      color: #E74C3C;
      font-size: 100%;
      font-weight: bold;
      width: 100%;
      height: 100%;
      text-align: left;
      vertical-align: middle;
      padding: 6px;
      margin: 2px;
      overflow-x: auto;
      overflow-y: auto;
}

  div.body {
     max-width: 1080px;
 }

table.longtable.align-default{
    text-align: left;
}


================================================
FILE: docs/_static/references.bib
================================================
@article{assunccao2006efficient,
  title={{Efficient Regionalization Techniques for Socio-economic Geographical Units Using Minimum Spanning Trees}},
  author={Assunção, RM and Neves, MC and Câmara, G and da Costa Freitas, C},
  journal={{International Journal of Geographical Information Science}},
  volume={20},
  number={7},
  pages={797--811},
  year={2006},
  doi={10.1080/13658810600665111},
  publisher={Taylor \& Francis}
}


@article{calik_labbé_yaman_2015, 
  author={Calik, H and Labbé, M and Yaman, H},
  title={{p-Center Problems}}, 
  journal={Location Science},
  pages={79--92},
  year={2015},
  doi={10.1007/978-3-319-13111-5_4},
}


@article{chen_murray_jiang_2021,
  author={Chen, H and Murray, AT and Jiang, R},
  title={Open-source approaches for location cover models: capabilities and efficiency},
  journal={Journal of Geographical Systems},
  doi={10.1007/s10109-021-00350-w},
  year={2021},
  pages={361--380},
  volume={23},
  number={3},
}


@book{Church2009,
  address={Hoboken},
  author={Church, Richard L. and Murray, Alan T.},
  publisher={John Wiley {\&} Sons, Inc.},
  title={{Business Site Selection, Locational Analysis, and GIS}},
  year={2009},
  doi={10.1002/9780470432761},
}


@article{church_2018,
  author={Richard L. Church},
  title={{Tobler's Law and Spatial Optimization: Why Bakersfield?}},
  journal={International Regional Science Review},
  volume={41},
  number={3},
  pages={287--310},
  year={2018},
  doi={10.1177/0160017616650612},
}


@book{church_murray_2018, 
  author={Church, RL and Murray, AT},
  title={{Location Covering Models: History, Applications and Advancements}}, 
  publisher={Springer},
  year={2018},
  doi={10.1007/978-3-319-99846-6},
}


@article{current1988capacitated,
  title={{Capacitated Covering Models}},
  author={Current, John Richard and Storbeck, James Edward},
  journal={{Environment and Planning B: Planning and Design}},
  volume={15},
  number={2},
  pages={153--163},
  year={1988},
  publisher={SAGE Publications Sage UK: London, England},
  doi={10.1068/b150153},
}


@article{daskin_stern_edmund_1981,
  author={Daskin, MS and Stern, EH},
  title={{A Hierarchical Objective Set Covering Model for Emergency Medical Service Vehicle Deployment}},
  journal={Transportation Science},
  doi={10.1287/trsc.15.2.137},
  year={1981},
  volume={15},
  number={2},
  pages={137--152},
}


@book{daskin_2013, 
  author={Daskin, MS},
  title={{Network and Discrete Location: Models, Algorithms, and Applications}}, 
  publisher={John Wiley \& Sons, Inc.}, 
  year={2013},
  doi={10.1002/9781118537015},
}


@article{duque2011p,
  title={{The p-Regions Problem}},
  author={Duque, JC and Church, RL and Middleton, RS},
  journal={Geographical Analysis},
  volume={43},
  number={1},
  pages={104--126},
  year={2011},
  publisher={Wiley Online Library},
  doi={10.1111/j.1538-4632.2010.00810.x},
}


@article{duque2012max,
  author={Duque, JC and Anselin, L and Rey, SJ},
  title={{THE MAX-P-REGIONS PROBLEM*}},
  journal={Journal of Regional Science},
  volume={52},
  number={3},
  pages={397--419},
  doi={10.1111/j.1467-9787.2011.00743.x},
  year={2012},
}


@article{hakimi_1964, 
  author={Hakimi, SL},
  title={{Optimum Locations of Switching Centers and the Absolute Centers and Medians of a Graph}}, 
  journal={Operations Research},
  volume={12}, 
  number={3},
  pages={450--459},
  year={1964},
  doi={10.1287/opre.12.3.450},
}


@article{hakimi_1965, 
  author={Hakimi, SL},
  title={{Optimum Distribution of Switching Centers in a Communication Network and Some Related Graph Theoretic Problems}}, 
  journal={Operations Research},
  number={3},
  volume={13},
  pages={462--475},
  year={1965},
  doi={10.1287/opre.13.3.462},
}


@article{kuby_1987,
  author={Kuby, MJ},
  title={{Programming Models for Facility Dispersion: The p-Dispersion and Maxisum Dispersion Problems}},
  journal={Geographical Analysis},
  doi={10.1111/j.1538-4632.1987.tb00133.x},
  year={1987},
  volume={19},
  number={4},
  pages={315--329},
}


@article{MALISZEWSKI2012331,
  author={Maliszewski, PJ and Kuby, MJ and Horner, MW},
  title={A comparison of multi-objective spatial dispersion models for managing critical assets in urban areas},
  journal={Computers, Environment and Urban Systems},
  doi={10.1016/j.compenvurbsys.2011.12.006},
  year={2012},
  volume={36},
  number={4},
  pages={331--341},
}


@article{openshaw1977geographical,
  title={{A Geographical Solution to Scale and Aggregation Problems in Region-building, Partitioning and Spatial Modelling}},
  author={Openshaw, S},
  journal={Transactions of the Institute of British Geographers},
  pages={459--472},
  year={1977},
  volume={2},
  number={4},
  publisher={JSTOR},
  doi={10.2307/622300},
}


@article{openshaw1995algorithms,
  title={{Algorithms for Reengineering 1991 Census Geography}},
  author={Openshaw, S and Rao, L},
  journal={Environment and Planning A},
  volume={27},
  number={3},
  pages={425--446},
  year={1995},
  doi={10.1068/a270425},
  publisher={SAGE Publications Sage UK: London, England}
}


@article{shi_malik_2000,
    author={Jianbo Shi and Malik, J.},
    journal={{IEEE Transactions on Pattern Analysis and Machine Intelligence}},
    title={Normalized cuts and image segmentation},
    year={2000},
    volume={22},
    number={8},
    pages={888--905},
    doi={10.1109/34.868688}
}


@article{toregas_swain_revelle_bergman_1971, 
  author={Toregas, Constantine and Swain, Ralph and Revelle, Charles and Bergman, Lawrence},
  title={{The Location of Emergency Service Facilities}}, 
  journal={Operations Research}, 
  volume = {19},
  number = {6},
  pages={1363--1373},
  year={1971}, 
  doi={10.1287/opre.19.6.1363},
}


@article{von2007tutorial,
  title={A tutorial on spectral clustering},
  author={{von Luxburg}, Ulrike},
  journal={{Statistics and Computing}},
  volume={17},
  number={4},
  pages={395--416},
  year={2007},
  publisher={Springer},
  doi={10.1007/s11222-007-9033-z},
}


@article{wei2020efficient,
  title={Efficient regionalization for spatially explicit neighborhood delineation},
  author={Wei, R and Rey, SJ and Knaap, E},
  journal={International Journal of Geographical Information Science},
   year={2020},
  volume={35},
  number={1},
  pages={135--151},
  publisher={Taylor \& Francis},
  doi={10.1080/13658816.2020.1759806},
}


@misc{wolf2018,
  title={{ljwolf/spenc: GISRUK}},
  author={Wolf, LJ},
  year={2018},
  doi={10.5281/zenodo.1219904},
}


@article{wolf2021,
  author={Wolf, LJ},
  title={Spatially–encouraged spectral clustering: a technique for blending map typologies and regionalization},
  journal={International Journal of Geographical Information Science},
  volume={35},
  number={11},
  pages={2356--2373},
  year={2021},
  doi={10.1080/13658816.2021.1934475},
}


@inproceedings{yu_shi_2003,
  author={Yu, Stella X. and Shi, Jianbo},
  booktitle={{Proceedings Ninth IEEE International Conference on Computer Vision}}, 
  title={Multiclass spectral clustering}, 
  year={2003},
  volume={1},
  pages={313--319},
  doi={10.1109/ICCV.2003.1238361}}


@article{upchurch-kuby-lim-2009,
    author={Upchurch, Christopher and Kuby, Michael and Lim, Seow},
    title={{A Model for Location of Capacitated Alternative-Fuel Stations}},
    journal={Geographical Analysis},
    volume={41},
    number={1},
    pages={85--106},
    doi={10.1111/j.1538-4632.2009.00744.x},
    year={2009}
}


@article{hong-kuby-2016,
  title={A threshold covering flow-based location model to build a critical mass of alternative-fuel stations},
  journal={Journal of Transport Geography},
  volume={56},
  pages={128--137},
  year={2016},
  doi={10.1016/j.jtrangeo.2016.08.019},
  author={Shuyao Hong and Michael Kuby},
}


@article{KUBY2005125,
  title={The flow-refueling location problem for alternative-fuel vehicles},
  journal={Socio-Economic Planning Sciences},
  volume={39},
  number={2},
  pages={125--145},
  year={2005},
  doi={10.1016/j.seps.2004.03.001},
  author={Michael Kuby and Seow Lim},
}

%======


================================================
FILE: docs/api.rst
================================================
.. _api_ref:

.. currentmodule:: spopt

API reference
=============

.. _data_api:

Region Methods
--------------
Model based approaches for aggregating a large set of geographic units (with small footprints) into a smaller number of regions (with large footprints).

.. autosummary::
   :toctree: generated/

    region.AZP
    region.MaxPHeuristic
    region.RandomRegion
    region.RandomRegions
    region.RegionKMeansHeuristic
    region.SA3
    region.extract_clusters
    region.Skater
    region.Spenc
    region.WardSpatial

Locate Methods
--------------

Exact solution approaches to facility location modeling problems.

.. autosummary::
   :toctree: generated/

    locate.LSCP
    locate.LSCPB
    locate.MCLP
    locate.PMedian
    locate.KNearestPMedian
    locate.PCenter
    locate.PDispersion
    locate.FRLM


================================================
FILE: docs/conf.py
================================================
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.

import sphinx_bootstrap_theme

# import your package to obtain the version info to display on the docs website
import spopt

# -- General configuration ------------------------------------------------

# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [  #'sphinx_gallery.gen_gallery',
    "sphinx.ext.autodoc",
    "sphinx.ext.autosummary",
    "sphinx.ext.viewcode",
    "sphinxcontrib.bibtex",
    "sphinx.ext.mathjax",
    "sphinx.ext.doctest",
    "sphinx.ext.intersphinx",
    "nbsphinx",
    "numpydoc",
    "matplotlib.sphinxext.plot_directive",
]
bibtex_bibfiles = ["_static/references.bib"]

# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]

# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = ".rst"

# The master toctree document.
master_doc = "index"

# General information about the project.
project = "spopt"
copyright = "2020-, pysal developers"  # noqa: A001
author = "pysal developers"

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The full version.
version = spopt.__version__
release = spopt.__version__

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = "en"

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ["build", "Thumbs.db", ".DS_Store", "tests/*"]

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = "sphinx"

# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False

# -- Options for HTML output ----------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
#
# html_theme = 'alabaster'
html_theme = "bootstrap"
html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
html_title = f"{project} v{version} Manual"

# (Optional) Logo of your package.
# Should be small enough to fit the navbar (ideally 24x24).
# Path should be relative to the ``_static`` files directory.
# html_logo = "_static/images/package_logo.jpg"

# (Optional) PySAL favicon
html_favicon = "_static/images/pysal_favicon.ico"


# Theme options are theme-specific and customize the look and feel of a theme
# further.  For a list of options available for each theme, see the
# documentation.
#
html_theme_options = {
    # Navigation bar title. (Default: ``project`` value)
    "navbar_title": project,  # string of your project name, for example, 'spopt'
    # Render the next and previous page links in navbar. (Default: true)
    "navbar_sidebarrel": False,
    # Render the current pages TOC in the navbar. (Default: true)
    #'navbar_pagenav': True,
    #'navbar_pagenav': False,
    # No sidebar
    "nosidebar": True,
    # Tab name for the current pages TOC. (Default: "Page")
    #'navbar_pagenav_name': "Page",
    # Global TOC depth for "site" navbar tab. (Default: 1)
    # Switching to -1 shows all levels.
    "globaltoc_depth": 2,
    # Include hidden TOCs in Site navbar?
    #
    # Note: If this is "false", you cannot have mixed ``:hidden:`` and
    # non-hidden ``toctree`` directives in the same page, or else the build
    # will break.
    #
    # Values: "true" (default) or "false"
    "globaltoc_includehidden": "true",
    # HTML navbar class (Default: "navbar") to attach to <div> element.
    # For black navbar, do "navbar navbar-inverse"
    #'navbar_class': "navbar navbar-inverse",
    # Fix navigation bar to top of page?
    # Values: "true" (default) or "false"
    "navbar_fixed_top": "true",
    # Location of link to source.
    # Options are "nav" (default), "footer" or anything else to exclude.
    "source_link_position": "footer",
    # Bootswatch (http://bootswatch.com/) theme.
    #
    # Options are nothing (default) or the name of a valid theme
    # such as "amelia" or "cosmo", "yeti", "flatly".
    "bootswatch_theme": "yeti",
    # Choose Bootstrap version.
    # Values: "3" (default) or "2" (in quotes)
    "bootstrap_version": "3",
    # Navigation bar menu
    "navbar_links": [
        ("Installation", "installation"),
        ("Tutorials", "tutorials"),
        ("API", "api"),
        ("References", "references"),
    ],
}

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"]

# Custom sidebar templates, maps document names to template names.
# html_sidebars = {}
# html_sidebars = {'sidebar': ['localtoc.html', 'sourcelink.html', 'searchbox.html']}

# -- Options for HTMLHelp output ------------------------------------------

# Output file base name for HTML help builder.
htmlhelp_basename = f"{project}doc"


# -- Options for LaTeX output ---------------------------------------------

latex_elements = {
    # The paper size ('letterpaper' or 'a4paper').
    #
    # 'papersize': 'letterpaper',
    # The font size ('10pt', '11pt' or '12pt').
    #
    # 'pointsize': '10pt',
    # Additional stuff for the LaTeX preamble.
    #
    # 'preamble': '',
    # Latex figure (float) alignment
    #
    # 'figure_align': 'htbp',
}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
#  author, documentclass [howto, manual, or own class]).
latex_documents = [
    (
        master_doc,
        f"{project}doc.tex",
        f"{project} Documentation",
        f"{project} developers",
        "manual",
    )
]


# -- Options for manual page output ---------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [(master_doc, project, f"{project} Documentation", [author], 1)]


# -- Options for Texinfo output -------------------------------------------

# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
#  dir menu entry, description, category)
texinfo_documents = [
    (
        master_doc,
        project,
        f"{project} Documentation",
        author,
        project,
        "Spatial Optimization with PySAL",
        "Miscellaneous",
    ),
]


# -----------------------------------------------------------------------------
# Autosummary
# -----------------------------------------------------------------------------

# Generate the API documentation when building
autosummary_generate = True

# Avoid showing members twice
numpydoc_show_class_members = False
numpydoc_use_plots = True
class_members_toctree = True
numpydoc_show_inherited_class_members = True
numpydoc_xref_param_type = True

# automatically document class members
autodoc_default_options = {"members": True, "undoc-members": True}

# display the source code for Plot directive
plot_include_source = True


def setup(app):
    app.add_css_file("pysal-styles.css")


# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {
    "geopandas": ("https://geopandas.org/en/latest/", None),
    "libpysal": ("https://pysal.org/libpysal/", None),
    "mapclassify": ("https://pysal.org/mapclassify/", None),
    "networkx": ("https://networkx.org/documentation/stable/", None),
    "numpy": ("https://numpy.org/doc/stable/", None),
    "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None),
    "pointpats": ("https://pysal.org/pointpats/", None),
    "pulp": ("https://coin-or.github.io/pulp/", None),
    "python": ("https://docs.python.org/3", None),
    "region": ("https://region.readthedocs.io/en/latest/", None),
    "scipy": ("https://docs.scipy.org/doc/scipy/", None),
    "shapely": ("https://shapely.readthedocs.io/en/stable/", None),
    "sklearn": ("https://scikit-learn.org/stable/", None),
}

numpydoc_xref_ignore = {
    "type",
    "optional",
    "default",
    "shape",
    "fitted",
    "instance",
    "cluster",
    "of",
    "or",
    "if",
    "using",
    "otherwise",
    "required",
    "from",
}


# This is processed by Jinja2 and inserted before each notebook
nbsphinx_prolog = r"""
{% set docname = env.doc2path(env.docname, base=None) %}

.. only:: html

    .. role:: raw-html(raw)
        :format: html

    .. nbinfo::

        This page was generated from `{{ docname }}`__.
        Interactive online version:
        :raw-html:`<a href="https://mybinder.org/v2/gh/pysal/spopt/main?filepath={{ docname }}"><img alt="Binder badge" src="https://mybinder.org/badge_logo.svg" style="vertical-align:text-bottom"></a>`

    __ https://github.com/pysal/spopt/blob/main/{{ docname }}

.. raw:: latex

    \nbsphinxstartnotebook{\scriptsize\noindent\strut
    \textcolor{gray}{The following section was generated from
    \sphinxcode{\sphinxupquote{\strut {{ docname | escape_latex }}}} \dotfill}}
"""  # noqa: E501

# This is processed by Jinja2 and inserted after each notebook
nbsphinx_epilog = r"""
.. raw:: latex

    \nbsphinxstopnotebook{\scriptsize\noindent\strut
    \textcolor{gray}{\dotfill\ \sphinxcode{\sphinxupquote{\strut
    {{ env.doc2path(env.docname, base='doc') | escape_latex }}}} ends here.}}
"""

# List of arguments to be passed to the kernel that executes the notebooks:
nbsphinx_execute_arguments = [
    "--InlineBackend.figure_formats={'svg', 'pdf'}",
    "--InlineBackend.rc={'figure.dpi': 96}",
]

mathjax3_config = {
    "TeX": {"equationNumbers": {"autoNumber": "AMS", "useLabelIds": True}},
}


================================================
FILE: docs/index.rst
================================================
.. documentation master file

spopt: Spatial Optimization
===========================

Regionalization, facility location, and transportation-oriented modeling
------------------------------------------------------------------------

**spopt** is an open-source Python library for solving optimization problems with spatial data. Originating from the **region** module in `PySAL (Python Spatial Analysis Library) <http://pysal.org>`_, it is under active development for the inclusion of newly proposed models and methods for regionalization, facility location, and transportation-oriented solutions.

.. raw:: html

    <div class="container-fluid">
      <div class="row equal-height">
        <div class="col-sm-.5 col-xs-hidden">
        </div>
        <div class="col-md-4 col-xs-14">
            <a 
            href="https://pysal.org/spopt/notebooks/maxp.html" class="thumbnail">
                <img src="_static/images/notebooks_maxp_12_1.png" class="img-responsive center-block">
                <div class="caption text-center">
                <h6>Mexican State Regional Income Clustering</h6>
                </div>
            </a>
        </div>
        <div class="col-sm-4 col-xs-14">
            <a href="https://pysal.org/spopt/notebooks/skater.html" class="thumbnail">
                <img src="_static/images/notebooks_skater_12_1.png" class="img-responsive center-block">
                <div class="caption text-center">
                <h6>Airbnb Spots Clustering in Chicago</h6>
                </div>
            </a>
        </div>
        <div class="col-sm-4 col-xs-14">
            <a href="https://pysal.org/spopt/notebooks/reg-k-means.html" class="thumbnail">
                <img src="_static/images/notebooks_reg-k-means_15_1.png"
                class="img-responsive center-block">
                <div class="caption text-center">
                <h6>Grid Clustering
                </h6>
                </div>
            </a>
        </div>
        <div class="col-sm-4 col-xs-14">
            <a href="https://pysal.org/spopt/notebooks/lscp_gis.html" class="thumbnail">
                <img src="_static/images/notebooks-lscp.png"
                class="img-responsive center-block">
                <div class="caption text-center">
                <h6>Locating First Aid Stations in Toronto
                </h6>
                </div>
            </a>
        </div>
        <div class="col-sm-4 col-xs-14">
            <a href="https://pysal.org/spopt/notebooks/facloc-real-world.html" class="thumbnail">
                <img src="_static/images/notebooks-facloc-mclp.png"
                class="img-responsive center-block">
                <div class="caption text-center">
                <h6>Locating Store Sites in San Francisco
                </h6>
                </div>
            </a>
        </div>
        <div class="col-sm-4 col-xs-14">
            <a href="https://pysal.org/spopt/notebooks/lscpb.html" class="thumbnail">
                <img src="_static/images/lscpb-predef.png"
                class="img-responsive center-block">
                <div class="caption text-center">
                <h6>Backup Coverage and Predefined Locations
                </h6>
                </div>
            </a>
        </div>
        <div class="col-sm-.5 col-xs-hidden">
        </div>
      </div>
    </div>

Development
-----------

**spopt** development is hosted on github_.

Get in touch
------------

If you have a question regarding **spopt**, feel free to open an `issue`_, a new `discussion`_ on GitHub, or join a chat on PySAL's `Discord`_ channel.

Citing **spopt**
----------------

If you use **PySAL-spopt** in a scientific publication, we would appreciate citations to the following::

  @misc{spopt2021,
    author    = {Feng, Xin, and 
                 Gaboardi, James D. and 
                 Knaap, Elijah and 
                 Rey, Sergio J. and 
                 Wei, Ran},
    month     = {jan},
    year      = {2021},
    title     = {pysal/spopt},
    url       = {https://github.com/pysal/spopt},
    doi       = {10.5281/zenodo.4444156},
    keywords  = {python,regionalization,spatial-optimization,location-modeling}
  }

  @article{spopt2022,
    author    = {Feng, Xin and Barcelos, Germano and Gaboardi, James D. and
                Knaap, Elijah and Wei, Ran and Wolf, Levi J. and
                Zhao, Qunshan and Rey, Sergio J.},
    year      = {2022},
    title     = {spopt: a python package for solving spatial optimization problems in PySAL},
    journal   = {Journal of Open Source Software},
    publisher = {The Open Journal},
    volume    = {7},
    number    = {74},
    pages     = {3330},
    url       = {https://doi.org/10.21105/joss.03330},
    doi       = {10.21105/joss.03330},
  }

Funding
-------

This project is/was partially funded through:

.. figure:: _static/images/nsf_logo.png
    :target: https://www.nsf.gov/index.jsp
    :width: 100
    :align: left

    National Science Foundation Award #1831615: `RIDIR: Scalable Geospatial Analytics for Social Science Research <https://www.nsf.gov/awardsearch/showAward?AWD_ID=1831615>`_

.. raw:: html

    <img 
        src="_static/images/pysal_banner.svg" 
        class="img-responsive center-block" 
        alt="PySAL Logo" 
        width="370" 
        height="200"
    >

.. toctree::
   :hidden:
   :maxdepth: 3
   :caption: Contents:

   Installation <installation>
   Tutorials <tutorials>
   API <api>
   References <references>

.. _PySAL: https://github.com/pysal/pysal
.. _github : https://github.com/pysal/spopt
.. _issue: https://github.com/pysal/spopt/issues/new/choose
.. _discussion: https://github.com/pysal/spopt/discussions
.. _Discord: https://discord.gg/BxFTEPFFZn


================================================
FILE: docs/installation.rst
================================================
.. Installation

Installation
============

spopt supports Python >= 3.12_. Please make sure that you are operating in a Python 3 environment.

Installing released version
---------------------------

spopt is available on the `Python Package Index`_. Therefore, you can either install directly with `pip` from the command line::

  pip install -U spopt

or download the source distribution (.tar.gz) and decompress it to your selected destination. Open a command shell and navigate to the decompressed folder.
Type::

  pip install .

You may also install the latest stable spopt via conda-forge channel by running::

  conda install --channel conda-forge spopt

Installing development version
------------------------------

Potentially, you might want to use the newest features in the development version of spopt on github - `pysal/spopt`_ while have not been incorporated in the Pypi released version. You can achieve that by installing `pysal/spopt`_
 
  pip install git+https://github.com/pysal/spopt.git

You can  also `fork`_ the `pysal/spopt`_ repo and create a local clone of your fork. By making changes to your local clone and submitting a pull request to `pysal/spopt`_, you can contribute to spopt development.

.. _3.12: https://docs.python.org/3.12/
.. _Python Package Index: https://pypi.org/project/spopt/
.. _pysal/spopt: https://github.com/pysal/spopt
.. _fork: https://help.github.com/articles/fork-a-repo/ 


================================================
FILE: docs/references.rst
================================================
.. reference for the docs

References
==========

.. bibliography:: _static/references.bib
   :all:


================================================
FILE: docs/tutorials.rst
================================================
Tutorials
=========

.. toctree::
    :maxdepth: 1
    :caption: Regionalization:

    notebooks/maxp.ipynb
    notebooks/azp.ipynb
    notebooks/sa3.ipynb
    notebooks/skater.ipynb
    notebooks/ward.ipynb
    notebooks/reg-k-means.ipynb
    notebooks/randomregion.ipynb
    notebooks/component_policy.ipynb

.. toctree::
    :maxdepth: 1
    :caption: Locate:

    notebooks/lscp.ipynb
    notebooks/lscp_gis.ipynb
    notebooks/lscp_capacity.ipynb
    notebooks/lscpb.ipynb
    notebooks/mclp.ipynb
    notebooks/mclp_gis.ipynb
    notebooks/p-center.ipynb
    notebooks/p-median.ipynb
    notebooks/p-median_variations.ipynb
    notebooks/p-dispersion.ipynb
    notebooks/facloc-real-world.ipynb
    notebooks/facloc-lscpb-real-world.ipynb
    notebooks/facloc-disperse-real-world.ipynb
    notebooks/flow.ipynb


================================================
FILE: environment.yml
================================================
name: spopt
channels:
  - conda-forge
dependencies:
  - python
  - fast_hdbscan
  - geopandas
  - jupyterlab
  - libpysal
  - mapclassify
  - networkx
  - numba
  - numpy
  - pandas
  - pointpats
  - pip
  - pulp
  - scikit-learn
  - scipy
  - shapely
  - tqdm

  # notebook/binder specific
  - folium
  - glpk
  - inequality
  - matplotlib
  - matplotlib-scalebar
  - overpy
  - seaborn
  - spaghetti
  - watermark

  # bleeding edge spopt
  - pip:
    - git+https://github.com/pysal/spopt.git@main
    # (notebook/binder specific) having trouble resolving routingpy via conda-forge
    - routingpy
    - pulp


================================================
FILE: notebooks/azp.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  Automatic Zoning Procedure (AZP) algorithm\n",
    "Authors: [Xin Feng](https://github.com/xf37), [James Gaboardi](https://github.com/jGaboardi)\n",
    "\n",
    "AZP can work with different types of objective functions, which are very sensitive to aggregating data from a large number of zones into a pre-designated smaller number of regions. AZP was originally formulated in [Openshaw, 1977](https://www.jstor.org/stable/622300?casa_token=QITLwNVUPj4AAAAA%3AKXYVQHrdeAtefxZKkvxxUrWA_QCedSJrZwQD36F16Jfqx7Vq47uu1G_vp9I085Iozy_roZ_Dh6qQopZ6yXjfPsy4Y2aBqso-l0wZS2YqNv9pkh1JNXc&seq=1#metadata_info_tab_contents) and then extended in [Openshaw, S. and Rao, L. (1995)](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.461.8982&rep=rep1&type=pdf)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-10-29T17:23:01.190352Z",
     "start_time": "2022-10-29T17:23:01.152262Z"
    },
    "execution": {
     "iopub.execute_input": "2025-04-07T17:53:10.538497Z",
     "iopub.status.busy": "2025-04-07T17:53:10.538235Z",
     "iopub.status.idle": "2025-04-07T17:53:10.569383Z",
     "shell.execute_reply": "2025-04-07T17:53:10.569091Z",
     "shell.execute_reply.started": "2025-04-07T17:53:10.538471Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Last updated: 2025-04-07T13:53:10.559404-04:00\n",
      "\n",
      "Python implementation: CPython\n",
      "Python version       : 3.12.9\n",
      "IPython version      : 9.0.2\n",
      "\n",
      "Compiler    : Clang 18.1.8 \n",
      "OS          : Darwin\n",
      "Release     : 24.4.0\n",
      "Machine     : arm64\n",
      "Processor   : arm\n",
      "CPU cores   : 8\n",
      "Architecture: 64bit\n",
      "\n"
     ]
    }
   ],
   "source": [
    "%config InlineBackend.figure_format = \"retina\"\n",
    "%load_ext watermark\n",
    "%watermark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-10-29T17:23:03.516249Z",
     "start_time": "2022-10-29T17:23:01.193479Z"
    },
    "execution": {
     "iopub.execute_input": "2025-04-07T17:53:10.570030Z",
     "iopub.status.busy": "2025-04-07T17:53:10.569930Z",
     "iopub.status.idle": "2025-04-07T17:53:11.974171Z",
     "shell.execute_reply": "2025-04-07T17:53:11.973969Z",
     "shell.execute_reply.started": "2025-04-07T17:53:10.570017Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Watermark: 2.5.0\n",
      "\n",
      "spopt    : 0.6.2.dev3+g13ca45e\n",
      "geopandas: 1.0.1\n",
      "libpysal : 4.12.1\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import warnings\n",
    "\n",
    "import geopandas\n",
    "import libpysal\n",
    "\n",
    "import spopt\n",
    "from spopt.region import AZP\n",
    "\n",
    "%matplotlib inline\n",
    "%watermark -w\n",
    "%watermark -iv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Mexican State Regional Income Clustering\n",
    "\n",
    "To illustrate `azp` we utilize data on regional incomes for Mexican states over the period 1940-2000, originally used in [Rey and Sastré-Gutiérrez (2010)](https://www.tandfonline.com/doi/full/10.1080/17421772.2010.493955?casa_token=r6iIZaEKaywAAAAA%3ARxjQkEOcxQ5gffa1EGyd2rByA6w0uVxg5cU3v4VaSmx2u89Nr3oSe2f_n63CV20Ysrjs07U47m98). \n",
    "\n",
    "We can first explore the data by plotting the per capital gross regional domestic product (in constant USD 2000 dollars) for each year in the sample, using a quintile classification:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-10-29T17:23:03.662726Z",
     "start_time": "2022-10-29T17:23:03.522081Z"
    },
    "execution": {
     "iopub.execute_input": "2025-04-07T17:53:11.975233Z",
     "iopub.status.busy": "2025-04-07T17:53:11.975069Z",
     "iopub.status.idle": "2025-04-07T17:53:12.014107Z",
     "shell.execute_reply": "2025-04-07T17:53:12.013865Z",
     "shell.execute_reply.started": "2025-04-07T17:53:11.975225Z"
    }
   },
   "outputs": [],
   "source": [
    "pth = libpysal.examples.get_path(\"mexicojoin.shp\")\n",
    "mexico = geopandas.read_file(pth)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-10-29T17:23:05.819942Z",
     "start_time": "2022-10-29T17:23:03.665789Z"
    },
    "execution": {
     "iopub.execute_input": "2025-04-07T17:53:12.014622Z",
     "iopub.status.busy": "2025-04-07T17:53:12.014473Z",
     "iopub.status.idle": "2025-04-07T17:53:12.625564Z",
     "shell.execute_reply": "2025-04-07T17:53:12.625363Z",
     "shell.execute_reply.started": "2025-04-07T17:53:12.014614Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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kxN79uyhcePGmcYYjUbat2/Pnj17APjll1/o379/pjG9evXimWeeYcCAAej1WZflunnzJu3atePMmTMA/PPPP3To0CHP8YJaiXjs2DFATdT17Nkzy5gBAwawatUqQK0WHDt2bJYxlhWzy5cvZ+DAgZn2r1ixgscffxyAYcOGMX/+/HzFm53iVAFY/FLipZROB7NmwbPPZtxnCrOR6SpjHHzOatt//GF7XLVqanXgL7+oTQYAjCl6tv5fNb4f3Iiw/zzz/NgbP6/O+Z3l2TC1Jrcj761EuSTQ6SCgTiIdRl7muZ8O88Lv++k67jz3NYtF55DxR0hEBMydCz17qusGPv44/PSTWpEpRHYsKwB1evl8SadXqPjESdCr6yhNmwb799s5KCGEEMLC9aTwQkn+ASQa44lIKvkLT+eU/AO1siu9ci030yQL0w8//AColYtDhgyxOub27dtahVVISAgzZszItmIuv9M5p02bxhtvvGE1+Qeg1+uZOXOmdv6VK1daHffrr79y9qz6vnHChAlZkn+gVrmVL19e2y5Obt++zUsvvQTA559/jo+PT5E99smTJ7l16xagJvHuTv6Beo2//fbb2u2dO3dmGbN27Voef/xxq8k/gAoVKmRKfNv6WeYkLi5OS/41bdrUavIP1CnP2cUbERHBjz/+CED37t2zJP8ABg4cSPfu3QH19yYiIiLLmNJEEoBFyMEBvv8+Y501xSjzwACUxAra9p3XJZt0OujfH06eVKdVp/8fdfO8Oz+OaMC6D2qRGJO7me3GVB2X/8soE148vAGz+jVl4+fViQkvGz8b74optBx0jadn32kiMukMdUKyNhFZsSJrE5ErZa9/jciFtDSLGw6SAARwCUrAr+tFQF3bdOhQsLFsjRBCCFGkTGYT15MK94+6a0nhmMw2FvcuRQwGA8531vlITk62WxyhoaHs3r0bUNdsq1q1qtVxS5Ys0ZJCuWkeUZh8fX21NdzOnTtndczq1au1bVvVcm5ublo117FjxwgNLT4zUSZMmMCVK1cICQkp8spEy8YeNWrUsDnOMqlqa43FnFhWKNr6WeakoOL9/fffMd1pLDBs2DCb50m/nkwmE7///ntewy1RJAFYxK5fV6dhAuBQ+v8jzIk53g/TldaAui7Wnar5HJUrBzNmqJU0lssgHP49gNkDmnJkjT85VdVfPZ75U6iY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LI+TGzdu3CAoKAiz2Uz58uU5cuRIluRSXFwcjRo10qZPHzhwgKZNm2YaYzQaCQ4O5uzZs3h6enLw4EFq1qyZacyLL77IzJkzAVi0aBHPPPNMnuMtSJaVlsHBwWzcuNFmYi01NTVLpaaiKDRq1IijR4+i1+vZsGEDXbp0yXJcr1692LRpE66uroSGhmZJYs2YMYOIiAjGjRuX6TqwNG7cOL744gsA/ve///H9999bHZdeAThx4kQmTZqU4/cgP37++We2bNnC22+/zX333Wd1zDfffMMrr7wCwIMPPshff/1lddzQoUO1383ly5czcODATPtXrFjB448/DsCwYcOYP7/g8yjFqQLQ/ilxUSD0enBL/7+1JDcBAXSGVPQBhwG10+SCBXYOqIg0bZq52vHPqTW5fir/n5wIkVsGFxi98gAu5dR13kwJTiRfl2tPWOfkk0z1Fw7i0+Gydt8vv9gxICGEEPfErCisuBBaoMk/gESTkRUXQkvlmoD79+/n//7v/3B2dtYSTkXl33//1bbHjBljNSl33333MWzYMADMZjN79uzJtL9SpUps3LjRZvIPoFWrVlqFV2xsLJs3b85XvLt378ZsNgNqgsVaAszT05PXXntNu71z584sY3799VfOnj0LwIQJE7Ik/wA+++wzypcvr23b24QJE4iKisLZ2Zlff/0126q6u5N/AAcPHtQqRZ988sksyb/049IrPJOSkvjyyy+zjHnttdeYOnWqzeQfwCeffEJQUBAAq1atyneCuiA88cQTfPfddzaTfwAvv/yylgjfunWr1ensERER/PjjjwB07949S/IPYODAgXTv3h2AH374wWYlZmkhCcBSJP21X0kuT9q5rpgi69o3oHugr7RP2/72W7VLblkwdCiMHq1um1Id+OX1eiTGyEx9UfgMLlClaca6IslX8v4Jryg7dAaFgJ7n0BnUtWT27rVzQEIIIfJt+/Xwe1rzLzvhifFsjwgvlHPbi9FoZMSIEZhMJt566y3q1KlTpI+fmpqqbdeoUcPmOMsEWU5rqdliubZafhuCFFS8q1ev1raHDh1q9Rxubm5aNdexY8cIDQ3NY7QFJyYmhp9++glQp2zXrZv39+b79mW8J3744Ydtjqtdu7b2/Vu5cmWeHwfURGK7du0ANfaS0BgjfY1Ms9nMhQsXsuz//ffftXUP0xPi1qRfTyaT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Cj4cIme5ncMyCZ9TT0pbhQbNkK0m42AgGQcC0SW7lLr9//5Prp5zZLm54FZ0Dsa5WSbhjzbM/1vZp3y5vKIDGMvObrZoIScGn3mmZEW9IAgyey0XO5mYzQMbjpKRr69850p4OatZPLEz7fzdayCy+uWTTz7h+eefJ9cyyakMjz32GIsWLSrztldffZU333yz3ASdh4cHy5YtY/z48WXefs8997BixYpK4xwxYgRr167Fy8urzNt37NjB0KFDKz2OJebqJgFfeeUV3nrrrUoTkj169GDDhg00a9aswv2WLFnC7NmzKSwsLPP2Pn368NNPP+Hr61uteGtSQkICd9xxR4WJqh49evDTTz/h7+9f7j5l+e9//8ujjz5a4rryfsbLli1j5syZVTr+/Pnzef7550tc9+eff3LzzTdXet8mTZqwatUqRpQaLFA1BQUF3Hnnnfz0009l3q5QKHjttdd4+eWXKzzOgQMHGDt2LAkJCWXeHhQUxA8//ECPHj1uKN7y1KclwCIBKFRbSgq88gp8+SWY5AG7qMK3ogr7276BVZExqQP6c7eBUQuAWi0vn338cVCU8dnFaITwcLh8GcCEts/HoMnFGNcDQ8xAMMgfXFu0kJd5qevB4OTff7cNduk0OonbXz1v34CEei3uuBvLZ3YGwL3DVULvOWnniITGxGyG/EueZBwIJPNIU8x6W4bowAG5d6ujOnoUunSRtz27JxA8+Yxd46lN+kwNued8yDnnQ+45b4x5mlL7fPghPPGEHYIThHrOHh8WL6blcfc3h2sk+Wfh5axm1ZRuhPuUPqnjqN566y1rsqFFixY88MAD9O7dG3d3d+Li4jh37hzff/89vXv35sMPPyx1/3feeceaVAkMDGTu3Ln069cPgH/++YcFCxaQmJiIVqtl27Zt1tuKGz58OFu3bsXHx4eJEycyZMgQmjdvjkql4t9//+XDDz/kbNEEpgEDBrBz504UZXyoKZ4AXLp0KT179iz3+27atClNmzat4k9Ldt9997FkyRJcXV0ZP348w4YNo1WrVjg5OXH69Gk+/vhjDhw4AECrVq04fPgwbm5lr1jasmULo0aNwmQy4e/vz4svvkjv3r1JS0tj8eLFbNy4EYBBgwaxffv2Mr/vupKfn0///v35999/Afn39tBDDxEeHk5qairr16/nq6++wmQy0aNHD3bv3o1W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
Download .txt
gitextract_wl41rybo/

├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── dependabot.yml
│   ├── release.yml
│   └── workflows/
│       ├── build_docs.yml
│       ├── release_and_publish.yml
│       └── testing.yml
├── .gitignore
├── .pre-commit-config.yaml
├── LICENSE.txt
├── README.md
├── ci/
│   ├── 312-latest.yaml
│   ├── 312-oldest.yaml
│   ├── 313-latest.yaml
│   ├── 314-dev.yaml
│   └── 314-latest.yaml
├── codecov.yml
├── docs/
│   ├── Makefile
│   ├── _static/
│   │   ├── pysal-styles.css
│   │   └── references.bib
│   ├── api.rst
│   ├── conf.py
│   ├── index.rst
│   ├── installation.rst
│   ├── references.rst
│   └── tutorials.rst
├── environment.yml
├── notebooks/
│   ├── azp.ipynb
│   ├── component_policy.ipynb
│   ├── facloc-disperse-real-world.ipynb
│   ├── facloc-lscpb-real-world.ipynb
│   ├── facloc-real-world.ipynb
│   ├── flow.ipynb
│   ├── lscp.ipynb
│   ├── lscp_capacity.ipynb
│   ├── lscp_gis.ipynb
│   ├── lscpb.ipynb
│   ├── maxp.ipynb
│   ├── mclp.ipynb
│   ├── mclp_gis.ipynb
│   ├── p-center.ipynb
│   ├── p-dispersion.ipynb
│   ├── p-median.ipynb
│   ├── p-median_variations.ipynb
│   ├── randomregion.ipynb
│   ├── reg-k-means.ipynb
│   ├── sa3.ipynb
│   ├── skater.ipynb
│   └── ward.ipynb
├── paper/
│   ├── paper.bib
│   └── paper.md
├── pyproject.toml
└── spopt/
    ├── BaseClass.py
    ├── __init__.py
    ├── locate/
    │   ├── __init__.py
    │   ├── base.py
    │   ├── coverage.py
    │   ├── flow.py
    │   ├── p_center.py
    │   ├── p_dispersion.py
    │   ├── p_median.py
    │   └── util.py
    ├── region/
    │   ├── __init__.py
    │   ├── azp.py
    │   ├── azp_util.py
    │   ├── base.py
    │   ├── components.py
    │   ├── csgraph_utils.py
    │   ├── maxp.py
    │   ├── objective_function.py
    │   ├── random_region.py
    │   ├── region_k_means.py
    │   ├── sa3.py
    │   ├── skater.py
    │   ├── spenc.py
    │   ├── spenclib/
    │   │   ├── __init__.py
    │   │   ├── abstracts.py
    │   │   ├── scores.py
    │   │   └── utils.py
    │   ├── util.py
    │   └── ward.py
    └── tests/
        ├── __init__.py
        ├── conftest.py
        ├── test_locate/
        │   ├── data/
        │   │   ├── SF_demand_205_centroid_uniform_weight.csv
        │   │   ├── SF_network_distance_candidateStore_16_censusTract_205_new.csv
        │   │   ├── SF_store_site_16_longlat.csv
        │   │   ├── ServiceAreas_4.shp
        │   │   ├── ServiceAreas_4.shx
        │   │   ├── example_subject_schools.csv
        │   │   ├── example_subject_student_school_journeys.csv
        │   │   ├── example_subject_students.csv
        │   │   ├── flow_grid_network.pkl
        │   │   ├── lscp_cli2fac.pkl
        │   │   ├── lscp_fac2cli.pkl
        │   │   ├── lscp_geodataframe_cli2fac.pkl
        │   │   ├── lscp_geodataframe_fac2cli.pkl
        │   │   ├── lscp_preselected_loc_geodataframe_fac2cli.pkl
        │   │   ├── lscpb_cli2fac.pkl
        │   │   ├── lscpb_fac2cli.pkl
        │   │   ├── lscpb_geodataframe_cli2fac.pkl
        │   │   ├── lscpb_geodataframe_fac2cli.pkl
        │   │   ├── lscpb_preselected_loc_geodataframe_fac2cli.pkl
        │   │   ├── mclp_cli2fac.pkl
        │   │   ├── mclp_fac2cli.pkl
        │   │   ├── mclp_geodataframe_cli2fac.pkl
        │   │   ├── mclp_geodataframe_fac2cli.pkl
        │   │   ├── mclp_preselected_loc_geodataframe_fac2cli.pkl
        │   │   ├── pcenter_cli2fac.pkl
        │   │   ├── pcenter_fac2cli.pkl
        │   │   ├── pcenter_geodataframe_cli2fac.pkl
        │   │   ├── pcenter_geodataframe_fac2cli.pkl
        │   │   ├── pmedian_cli2fac.pkl
        │   │   ├── pmedian_fac2cli.pkl
        │   │   ├── pmedian_geodataframe_cli2fac.pkl
        │   │   └── pmedian_geodataframe_fac2cli.pkl
        │   ├── test_c_p_median.py
        │   ├── test_clscp-so.py
        │   ├── test_flow.py
        │   ├── test_knearest_p_median.py
        │   ├── test_locate_util.py
        │   ├── test_lscp.py
        │   ├── test_lscpb.py
        │   ├── test_mclp.py
        │   ├── test_p_center.py
        │   ├── test_p_dispersion.py
        │   └── test_p_median.py
        └── test_region/
            ├── test_azp.py
            ├── test_maxp.py
            ├── test_random_regions.py
            ├── test_region_k_means.py
            ├── test_region_util.py
            ├── test_sa3.py
            ├── test_skater.py
            ├── test_spenc.py
            └── test_ward.py
Download .txt
SYMBOL INDEX (638 symbols across 47 files)

FILE: docs/conf.py
  function setup (line 239) | def setup(app):

FILE: spopt/BaseClass.py
  class BaseSpOptSolver (line 6) | class BaseSpOptSolver(ABC):
    method solve (line 10) | def solve(self):
  class BaseSpOptExactSolver (line 15) | class BaseSpOptExactSolver(BaseSpOptSolver):
    method __init__ (line 18) | def __init__(self, name):
    method solve (line 29) | def solve(self):
  class BaseSpOptHeuristicSolver (line 34) | class BaseSpOptHeuristicSolver(BaseSpOptSolver):
    method solve (line 38) | def solve(self):

FILE: spopt/locate/base.py
  class SpecificationError (line 21) | class SpecificationError(pulp.PulpError):
  class LocateSolver (line 25) | class LocateSolver(BaseSpOptExactSolver):
    method __init__ (line 28) | def __init__(self, name: str, problem: pulp.LpProblem):
    method solve (line 34) | def solve(self, solver: pulp.LpSolver):
    method check_status (line 52) | def check_status(self):
  class BaseOutputMixin (line 64) | class BaseOutputMixin:
    method client_facility_array (line 67) | def client_facility_array(self) -> None:
  class CoveragePercentageMixin (line 98) | class CoveragePercentageMixin:
    method uncovered_clients (line 112) | def uncovered_clients(self) -> None:
    method get_percentage (line 139) | def get_percentage(self):
  class MeanDistanceMixin (line 150) | class MeanDistanceMixin:
    method get_mean_distance (line 155) | def get_mean_distance(self):
  class BackupPercentageMixinMixin (line 160) | class BackupPercentageMixinMixin:
    method get_percentage (line 166) | def get_percentage(self):
  class FacilityModelBuilder (line 174) | class FacilityModelBuilder:
    method add_facility_integer_variable (line 178) | def add_facility_integer_variable(
    method add_client_integer_variable (line 209) | def add_client_integer_variable(
    method add_client_assign_variable (line 240) | def add_client_assign_variable(
    method add_weight_continuous_variable (line 295) | def add_weight_continuous_variable(obj: T_FacModel) -> None:
    method add_maximized_min_variable (line 315) | def add_maximized_min_variable(obj: T_FacModel) -> None:
    method add_set_covering_constraint (line 334) | def add_set_covering_constraint(
    method add_backup_covering_constraint (line 374) | def add_backup_covering_constraint(
    method add_facility_constraint (line 427) | def add_facility_constraint(obj: T_FacModel, p_facilities: int) -> None:
    method add_predefined_facility_constraint (line 457) | def add_predefined_facility_constraint(
    method add_facility_capacity_constraint (line 542) | def add_facility_capacity_constraint(
    method add_client_demand_satisfaction_constraint (line 597) | def add_client_demand_satisfaction_constraint(
    method add_maximal_coverage_constraint (line 640) | def add_maximal_coverage_constraint(
    method add_assignment_constraint (line 684) | def add_assignment_constraint(
    method add_opening_constraint (line 723) | def add_opening_constraint(
    method add_minimized_maximum_constraint (line 767) | def add_minimized_maximum_constraint(
    method add_p_dispersion_interfacility_constraint (line 824) | def add_p_dispersion_interfacility_constraint(

FILE: spopt/locate/coverage.py
  class LSCP (line 19) | class LSCP(LocateSolver, BaseOutputMixin):
    method __init__ (line 104) | def __init__(self, name: str, problem: pulp.LpProblem):
    method __add_obj (line 107) | def __add_obj(self) -> None:
    method from_cost_matrix (line 123) | def from_cost_matrix(
    method from_geodataframe (line 287) | def from_geodataframe(
    method facility_client_array (line 462) | def facility_client_array(self) -> None:
    method solve (line 490) | def solve(self, solver: pulp.LpSolver, results: bool = True):
  class LSCPB (line 519) | class LSCPB(LocateSolver, BaseOutputMixin, BackupPercentageMixinMixin):
    method __init__ (line 587) | def __init__(
    method __add_obj (line 596) | def __add_obj(self) -> None:
    method from_cost_matrix (line 612) | def from_cost_matrix(
    method from_geodataframe (line 748) | def from_geodataframe(
    method facility_client_array (line 905) | def facility_client_array(self) -> None:
    method solve (line 934) | def solve(self, results: bool = True):
  class MCLP (line 962) | class MCLP(LocateSolver, BaseOutputMixin, CoveragePercentageMixin):
    method __init__ (line 1025) | def __init__(self, name: str, problem: pulp.LpProblem):
    method __add_obj (line 1028) | def __add_obj(self, weights: np.array, range_clients: range) -> None:
    method from_cost_matrix (line 1048) | def from_cost_matrix(
    method from_geodataframe (line 1188) | def from_geodataframe(
    method facility_client_array (line 1362) | def facility_client_array(self) -> None:
    method solve (line 1392) | def solve(self, solver: pulp.LpSolver, results: bool = True):

FILE: spopt/locate/flow.py
  class GreedyVariable (line 19) | class GreedyVariable:
    method __init__ (line 20) | def __init__(self, name, value):
  class GreedyConstraint (line 27) | class GreedyConstraint:
    method __init__ (line 28) | def __init__(self, name, info):
  class FlowModelBuilder (line 34) | class FlowModelBuilder:
    method add_facility_variables (line 41) | def add_facility_variables(
    method add_ac_pc_constraints (line 65) | def add_ac_pc_constraints(
    method add_flow_variables (line 116) | def add_flow_variables(
    method add_flow_coverage_constraints (line 156) | def add_flow_coverage_constraints(
    method add_capacity_constraints (line 197) | def add_capacity_constraints(
    method add_threshold_constraints (line 250) | def add_threshold_constraints(
    method add_combination_variables (line 321) | def add_combination_variables(
    method add_combination_refueling_constraints (line 346) | def add_combination_refueling_constraints(
  class FRLMCoverageMixin (line 373) | class FRLMCoverageMixin:
    method get_flow_coverage (line 376) | def get_flow_coverage(self) -> None:
    method get_vmt_coverage (line 430) | def get_vmt_coverage(self) -> dict[str, float]:
  class FRLMNodeCoverageMixin (line 453) | class FRLMNodeCoverageMixin:
    method calculate_covered_nodes (line 454) | def calculate_covered_nodes(self) -> None:
    method get_node_coverage_percentage (line 486) | def get_node_coverage_percentage(self) -> float:
  class FRLMSolverStatsMixin (line 495) | class FRLMSolverStatsMixin:
    method extract_solver_statistics (line 496) | def extract_solver_statistics(self) -> None:
    method get_detailed_results (line 536) | def get_detailed_results(self) -> dict:
  class FRLM (line 579) | class FRLM(FRLMCoverageMixin, FRLMNodeCoverageMixin, FRLMSolverStatsMixin):
    method __init__ (line 626) | def __init__(
    method _initialize_variables (line 690) | def _initialize_variables(self):
    method get_constraint_dual (line 701) | def get_constraint_dual(self, constraint_name: str) -> float | None:
    method from_flow_dataframe (line 705) | def from_flow_dataframe(
    method add_network (line 747) | def add_network(self, network: sp.csr_matrix):
    method add_flows (line 769) | def add_flows(self, flows: pd.DataFrame | dict[tuple[Any, Any], float]):
    method _reconstruct_path (line 797) | def _reconstruct_path(
    method add_flow (line 835) | def add_flow(
    method _load_flows_from_dict (line 898) | def _load_flows_from_dict(self, flows: dict[tuple[Any, Any], float]) -...
    method _load_flows_from_dataframe (line 923) | def _load_flows_from_dataframe(
    method _set_adaptive_vehicle_range (line 975) | def _set_adaptive_vehicle_range(self):
    method compute_refueling_frequency (line 1001) | def compute_refueling_frequency(self, origin: Any, destination: Any) -...
    method check_path_refueling_feasibility (line 1029) | def check_path_refueling_feasibility(self, path: list, facilities: lis...
    method generate_path_refueling_combinations (line 1086) | def generate_path_refueling_combinations(
    method calculate_node_weights (line 1190) | def calculate_node_weights(self, include_destination: bool = False) ->...
    method _calculate_objective_value (line 1223) | def _calculate_objective_value(
    method _build_model (line 1271) | def _build_model(
    method solve (line 1313) | def solve(
    method _solve_greedy (line 1384) | def _solve_greedy(
    method _build_pulp_model (line 1536) | def _build_pulp_model(
    method _update_pulp_variables_from_solution (line 1709) | def _update_pulp_variables_from_solution(self):
    method _evaluate_solution_with_combinations (line 1748) | def _evaluate_solution_with_combinations(self, facilities: dict[Any, i...
    method _solve_pulp (line 1885) | def _solve_pulp(
    method _evaluate_capacitated_solution (line 1934) | def _evaluate_capacitated_solution(self, facilities: dict[Any, int]) -...
    method _initialize_greedy_solution (line 2012) | def _initialize_greedy_solution(self, method: str) -> set:
    method _calculate_path_distances (line 2058) | def _calculate_path_distances(self):
    method get_solver_details (line 2071) | def get_solver_details(self) -> dict:
    method selected_facilities (line 2122) | def selected_facilities(self):
    method to_dataframes (line 2137) | def to_dataframes(self, include_iterations: bool = True) -> dict[str, ...
    method get_shadow_prices (line 2245) | def get_shadow_prices(self) -> dict[str, float]:
    method get_reduced_costs (line 2262) | def get_reduced_costs(self) -> dict[str, float]:
    method get_variable_values (line 2280) | def get_variable_values(self) -> dict[str, float]:
    method get_shadow_price (line 2283) | def get_shadow_price(self, constraint_name: str) -> float:
    method get_variable_value (line 2287) | def get_variable_value(self, var_name: str) -> float:
    method get_slack (line 2290) | def get_slack(self, constraint_name: str) -> float:
    method is_constraint_active (line 2295) | def is_constraint_active(self, constraint_name: str) -> bool:
    method _estimate_facility_shadow_price (line 2298) | def _estimate_facility_shadow_price(self) -> float:
    method problem (line 2321) | def problem(self):
    method _get_flow_details (line 2327) | def _get_flow_details(self) -> dict:
    method _get_constraint_details (line 2347) | def _get_constraint_details(self) -> dict:
    method _get_variable_details (line 2361) | def _get_variable_details(self) -> dict:
    method summary (line 2382) | def summary(self) -> dict:
    method __repr__ (line 2471) | def __repr__(self):

FILE: spopt/locate/p_center.py
  class PCenter (line 13) | class PCenter(LocateSolver, BaseOutputMixin):
    method __init__ (line 77) | def __init__(self, name: str, problem: pulp.LpProblem, aij: np.array):
    method __add_obj (line 82) | def __add_obj(self) -> None:
    method from_cost_matrix (line 99) | def from_cost_matrix(
    method from_geodataframe (line 222) | def from_geodataframe(
    method facility_client_array (line 368) | def facility_client_array(self) -> None:
    method solve (line 397) | def solve(self, solver: pulp.LpSolver, results: bool = True):

FILE: spopt/locate/p_dispersion.py
  class PDispersion (line 13) | class PDispersion(LocateSolver):
    method __init__ (line 58) | def __init__(self, name: str, problem: pulp.LpProblem, p_facilities: i...
    method __add_obj (line 62) | def __add_obj(self) -> None:
    method from_cost_matrix (line 79) | def from_cost_matrix(
    method from_geodataframe (line 195) | def from_geodataframe(
    method solve (line 315) | def solve(self, solver: pulp.LpSolver):

FILE: spopt/locate/p_median.py
  class PMedian (line 21) | class PMedian(LocateSolver, BaseOutputMixin, MeanDistanceMixin):
    method __init__ (line 84) | def __init__(
    method __add_obj (line 96) | def __add_obj(self, range_clients: range, range_facility: range) -> None:
    method from_cost_matrix (line 130) | def from_cost_matrix(
    method from_geodataframe (line 315) | def from_geodataframe(
    method facility_client_array (line 488) | def facility_client_array(self) -> None:
    method solve (line 517) | def solve(self, solver: pulp.LpSolver, results: bool = True):
  class KNearestPMedian (line 547) | class KNearestPMedian(PMedian):
    method __init__ (line 632) | def __init__(
    method __add_obj (line 654) | def __add_obj(
    method from_cost_matrix (line 694) | def from_cost_matrix(cls, *args, **kwargs):
    method _create_sparse_matrix (line 703) | def _create_sparse_matrix(self) -> None:
    method _update_k_array (line 756) | def _update_k_array(self) -> None:
    method _from_sparse_matrix (line 779) | def _from_sparse_matrix(self) -> None:
    method from_geodataframe (line 856) | def from_geodataframe(
    method facility_client_array (line 999) | def facility_client_array(self) -> None:
    method solve (line 1027) | def solve(self, solver: pulp.LpSolver, results: bool = True):

FILE: spopt/locate/util.py
  function simulated_geo_points (line 10) | def simulated_geo_points(
  function rising_combination (line 109) | def rising_combination(
  function compute_facility_usage (line 141) | def compute_facility_usage(

FILE: spopt/region/azp.py
  class AZP (line 45) | class AZP(BaseSpOptHeuristicSolver):
    method __init__ (line 128) | def __init__(
    method solve (line 148) | def solve(self):
  class AZPOrig (line 164) | class AZPOrig:
    method __init__ (line 177) | def __init__(self, allow_move_strategy=None, random_state=None):
    method fit_from_scipy_sparse_matrix (line 208) | def fit_from_scipy_sparse_matrix(
    method fit_from_w (line 276) | def fit_from_w(
    method fit_from_networkx (line 313) | def fit_from_networkx(
    method fit_from_geodataframe (line 367) | def fit_from_geodataframe(
    method fit_from_dict (line 415) | def fit_from_dict(
    method _azp_connected_component (line 461) | def _azp_connected_component(self, adj, initial_clustering, attr):  # ...
  class AZPSimulatedAnnealing (line 589) | class AZPSimulatedAnnealing:
    method __init__ (line 602) | def __init__(
    method fit_from_geodataframe (line 658) | def fit_from_geodataframe(
    method fit_from_dict (line 707) | def fit_from_dict(
    method fit_from_networkx (line 757) | def fit_from_networkx(
    method fit_from_scipy_sparse_matrix (line 807) | def fit_from_scipy_sparse_matrix(
    method fit_from_w (line 893) | def fit_from_w(
    method sa_moves_alert (line 938) | def sa_moves_alert(self):
    method move_made_alert (line 941) | def move_made_alert(self):
  class AZPTabu (line 945) | class AZPTabu(AZP, abc.ABC):
    method _make_move (line 950) | def _make_move(self, area, new_region, labels, adj):
    method reset_tabu (line 966) | def reset_tabu(self, tabu_len=None):
  class AZPBasicTabu (line 971) | class AZPBasicTabu(AZPTabu):
    method __init__ (line 984) | def __init__(
    method _azp_connected_component (line 1007) | def _azp_connected_component(self, adj, initial_clustering, attr):
  class AZPReactiveTabu (line 1132) | class AZPReactiveTabu(AZPTabu):
    method __init__ (line 1145) | def __init__(self, max_iterations, k1, k2, random_state=None):
    method _azp_connected_component (line 1179) | def _azp_connected_component(self, adj, initial_labels, attr):

FILE: spopt/region/azp_util.py
  class AllowMoveStrategy (line 9) | class AllowMoveStrategy(abc.ABC):
    method start_new_component (line 10) | def start_new_component(
    method __call__ (line 41) | def __call__(self, moving_area, new_region, labels):
  class AllowMoveAZP (line 66) | class AllowMoveAZP(AllowMoveStrategy):
    method __call__ (line 67) | def __call__(self, moving_area, new_region, labels):
  class AllowMoveAZPSimulatedAnnealing (line 76) | class AllowMoveAZPSimulatedAnnealing(AllowMoveStrategy):
    method __init__ (line 77) | def __init__(self, init_temperature, sa_moves_term=float("inf")):
    method __call__ (line 87) | def __call__(self, moving_area, new_region, labels):
    method register_sa_moves_term (line 105) | def register_sa_moves_term(self, observer_func):
    method register_move_made (line 118) | def register_move_made(self, observer_func):
    method notify_min_sa_moves (line 130) | def notify_min_sa_moves(self):
    method notify_move_made (line 134) | def notify_move_made(self):
    method update_temperature (line 138) | def update_temperature(self, temp):
    method reset (line 141) | def reset(self):
  class AllowMoveAZPMaxPRegions (line 145) | class AllowMoveAZPMaxPRegions(AllowMoveStrategy):
    method __init__ (line 154) | def __init__(self, spatially_extensive_attr, threshold, decorated_stra...
    method start_new_component (line 171) | def start_new_component(self, initial_labels, attr, objective_func, co...
    method __call__ (line 178) | def __call__(self, moving_area, new_region, labels):
    method __getattr__ (line 198) | def __getattr__(self, name):

FILE: spopt/region/base.py
  class RegionMixin (line 11) | class RegionMixin:
    method solve_assign (line 16) | def solve_assign(self, X, adjacency):  # noqa: N803
  function w_to_g (line 35) | def w_to_g(w):
  function move_ok (line 59) | def move_ok(area, source, destination, g, w):
  function ok_moves (line 98) | def ok_moves(candidates, regions, labels_, closest, g, w, areas):
  function region_neighbors (line 137) | def region_neighbors(a_list, region):
  function _centroid (line 162) | def _centroid(regions, data):
  function _closest (line 185) | def _closest(data, centroids):
  function _seeds (line 208) | def _seeds(areas, k, seed):
  function is_neighbor (line 234) | def is_neighbor(area, region, w):
  function infeasible_components (line 263) | def infeasible_components(gdf, w, threshold_var, threshold):
  function plot_components (line 298) | def plot_components(gdf, w):
  function modify_components (line 321) | def modify_components(gdf, w, threshold_var, threshold, policy="single"):
  function form_single_component (line 386) | def form_single_component(gdf, w, linkage="single"):

FILE: spopt/region/components.py
  function is_component (line 13) | def is_component(w, ids):
  function check_contiguity (line 54) | def check_contiguity(w, neighbors, leaver):
  class Graph (line 107) | class Graph:
    method __init__ (line 108) | def __init__(self, undirected=True):
    method add_edge (line 115) | def add_edge(self, n1, n2, w):
    method connected_components (line 122) | def connected_components(self, threshold=0.9, op=lt):
    method dfs (line 149) | def dfs(self, v, visited, threshold, op=lt, first=None):

FILE: spopt/region/csgraph_utils.py
  function is_connected (line 13) | def is_connected(adj):
  function neighbors (line 50) | def neighbors(adj, area):
  function sub_adj_matrix (line 85) | def sub_adj_matrix(adj, nodes, wo_nodes=None):

FILE: spopt/region/maxp.py
  function maxp (line 24) | def maxp(
  function _construction_phase (line 155) | def _construction_phase(
  function _grow_cluster_for_poly (line 279) | def _grow_cluster_for_poly(
  function _assign_enclave (line 341) | def _assign_enclave(
  function _calculate_within_region_distance (line 425) | def _calculate_within_region_distance(region_list, distance_matrix):
  function _pick_move_area (line 454) | def _pick_move_area(
  function _check_move (line 515) | def _check_move(
  function _perform_sa (line 580) | def _perform_sa(
  class MaxPHeuristic (line 715) | class MaxPHeuristic(BaseSpOptHeuristicSolver):
    method __init__ (line 810) | def __init__(
    method solve (line 834) | def solve(self):

FILE: spopt/region/objective_function.py
  class ObjectiveFunction (line 9) | class ObjectiveFunction(ABC):
    method __init__ (line 10) | def __init__(self, metric=None):
    method __call__ (line 23) | def __call__(self, labels, attr):
    method update (line 45) | def update(self, moving_area, recipient_region, labels, attr):
  class ObjectiveFunctionPairwise (line 72) | class ObjectiveFunctionPairwise(ObjectiveFunction):
    method __call__ (line 73) | def __call__(self, labels, attr):
    method update (line 95) | def update(self, moving_area, recipient_region, labels, attr):
  class ObjectiveFunctionCenter (line 108) | class ObjectiveFunctionCenter(ObjectiveFunction):
    method __init__ (line 109) | def __init__(self, metric=None, center=np.mean, reduction=np.sum):
    method __call__ (line 131) | def __call__(self, labels, attr):
    method _intraregional_heterogeneity (line 156) | def _intraregional_heterogeneity(self, labels, region, attr):
    method update (line 165) | def update(self, moving_area, recipient_region, labels, attr):

FILE: spopt/region/random_region.py
  class RandomRegions (line 19) | class RandomRegions:
    method __init__ (line 133) | def __init__(
  class RandomRegion (line 164) | class RandomRegion:
    method __init__ (line 272) | def __init__(
    method get_num_regions (line 353) | def get_num_regions(self):
    method get_region_breaks (line 356) | def get_region_breaks(self, num_regions):
    method get_cards (line 364) | def get_cards(self, num_regions):
    method cards2breaks (line 374) | def cards2breaks(self, cards):
    method build_noncontig_regions (line 383) | def build_noncontig_regions(self, num_regions, region_breaks):  # noqa...
    method grow_compact (line 390) | def grow_compact(self, w, test_card, region, candidates, potential):
    method grow_free (line 411) | def grow_free(self, w, test_card, region, candidates, potential):  # n...
    method build_contig_regions (line 428) | def build_contig_regions(

FILE: spopt/region/region_k_means.py
  function region_k_means (line 28) | def region_k_means(X, n_clusters, w, drop_islands=True, seed=0):  # noqa...
  class RegionKMeansHeuristic (line 132) | class RegionKMeansHeuristic(BaseSpOptHeuristicSolver):
    method __init__ (line 165) | def __init__(self, data, n_clusters, w, drop_islands=True, seed=0):
    method solve (line 172) | def solve(self):

FILE: spopt/region/sa3.py
  function extract_clusters (line 9) | def extract_clusters(linkage_matrix, min_cluster_size, extraction="eom"):
  class SA3 (line 66) | class SA3(BaseSpOptHeuristicSolver):
    method __init__ (line 100) | def __init__(
    method solve (line 123) | def solve(self):
    method _get_tree (line 189) | def _get_tree(self, training_data, clustering_graph, clustering_kwds):

FILE: spopt/region/skater.py
  class SpanningForest (line 18) | class SpanningForest:
    method __init__ (line 19) | def __init__(
    method __repr__ (line 77) | def __repr__(self):
    method fit (line 83) | def fit(
    method score (line 234) | def score(self, data, labels=None, quorum=-np.inf):
    method find_cut (line 292) | def find_cut(
    method make_cut (line 395) | def make_cut(self, in_node, out_node, score, MSF=None):
  class Skater (line 425) | class Skater(BaseSpOptHeuristicSolver):
    method __init__ (line 518) | def __init__(
    method solve (line 538) | def solve(self):

FILE: spopt/region/spenc.py
  class Spenc (line 8) | class Spenc(BaseSpOptHeuristicSolver):
    method __init__ (line 36) | def __init__(
    method solve (line 176) | def solve(self, fit_kwargs=dict()):

FILE: spopt/region/spenclib/abstracts.py
  class SPENC (line 21) | class SPENC(clust.SpectralClustering):
    method __init__ (line 22) | def __init__(
    method fit (line 189) | def fit(
    method _embed (line 320) | def _embed(self, affinity, shift_invert=True):
    method _spectral_bipartition (line 357) | def _spectral_bipartition(
    method _make_hierarchical_cut (line 455) | def _make_hierarchical_cut(
    method score (line 500) | def score(
    method _sample_gen (line 548) | def _sample_gen(self, W, n_samples=1, distribution=None, **fit_kw):
    method sample (line 584) | def sample(self, W, n_samples=1, distribution=None, **fit_kw):
  class AgglomerativeClustering (line 629) | class AgglomerativeClustering(clust.AgglomerativeClustering):
    method _sample_gen (line 630) | def _sample_gen(self, n_samples=25, distribution=None):
    method sample (line 645) | def sample(self, n_samples=1, distribution=None):

FILE: spopt/region/spenclib/scores.py
  function boundary_fraction (line 6) | def boundary_fraction(W, labels):
  function boundary_score (line 15) | def boundary_score(W, labels):

FILE: spopt/region/spenclib/utils.py
  function check_weights (line 10) | def check_weights(W, X=None):
  function lattice (line 27) | def lattice(x, y):

FILE: spopt/region/util.py
  function array_from_dict_values (line 21) | def array_from_dict_values(dct, sorted_keys=None, flat_output=False, dty...
  function scipy_sparse_matrix_from_dict (line 87) | def scipy_sparse_matrix_from_dict(neighbors):
  function scipy_sparse_matrix_from_w (line 146) | def scipy_sparse_matrix_from_w(w):
  function dict_from_graph_attr (line 179) | def dict_from_graph_attr(graph, attr, array_values=False):
  function array_from_graph (line 239) | def array_from_graph(graph, attr):
  function array_from_graph_or_dict (line 285) | def array_from_graph_or_dict(graph, attr):
  function array_from_region_list (line 297) | def array_from_region_list(region_list):
  function array_from_df_col (line 329) | def array_from_df_col(df, attr):
  function w_from_gdf (line 379) | def w_from_gdf(gdf, contiguity):
  function dataframe_to_dict (line 411) | def dataframe_to_dict(df, cols):
  function find_sublist_containing (line 451) | def find_sublist_containing(el, lst, index=False):
  function get_metric_function (line 500) | def get_metric_function(metric=None):
  class MissingMetricError (line 559) | class MissingMetricError(RuntimeError):
  function raise_distance_metric_not_set (line 563) | def raise_distance_metric_not_set(x, y):
  function make_move (line 567) | def make_move(moving_area, new_label, labels):
  function distribute_regions_among_components (line 595) | def distribute_regions_among_components(component_labels, n_regions):
  function generate_initial_sol (line 646) | def generate_initial_sol(adj, n_regions):
  function _randomly_divide_connected_graph (line 703) | def _randomly_divide_connected_graph(adj, n_regions):
  function copy_func (line 772) | def copy_func(f):
  function assert_feasible (line 802) | def assert_feasible(solution, adj, n_regions=None):
  function boolean_assert_feasible (line 837) | def boolean_assert_feasible(solution, adj, n_regions=None):
  function all_elements_equal (line 854) | def all_elements_equal(array):
  function separate_components (line 858) | def separate_components(adj, labels):
  function random_element_from (line 921) | def random_element_from(lst):
  function pop_randomly_from (line 926) | def pop_randomly_from(lst):
  function count (line 931) | def count(arr, el):
  function check_solver (line 974) | def check_solver(solver):
  function get_solver_instance (line 982) | def get_solver_instance(solver_string):

FILE: spopt/region/ward.py
  class WardSpatial (line 8) | class WardSpatial(BaseSpOptHeuristicSolver):
    method __init__ (line 73) | def __init__(self, gdf, w, attrs_name, n_clusters=5, clustering_kwds=d...
    method solve (line 80) | def solve(self):

FILE: spopt/tests/conftest.py
  function locate_dirpath (line 19) | def locate_dirpath() -> pathlib.Path:
  function load_locate_test_data (line 25) | def load_locate_test_data():
  function network_instance (line 43) | def network_instance():
  function loc_warns_geo_crs (line 130) | def loc_warns_geo_crs():
  function loc_warns_mixed_type_dem (line 136) | def loc_warns_mixed_type_dem():
  function loc_warns_mixed_type_fac (line 142) | def loc_warns_mixed_type_fac():
  function loc_raises_diff_crs (line 148) | def loc_raises_diff_crs():
  function loc_raises_infeasible (line 154) | def loc_raises_infeasible():
  function loc_raises_fac_constr (line 160) | def loc_raises_fac_constr():
  function toy_fac_data (line 166) | def toy_fac_data() -> geopandas.GeoDataFrame:
  function toy_dem_data (line 177) | def toy_dem_data() -> tuple[

FILE: spopt/tests/test_locate/test_c_p_median.py
  class TestSyntheticLocate (line 9) | class TestSyntheticLocate:
    method setup_method (line 11) | def setup_method(self, network_instance) -> None:
    method test_c_p_median_from_cost_matrix (line 19) | def test_c_p_median_from_cost_matrix(self):
    method test_c_p_median_with_predefined_facilities_from_cost_matrix (line 39) | def test_c_p_median_with_predefined_facilities_from_cost_matrix(self):
    method test_c_p_median_with_predefined_facilities_infeasible (line 62) | def test_c_p_median_with_predefined_facilities_infeasible(
  class TestRealWorldLocate (line 80) | class TestRealWorldLocate:
    method setup_method (line 82) | def setup_method(self, load_locate_test_data) -> None:
    method test_optimality_capacitated_pmedian_with_predefined_facilities (line 110) | def test_optimality_capacitated_pmedian_with_predefined_facilities(self):
    method test_infeasibility_capacitated_pmedian (line 122) | def test_infeasibility_capacitated_pmedian(self, loc_raises_infeasible):
    method test_mixin_mean_time (line 129) | def test_mixin_mean_time(self):
    method test_infeasibility_predefined_facilities_fulfillment_error (line 142) | def test_infeasibility_predefined_facilities_fulfillment_error(self):
    method test_no_capacity_data_predefined_facilities_error (line 162) | def test_no_capacity_data_predefined_facilities_error(self):
    method test_infeasibility_capacity_smaller_than_demand_error (line 178) | def test_infeasibility_capacity_smaller_than_demand_error(self):

FILE: spopt/tests/test_locate/test_clscp-so.py
  class TestSyntheticLocate (line 9) | class TestSyntheticLocate:
    method setup_method (line 11) | def setup_method(self, network_instance) -> None:
    method test_clscpso_y1_lt_y2 (line 19) | def test_clscpso_y1_lt_y2(self):
    method test_clscpso_y1_gt_y2 (line 40) | def test_clscpso_y1_gt_y2(self):
    method test_clscpso_y1_eq_y2 (line 61) | def test_clscpso_y1_eq_y2(self):
    method test_clscpso_dem_gt_cap_error (line 82) | def test_clscpso_dem_gt_cap_error(self):
    method test_clscpso_infease_error (line 96) | def test_clscpso_infease_error(self, loc_raises_infeasible):

FILE: spopt/tests/test_locate/test_flow.py
  function load_grid_test_data (line 14) | def load_grid_test_data():
  class TestFRLMBasicFunctionality (line 22) | class TestFRLMBasicFunctionality:
    method setup_simple_network (line 24) | def setup_simple_network(self):
    method setup_grid_network (line 30) | def setup_grid_network(self):
    method test_basic_initialization (line 33) | def test_basic_initialization(self):
    method test_vehicle_range_percentage (line 43) | def test_vehicle_range_percentage(self, setup_simple_network):
    method test_ac_pc_approach (line 57) | def test_ac_pc_approach(self, setup_grid_network):
    method test_combination_approach (line 72) | def test_combination_approach(self, setup_grid_network):
  class TestFRLMObjectives (line 86) | class TestFRLMObjectives:
    method setup_network_with_distances (line 88) | def setup_network_with_distances(self):
    method test_flow_objective (line 100) | def test_flow_objective(self, setup_network_with_distances):
    method test_vmt_objective (line 114) | def test_vmt_objective(self, setup_network_with_distances):
  class TestFRLMThresholdExtension (line 134) | class TestFRLMThresholdExtension:
    method setup_threshold_network (line 136) | def setup_threshold_network(self):
    method test_threshold_basic (line 140) | def test_threshold_basic(self, setup_threshold_network):
    method test_threshold_weight_impact (line 166) | def test_threshold_weight_impact(self, setup_threshold_network):
    method test_include_destination_parameter (line 191) | def test_include_destination_parameter(self, setup_threshold_network):
  class TestFRLMGreedySolver (line 223) | class TestFRLMGreedySolver:
    method setup_greedy_network (line 225) | def setup_greedy_network(self):
    method test_greedy_initialization_methods (line 230) | def test_greedy_initialization_methods(self, setup_greedy_network):
    method test_greedy_iterations_tracking (line 250) | def test_greedy_iterations_tracking(self, setup_greedy_network):
    method test_greedy_capacitated (line 269) | def test_greedy_capacitated(self, setup_greedy_network):
    method test_greedy_no_feasible_solution (line 283) | def test_greedy_no_feasible_solution(self, setup_greedy_network):
  class TestFRLMErrorHandling (line 295) | class TestFRLMErrorHandling:
    method test_no_network_error (line 296) | def test_no_network_error(self):
    method test_no_flows_error (line 303) | def test_no_flows_error(self):
    method test_invalid_node_ids (line 311) | def test_invalid_node_ids(self):
    method test_disconnected_path (line 319) | def test_disconnected_path(self):
    method test_invalid_parameters (line 327) | def test_invalid_parameters(self):
  class TestFRLMOutputsAndReporting (line 345) | class TestFRLMOutputsAndReporting:
    method setup_solved_model (line 347) | def setup_solved_model(self):
    method test_summary_output (line 358) | def test_summary_output(self, setup_solved_model):
    method test_dataframe_export (line 377) | def test_dataframe_export(self, setup_solved_model):
    method test_solver_details (line 394) | def test_solver_details(self, setup_solved_model):
    method test_shadow_prices_and_reduced_costs (line 403) | def test_shadow_prices_and_reduced_costs(self, setup_solved_model):
    method test_detailed_results (line 415) | def test_detailed_results(self, setup_solved_model):
  class TestFRLMCustomPaths (line 430) | class TestFRLMCustomPaths:
    method test_custom_paths_basic (line 431) | def test_custom_paths_basic(self):
    method test_invalid_custom_paths (line 464) | def test_invalid_custom_paths(self):

FILE: spopt/tests/test_locate/test_knearest_p_median.py
  class TestKNearestPMedian (line 13) | class TestKNearestPMedian:
    method setup_method (line 14) | def setup_method(self) -> None:
    method test_knearest_p_median_from_geodataframe (line 41) | def test_knearest_p_median_from_geodataframe(self):
    method test_knearest_p_median_from_geodataframe_no_results (line 45) | def test_knearest_p_median_from_geodataframe_no_results(self):
    method test_solve (line 56) | def test_solve(self):
    method test_error_overflow_k (line 67) | def test_error_overflow_k(self):
    method test_error_k_array_non_numpy_array (line 81) | def test_error_k_array_non_numpy_array(self):
    method test_error_k_array_invalid_value (line 95) | def test_error_k_array_invalid_value(self):
    method test_error_no_crs_demand (line 109) | def test_error_no_crs_demand(self):
    method test_error_no_crs_facility (line 124) | def test_error_no_crs_facility(self):
    method test_error_geodataframe_crs_mismatch (line 139) | def test_error_geodataframe_crs_mismatch(self, loc_raises_diff_crs):
    method test_error_high_capacity (line 154) | def test_error_high_capacity(self):

FILE: spopt/tests/test_locate/test_locate_util.py
  class TestSimulatedGeoPoints (line 6) | class TestSimulatedGeoPoints:
    method setup_method (line 8) | def setup_method(self, network_instance) -> None:
    method test_from_polygon (line 21) | def test_from_polygon(self):
    method test_from_polygons_geoseries (line 30) | def test_from_polygons_geoseries(self):
    method test_from_multipolygon (line 41) | def test_from_multipolygon(self):
    method test_from_multipolygon_geoseries (line 50) | def test_from_multipolygon_geoseries(self):
    method test_error_indata (line 61) | def test_error_indata(self):
    method test_error_neq_needed (line 68) | def test_error_neq_needed(self):
    method test_error_flt_needed (line 73) | def test_error_flt_needed(self):
    method test_error_neg_seed (line 78) | def test_error_neg_seed(self):
    method test_error_flt_seed (line 83) | def test_error_flt_seed(self):

FILE: spopt/tests/test_locate/test_lscp.py
  class TestSyntheticLocate (line 10) | class TestSyntheticLocate:
    method setup_method (line 12) | def setup_method(self, network_instance) -> None:
    method test_lscp_from_cost_matrix (line 20) | def test_lscp_from_cost_matrix(self):
    method test_lscp_from_cost_matrix_no_results (line 25) | def test_lscp_from_cost_matrix_no_results(self):
    method test_lscp_facility_client_array_from_cost_matrix (line 35) | def test_lscp_facility_client_array_from_cost_matrix(self, load_locate...
    method test_lscp_client_facility_array_from_cost_matrix (line 46) | def test_lscp_client_facility_array_from_cost_matrix(self, load_locate...
    method test_lscp_from_geodataframe (line 57) | def test_lscp_from_geodataframe(self):
    method test_lscp_facility_client_array_from_geodataframe (line 64) | def test_lscp_facility_client_array_from_geodataframe(self, load_locat...
    method test_lscp_client_facility_array_from_geodataframe (line 81) | def test_lscp_client_facility_array_from_geodataframe(self, load_locat...
    method test_lscp_preselected_facility_client_array_from_geodataframe (line 98) | def test_lscp_preselected_facility_client_array_from_geodataframe(
  class TestRealWorldLSCP (line 125) | class TestRealWorldLSCP:
    method setup_method (line 127) | def setup_method(self, load_locate_test_data) -> None:
    method test_optimality_lscp_from_cost_matrix (line 169) | def test_optimality_lscp_from_cost_matrix(self):
    method test_infeasibility_lscp_from_cost_matrix (line 175) | def test_infeasibility_lscp_from_cost_matrix(self, loc_raises_infeasib...
    method test_optimality_lscp_from_geodataframe (line 180) | def test_optimality_lscp_from_geodataframe(self):
    method test_infeasibility_lscp_from_geodataframe (line 191) | def test_infeasibility_lscp_from_geodataframe(self, loc_raises_infeasi...
  class TestErrorsWarnings (line 203) | class TestErrorsWarnings:
    method setup_method (line 205) | def setup_method(self, toy_fac_data, toy_dem_data) -> None:
    method test_attribute_error_add_set_covering_constraint (line 213) | def test_attribute_error_add_set_covering_constraint(self):
    method test_error_lscp_different_crs (line 222) | def test_error_lscp_different_crs(
    method test_warning_lscp_demand_geodataframe (line 230) | def test_warning_lscp_demand_geodataframe(

FILE: spopt/tests/test_locate/test_lscpb.py
  class TestSyntheticLocate (line 10) | class TestSyntheticLocate:
    method setup_method (line 12) | def setup_method(self, network_instance) -> None:
    method test_lscpb_from_cost_matrix (line 24) | def test_lscpb_from_cost_matrix(self):
    method test_lscpb_from_cost_matrix_no_results (line 32) | def test_lscpb_from_cost_matrix_no_results(self):
    method test_lscpb_facility_client_array_from_cost_matrix (line 46) | def test_lscpb_facility_client_array_from_cost_matrix(self, load_locat...
    method test_lscpb_client_facility_array_from_cost_matrix (line 59) | def test_lscpb_client_facility_array_from_cost_matrix(self, load_locat...
    method test_lscpb_from_geodataframe (line 72) | def test_lscpb_from_geodataframe(self):
    method test_lscpb_facility_client_array_from_geodataframe (line 85) | def test_lscpb_facility_client_array_from_geodataframe(self, load_loca...
    method test_lscpb_client_facility_array_from_geodataframe (line 103) | def test_lscpb_client_facility_array_from_geodataframe(self, load_loca...
    method test_lscpb_preselected_facility_client_array_from_geodataframe (line 121) | def test_lscpb_preselected_facility_client_array_from_geodataframe(
  class TestRealWorldLocate (line 148) | class TestRealWorldLocate:
    method setup_method (line 150) | def setup_method(self, load_locate_test_data) -> None:
    method test_optimality_lscpb_from_cost_matrix (line 192) | def test_optimality_lscpb_from_cost_matrix(self):
    method test_infeasibility_lscpb_from_cost_matrix (line 200) | def test_infeasibility_lscpb_from_cost_matrix(self, loc_raises_infeasi...
    method test_mixin_lscpb_get_percentage (line 207) | def test_mixin_lscpb_get_percentage(self):
    method test_optimality_lscpb_from_geodataframe (line 216) | def test_optimality_lscpb_from_geodataframe(self):
    method test_infeasibility_lscpb_from_geodataframe (line 229) | def test_infeasibility_lscpb_from_geodataframe(self, loc_raises_infeas...
  class TestErrorsWarnings (line 242) | class TestErrorsWarnings:
    method setup_method (line 244) | def setup_method(self, toy_fac_data, toy_dem_data) -> None:
    method test_error_lscpb_different_crs (line 252) | def test_error_lscpb_different_crs(
    method test_warning_lscpb_demand_geodataframe (line 265) | def test_warning_lscpb_demand_geodataframe(
    method test_attribute_error_add_backup_covering_constraint (line 278) | def test_attribute_error_add_backup_covering_constraint(self):

FILE: spopt/tests/test_locate/test_mclp.py
  class TestSyntheticLocate (line 10) | class TestSyntheticLocate:
    method setup_method (line 12) | def setup_method(self, network_instance) -> None:
    method test_mclp_from_cost_matrix (line 24) | def test_mclp_from_cost_matrix(self):
    method test_mclp_from_cost_matrix_no_results (line 34) | def test_mclp_from_cost_matrix_no_results(self):
    method test_mclp_facility_client_array_from_cost_matrix (line 51) | def test_mclp_facility_client_array_from_cost_matrix(self, load_locate...
    method test_mclp_client_facility_array_from_cost_matrix (line 67) | def test_mclp_client_facility_array_from_cost_matrix(self, load_locate...
    method test_mclp_from_geodataframe (line 83) | def test_mclp_from_geodataframe(self):
    method test_mclp_facility_client_array_from_geodataframe (line 96) | def test_mclp_facility_client_array_from_geodataframe(self, load_locat...
    method test_mclp_preselected_facility_client_array_from_geodataframe (line 115) | def test_mclp_preselected_facility_client_array_from_geodataframe(
    method test_mclp_client_facility_array_from_geodataframe (line 143) | def test_mclp_client_facility_array_from_geodataframe(self, load_locat...
  class TestRealWorldLocate (line 163) | class TestRealWorldLocate:
    method setup_method (line 165) | def setup_method(self, load_locate_test_data) -> None:
    method test_optimality_mclp_from_cost_matrix (line 207) | def test_optimality_mclp_from_cost_matrix(self):
    method test_infeasibility_mclp_from_cost_matrix (line 217) | def test_infeasibility_mclp_from_cost_matrix(self, loc_raises_infeasib...
    method test_mixin_mclp_get_uncovered_clients (line 227) | def test_mixin_mclp_get_uncovered_clients(self):
    method test_mixin_mclp_get_percentage (line 239) | def test_mixin_mclp_get_percentage(self):
    method test_optimality_mclp_from_geodataframe (line 251) | def test_optimality_mclp_from_geodataframe(self):
    method test_infeasibility_mclp_from_geodataframe (line 264) | def test_infeasibility_mclp_from_geodataframe(self, loc_raises_infeasi...
    method test_attribute_error_fac2cli_mclp_facility_client_array (line 277) | def test_attribute_error_fac2cli_mclp_facility_client_array(self):
    method test_attribute_error_cli2fac_mclp_facility_client_array (line 294) | def test_attribute_error_cli2fac_mclp_facility_client_array(self):
    method test_attribute_error_ncliuncov_mclp_facility_client_array (line 311) | def test_attribute_error_ncliuncov_mclp_facility_client_array(self):
    method test_attribute_error_percentage_mclp_facility_client_array (line 328) | def test_attribute_error_percentage_mclp_facility_client_array(self):
  class TestErrorsWarnings (line 346) | class TestErrorsWarnings:
    method setup_method (line 348) | def setup_method(self, toy_fac_data, toy_dem_data) -> None:
    method test_attribute_error_add_facility_constraint (line 356) | def test_attribute_error_add_facility_constraint(self, loc_raises_fac_...
    method test_attribute_error_add_maximal_coverage_constraint (line 362) | def test_attribute_error_add_maximal_coverage_constraint(self):
    method test_error_mclp_different_crs (line 373) | def test_error_mclp_different_crs(
    method test_warning_mclp_demand_geodataframe (line 387) | def test_warning_mclp_demand_geodataframe(

FILE: spopt/tests/test_locate/test_p_center.py
  class TestSyntheticLocate (line 10) | class TestSyntheticLocate:
    method setup_method (line 12) | def setup_method(self, network_instance) -> None:
    method test_p_center_from_cost_matrix (line 20) | def test_p_center_from_cost_matrix(self):
    method test_p_center_from_cost_matrix_no_results (line 25) | def test_p_center_from_cost_matrix_no_results(self):
    method test_pcenter_facility_client_array_from_cost_matrix (line 35) | def test_pcenter_facility_client_array_from_cost_matrix(
    method test_p_center_from_geodataframe (line 48) | def test_p_center_from_geodataframe(self):
    method test_pcenter_facility_client_array_from_geodataframe (line 59) | def test_pcenter_facility_client_array_from_geodataframe(
    method test_pcenter_client_facility_array_from_geodataframe (line 78) | def test_pcenter_client_facility_array_from_geodataframe(
    method test_pcenter_preselected_facility_client_array_from_geodataframe (line 97) | def test_pcenter_preselected_facility_client_array_from_geodataframe(s...
  class TestRealWorldLocate (line 124) | class TestRealWorldLocate:
    method setup_method (line 126) | def setup_method(self, load_locate_test_data) -> None:
    method test_optimality_pcenter_from_cost_matrix (line 168) | def test_optimality_pcenter_from_cost_matrix(self):
    method test_infeasibility_pcenter_from_cost_matrix (line 173) | def test_infeasibility_pcenter_from_cost_matrix(self, loc_raises_infea...
    method test_optimality_pcenter_from_geodataframe (line 178) | def test_optimality_pcenter_from_geodataframe(self):
    method test_infeasibility_pcenter_from_geodataframe (line 189) | def test_infeasibility_pcenter_from_geodataframe(self, loc_raises_infe...
  class TestErrorsWarnings (line 201) | class TestErrorsWarnings:
    method setup_method (line 203) | def setup_method(self, toy_fac_data, toy_dem_data) -> None:
    method test_attribute_error_add_minimized_maximum_constraint (line 211) | def test_attribute_error_add_minimized_maximum_constraint(self):
    method test_error_pcenter_different_crs (line 222) | def test_error_pcenter_different_crs(
    method test_warning_pcenter_demand_geodataframe (line 230) | def test_warning_pcenter_demand_geodataframe(

FILE: spopt/tests/test_locate/test_p_dispersion.py
  class TestSyntheticLocate (line 10) | class TestSyntheticLocate:
    method setup_method (line 12) | def setup_method(self, network_instance) -> None:
    method test_p_dispersion_from_cost_matrix (line 18) | def test_p_dispersion_from_cost_matrix(self):
    method test_p_dispersion_from_cost_matrix_no_results (line 23) | def test_p_dispersion_from_cost_matrix_no_results(self):
    method test_p_dispersion_from_geodataframe (line 33) | def test_p_dispersion_from_geodataframe(self):
    method test_p_dispersion_preselected_facility_array_from_geodataframe (line 42) | def test_p_dispersion_preselected_facility_array_from_geodataframe(self):
  class TestRealWorldLocate (line 70) | class TestRealWorldLocate:
    method setup_method (line 72) | def setup_method(self, load_locate_test_data) -> None:
    method test_optimality_p_dispersion_from_cost_matrix (line 99) | def test_optimality_p_dispersion_from_cost_matrix(self):
    method test_infeasibility_p_dispersion_from_cost_matrix (line 110) | def test_infeasibility_p_dispersion_from_cost_matrix(self, loc_raises_...
    method test_optimality_p_dispersion_from_geodataframe (line 115) | def test_optimality_p_dispersion_from_geodataframe(self):
    method test_infeasibility_p_dispersion_from_geodataframe (line 130) | def test_infeasibility_p_dispersion_from_geodataframe(self, loc_raises...
  class TestErrorsWarnings (line 140) | class TestErrorsWarnings:
    method setup_method (line 142) | def setup_method(self, toy_fac_data) -> None:
    method test_attribute_error_add_facility_constraint (line 145) | def test_attribute_error_add_facility_constraint(self, loc_raises_fac_...
    method test_attribute_error_add_p_dispersion_interfacility_constraint (line 151) | def test_attribute_error_add_p_dispersion_interfacility_constraint(self):
    method test_attribute_error_add_predefined_facility_constraint (line 165) | def test_attribute_error_add_predefined_facility_constraint(
    method test_warning_facility_geodataframe (line 174) | def test_warning_facility_geodataframe(

FILE: spopt/tests/test_locate/test_p_median.py
  class TestSyntheticLocate (line 10) | class TestSyntheticLocate:
    method setup_method (line 12) | def setup_method(self, network_instance) -> None:
    method test_p_median_from_cost_matrix (line 24) | def test_p_median_from_cost_matrix(self):
    method test_p_median_from_cost_matrix_no_results (line 29) | def test_p_median_from_cost_matrix_no_results(self):
    method test_pmedian_facility_client_array_from_cost_matrix (line 41) | def test_pmedian_facility_client_array_from_cost_matrix(
    method test_pmedian_client_facility_array_from_cost_matrix (line 54) | def test_pmedian_client_facility_array_from_cost_matrix(
    method test_p_median_from_geodataframe (line 67) | def test_p_median_from_geodataframe(self):
    method test_pmedian_facility_client_array_from_geodataframe (line 79) | def test_pmedian_facility_client_array_from_geodataframe(
    method test_pmedian_client_facility_array_from_geodataframe (line 99) | def test_pmedian_client_facility_array_from_geodataframe(
    method test_pmedian_preselected_facility_client_array_from_geodataframe (line 119) | def test_pmedian_preselected_facility_client_array_from_geodataframe(s...
  class TestRealWorldLocate (line 151) | class TestRealWorldLocate:
    method setup_method (line 153) | def setup_method(self, load_locate_test_data) -> None:
    method test_optimality_pmedian_from_cost_matrix (line 195) | def test_optimality_pmedian_from_cost_matrix(self):
    method test_infeasibility_pmedian_from_cost_matrix (line 200) | def test_infeasibility_pmedian_from_cost_matrix(self, loc_raises_infea...
    method test_mixin_mean_distance (line 205) | def test_mixin_mean_distance(self):
    method test_optimality_pmedian_from_geodataframe (line 212) | def test_optimality_pmedian_from_geodataframe(self):
    method test_infeasibility_pmedian_from_geodataframe (line 224) | def test_infeasibility_pmedian_from_geodataframe(self, loc_raises_infe...
  class TestErrorsWarnings (line 237) | class TestErrorsWarnings:
    method setup_method (line 239) | def setup_method(self, toy_fac_data, toy_dem_data) -> None:
    method test_attribute_error_add_assignment_constraint (line 247) | def test_attribute_error_add_assignment_constraint(self):
    method test_attribute_error_add_opening_constraint (line 257) | def test_attribute_error_add_opening_constraint(self):
    method test_error_pmedian_different_crs (line 265) | def test_error_pmedian_different_crs(
    method test_warning_pmedian_demand_geodataframe (line 273) | def test_warning_pmedian_demand_geodataframe(

FILE: spopt/tests/test_region/test_azp.py
  class TestAZP (line 14) | class TestAZP:
    method setup_method (line 15) | def setup_method(self):
    method test_azp_basic_from_w (line 30) | def test_azp_basic_from_w(self):

FILE: spopt/tests/test_region/test_maxp.py
  class TestMaxPHeuristic (line 20) | class TestMaxPHeuristic:
    method setup_method (line 21) | def setup_method(self):
    method test_maxp_heuristic_basic_nonverbose (line 60) | def test_maxp_heuristic_basic_nonverbose(self):
    method test_maxp_heuristic_basic_verbose (line 72) | def test_maxp_heuristic_basic_verbose(self):
    method test_maxp_heuristic_complex (line 84) | def test_maxp_heuristic_complex(self):
    method test_maxp_one_var (line 96) | def test_maxp_one_var(self):
    method test_infeasible_components (line 108) | def test_infeasible_components(self):
    method test_plot_components (line 112) | def test_plot_components(self):
    method test_modify_components (line 117) | def test_modify_components(self):
    method test_modify_components_policy_error (line 133) | def test_modify_components_policy_error(self):
    method test_modify_components_xfeasible_error (line 145) | def test_modify_components_xfeasible_error(self):
    method test_form_single_component_already_single (line 155) | def test_form_single_component_already_single(self):
    method test_form_single_component_error (line 165) | def test_form_single_component_error(self):

FILE: spopt/tests/test_region/test_random_regions.py
  class TestRandomRegionEmpirical (line 21) | class TestRandomRegionEmpirical:
    method setup_method (line 22) | def setup_method(self):
    method test_random_region_6_card (line 28) | def test_random_region_6_card(self):
    method test_random_region_6_card_contig_compact (line 46) | def test_random_region_6_card_contig_compact(self):
  class TestRandomRegionsEmpirical (line 70) | class TestRandomRegionsEmpirical:
    method setup_method (line 71) | def setup_method(self):
    method test_random_regions_6_card (line 76) | def test_random_regions_6_card(self):
  class TestRandomRegionSynthetic (line 96) | class TestRandomRegionSynthetic:
    method setup_method (line 97) | def setup_method(self):
    method test_random_region_unconstrained (line 103) | def test_random_region_unconstrained(self):
    method test_random_region_exo_regions (line 109) | def test_random_region_exo_regions(self):
    method test_random_region_endo_regions_constrained_card (line 116) | def test_random_region_endo_regions_constrained_card(self):
    method test_random_region_exo_regions_constrained_card (line 123) | def test_random_region_exo_regions_constrained_card(self):
    method test_random_region_endo_regions_constrained_contig (line 130) | def test_random_region_endo_regions_constrained_contig(self):
    method test_random_region_exo_regions_constrained_contig (line 137) | def test_random_region_exo_regions_constrained_contig(self):
    method test_random_region_exo_regions_constrained_card_contig (line 144) | def test_random_region_exo_regions_constrained_card_contig(self):
    method test_random_region_endo_regions_constrained_card_contig (line 155) | def test_random_region_endo_regions_constrained_card_contig(self):
    method test_random_regions_error_card (line 162) | def test_random_regions_error_card(self):
    method test_random_regions_error_contig (line 166) | def test_random_regions_error_contig(self):
    method test_random_regions_error_nregs (line 175) | def test_random_regions_error_nregs(self):
  class TestRandomRegionsSynthetic (line 180) | class TestRandomRegionsSynthetic:
    method setup_method (line 181) | def setup_method(self):
    method test_random_region_unconstrained (line 188) | def test_random_region_unconstrained(self):
    method test_random_region_exo_regions (line 195) | def test_random_region_exo_regions(self):
    method test_random_region_endo_regions_constrained_card (line 202) | def test_random_region_endo_regions_constrained_card(self):
    method test_random_region_exo_regions_constrained_card (line 209) | def test_random_region_exo_regions_constrained_card(self):
    method test_random_region_endo_regions_constrained_contig (line 220) | def test_random_region_endo_regions_constrained_contig(self):
    method test_random_region_exo_regions_constrained_contig (line 227) | def test_random_region_exo_regions_constrained_contig(self):
    method test_random_region_exo_regions_constrained_card_contig (line 238) | def test_random_region_exo_regions_constrained_card_contig(self):
    method test_random_region_endo_regions_constrained_card_contig (line 250) | def test_random_region_endo_regions_constrained_card_contig(self):

FILE: spopt/tests/test_region/test_region_k_means.py
  class TestRegionKMeansHeuristic (line 12) | class TestRegionKMeansHeuristic:
    method setup_method (line 13) | def setup_method(self):
    method test_region_k_means_heuristic_synth_small (line 37) | def test_region_k_means_heuristic_synth_small(self):
    method test_region_k_means_heuristic_synth_large (line 46) | def test_region_k_means_heuristic_synth_large(self):

FILE: spopt/tests/test_region/test_region_util.py
  class TestRegionUtil (line 16) | class TestRegionUtil:
    method setup_method (line 17) | def setup_method(self):
    method test_array_from_dict_values (line 20) | def test_array_from_dict_values(self):
    method test_scipy_sparse_matrix_from_dict (line 38) | def test_scipy_sparse_matrix_from_dict(self):
    method test_dict_from_graph_attr (line 69) | def test_dict_from_graph_attr(self):
    method test_check_solver (line 89) | def test_check_solver(self):
    method test_get_solver_instance (line 94) | def test_get_solver_instance(self):

FILE: spopt/tests/test_region/test_sa3.py
  class TestSA3 (line 15) | class TestSA3:
    method setup_method (line 16) | def setup_method(self):
    method test_ward_eom_3 (line 186) | def test_ward_eom_3(self):
    method test_ward_leaf_10 (line 194) | def test_ward_leaf_10(self):
    method test_extract_clusters (line 217) | def test_extract_clusters(self):
    method test_invalid_extraction (line 240) | def test_invalid_extraction(self):

FILE: spopt/tests/test_region/test_skater.py
  class TestSkater (line 20) | class TestSkater:
    method setup_method (line 21) | def setup_method(self):
    method test_skater_defaults (line 47) | def test_skater_defaults(self):
    method test_skater_defaults_verbose (line 56) | def test_skater_defaults_verbose(self):
    method test_skater_defaults_super_verbose (line 71) | def test_skater_defaults_super_verbose(self):
    method test_skater_defaults_non_defaults (line 87) | def test_skater_defaults_non_defaults(self):
    method test_skater_island_pass (line 113) | def test_skater_island_pass(self):
    method test_skater_island_fail (line 139) | def test_skater_island_fail(self):
    method test_skater_forest_affinity (line 161) | def test_skater_forest_affinity(self):

FILE: spopt/tests/test_region/test_spenc.py
  class TestSpenc (line 14) | class TestSpenc:
    method setup_method (line 15) | def setup_method(self):
    method test_spenc_non_defaults (line 23) | def test_spenc_non_defaults(self):

FILE: spopt/tests/test_region/test_ward.py
  class TestWard (line 13) | class TestWard:
    method setup_method (line 14) | def setup_method(self):
    method test_ward_defaults (line 22) | def test_ward_defaults(self):
Copy disabled (too large) Download .json
Condensed preview — 135 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (41,259K chars).
[
  {
    "path": ".gitattributes",
    "chars": 33,
    "preview": "*.ipynb linguist-language=Python\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 986,
    "preview": "# Contributing Guidelines for `spopt`\n\nThank you for your interest in contributing! We work primarily on Github. Please "
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 628,
    "preview": " # To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where"
  },
  {
    "path": ".github/release.yml",
    "chars": 469,
    "preview": "changelog:\n  exclude:\n    labels:\n      - ignore-for-release\n    authors:\n      - dependabot\n  categories:\n    - title: "
  },
  {
    "path": ".github/workflows/build_docs.yml",
    "chars": 1195,
    "preview": "---\nname: Build Docs\non:\n  push:\n    tags:\n      - v*\n  workflow_dispatch:\n    inputs:\n      version:\n        descriptio"
  },
  {
    "path": ".github/workflows/release_and_publish.yml",
    "chars": 1306,
    "preview": "---\nname: Release Package\non:\n  push:\n    tags:\n      - v*\n  workflow_dispatch:\n    inputs:\n      version:\n        descr"
  },
  {
    "path": ".github/workflows/testing.yml",
    "chars": 1941,
    "preview": "---\nname: Continuous Integration\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches:\n      - \"*\"\n  schedule:\n"
  },
  {
    "path": ".gitignore",
    "chars": 264,
    "preview": "*.swp\n*.pyc\n.rope*\n.idea/\nnotebooks/.ipynb_checkpoints/\n.DS_Store\n.ipynb_checkpoints/\n*.bak\n.eggs/\n*.egg-info/\n\n# Packag"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 227,
    "preview": "files: \"spopt\\/|notebooks\\/\"\nrepos:\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: \"v0.15.9\"\n    hooks:"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1489,
    "preview": "BSD 3-Clause License\n\nCopyright 2018 pysal-spopt developers\n\nRedistribution and use in source and binary forms, with or "
  },
  {
    "path": "README.md",
    "chars": 8661,
    "preview": "\n<p align=\"center\">\n<img src=\"docs/_static/images/pysal_banner.svg\" width=\"370\" height=\"200\" />\n</p>\n\n# `spopt`: Spatial"
  },
  {
    "path": "ci/312-latest.yaml",
    "chars": 390,
    "preview": "name: test\nchannels:\n  - conda-forge\ndependencies:\n  - python=3.12\n  - fast_hdbscan # for sa3\n  - geopandas\n  - libpysal"
  },
  {
    "path": "ci/312-oldest.yaml",
    "chars": 490,
    "preview": "name: py312_spopt-oldest\nchannels:\n  - conda-forge\ndependencies:\n  - python=3.12\n  - fast_hdbscan=0.2.2 # for sa3\n  - ge"
  },
  {
    "path": "ci/313-latest.yaml",
    "chars": 391,
    "preview": "name: test\nchannels:\n  - conda-forge\ndependencies:\n  - python=3.13\n  - fast_hdbscan # for sa3\n  - geopandas\n  - libpysal"
  },
  {
    "path": "ci/314-dev.yaml",
    "chars": 841,
    "preview": "name: test\nchannels:\n  - conda-forge\ndependencies:\n  - python=3.14\n  - fast_hdbscan # for sa3\n  - folium # for geopandas"
  },
  {
    "path": "ci/314-latest.yaml",
    "chars": 506,
    "preview": "name: test\nchannels:\n  - conda-forge\ndependencies:\n  - python=3.14\n  - fast_hdbscan # for sa3\n  - geopandas\n  - libpysal"
  },
  {
    "path": "codecov.yml",
    "chars": 355,
    "preview": "codecov:\n  notify:\n    after_n_builds: 5\ncoverage:\n  range: 50..95\n  round: nearest\n  precision: 1\n  status:\n    project"
  },
  {
    "path": "docs/Makefile",
    "chars": 753,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHI"
  },
  {
    "path": "docs/_static/pysal-styles.css",
    "chars": 2119,
    "preview": "/* Make thumbnails with equal heights */\n@media only screen and (min-width : 500px) {\n    .row.equal-height {\n        di"
  },
  {
    "path": "docs/_static/references.bib",
    "chars": 8038,
    "preview": "@article{assunccao2006efficient,\n  title={{Efficient Regionalization Techniques for Socio-economic Geographical Units Us"
  },
  {
    "path": "docs/api.rst",
    "chars": 827,
    "preview": ".. _api_ref:\n\n.. currentmodule:: spopt\n\nAPI reference\n=============\n\n.. _data_api:\n\nRegion Methods\n--------------\nModel "
  },
  {
    "path": "docs/conf.py",
    "chars": 10458,
    "preview": "# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here"
  },
  {
    "path": "docs/index.rst",
    "chars": 5753,
    "preview": ".. documentation master file\n\nspopt: Spatial Optimization\n===========================\n\nRegionalization, facility locatio"
  },
  {
    "path": "docs/installation.rst",
    "chars": 1431,
    "preview": ".. Installation\n\nInstallation\n============\n\nspopt supports Python >= 3.12_. Please make sure that you are operating in a"
  },
  {
    "path": "docs/references.rst",
    "chars": 100,
    "preview": ".. reference for the docs\n\nReferences\n==========\n\n.. bibliography:: _static/references.bib\n   :all:\n"
  },
  {
    "path": "docs/tutorials.rst",
    "chars": 817,
    "preview": "Tutorials\n=========\n\n.. toctree::\n    :maxdepth: 1\n    :caption: Regionalization:\n\n    notebooks/maxp.ipynb\n    notebook"
  },
  {
    "path": "environment.yml",
    "chars": 611,
    "preview": "name: spopt\nchannels:\n  - conda-forge\ndependencies:\n  - python\n  - fast_hdbscan\n  - geopandas\n  - jupyterlab\n  - libpysa"
  },
  {
    "path": "notebooks/azp.ipynb",
    "chars": 2621914,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#  Automatic Zoning Procedure (AZP)"
  },
  {
    "path": "notebooks/component_policy.ipynb",
    "chars": 233507,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Max-P Regionalization for Multipl"
  },
  {
    "path": "notebooks/facloc-disperse-real-world.ipynb",
    "chars": 699874,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# The P-Dispersion Problem: An Empi"
  },
  {
    "path": "notebooks/facloc-lscpb-real-world.ipynb",
    "chars": 3856756,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Backup Coverage Location Problem:"
  },
  {
    "path": "notebooks/facloc-real-world.ipynb",
    "chars": 3581769,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Empirical examples of facility lo"
  },
  {
    "path": "notebooks/flow.ipynb",
    "chars": 1137413,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"412b4109\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Flow Refueli"
  },
  {
    "path": "notebooks/lscp.ipynb",
    "chars": 2204735,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hid"
  },
  {
    "path": "notebooks/lscp_capacity.ipynb",
    "chars": 2236805,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hid"
  },
  {
    "path": "notebooks/lscp_gis.ipynb",
    "chars": 960446,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"d59e293a\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Siting First"
  },
  {
    "path": "notebooks/lscpb.ipynb",
    "chars": 3980405,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hid"
  },
  {
    "path": "notebooks/maxp.ipynb",
    "chars": 4528746,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Max-P Regionalization\\n\",\n    \"\\n"
  },
  {
    "path": "notebooks/mclp.ipynb",
    "chars": 1840455,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hid"
  },
  {
    "path": "notebooks/mclp_gis.ipynb",
    "chars": 1313698,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"d59e293a\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Siting Resta"
  },
  {
    "path": "notebooks/p-center.ipynb",
    "chars": 1706275,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hid"
  },
  {
    "path": "notebooks/p-dispersion.ipynb",
    "chars": 566636,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"4ed711c8\",\n   \"metadata\": {},\n   \"source\": [\n    \"# The P-Disper"
  },
  {
    "path": "notebooks/p-median.ipynb",
    "chars": 1704395,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hid"
  },
  {
    "path": "notebooks/p-median_variations.ipynb",
    "chars": 2261769,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hid"
  },
  {
    "path": "notebooks/randomregion.ipynb",
    "chars": 1108480,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Random Regions\\n\",\n    \"\\n\",\n    "
  },
  {
    "path": "notebooks/reg-k-means.ipynb",
    "chars": 666814,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Regional-k-means\\n\",\n    \"\\n\",\n  "
  },
  {
    "path": "notebooks/sa3.ipynb",
    "chars": 1456562,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Spatial Adaptive Agglomerative Ag"
  },
  {
    "path": "notebooks/skater.ipynb",
    "chars": 800481,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# SKATER\\n\",\n    \"\\n\",\n    \"## Spat"
  },
  {
    "path": "notebooks/ward.ipynb",
    "chars": 395189,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Ward\\n\",\n    \"\\n\",\n    \"Author: ["
  },
  {
    "path": "paper/paper.bib",
    "chars": 11393,
    "preview": "@article{assunccao2006efficient,\n  title={Efficient Regionalization Techniques for Socio-economic Geographical Units Usi"
  },
  {
    "path": "paper/paper.md",
    "chars": 13203,
    "preview": "---\ntitle: 'spopt: a python package for solving spatial optimization problems in PySAL'\ntags:\n  - Python\n  - spatial opt"
  },
  {
    "path": "pyproject.toml",
    "chars": 2399,
    "preview": "[build-system]\nrequires = [\"setuptools>=61.0\", \"setuptools_scm[toml]>=6.2\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[to"
  },
  {
    "path": "spopt/BaseClass.py",
    "chars": 925,
    "preview": "# ruff: noqa: N999\r\n\r\nfrom abc import ABC, abstractmethod\r\n\r\n\r\nclass BaseSpOptSolver(ABC):\r\n    \"\"\"Base class for all sp"
  },
  {
    "path": "spopt/__init__.py",
    "chars": 193,
    "preview": "import contextlib\nfrom importlib.metadata import PackageNotFoundError, version\n\nfrom . import locate, region\n\nwith conte"
  },
  {
    "path": "spopt/locate/__init__.py",
    "chars": 295,
    "preview": "from .base import BaseOutputMixin, CoveragePercentageMixin, MeanDistanceMixin\nfrom .coverage import LSCP, LSCPB, MCLP\nfr"
  },
  {
    "path": "spopt/locate/base.py",
    "chars": 25381,
    "preview": "# ruff: noqa: B009, B010\n\nfrom abc import abstractmethod\nfrom typing import TypeVar\n\nimport numpy as np\nimport pulp\n\nfro"
  },
  {
    "path": "spopt/locate/coverage.py",
    "chars": 59562,
    "preview": "# ruff: noqa: B009\n\nimport warnings\n\nimport numpy as np\nimport pulp\nfrom geopandas import GeoDataFrame\nfrom scipy.spatia"
  },
  {
    "path": "spopt/locate/flow.py",
    "chars": 92932,
    "preview": "import logging\r\nimport random\r\nimport time\r\nimport warnings\r\nfrom collections import deque\r\nfrom typing import Any, Lite"
  },
  {
    "path": "spopt/locate/p_center.py",
    "chars": 18030,
    "preview": "# ruff: noqa: B009\n\nimport warnings\n\nimport numpy as np\nimport pulp\nfrom geopandas import GeoDataFrame\nfrom scipy.spatia"
  },
  {
    "path": "spopt/locate/p_dispersion.py",
    "chars": 12912,
    "preview": "# ruff: noqa: B009\n\nimport warnings\n\nimport numpy as np\nimport pulp\nfrom geopandas import GeoDataFrame\nfrom scipy.spatia"
  },
  {
    "path": "spopt/locate/p_median.py",
    "chars": 48072,
    "preview": "# ruff: noqa: B009, B010\n\nimport warnings\n\nimport numpy as np\nimport pulp\nfrom geopandas import GeoDataFrame\nfrom pointp"
  },
  {
    "path": "spopt/locate/util.py",
    "chars": 4898,
    "preview": "import itertools\nfrom collections.abc import Iterable\nfrom typing import Any\n\nimport geopandas\nimport numpy\nfrom shapely"
  },
  {
    "path": "spopt/region/__init__.py",
    "chars": 304,
    "preview": "from .azp import AZP\nfrom .base import w_to_g\nfrom .maxp import MaxPHeuristic\nfrom .random_region import RandomRegion, R"
  },
  {
    "path": "spopt/region/azp.py",
    "chars": 49852,
    "preview": "\"\"\"\nOpenshaw, S. and Rao, L. (1995). Algorithms for reengineering 1991 census geography.\nEnvironment and Planning A, 27("
  },
  {
    "path": "spopt/region/azp_util.py",
    "chars": 7299,
    "preview": "import abc\nimport math\nimport numbers\nimport random\n\nimport numpy as np\n\n\nclass AllowMoveStrategy(abc.ABC):\n    def star"
  },
  {
    "path": "spopt/region/base.py",
    "chars": 11863,
    "preview": "\"\"\"Base classes and functions for spopt/region\"\"\"\n\nimport copy\n\nimport libpysal\nimport networkx\nimport numpy\nfrom scipy."
  },
  {
    "path": "spopt/region/components.py",
    "chars": 4697,
    "preview": "\"\"\"\nChecking for connected components in a graph.\n\"\"\"\n\n__author__ = \"Sergio J. Rey <srey@asu.edu>\"\n\n\n__all__ = [\"check_c"
  },
  {
    "path": "spopt/region/csgraph_utils.py",
    "chars": 3996,
    "preview": "\"\"\"\nUtility functions for graph-related operations with sparse adjacency matrices\n(scipy.sparse.csr_matrix) using and su"
  },
  {
    "path": "spopt/region/maxp.py",
    "chars": 24980,
    "preview": "\"\"\"Max-p regions algorithm.\r\n\r\nSource: Wei, Ran, Sergio J. Rey, and Elijah Knaap (2020) \"Efficient\r\nregionalization for "
  },
  {
    "path": "spopt/region/objective_function.py",
    "chars": 5718,
    "preview": "import itertools\nfrom abc import ABC, abstractmethod\n\nimport numpy as np\n\nfrom spopt.region.util import get_metric_funct"
  },
  {
    "path": "spopt/region/random_region.py",
    "chars": 19371,
    "preview": "\"\"\"\nGenerate random regions.\n\nRandomly form regions given various types of constraints\non cardinality and composition.\n\""
  },
  {
    "path": "spopt/region/region_k_means.py",
    "chars": 5761,
    "preview": "\"\"\"\nRegion k-means\n\n\nK-means with the constraint that all clusters form a spatially connected component.\n\"\"\"\n\n__author__"
  },
  {
    "path": "spopt/region/sa3.py",
    "chars": 7878,
    "preview": "import numpy as np\nimport pandas as pd\nfrom libpysal import graph, weights\nfrom sklearn.cluster import AgglomerativeClus"
  },
  {
    "path": "spopt/region/skater.py",
    "chars": 19401,
    "preview": "# ruff: noqa: C408, B006, E731, N803, N806\n\nimport copy\nimport time\nimport warnings\nfrom collections import namedtuple\n\n"
  },
  {
    "path": "spopt/region/spenc.py",
    "chars": 8737,
    "preview": "# ruff: noqa: C408, B006, N806\n\n\nfrom ..BaseClass import BaseSpOptHeuristicSolver\nfrom .spenclib import SPENC\n\n\nclass Sp"
  },
  {
    "path": "spopt/region/spenclib/__init__.py",
    "chars": 29,
    "preview": "from .abstracts import SPENC\n"
  },
  {
    "path": "spopt/region/spenclib/abstracts.py",
    "chars": 28850,
    "preview": "# ruff: noqa: C408, B006, E731, N803, N806\n\nimport numpy as np\nimport scipy.sparse as spar\nimport sklearn.metrics as skm"
  },
  {
    "path": "spopt/region/spenclib/scores.py",
    "chars": 609,
    "preview": "# ruff: noqa: N803\n\nimport numpy as np\n\n\ndef boundary_fraction(W, labels):\n    \"\"\"\"\"\"\n    boundary = 0\n    for row, own_"
  },
  {
    "path": "spopt/region/spenclib/utils.py",
    "chars": 1135,
    "preview": "# ruff: noqa: N803\n\nfrom warnings import warn\n\nimport numpy as np\nimport scipy.sparse as sp\nimport scipy.sparse.csgraph "
  },
  {
    "path": "spopt/region/util.py",
    "chars": 29089,
    "preview": "import collections\nimport functools\nimport itertools\nimport random\nimport types\n\nimport networkx as nx\nimport numpy as n"
  },
  {
    "path": "spopt/region/ward.py",
    "chars": 2368,
    "preview": "# ruff: noqa: B006, C408\n\nfrom sklearn.cluster import AgglomerativeClustering\n\nfrom ..BaseClass import BaseSpOptHeuristi"
  },
  {
    "path": "spopt/tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "spopt/tests/conftest.py",
    "chars": 6272,
    "preview": "import pathlib\nimport pickle\nimport warnings\n\nimport geopandas\nimport numpy\nimport pandas\nimport pytest\nimport shapely\n\n"
  },
  {
    "path": "spopt/tests/test_locate/data/SF_demand_205_centroid_uniform_weight.csv",
    "chars": 24076,
    "preview": "\"\",\"OBJECTID\",\"ID\",\"NAME\",\"STATE_NAME\",\"AREA\",\"POP2000\",\"HOUSEHOLDS\",\"HSE_UNITS\",\"BUS_COUNT\",\"long\",\"lat\"\r\n\"1\",\"1\",\"0608"
  },
  {
    "path": "spopt/tests/test_locate/data/SF_network_distance_candidateStore_16_censusTract_205_new.csv",
    "chars": 150348,
    "preview": "distance,name,DestinationName,demand\r\n671.5733459664615,Store_1,060750479.01,6540\r\n1333.708062515136,Store_1,060750479.0"
  },
  {
    "path": "spopt/tests/test_locate/data/SF_store_site_16_longlat.csv",
    "chars": 862,
    "preview": "\"\",\"OBJECTID\",\"NAME\",\"long\",\"lat\"\r\n\"1\",\"1\",\"Store_1\",-122.510018182,37.7723636370001\r\n\"2\",\"2\",\"Store_2\",-122.488872727,3"
  },
  {
    "path": "spopt/tests/test_locate/data/example_subject_schools.csv",
    "chars": 2780,
    "preview": ",SE2 PP: Code,SE2 PP: PC,PL: Subject,Count,priority\n0,IOE00043,NW51RL,Mathematics,1,2.0\n1,IOE00044,NW11RX,Mathematics,1,"
  },
  {
    "path": "spopt/tests/test_locate/data/example_subject_student_school_journeys.csv",
    "chars": 190692,
    "preview": "student,school,time,message\r\n2,IOE00043,83,Walk to Garston (Herts) Rail Station THEN West Midlands Trains to Watford Jun"
  },
  {
    "path": "spopt/tests/test_locate/data/example_subject_students.csv",
    "chars": 628,
    "preview": ",ST: ID,ST: Term PC,ST: Allocation Priority,PL: Subject,Travel,time_allocation,allocation_school_id,allocation_school_po"
  },
  {
    "path": "spopt/tests/test_locate/test_c_p_median.py",
    "chars": 6789,
    "preview": "import numpy\nimport pulp\nimport pytest\n\nfrom spopt.locate import PMedian\nfrom spopt.locate.base import SpecificationErro"
  },
  {
    "path": "spopt/tests/test_locate/test_clscp-so.py",
    "chars": 3506,
    "preview": "# ruff: noqa: N999\nimport numpy\nimport pulp\nimport pytest\n\nfrom spopt.locate import LSCP\n\n\nclass TestSyntheticLocate:\n  "
  },
  {
    "path": "spopt/tests/test_locate/test_flow.py",
    "chars": 16384,
    "preview": "import os\r\nimport pickle\r\n\r\nimport numpy as np\r\nimport pandas as pd\r\nimport pulp\r\nimport pytest\r\nfrom numpy.testing impo"
  },
  {
    "path": "spopt/tests/test_locate/test_knearest_p_median.py",
    "chars": 5827,
    "preview": "import geopandas\nimport numpy\nimport pulp\nimport pytest\nfrom shapely import Point\n\nfrom spopt.locate.base import Specifi"
  },
  {
    "path": "spopt/tests/test_locate/test_locate_util.py",
    "chars": 2933,
    "preview": "import pytest\n\nfrom spopt.locate.util import simulated_geo_points\n\n\nclass TestSimulatedGeoPoints:\n    @pytest.fixture(au"
  },
  {
    "path": "spopt/tests/test_locate/test_lscp.py",
    "chars": 8246,
    "preview": "import geopandas\nimport numpy\nimport pulp\nimport pytest\n\nfrom spopt.locate import LSCP\nfrom spopt.locate.base import Fac"
  },
  {
    "path": "spopt/tests/test_locate/test_lscpb.py",
    "chars": 9459,
    "preview": "import geopandas\nimport numpy\nimport pulp\nimport pytest\n\nfrom spopt.locate import LSCPB\nfrom spopt.locate.base import Fa"
  },
  {
    "path": "spopt/tests/test_locate/test_mclp.py",
    "chars": 13060,
    "preview": "import geopandas\nimport numpy\nimport pulp\nimport pytest\n\nfrom spopt.locate import MCLP\nfrom spopt.locate.base import Fac"
  },
  {
    "path": "spopt/tests/test_locate/test_p_center.py",
    "chars": 8397,
    "preview": "import geopandas\nimport numpy\nimport pulp\nimport pytest\n\nfrom spopt.locate import PCenter\nfrom spopt.locate.base import "
  },
  {
    "path": "spopt/tests/test_locate/test_p_dispersion.py",
    "chars": 6695,
    "preview": "import geopandas\nimport numpy\nimport pulp\nimport pytest\n\nfrom spopt.locate import PDispersion\nfrom spopt.locate.base imp"
  },
  {
    "path": "spopt/tests/test_locate/test_p_median.py",
    "chars": 10094,
    "preview": "import geopandas\nimport numpy\nimport pulp\nimport pytest\n\nfrom spopt.locate import PMedian\nfrom spopt.locate.base import "
  },
  {
    "path": "spopt/tests/test_region/test_azp.py",
    "chars": 2271,
    "preview": "import geopandas\nimport libpysal\nimport numpy\n\nfrom spopt.region import AZP\n\nRANDOM_STATE = 123456\n\n# Mexican states\npth"
  },
  {
    "path": "spopt/tests/test_region/test_maxp.py",
    "chars": 6254,
    "preview": "import geopandas\nimport libpysal\nimport numpy\nimport pytest\nfrom shapely.geometry import box\n\nfrom spopt.region import M"
  },
  {
    "path": "spopt/tests/test_region/test_random_regions.py",
    "chars": 9616,
    "preview": "import geopandas\nimport libpysal\nimport numpy\nimport pytest\n\nfrom spopt.region import RandomRegion, RandomRegions\n\n# Emp"
  },
  {
    "path": "spopt/tests/test_region/test_region_k_means.py",
    "chars": 1958,
    "preview": "import libpysal\nimport numpy\nimport pandas\nimport pytest\n\nfrom spopt.region import RegionKMeansHeuristic\nfrom spopt.regi"
  },
  {
    "path": "spopt/tests/test_region/test_region_util.py",
    "chars": 3186,
    "preview": "import geopandas\nimport libpysal\nimport networkx\nimport numpy\nimport pytest\n\nimport spopt.region.util as util\n\nRANDOM_ST"
  },
  {
    "path": "spopt/tests/test_region/test_sa3.py",
    "chars": 5911,
    "preview": "import geopandas\nimport libpysal\nimport numpy\nimport pytest\nimport sklearn\nfrom packaging.version import Version\n\nfrom s"
  },
  {
    "path": "spopt/tests/test_region/test_skater.py",
    "chars": 7249,
    "preview": "import geopandas\nimport libpysal\nimport numpy\nimport pytest\nfrom scipy.optimize import OptimizeWarning\nfrom sklearn.metr"
  },
  {
    "path": "spopt/tests/test_region/test_spenc.py",
    "chars": 1074,
    "preview": "import geopandas\nimport libpysal\nimport numpy\n\nfrom spopt.region import Spenc\n\n# Empirical tests\nRANDOM_STATE = 123456\n#"
  },
  {
    "path": "spopt/tests/test_region/test_ward.py",
    "chars": 892,
    "preview": "import geopandas\nimport libpysal\nimport numpy\n\nfrom spopt.region import WardSpatial\n\n# Empirical tests -- Mexican states"
  }
]

// ... and 26 more files (download for full content)

About this extraction

This page contains the full source code of the pysal/spopt GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 135 files (39.0 MB), approximately 10.2M tokens, and a symbol index with 638 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!