nixify notebook

This commit is contained in:
Laureηt 2024-09-07 13:44:56 +02:00
parent 456f1234a2
commit 3c21d9a900
Signed by: Laurent
SSH key fingerprint: SHA256:pb5NrYg80So5z9hmqQFPmp//sgr+DFeJkKhmGyU2NLk
6 changed files with 136 additions and 60 deletions

View file

@ -1,30 +1,32 @@
{ {
"nodes": { "nodes": {
"flake-utils": { "flake-parts": {
"inputs": { "inputs": {
"systems": "systems" "nixpkgs-lib": [
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1687709756, "lastModified": 1725234343,
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=", "narHash": "sha256-+ebgonl3NbiKD2UD0x4BszCZQ6sTfL4xioaM49o5B3Y=",
"owner": "numtide", "owner": "hercules-ci",
"repo": "flake-utils", "repo": "flake-parts",
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7", "rev": "567b938d64d4b4112ee253b9274472dc3a346eb6",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "numtide", "owner": "hercules-ci",
"repo": "flake-utils", "repo": "flake-parts",
"type": "github" "type": "github"
} }
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1687898314, "lastModified": 1725432240,
"narHash": "sha256-B4BHon3uMXQw8ZdbwxRK1BmxVOGBV4viipKpGaIlGwk=", "narHash": "sha256-+yj+xgsfZaErbfYM3T+QvEE2hU7UuE+Jf0fJCJ8uPS0=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "e18dc963075ed115afb3e312b64643bf8fd4b474", "rev": "ad416d066ca1222956472ab7d0555a6946746a80",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -36,8 +38,9 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"flake-utils": "flake-utils", "flake-parts": "flake-parts",
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs",
"systems": "systems"
} }
}, },
"systems": { "systems": {

64
flake.nix Normal file
View file

@ -0,0 +1,64 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-parts = {
url = "github:hercules-ci/flake-parts";
inputs.nixpkgs-lib.follows = "nixpkgs";
};
systems.url = "github:nix-systems/default";
};
outputs = {flake-parts, ...} @ inputs:
flake-parts.lib.mkFlake {inherit inputs;} {
systems = import inputs.systems;
perSystem = {
pkgs,
system,
...
}: rec {
devShells.default = pkgs.mkShell {
packages = packages.notebooks.buildInputs;
};
packages.notebooks = pkgs.stdenvNoCC.mkDerivation {
name = "notebooks";
src = ./julia;
dontUnpack = true;
buildInputs = [
(pkgs.julia.withPackages [
"Pluto"
"Plots"
"Statistics"
"PlutoUI"
"LinearAlgebra"
"StatsPlots"
"Distributions"
"MAT"
"DSP"
])
];
buildPhase = ''
# copy the notebooks, Pluto needs write permission
cp $src/notebook.jl index.jl
cp $src/donnees.mat donnees.mat
chmod +w index.jl
# julia needs permission to create .julia directory
export HOME=$TMPDIR
# run and export the notebooks
julia $src/export_html.jl index.jl
'';
installPhase = ''
mkdir -p $out
cp index.html $out
cp -r $src/content $out
'';
};
};
};
}

View file

@ -1,13 +0,0 @@
{
"editor.formatOnSave": true,
"files.insertFinalNewline": true,
"editor.trimAutoWhitespace": true,
"files.trimTrailingWhitespace": true,
"terminal.integrated.env.linux": {
"JULIA_PROJECT": "@."
},
"[julia]": {
"editor.tabSize": 2,
"editor.insertSpaces": true
}
}

42
julia/export_html.jl Normal file
View file

@ -0,0 +1,42 @@
using Pluto
function export_html(notebook_path, html_path)
# load notebook
notebook = Pluto.load_notebook(Pluto.tamepath(notebook_path));
topology = Pluto.updated_topology(notebook.topology, notebook, notebook.cells)
# create offline workspace
workspace = Pluto.WorkspaceManager.make_workspace(
(
Pluto.ServerSession(),
notebook,
),
is_offline_renderer=true,
)
# run all the cells of the notebook
for cell in notebook.cells
Pluto.run_single!(
workspace,
cell,
topology.nodes[cell],
topology.codes[cell],
)
end
# convert notebook outputs to html
html_contents = Pluto.generate_html(notebook);
# write to html file
open(html_path, "w") do html_file
write(html_file, html_contents);
end
end
# get cli args
for arg in ARGS
filename, _ = splitext(arg)
html_path = filename * ".html"
println("Exporting $arg to $html_path")
export_html(arg, filename * ".html")
end

View file

@ -1,19 +0,0 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let pkgs = nixpkgs.legacyPackages.${system};
in {
devShell = pkgs.mkShell {
buildInputs = with pkgs; [
julia
ffmpeg-full # https://github.com/JuliaIO/FFMPEG.jl/issues/48#issuecomment-898340527
patchelf
];
};
});
}

View file

@ -382,7 +382,7 @@ begin
Leave-one-out : d=$(d_estime_loo), σ=$(round(σ_estime_loo, digits=2)) Leave-one-out : d=$(d_estime_loo), σ=$(round(σ_estime_loo, digits=2))
""")] """)]
) )
) )
end end
@ -435,7 +435,7 @@ On peut montrer que le vecteur de paramètres estimé en moindres carrés est di
$$\beta \hookrightarrow \mathcal{N} ( \beta^*, \sigma^2 ( A^\intercal A )^{-1})$$ $$\beta \hookrightarrow \mathcal{N} ( \beta^*, \sigma^2 ( A^\intercal A )^{-1})$$
On trace alors sur la figure suivante, avec un tracé continu la distribution théorique des $\beta$, et via un histogramme la distribution que l'on obtient par estimation aux moindres carrés (sur un grand nombre de points, n=$(n)) On trace alors sur la figure suivante, avec un tracé continu la distribution théorique des $\beta$, et via un histogramme la distribution que l'on obtient par estimation aux moindres carrés (sur un grand nombre de points, n=1000)
""" """
# ╔═╡ a8843a99-cd5d-47fa-810b-68b56e405af9 # ╔═╡ a8843a99-cd5d-47fa-810b-68b56e405af9
@ -452,7 +452,6 @@ begin
λ: $(λ_slider) λ: $(λ_slider)
On observe que via les moindres carrés classiques, notre régression a souvent tendance à [overfitter](https://fr.wikipedia.org/wiki/Surapprentissage) les points d'apprentissage. Pour remédier à ce problème, nous pouvons introduire un hyperparamètre $\lambda$ qui nous permettra de pénaliser l'overfitting (par régularisation). On observe que via les moindres carrés classiques, notre régression a souvent tendance à [overfitter](https://fr.wikipedia.org/wiki/Surapprentissage) les points d'apprentissage. Pour remédier à ce problème, nous pouvons introduire un hyperparamètre $\lambda$ qui nous permettra de pénaliser l'overfitting (par régularisation).
""" """
end end
@ -3953,27 +3952,30 @@ version = "1.4.1+0"
# ╟─1ae5bc6d-16c4-40cb-846e-3b0e177fd0cf # ╟─1ae5bc6d-16c4-40cb-846e-3b0e177fd0cf
# ╟─b3634cc1-fb5f-4b7b-bfa3-08d1fb787c5f # ╟─b3634cc1-fb5f-4b7b-bfa3-08d1fb787c5f
# ╟─73ed5f0e-4298-4308-bcb8-7c1245ebf0f5 # ╟─73ed5f0e-4298-4308-bcb8-7c1245ebf0f5
# ╟─d969e49e-0a0c-4bdf-aba2-835586c87e7f
# ╟─c0615490-3d43-4c42-9ac6-c4fdd59aae7f
# ╟─cc938f64-41f9-478b-a136-ae0cc55b5f48 # ╟─cc938f64-41f9-478b-a136-ae0cc55b5f48
# ╟─aec0ff6e-ac6a-4104-83c1-f70e254602b9 # ╟─aec0ff6e-ac6a-4104-83c1-f70e254602b9
# ╟─dbffcc35-ba67-4468-b1b5-1c38a0fd971e # ╟─dbffcc35-ba67-4468-b1b5-1c38a0fd971e
# ╟─d969e49e-0a0c-4bdf-aba2-835586c87e7f
# ╟─c0615490-3d43-4c42-9ac6-c4fdd59aae7f
# ╟─ae8a3f9b-12cf-4802-8ae5-31546d82516d # ╟─ae8a3f9b-12cf-4802-8ae5-31546d82516d
# ╠═7960408a-d922-43e2-9a61-4aaf0c9e6a39 # ╟─7960408a-d922-43e2-9a61-4aaf0c9e6a39
# ╟─b56c3502-4dd9-4446-acd9-dcb0c667803f # ╟─b56c3502-4dd9-4446-acd9-dcb0c667803f
# ╟─76279a22-3afe-46e1-829f-88f5dddfd55c # ╟─76279a22-3afe-46e1-829f-88f5dddfd55c
# ╟─cde13c7c-fbc2-4a8d-9b82-7607d71bb4b1 # ╟─cde13c7c-fbc2-4a8d-9b82-7607d71bb4b1
# ╟─a8843a99-cd5d-47fa-810b-68b56e405af9 # ╟─a8843a99-cd5d-47fa-810b-68b56e405af9
# ╠═c3f3a0c3-8523-43aa-8a8a-589f567399c9 # ╟─c3f3a0c3-8523-43aa-8a8a-589f567399c9
# ╟─f60fbae0-a6bd-4791-b38b-9e29ae801a07 # ╟─f60fbae0-a6bd-4791-b38b-9e29ae801a07
# ╟─b95121b9-4b58-4086-bbd8-ecd2893060dd # ╟─b95121b9-4b58-4086-bbd8-ecd2893060dd
# ╟─3ff18976-beb4-45ad-aa29-d511e5d3ad0a # ╟─3ff18976-beb4-45ad-aa29-d511e5d3ad0a
# ╟─c563818e-d117-47ce-abeb-5b048edad64e
# ╟─650ab9f4-581b-4190-8dd0-91c6d4c86b6b
# ╟─1b88eacd-754b-4b6b-a8e0-dd35ae37f248 # ╟─1b88eacd-754b-4b6b-a8e0-dd35ae37f248
# ╟─acbab47e-2ab5-443a-8d78-f597a4ca08ed # ╟─acbab47e-2ab5-443a-8d78-f597a4ca08ed
# ╟─230c1126-6717-4a93-9013-5f0c15616904 # ╟─230c1126-6717-4a93-9013-5f0c15616904
# ╟─c563818e-d117-47ce-abeb-5b048edad64e
# ╟─650ab9f4-581b-4190-8dd0-91c6d4c86b6b
# ╟─5974ceb3-1e82-4183-9dca-35ccd6b9a9ba # ╟─5974ceb3-1e82-4183-9dca-35ccd6b9a9ba
# ╟─fac7b990-552e-4353-8264-ba0840a95383
# ╟─4bcfb185-4499-422d-9439-6ca4e30c4846
# ╟─174dbb25-12ba-460d-a905-8223f8241964
# ╟─27a1f0cc-a6bc-417e-9c58-6b63172f753f # ╟─27a1f0cc-a6bc-417e-9c58-6b63172f753f
# ╟─c9e530b7-f5f6-4905-8c6c-69ea2440f57d # ╟─c9e530b7-f5f6-4905-8c6c-69ea2440f57d
# ╟─67a5b4cc-00dd-4f8f-a408-27f1d8c60e7c # ╟─67a5b4cc-00dd-4f8f-a408-27f1d8c60e7c
@ -3981,9 +3983,6 @@ version = "1.4.1+0"
# ╟─8655b8fd-ef08-441f-9186-e2febce6e8f1 # ╟─8655b8fd-ef08-441f-9186-e2febce6e8f1
# ╟─e16bb608-d97b-40eb-bf6b-4199ee4d1926 # ╟─e16bb608-d97b-40eb-bf6b-4199ee4d1926
# ╟─475aecd7-123f-4e4a-b004-90c2a8a951d8 # ╟─475aecd7-123f-4e4a-b004-90c2a8a951d8
# ╟─fac7b990-552e-4353-8264-ba0840a95383
# ╟─4bcfb185-4499-422d-9439-6ca4e30c4846
# ╟─174dbb25-12ba-460d-a905-8223f8241964
# ╟─59be55be-5847-4fa1-a4f6-ef8e0658da13 # ╟─59be55be-5847-4fa1-a4f6-ef8e0658da13
# ╟─2e002135-2a74-47bb-92a6-520d84e85bf3 # ╟─2e002135-2a74-47bb-92a6-520d84e85bf3
# ╟─764c0716-5dd2-4d3c-9489-1dd92d29d7c7 # ╟─764c0716-5dd2-4d3c-9489-1dd92d29d7c7