Skip to content

Commit dff4a62

Browse files
authored
V3: complete overhaul (#372)
* Remove redundant definitions * Use new syntax for CMI examples * Documentation examples * Docs... * References from ComplexityMeasures.jl * Rearrange docs * More docs * Discretization using `CosineSimilarityBinning` * Delete example system docs * Docs for core * Migrate conditional entropy examples * Missing @docs tag * More docs * Docs * Remove some text * Fix `SurrogateAssociationTest` for transfer entropy * Fix various transfer entropy related issues and docs * Add compatible `OutcomeSpace`s to docstring * More transfer entropy tests * Test `Lindner` * New API * New API for cross mappings (estimators contain measure) * More docs * New syntax * Include closeness and cross mapping files * Some doc restructuring * Include relevant deprecations * correct field name * Fix crossmap doc example * Add explicit error messages * Changelog for cross mappings * More "deprecations" * update changelog * Move utility method to relevant file * Remove obsolete tests * Remove duplicated header * Explicit imports * Make formal API * Add note on measures defines also in Distances.jl * Reintroduce correlation measures * Correlation API * Move counting and discretization to information measures * Crossmap API * Correlation examples * Reintroduce closeness measures * Reintroduce JointDistanceDistributionTest * Adhere to latest ComplexityMeasures api * WIP * Don't run compathelper so often * Fix some missing refs * Temporarily use local `build_docs_with_style` * Start reorganizing docs mirroring ComplexityMeasures.jl * docs * Move crossmap api * Aim for 1.11 while developing (tests/docs build faster) * WIP: docs... * wip: Unify syntax, better docs, etc.. * Update docs * WIP... * Preserve axis information when taking marginals * Add coverage files to gitignore * deprecations * deprecations * Multidimensional surrogates * Fix import * Headers * Add reference * Refer to abstract types * deprecations * WIP... * organize a bit better * update const name * move to utils * Use cov/cor from StateSpaceSets 1.5 * Update package versions, add StyledStrings and set julia to 1.10 * Remove redundant tests * fix tests... * fix tests * fix tests * Typo * Convenience union * Remove unnecessary print * Fix syntax * Update changelog * Fix tests * faster tests with fewer sample * fix tests * cosmetics * input validation * cosmetics * remove integration * remove redundant ContingencyMatrix * Add test dep * Test systems * update deps * clean up main file * remove redundant test * test cross mapping independence tests * Fix tests * remove redundant file * Faster tests using fewer samples * Fewer samples -> faster tests * input checks for all information measures * fix tests and faster tests * faster tests * Fix reference * Part mutual information tests * fix discretization for 1d state space sets * pmi tests and fix implementation * more tests * remove dev deps from project * fewer samples, faster tests * Remove unnecessary deps from doc build * LabelledArrays is needed * Fix example * Fix OCE and PC * Consistent syntax * Necessary imports * consistent syntax * Reintroduce network graph tests * Reintroduce example for graphs * improve figures * update docs * fix tests and remove outdated syntax * less samples, faster tests * actually test recurrence-based methods * more crossmap tests * use rng * correct syntax * use rng * EntropyDecomposition tests * Fix tests * Un-support `TransferOperator` estimation of transfer entropy * type parameterize outcome spaces, so we can dispatch properly * Fix transfer entropy estimation using TransferOperator * Generic dispatch for codifying marginals New outcome spaces that implements `codify` now works automagically. * node labels * Examples * Add estimator to docstring * more examples * fix test * remove reference to convenience func * More examples * More examples * examples for joint entropy * Add more examples * Update docs and test * Update tests * Keep important info in docstrings * Clean-up * Add tests * Add comments for clarity * Clean up docs * Clean up docs * Polish cross-map docs * fix references * typo * Clean cross mapping stuff * rng * Cross map docs * ccm docs * missing references * Clean up cross map stuff Also DO export the predict and crossmap methods. * Clean up index.md * cross map stuff * add missing reference * fix codify method * add conversion method * add method for JointProbabilities * Add Hilbert * add tests * docs.. * test coverage for MCR and RMCD * remove redundant code * remove redundant docstring * Add hilbert rerference in docs * Example and docs for recurrence measures * Remove redundant docs * Rename * docs * fix tutorial * Fix examples * SymbolicTransferEntropy convenience * Fix docs * Better example * typo * Test `SymbolicTransferEntropy` * test coverage * more tests * More tests * tests * remove reference to deleted file * tests... * more tests * todo * bbnue.. wip * wip.. * outer constructor * remove deprecations * remove methods not finished yet * fewer samples, faster tests * Remove not finished bbnue * remove unfinished code * duplicate call * remove unfinished code * add tests * remove unused methods * more tests * remove unfinished code * Alias * include forgotten test file * remove unfinished code * Remember to export * more tests * remove redundant code * explicit access * remember to export * more efficient TE tests for independence * Don't use deprecated syntax * Error throwing handled at higher level * More test coverage * More tests * fix test * add rng to test * Remove redundant code * remove redundant utils * more tests * pretty printing * better printing of decomposition estimators * short-form printing * typo * more tests * clean up @show statements * remove redundant code * more tests * more tests * Reorganize * Docs. * docs... * doc fixes... * Fix doc warnings.. * Eliminate documentation warnings * Add DocumenterInterLinks * docs.. * finalize docs * codify for multiple outcome spaces * Add note * enable breaking docs on fails again * fix broken link * remove empty file
1 parent 506b684 commit dff4a62

File tree

396 files changed

+11626
-16747
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

396 files changed

+11626
-16747
lines changed

.github/workflows/CompatHelper.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: CompatHelper
22

33
on:
44
schedule:
5-
- cron: '00 * * * *'
5+
- cron: '00 8 * * *'
66

77
jobs:
88
CompatHelper:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ Manifest.toml
1212
*.scss
1313
*.css
1414
vscode/*
15+
*.cov

Project.toml

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name = "CausalityTools"
22
uuid = "5520caf5-2dd7-5c5d-bfcb-a00e56ac49f7"
33
authors = ["Kristian Agasøster Haaga <[email protected]>", "Tor Einar Møller <[email protected]>", "George Datseris <[email protected]>"]
44
repo = "https://github.com/kahaaga/CausalityTools.jl.git"
5-
version = "2.10.1"
5+
version = "3.0.0"
66

77
[deps]
88
Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
@@ -12,10 +12,9 @@ DSP = "717857b8-e6f2-59f4-9121-6e50c889abd2"
1212
DelayEmbeddings = "5732040d-69e3-5649-938a-b6b4f237613f"
1313
Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7"
1414
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
15-
DynamicalSystemsBase = "6e36e845-645a-534a-86f2-f5d4aa5a06b4"
1615
Graphs = "86223c79-3864-5bf0-83f7-82e725a168b6"
1716
HypothesisTests = "09f84164-cd44-5f33-b23f-e6b0d136a0d5"
18-
LabelledArrays = "2ee39098-c373-598a-b85f-a56591580800"
17+
LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
1918
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
2019
NearestNeighbors = "b8a86587-4115-5ab1-83bc-aa920d37bbce"
2120
Neighborhood = "645ca80c-8b79-4109-87ea-e1f58159d116"
@@ -24,37 +23,34 @@ Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
2423
RecurrenceAnalysis = "639c3291-70d9-5ea2-8c5b-839eba1ee399"
2524
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
2625
Scratch = "6c6a2e73-6563-6170-7368-637461726353"
27-
SimpleDiffEq = "05bca326-078c-5bf0-a5bf-ce7c7982d7fd"
2826
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
2927
StateSpaceSets = "40b095a5-5852-4c12-98c7-d43bf788e795"
3028
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
3129
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
3230
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
33-
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
31+
StyledStrings = "f489334b-da3d-4c2e-b8f0-e476e12c162b"
3432
TimeseriesSurrogates = "c804724b-8c18-5caa-8579-6025a0767c70"
3533

3634
[compat]
3735
Accessors = "^0.1.28"
3836
Combinatorics = "1"
39-
ComplexityMeasures = "2 - 2.8"
40-
DSP = "0.7"
37+
ComplexityMeasures = "3.6.5"
38+
DSP = "^0.7"
4139
DelayEmbeddings = "2.7"
4240
Distances = "^0.10"
43-
Distributions = "^0.24, 0.25"
44-
DynamicalSystemsBase = "3"
41+
Distributions = "^0.25"
4542
Graphs = "^1.8"
46-
HypothesisTests = "0.8, 1, 0.10, 0.11"
47-
LabelledArrays = "1.6.7"
48-
NearestNeighbors = "0.4"
49-
Neighborhood = "0.2.2"
43+
HypothesisTests = "^0.11"
44+
NearestNeighbors = "^0.4"
45+
Neighborhood = "^0.2.4"
5046
ProgressMeter = "1.7"
5147
RecurrenceAnalysis = "2"
52-
Reexport = "0.2, 1"
48+
Reexport = "1"
5349
Scratch = "1"
54-
SimpleDiffEq = "^1"
5550
SpecialFunctions = "2"
56-
StateSpaceSets = "^1.4"
51+
StateSpaceSets = "^1.5"
5752
StaticArrays = "^1"
58-
StatsBase = "^0.33, 0.34"
59-
TimeseriesSurrogates = "2.5"
60-
julia = "^1.6"
53+
StatsBase = "^0.34"
54+
StyledStrings = "1"
55+
TimeseriesSurrogates = "2.6"
56+
julia = "^1.10"

README.md

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,28 @@
66
[![codecov](https://codecov.io/gh/JuliaDynamics/CausalityTools.jl/branch/master/graph/badge.svg?token=0b71n6x6AP)](https://codecov.io/gh/JuliaDynamics/CausalityTools.jl)
77
[![DOI](https://zenodo.org/badge/135443027.svg)](https://zenodo.org/badge/latestdoi/135443027)
88

9-
CausalityTools.jl is a package for quantifying associations and dynamical coupling
10-
between datasets, independence testing and causal inference.
9+
CausalityTools.jl is a package for quantifying associations, independence testing and causal inference.
1110

1211
All further information is provided in the
1312
[documentation](https://juliadynamics.github.io/CausalityTools.jl/dev), which you can either
1413
find online or build locally by running the `docs/make.jl` file.
1514

1615
## Key features
1716

18-
- Association measures from conventional statistics, information theory and dynamical
19-
systems theory, for example distance correlation, mutual information, transfer entropy,
20-
convergent cross mapping and a lot more!
21-
- A dedicated API for independence testing, which comes with automatic compatibility with
22-
every measure-estimator combination you can think of. For example, we offer the generic
23-
`SurrogateTest`, which is fully compatible with
24-
[TimeseriesSurrogates.jl](https://github.com/JuliaDynamics/TimeseriesSurrogates.jl),
25-
and the `LocalPermutationTest` for conditional indepencence testing.
26-
- A dedicated API for causal network inference based on these measures and independence
27-
tests.
17+
- **Association API**: includes measures and their estimators for pairwise, conditional and other forms of
18+
association from conventional statistics, from dynamical systems theory, and from information theory: partial correlation, distance correlation, (conditional) mutual information, transfer entropy, convergent cross mapping and a lot more!
19+
- **Independence testing API**, which is automatically compatible with
20+
every association measure estimator implemented in the package.
21+
- **Causal (network) inference API** integrating the association measures and independence testing framework.
22+
23+
## Addititional features
24+
25+
Extending on features from [ComplexityMeasures.jl](https://github.com/JuliaDynamics/ComplexityMeasures.jl),
26+
we also offer
27+
28+
- Discretization API for multiple (multivariate) input datasets.
29+
- Multivariate counting and probability estimation API.
30+
- Multivariate information measure API
2831

2932
## Installation
3033

changelog.md

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,70 @@
11
# Changelog
22

3+
## 3.0 (new major release)
4+
5+
This release contains several breaking changes. Any code from before v3.0 will need
6+
updating to continue working with v3.0.
7+
8+
The main reason for these breaking changes is that estimators now store the
9+
definitions they estimate. This way, we reduce the amount of code we have to write
10+
maintain, document and test. At the same time, we hope it is a bit more user-friendly
11+
to only relate to "one way of thinking" about estimating association measures.
12+
13+
### Breaking changes
14+
15+
#### Association measures
16+
17+
- The function `association(measure_or_est, input_data...)` is the central function that computes
18+
all association measures. The first argument is either a measure definition (if it has no
19+
estimator), or an estimator. This means that if `input_data` consists of two input datasets,
20+
then a pairwise association is estimated. If `input_data` consists of three input datasets, then typically a conditional association is estimated (but exceptions are possible).
21+
22+
#### Independence testing
23+
24+
- `SurrogateTest` is now `SurrogateAssociationTest`
25+
- `SurrogateTestResult` is now `SurrogateAssociationTestResult`
26+
27+
#### Example systems
28+
29+
- All example systems are removed.
30+
31+
#### Crossmap API
32+
33+
The crossmap API has been overhauled.
34+
35+
- `CrossmapEstimator`s now take the `CrossmapMeasure` definition as their first argument.
36+
For example, you'll have to do `ExpandingSegment(CCM(); libsizes = 10:10:50)` instead
37+
of `ExpandingSegment(; libsizes = 10:10:50)`.
38+
39+
#### Information API
40+
41+
The information API has been overhauled.
42+
43+
- Multivariate information measures now store their parameters explicitly, instead
44+
of using `ComplexityMeasures.EntropyDefinition` to do so. For example, to
45+
define Shannon-type conditional mutual information, one should do
46+
`CMIShannon(base = 2)` instead of `CMIShannon(Shannon(base = 2))`.
47+
- New generic discrete estimator `JointDistribution` for estimating multivariate
48+
information measures. This estimators explicitly computes the joint distribution
49+
based on the given discretization, and can be applied to any measure which is
50+
defined as a function of a joint distribution.
51+
- New generic decomposition-based estimator `EntropyDecomposition`. This estimator
52+
computes some multivariate information measure by rewriting the measure definition
53+
as a combination of some lower-level measure. For example, `CMIShannon` can be
54+
rewritten as a sum of `Shannon` entropies. Each of these terms can then
55+
be estimated using some differential entropy estimator, e.g. `ZhuSingh` or `Kraskov`.
56+
- New generic decomposition-based estimator `MIDecomposition`. This estimator
57+
computes some multivariate information measure by rewriting the measure definition
58+
as a combination of some mutual information measure.
59+
- New generic decomposition-based estimator `CMIDecomposition`. This estimator
60+
computes some multivariate information measure by rewriting the measure definition
61+
as a combination of some conditional mutual information measure.
62+
63+
### Bux fixes
64+
65+
- There was an error in the implementation of `PartMutualInformation`. It is now fixed using explicit loops for computing the measures from a probability distribution.
66+
67+
368
## 2.10
469

570
- Progress bars in some independence tests (surrogate, local permutation) can be
@@ -78,7 +143,7 @@ indices).
78143
- Bugfix for `OCE` for certain conditional variable cases.
79144
- Improve docstring for `OCE`.
80145
- Updated readme.
81-
- Fixed bug related to `DifferentialEntropyEstimator` "unit" conversion.
146+
- Fixed bug related to `DifferentialInfoEstimator` "unit" conversion.
82147

83148
## 2.0
84149

docs/Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
[deps]
2-
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
32
CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
43
CausalityTools = "5520caf5-2dd7-5c5d-bfcb-a00e56ac49f7"
54
ComplexityMeasures = "ab4b797d-85ee-42ba-b621-05d793b346a2"
@@ -8,6 +7,7 @@ Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7"
87
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
98
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
109
DocumenterCitations = "daee34ce-89f3-4625-b898-19384cb65244"
10+
DocumenterInterLinks = "d12716ef-a0f6-4df4-a9f1-a5a34e75c656"
1111
DocumenterTools = "35a29f4d-8980-5a13-9543-d66fff28ecb8"
1212
DynamicalSystemsBase = "6e36e845-645a-534a-86f2-f5d4aa5a06b4"
1313
GraphMakie = "1ecd5474-83a3-4783-bb4f-06765db800d2"
@@ -18,6 +18,7 @@ LabelledArrays = "2ee39098-c373-598a-b85f-a56591580800"
1818
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1919
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
2020
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
21+
Revise = "295af30f-e4ad-537b-8983-00126c2a3abe"
2122
StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3"
2223
StateSpaceSets = "40b095a5-5852-4c12-98c7-d43bf788e795"
2324
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"

docs/build_docs_with_style.jl

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
CI = get(ENV, "CI", nothing) == "true" || get(ENV, "GITHUB_TOKEN", nothing) !== nothing
2+
3+
import Pkg
4+
Pkg.pkg"add Documenter@1"
5+
6+
# Load documenter
7+
using Documenter
8+
using DocumenterTools: Themes
9+
ENV["JULIA_DEBUG"] = "Documenter"
10+
11+
# For easier debugging when downloading from a specific branch.
12+
github_user = "JuliaDynamics"
13+
branch = "master"
14+
download_path = "https://raw.githubusercontent.com/$github_user/doctheme/$branch"
15+
16+
import Downloads
17+
for file in ("juliadynamics-lightdefs.scss", "juliadynamics-darkdefs.scss", "juliadynamics-style.scss")
18+
Downloads.download("$download_path/$file", joinpath(@__DIR__, file))
19+
end
20+
21+
# create the themes
22+
for w in ("light", "dark")
23+
header = read(joinpath(@__DIR__, "juliadynamics-style.scss"), String)
24+
theme = read(joinpath(@__DIR__, "juliadynamics-$(w)defs.scss"), String)
25+
write(joinpath(@__DIR__, "juliadynamics-$(w).scss"), header*"\n"*theme)
26+
end
27+
28+
# compile the themes
29+
Themes.compile(joinpath(@__DIR__, "juliadynamics-light.scss"), joinpath(@__DIR__, "src/assets/themes/documenter-light.css"))
30+
Themes.compile(joinpath(@__DIR__, "juliadynamics-dark.scss"), joinpath(@__DIR__, "src/assets/themes/documenter-dark.css"))
31+
32+
# Download and apply CairoMakie plotting style
33+
using CairoMakie
34+
Downloads.download("$download_path/style.jl", joinpath(@__DIR__, "style.jl"))
35+
include("style.jl")
36+
37+
using DocumenterInterLinks
38+
39+
links = InterLinks(
40+
"ComplexityMeasures" => (
41+
"https://juliadynamics.github.io/DynamicalSystemsDocs.jl/complexitymeasures/stable/",
42+
"https://juliadynamics.github.io/DynamicalSystemsDocs.jl/complexitymeasures/stable/objects.inv",
43+
joinpath(@__DIR__, "inventories", "Documenter.toml")
44+
),
45+
"StateSpaceSets" => (
46+
"https://juliadynamics.github.io/DynamicalSystemsDocs.jl/statespacesets/stable/",
47+
"https://juliadynamics.github.io/DynamicalSystemsDocs.jl/statespacesets/stable/objects.inv",
48+
joinpath(@__DIR__, "inventories", "Documenter.toml")
49+
),
50+
);
51+
52+
function build_docs_with_style(pages, modules...; bib = nothing, authors = "George Datseris", draft = false, kwargs...)
53+
settings = (
54+
modules = [modules...],
55+
format = Documenter.HTML(
56+
prettyurls = CI,
57+
assets = [
58+
asset("https://fonts.googleapis.com/css?family=Montserrat|Source+Code+Pro&display=swap", class=:css),
59+
],
60+
collapselevel = 3,
61+
size_threshold = 1250 * 2^10,
62+
size_threshold_warn = 750 * 2^10,
63+
example_size_threshold = 100 * 2^10,
64+
size_threshold_ignore = [
65+
"examples/examples_associations.md",
66+
"examples/examples_independence.md",
67+
"examples/examples_infer_graphs.md",
68+
]
69+
),
70+
sitename = "$(modules[1]).jl",
71+
authors,
72+
pages,
73+
draft,
74+
doctest = false,
75+
warnonly = false,
76+
checkdocs = :exported,
77+
kwargs...
78+
)
79+
80+
if isnothing(bib)
81+
makedocs(; settings...)
82+
else
83+
makedocs(; plugins=[bib, links], settings...)
84+
end
85+
86+
if CI
87+
deploydocs(
88+
repo = "github.com/JuliaDynamics/$(modules[1]).jl.git",
89+
target = "build",
90+
push_preview = true
91+
)
92+
end
93+
94+
end

docs/make.jl

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ cd(@__DIR__)
22
# Doc-specific (remaining packages are imported in `build_docs_with_style.jl`, which is
33
# downloaded)
44
using DocumenterCitations
5+
using DocumenterInterLinks
56
import Downloads
67

78
# Packages used in the doc build.
@@ -10,21 +11,31 @@ using ComplexityMeasures
1011
using StateSpaceSets
1112

1213
pages = [
13-
"Overview" => "index.md",
14-
"Association measures" => "measures.md",
15-
"Independence testing" => "independence.md",
16-
"Causal graphs" => "causal_graphs.md",
17-
"APIs and estimators" => "api.md",
18-
"Examples" => "examples.md",
19-
"Predefined systems" => "coupled_systems.md",
20-
"Experimental" => "experimental.md",
14+
"CausalityTools.jl" => "index.md",
15+
"Core API reference" => [
16+
"Association measures" => "associations.md",
17+
"Independence" => "independence.md",
18+
"Network/graph inference" => "causal_graphs.md",
19+
],
20+
"Extended API reference" => [
21+
"api/discretization_counts_probs_api.md",
22+
"api/counts_and_probabilities_api.md",
23+
"api/information_single_variable_api.md",
24+
"api/information_multivariate_api.md",
25+
"api/cross_map_api.md",
26+
],
27+
"Examples" => [
28+
"Associations" => "examples/examples_associations.md",
29+
"Independence testing" => "examples/examples_independence.md",
30+
"Causal graph inference" => "examples/examples_infer_graphs.md",
31+
],
2132
"References" => "references.md",
2233
]
2334

24-
Downloads.download(
25-
"https://raw.githubusercontent.com/JuliaDynamics/doctheme/master/build_docs_with_style.jl",
26-
joinpath(@__DIR__, "build_docs_with_style.jl")
27-
)
35+
# Downloads.download(
36+
# "https://raw.githubusercontent.com/JuliaDynamics/doctheme/master/build_docs_with_style.jl",
37+
# joinpath(@__DIR__, "build_docs_with_style.jl")
38+
# )
2839
include("build_docs_with_style.jl")
2940

3041
bibliography = CitationBibliography(

0 commit comments

Comments
 (0)