From 4ed00d59520a3fdf5630ea72990fd128e3568e63 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 10:27:10 +0100 Subject: [PATCH 01/18] extra targets --- requirements.txt | 1 + setup.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index c5f3b34..32de2b2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ black joblib networkx>=2.6 numpy +pygraphviz scipy scikit-learn stackeddag diff --git a/setup.py b/setup.py index 6788a8a..f6569eb 100644 --- a/setup.py +++ b/setup.py @@ -54,8 +54,8 @@ def parse_requirements(filename): "Programming Language :: Python :: 3.9", ] EXTRAS_REQUIRE = { - "tests": ["pytest", "pytest-cov"], - "docs": ["sphinx", "sphinx-gallery", "sphinx_rtd_theme", "numpydoc", "matplotlib"], + tgt: parse_requirements(f"requirements_{tgt}.txt") + for tgt in ["test", "doc"] } setup( From 1766654fdf471ed4b07e22d384f27a6f16c19ac6 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 10:32:12 +0100 Subject: [PATCH 02/18] missing extra targets files --- requirements_doc.txt | 5 +++++ requirements_test.txt | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 requirements_doc.txt create mode 100644 requirements_test.txt diff --git a/requirements_doc.txt b/requirements_doc.txt new file mode 100644 index 0000000..4818857 --- /dev/null +++ b/requirements_doc.txt @@ -0,0 +1,5 @@ +matplotlib +numpydoc +sphinx +sphinx-gallery +sphinx_rtd_theme diff --git a/requirements_test.txt b/requirements_test.txt new file mode 100644 index 0000000..9955dec --- /dev/null +++ b/requirements_test.txt @@ -0,0 +1,2 @@ +pytest +pytest-cov From a09dcc544ce63fed6d84a21a721592c3528bef49 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 11:10:49 +0100 Subject: [PATCH 03/18] appveyor config --- appveyor.yml | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 9bea293..d33f694 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,28 +2,19 @@ build: false environment: matrix: - - PYTHON: "C:\\Miniconda3-x64" - PYTHON_VERSION: "3.8.x" - PYTHON_ARCH: "64" - NUMPY_VERSION: "*" - SCIPY_VERSION: "*" - SKLEARN_VERSION: "*" + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 + APPVEYOR_YML_DISABLE_PS_LINUX: true + - APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu + APPVEYOR_YML_DISABLE_PS_LINUX: true + - APPVEYOR_BUILD_WORKER_IMAGE: macOS + APPVEYOR_YML_DISABLE_PS_LINUX: true - - PYTHON: "C:\\Miniconda3-x64" - PYTHON_VERSION: "3.9.x" - PYTHON_ARCH: "64" - NUMPY_VERSION: "*" - SCIPY_VERSION: "*" - SKLEARN_VERSION: "*" +stack: python 3.8 install: - # Prepend miniconda installed Python to the PATH of this build - # Add Library/bin directory to fix issue - # https://github.com/conda/conda/issues/1753 - - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PYTHON%\\Library\\bin;%PATH%" - # install the dependencies - - "conda install --yes -c conda-forge pip numpy==%NUMPY_VERSION% scipy==%SCIPY_VERSION% scikit-learn==%SKLEARN_VERSION%" - - pip install codecov nose pytest pytest-cov + - pip install -r requirements.txt + - pip install -r requirements_test.txt + - pip install -r requirements_doc.txt - pip install . test_script: @@ -32,6 +23,6 @@ test_script: - pytest -v --cov=skdag --pyargs skdag after_test: - - cp .coverage %APPVEYOR_BUILD_FOLDER% - - cd %APPVEYOR_BUILD_FOLDER% + - cp .coverage ${APPVEYOR_BUILD_FOLDER} + - cd ${APPVEYOR_BUILD_FOLDER} - codecov From edb896dd617e1f8e40b9cd4ecdd90847f1fb931a Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 11:12:54 +0100 Subject: [PATCH 04/18] appveyor config --- appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index d33f694..2ddcbb0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,8 +2,6 @@ build: false environment: matrix: - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - APPVEYOR_YML_DISABLE_PS_LINUX: true - APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu APPVEYOR_YML_DISABLE_PS_LINUX: true - APPVEYOR_BUILD_WORKER_IMAGE: macOS From 3480dda1fbae0fe935959bd2d35c947673d9f927 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 11:43:42 +0100 Subject: [PATCH 05/18] project badges --- .travis.yml | 46 ---------------------------------------------- README.rst | 14 ++++---------- 2 files changed, 4 insertions(+), 56 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 506ea59..0000000 --- a/.travis.yml +++ /dev/null @@ -1,46 +0,0 @@ -dist: trusty -sudo: false - -language: python - -cache: - directories: - - $HOME/.cache/pip - -matrix: - include: - - env: PYTHON_VERSION="3.8" NUMPY_VERSION="*" SCIPY_VERSION="*" - SKLEARN_VERSION="nightly" - - env: PYTHON_VERSION="3.9" NUMPY_VERSION="*" SCIPY_VERSION="*" - SKLEARN_VERSION="nightly" - -install: - # install miniconda - - deactivate - - wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh - - MINICONDA_PATH=/home/travis/miniconda - - chmod +x miniconda.sh && ./miniconda.sh -b -p $MINICONDA_PATH - - export PATH=$MINICONDA_PATH/bin:$PATH - - conda update --yes conda - # create the testing environment - - conda create -n testenv --yes python=$PYTHON_VERSION pip - - source activate testenv - - | - if [ $SKLEARN_VERSION = "nightly" ]; then - conda install --yes -c conda-forge numpy==$NUMPY_VERSION scipy==$SCIPY_VERSION - # install nightly wheels - pip install --pre -f https://sklearn-nightly.scdn8.secure.raxcdn.com scikit-learn - else - conda install --yes -c conda-forge numpy==$NUMPY_VERSION scipy==$SCIPY_VERSION scikit-learn==$SKLEARN_VERSION - fi - - pip install codecov cython nose pytest pytest-cov - - pip install . - -script: - - pytest -v doc/*rst - - mkdir for_test - - cd for_test - - pytest -v --cov=skdag --pyargs skdag - -after_success: - - codecov diff --git a/README.rst b/README.rst index 7dbd8d1..7757c56 100644 --- a/README.rst +++ b/README.rst @@ -1,18 +1,12 @@ .. -*- mode: rst -*- -|Travis|_ |AppVeyor|_ |Codecov|_ |CircleCI|_ |ReadTheDocs|_ +|AppVeyor|_ |Codecov|_ |ReadTheDocs|_ -.. |Travis| image:: https://travis-ci.org/scikit-learn-contrib/project-template.svg?branch=master -.. _Travis: https://travis-ci.org/scikit-learn-contrib/project-template - -.. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/coy2qqaqr1rnnt5y/branch/master?svg=true -.. _AppVeyor: https://ci.appveyor.com/project/glemaitre/project-template +.. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/github/big-o/skdag?branch=main&svg=true +.. _AppVeyor: https://ci.appveyor.com/project/big-o/skdag .. |Codecov| image:: https://codecov.io/gh/scikit-learn-contrib/project-template/branch/master/graph/badge.svg -.. _Codecov: https://codecov.io/gh/scikit-learn-contrib/project-template - -.. |CircleCI| image:: https://circleci.com/gh/scikit-learn-contrib/project-template.svg?style=shield&circle-token=:circle-token -.. _CircleCI: https://circleci.com/gh/scikit-learn-contrib/project-template/tree/master +.. _Codecov: https://codecov.io/gh/big-o/skdag .. |ReadTheDocs| image:: https://readthedocs.org/projects/skdag/badge/?version=latest .. _ReadTheDocs: https://skdag.readthedocs.io/en/latest/?badge=latest From 26470c26b7bc65495943675bb302de8946e69fac Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 11:49:01 +0100 Subject: [PATCH 06/18] project badges --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 7757c56..42475df 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ .. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/github/big-o/skdag?branch=main&svg=true .. _AppVeyor: https://ci.appveyor.com/project/big-o/skdag -.. |Codecov| image:: https://codecov.io/gh/scikit-learn-contrib/project-template/branch/master/graph/badge.svg +.. |Codecov| image:: https://codecov.io/gh/big-o/skdag/branch/main/graph/badge.svg .. _Codecov: https://codecov.io/gh/big-o/skdag .. |ReadTheDocs| image:: https://readthedocs.org/projects/skdag/badge/?version=latest From fbe039d119e9330491d1681fb4e7eec7fb97d6f2 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 11:55:56 +0100 Subject: [PATCH 07/18] graphviz dependencies --- appveyor.yml | 1 + doc/quick_start.rst | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 2ddcbb0..25d6b88 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,6 +10,7 @@ environment: stack: python 3.8 install: + - apt install graphviz graphviz-dev - pip install -r requirements.txt - pip install -r requirements_test.txt - pip install -r requirements_doc.txt diff --git a/doc/quick_start.rst b/doc/quick_start.rst index 29d1498..b73fa8f 100644 --- a/doc/quick_start.rst +++ b/doc/quick_start.rst @@ -5,6 +5,22 @@ Quick Start with skdag The following tutorial shows you how to write some simple directed acyclic graphs (DAGs) with ``skdag``. +Installation +============ + +Installing skdag is simple: + +.. code:: bash + + pip install skdag + +Note that to visualise graphs you need to install the graphviz libraries too. Here's how +to do this in Ubuntu: + +.. code:: bash + + sudo apt install graphviz graphviz-dev + Creating your own scikit-learn contribution package =================================================== From f74acbf5030ff887ac2ad2578f587b0ae8276c23 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 12:10:50 +0100 Subject: [PATCH 08/18] graphviz dependencies --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 25d6b88..05c5eac 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,7 +10,7 @@ environment: stack: python 3.8 install: - - apt install graphviz graphviz-dev + - sudo apt install graphviz graphviz-dev - pip install -r requirements.txt - pip install -r requirements_test.txt - pip install -r requirements_doc.txt From 88d5626da10bb88ee7e806e5bf02c565e0265f86 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 12:12:38 +0100 Subject: [PATCH 09/18] graphviz dependencies --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 05c5eac..ff6d7b1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,7 +10,7 @@ environment: stack: python 3.8 install: - - sudo apt install graphviz graphviz-dev + - sudo apt install -y graphviz graphviz-dev - pip install -r requirements.txt - pip install -r requirements_test.txt - pip install -r requirements_doc.txt From fcdb4dae43828e21896046f58e4fd350ac675618 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 13:29:20 +0100 Subject: [PATCH 10/18] appveyor config --- appveyor.yml | 17 +++++++++++------ doc/user_guide.rst | 23 +++++++++++++++++++++++ skdag/dag/_dag.py | 2 +- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index ff6d7b1..0965507 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,12 +9,17 @@ environment: stack: python 3.8 -install: - - sudo apt install -y graphviz graphviz-dev - - pip install -r requirements.txt - - pip install -r requirements_test.txt - - pip install -r requirements_doc.txt - - pip install . +install: | + if [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" -eq "Ubuntu" ]]; then + sudo apt install -y graphviz graphviz-dev + else + brew install -y graphviz + fi + pip install --upgrade pip + pip install -r requirements.txt + pip install -r requirements_test.txt + pip install -r requirements_doc.txt + pip install . test_script: - mkdir for_test diff --git a/doc/user_guide.rst b/doc/user_guide.rst index 4f3b5bc..5c40b9d 100644 --- a/doc/user_guide.rst +++ b/doc/user_guide.rst @@ -163,6 +163,10 @@ the next step(s). Note that the passthrough is not strictly necessary but it is convenient as it ensures the stack has a single entry point, which makes it simpler to use. +The DAG infers that :meth:`predict` should be called for the two intermediate +estimators. Our meta-estimator is then simply taking in prediction for each classifier +as its input features. + As we can now see, the stacking ensemble method gives us a boost in performance: .. code-block:: python @@ -174,6 +178,25 @@ As we can now see, the stacking ensemble method gives us a boost in performance: >>> svr.score(X_test, y_test) 0.128... +Note that for binary classifiers you probably need to specify that only the positive +class probability is used as input by the meta-estimator. The DAG will automatically +infer that :meth:`predict_proba` should be called, but you will need to manually tell +the DAG which column to take. To do this, you can simply specify your step dependencies +as a dictionary of step name to column indices instead: + +.. code:: python + + >>> from sklearn.ensemble import RandomForestClassifier + >>> from sklearn.svm import SVC + >>> clf_stack = ( + ... DAGBuilder() + ... .add_step("pass", "passthrough") + ... .add_step("rf", RandomForestClassifier(), deps=["pass"]) + ... .add_step("svr", SVC(), deps=["pass"]) + ... .add_step("meta", LinearRegression(), deps={"rf": 1, "svc": 1}]) + ... .make_dag() + ... ) + Stacking works best when a diverse range of algorithms are used to provide predictions, which are then fed into a very simple meta-estimator. To minimize overfitting, cross-validation should be considered when using stacking. \ No newline at end of file diff --git a/skdag/dag/_dag.py b/skdag/dag/_dag.py index a6e5266..cd1d1a2 100644 --- a/skdag/dag/_dag.py +++ b/skdag/dag/_dag.py @@ -1266,7 +1266,7 @@ def draw( from IPython import get_ipython rich = type(get_ipython()).__name__ == "ZMQInteractiveShell" - except NameError: + except (ModuleNotFoundError, NameError): rich = False format = "svg" if rich else "txt" From 3e4e9366b390c0689c0a1423d0b068b94f873927 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 15:19:59 +0100 Subject: [PATCH 11/18] safe indexing fix --- skdag/dag/_dag.py | 40 +++++++++++++++++++++---------------- skdag/dag/tests/test_dag.py | 15 +++++++------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/skdag/dag/_dag.py b/skdag/dag/_dag.py index cd1d1a2..f9c7489 100644 --- a/skdag/dag/_dag.py +++ b/skdag/dag/_dag.py @@ -28,6 +28,19 @@ __all__ = ["DAG", "DAGStep"] +def _stack_inputs(X, node): + cols = [_safe_indexing(X[dep], node.deps[dep], axis=1) for dep in node.deps] + X_stacked = _stack( + [ + col.reshape(-1, 1) if col is not None and col.ndim < 2 else col + for col in cols + ], + axis=node.axis, + ) + + return X_stacked + + def _transform_one(transformer, X, weight, allow_predictor=True, **fit_params): if _is_passthrough(transformer): res = X @@ -74,10 +87,12 @@ def _fit_transform_one( elif hasattr(transformer, "transform"): res = transformer.fit(X, y, **fit_params).transform(X) elif allow_predictor: - if hasattr(transformer, "fit_predict"): - res = transformer.fit_predict(X, y, **fit_params) - elif hasattr(transformer, "predict"): - res = transformer.fit(X, y, **fit_params).predict(X) + for fn in ["predict_proba", "decision_function", "predict"]: + if hasattr(transformer, fn): + res = getattr(transformer.fit(X, y, **fit_params), fn)(X) + if res.ndim < 2: + res = res.reshape(-1, 1) + break else: failed = True res = None @@ -128,10 +143,7 @@ def _parallel_fit(dag, step, Xin, Xs, y, fit_transform_fn, memory, **fit_params) transformer = step.estimator if step.deps: - X = _stack( - [_safe_indexing(Xs[dep], step.deps[dep], axis=1) for dep in step.deps], - axis=step.axis, - ) + X = _stack_inputs(Xs, step) else: # For root nodes, the destination rather than the source is # specified. @@ -166,10 +178,7 @@ def _parallel_fit(dag, step, Xin, Xs, y, fit_transform_fn, memory, **fit_params) def _parallel_transform(dag, step, Xin, Xs, transform_fn, **fn_params): transformer = step.estimator if step.deps: - X = _stack( - [_safe_indexing(Xs[dep], step.deps[dep], axis=1) for dep in step.deps], - axis=step.axis, - ) + X = _stack_inputs(Xs, step) else: # For root nodes, the destination rather than the source is # specified. @@ -198,7 +207,7 @@ def _parallel_fit_leaf(dag, leaf, Xts, y, **fit_params): if leaf.estimator == "passthrough": fitted_estimator = leaf.estimator else: - Xt = _stack([Xts[dep] for dep in leaf.deps], axis=leaf.axis) + Xt = _stack_inputs(Xts, leaf) fitted_estimator = leaf.estimator.fit(Xt, y, **fit_params) return fitted_estimator @@ -208,10 +217,7 @@ def _parallel_execute( dag, leaf, fn, Xts, y=None, fit_first=False, fit_params=None, fn_params=None ): with _print_elapsed_time("DAG", dag._log_message(leaf)): - Xt = _stack( - [_safe_indexing(Xts[dep], leaf.deps[dep], axis=1) for dep in leaf.deps], - axis=leaf.axis, - ) + Xt = _stack_inputs(Xts, leaf) fit_params = fit_params or {} fn_params = fn_params or {} if leaf.estimator == "passthrough": diff --git a/skdag/dag/tests/test_dag.py b/skdag/dag/tests/test_dag.py index 1ab83d8..44fa883 100644 --- a/skdag/dag/tests/test_dag.py +++ b/skdag/dag/tests/test_dag.py @@ -17,10 +17,11 @@ from sklearn.linear_model import LinearRegression from sklearn.feature_selection import SelectKBest, f_classif from sklearn.decomposition import PCA -from sklearn.datasets import load_iris +from sklearn import datasets from sklearn.ensemble import RandomForestClassifier -iris = load_iris() +iris = datasets.load_iris() +cancer = datasets.load_breast_cancer() JUNK_FOOD_DOCS = ( "the pizza pizza beer copyright", @@ -221,8 +222,8 @@ def test_dag_raise_set_params_error(): def test_dag_stacking_pca_svm_rf(): # Test the various methods of the pipeline (pca + svm). - X = iris.data - y = iris.target + X = cancer.data + y = cancer.target # Build a simple model stack with some preprocessing. pca = PCA(svd_solver="full", n_components="mle", whiten=True) svc = SVC(probability=True, random_state=0) @@ -234,13 +235,13 @@ def test_dag_stacking_pca_svm_rf(): .add_step("pca", pca) .add_step("svc", svc, deps=["pca"]) .add_step("rf", rf, deps=["pca"]) - .add_step("log", log, deps=["svc", "rf"]) + .add_step("log", log, deps={"svc": 1, "rf": 1}) .make_dag() ) dag.fit(X, y) - prob_shape = len(iris.target), len(iris.target_names) - tgt_shape = iris.target.shape + prob_shape = len(cancer.target), len(cancer.target_names) + tgt_shape = cancer.target.shape assert dag.predict_proba(X).shape == prob_shape assert dag.predict(X).shape == tgt_shape From 1ba5691626e7dc4219f1ee8b3701ee269eb68657 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 15:30:10 +0100 Subject: [PATCH 12/18] appveyor config --- appveyor.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 0965507..a29ea84 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,9 +10,9 @@ environment: stack: python 3.8 install: | - if [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" -eq "Ubuntu" ]]; then + if [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "Ubuntu" ]]; then sudo apt install -y graphviz graphviz-dev - else + elif [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "macOS" ]]; then brew install -y graphviz fi pip install --upgrade pip @@ -29,4 +29,6 @@ test_script: after_test: - cp .coverage ${APPVEYOR_BUILD_FOLDER} - cd ${APPVEYOR_BUILD_FOLDER} - - codecov + - curl -Os https://uploader.codecov.io/latest/linux/codecov + - chmod +x codecov + - ./codecov From 456d401051f7b6e77bb2f83590eafda9eeb42659 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 15:38:24 +0100 Subject: [PATCH 13/18] appveyor config --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index a29ea84..03ed02e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,7 @@ install: | if [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "Ubuntu" ]]; then sudo apt install -y graphviz graphviz-dev elif [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "macOS" ]]; then - brew install -y graphviz + brew install graphviz fi pip install --upgrade pip pip install -r requirements.txt From 231a73cded3ef5e9a81e82775d709b82310c55ea Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 15:53:15 +0100 Subject: [PATCH 14/18] appveyor config --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 03ed02e..34eb0e5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,6 +13,7 @@ install: | if [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "Ubuntu" ]]; then sudo apt install -y graphviz graphviz-dev elif [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "macOS" ]]; then + brew update brew install graphviz fi pip install --upgrade pip From 4742fdbad12ec92002f9d8651dc05b9438253676 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 15:54:06 +0100 Subject: [PATCH 15/18] appveyor config --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 34eb0e5..f1d51d5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,7 +11,7 @@ stack: python 3.8 install: | if [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "Ubuntu" ]]; then - sudo apt install -y graphviz graphviz-dev + sudo apt install -y graphviz libgraphviz-dev elif [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "macOS" ]]; then brew update brew install graphviz From a3e430a9bc3c7972a2a5fb40c36df1df2ad4cca8 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 15:55:06 +0100 Subject: [PATCH 16/18] appveyor config --- appveyor.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f1d51d5..0a62493 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,10 +11,11 @@ stack: python 3.8 install: | if [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "Ubuntu" ]]; then - sudo apt install -y graphviz libgraphviz-dev + sudo apt update + sudo apt install -y graphviz libgraphviz-dev elif [[ "${APPVEYOR_BUILD_WORKER_IMAGE}" == "macOS" ]]; then - brew update - brew install graphviz + brew update + brew install graphviz fi pip install --upgrade pip pip install -r requirements.txt From da05fd26ffea854d2cf1ef5bbee9c72daec9cc75 Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 16:16:21 +0100 Subject: [PATCH 17/18] appveyor config --- appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 0a62493..769b6c3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,8 +4,6 @@ environment: matrix: - APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu APPVEYOR_YML_DISABLE_PS_LINUX: true - - APPVEYOR_BUILD_WORKER_IMAGE: macOS - APPVEYOR_YML_DISABLE_PS_LINUX: true stack: python 3.8 From 621cd8ff1c94acff586ae6ca727f1375d3beb61b Mon Sep 17 00:00:00 2001 From: big-o Date: Sun, 31 Jul 2022 16:27:04 +0100 Subject: [PATCH 18/18] rtd config --- .readthedocs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 228fc8a..29aec1e 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -4,5 +4,5 @@ requirements_file: requirements.txt python: pip_install: true extra_requirements: - - tests - - docs + - test + - doc