From 3559fce27533b57db48fc2cc6fdd9f78889c38cc Mon Sep 17 00:00:00 2001 From: Smaug123 <3138005+Smaug123@users.noreply.github.com> Date: Mon, 8 Sep 2025 23:10:15 +0100 Subject: [PATCH 1/5] Modernise --- .envrc | 1 + .gitignore | 2 + ...-complete.yml => all-checks-complete.yaml} | 0 .woodpecker/{.build.yml => build.yaml} | 0 Cargo.lock | 124 +++++++++---- Cargo.toml | 8 + flake.lock | 98 ++++------ flake.nix | 175 +++++++++--------- little_learner/Cargo.toml | 4 +- little_learner/src/decider.rs | 6 +- little_learner/src/gradient_descent.rs | 4 +- little_learner/src/lib.rs | 1 - little_learner/src/scalar.rs | 4 +- little_learner_app/Cargo.toml | 4 +- little_learner_app/src/iris.rs | 2 +- 15 files changed, 227 insertions(+), 206 deletions(-) create mode 100644 .envrc rename .woodpecker/{.all-checks-complete.yml => all-checks-complete.yaml} (100%) rename .woodpecker/{.build.yml => build.yaml} (100%) diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 3864e7b..723a8fc 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ target/ .vscode/ .profile* .DS_Store +.direnv/ +result diff --git a/.woodpecker/.all-checks-complete.yml b/.woodpecker/all-checks-complete.yaml similarity index 100% rename from .woodpecker/.all-checks-complete.yml rename to .woodpecker/all-checks-complete.yaml diff --git a/.woodpecker/.build.yml b/.woodpecker/build.yaml similarity index 100% rename from .woodpecker/.build.yml rename to .woodpecker/build.yaml diff --git a/Cargo.lock b/Cargo.lock index 923f5c7..e3aab9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,18 +1,18 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "bitvec" @@ -28,15 +28,15 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "csv" -version = "1.2.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", "itoa", @@ -46,9 +46,9 @@ dependencies = [ [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" dependencies = [ "memchr", ] @@ -61,9 +61,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", @@ -83,15 +83,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "little_learner" @@ -115,24 +115,24 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "ordered-float" -version = "3.6.0" +version = "3.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13a384337e997e6860ffbaa83708b2ef329fd8c54cb67a5f64d421e0f943254f" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" dependencies = [ "num-traits", ] @@ -155,29 +155,32 @@ checksum = "9cd6706dfe50d53e0f6aa09e12c034c44faacd23e966ae5a209e8bdb8f179f98" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -220,15 +223,29 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "serde" -version = "1.0.164" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] name = "syn" @@ -241,6 +258,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tap" version = "1.0.1" @@ -249,15 +277,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wyz" @@ -267,3 +295,23 @@ checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ "tap", ] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] diff --git a/Cargo.toml b/Cargo.toml index 4b703c3..2999968 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,3 +3,11 @@ members = [ "little_learner", "little_learner_app" ] +resolver = "3" + +[workspace.package] +version = "0.1.0" +edition = "2024" + +[workspace.metadata.crane] +name = "little_learner" diff --git a/flake.lock b/flake.lock index f3f7ab2..a73111f 100644 --- a/flake.lock +++ b/flake.lock @@ -1,44 +1,30 @@ { "nodes": { - "crate2nix": { - "flake": false, + "crane": { "locked": { - "lastModified": 1678820090, - "narHash": "sha256-4FFeonajXNqiSP0PqUlC1wmTyPC8SX6SthEvgRjMupw=", - "owner": "kolloch", - "repo": "crate2nix", - "rev": "4fd826e37bec90dfe26ca16cb6e632c617cc7c0d", + "lastModified": 1757183466, + "narHash": "sha256-kTdCCMuRE+/HNHES5JYsbRHmgtr+l9mOtf5dpcMppVc=", + "owner": "ipetkov", + "repo": "crane", + "rev": "d599ae4847e7f87603e7082d73ca673aa93c916d", "type": "github" }, "original": { - "owner": "kolloch", - "repo": "crate2nix", - "type": "github" - } - }, - "flake-compat": { - "flake": false, - "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "ipetkov", + "repo": "crane", "type": "github" } }, "flake-utils": { + "inputs": { + "systems": "systems" + }, "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -49,11 +35,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1679705136, - "narHash": "sha256-MDlZUR7wJ3PlPtqwwoGQr3euNOe0vdSSteVVOef7tBY=", + "lastModified": 1757068644, + "narHash": "sha256-NOrUtIhTkIIumj1E/Rsv1J37Yi3xGStISEo8tZm3KW4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "8f40f2f90b9c9032d1b824442cfbbe0dbabd0dbd", + "rev": "8eb28adfa3dc4de28e792e3bf49fcf9007ca8ac9", "type": "github" }, "original": { @@ -63,42 +49,26 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1679734080, - "narHash": "sha256-z846xfGLlon6t9lqUzlNtBOmsgQLQIZvR6Lt2dImk1M=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "dbf5322e93bcc6cfc52268367a8ad21c09d76fea", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "root": { "inputs": { - "crate2nix": "crate2nix", - "flake-compat": "flake-compat", + "crane": "crane", + "flake-utils": "flake-utils", "nixpkgs": "nixpkgs", - "rust-overlay": "rust-overlay", - "utils": "utils" + "rust-overlay": "rust-overlay" } }, "rust-overlay": { "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs_2" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { - "lastModified": 1679106165, - "narHash": "sha256-03Opt2yu4E/AIFjvlgib0/nhMn6B4B/t/nvwS2bzOGw=", + "lastModified": 1757298987, + "narHash": "sha256-yuFSw6fpfjPtVMmym51ozHYpJQ7SzVOTkk7tUv2JA0U=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "7313c06ac334d6262ddfe30a38b3abc3da6bd565", + "rev": "cfd63776bde44438ff2936f0c9194c79dd407a5f", "type": "github" }, "original": { @@ -107,18 +77,18 @@ "type": "github" } }, - "utils": { + "systems": { "locked": { - "lastModified": 1678901627, - "narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6", + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "nix-systems", + "repo": "default", "type": "github" } } diff --git a/flake.nix b/flake.nix index 363782e..77bd2bb 100644 --- a/flake.nix +++ b/flake.nix @@ -3,109 +3,106 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - utils.url = "github:numtide/flake-utils"; - rust-overlay.url = "github:oxalica/rust-overlay"; - crate2nix = { - url = "github:kolloch/crate2nix"; - flake = false; + flake-utils.url = "github:numtide/flake-utils"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; }; - flake-compat = { - url = "github:edolstra/flake-compat"; - flake = false; + crane = { + url = "github:ipetkov/crane"; }; }; - outputs = { - self, - nixpkgs, - utils, - rust-overlay, - crate2nix, - ... - }: let - name = "little_learner_app"; - in - utils.lib.eachDefaultSystem - ( - system: let - # Imports + outputs = { self, nixpkgs, flake-utils, rust-overlay, crane }: + flake-utils.lib.eachDefaultSystem (system: + let pkgs = import nixpkgs { inherit system; - overlays = [ - rust-overlay.overlays.default - (self: super: { - # Because rust-overlay bundles multiple rust packages into one - # derivation, specify that mega-bundle here, so that crate2nix - # will use them automatically. - rustc = self.rust-bin.nightly.latest.default; - cargo = self.rust-bin.nightly.latest.default; - }) + overlays = [ (import rust-overlay) ]; + }; + + rustToolchain = pkgs.rust-bin.nightly.latest.default; + + craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; + + # Common build inputs for all derivations + commonArgs = { + src = pkgs.lib.cleanSourceWith { src = ./.; name = "source"; filter = path: type: (builtins.match ".*csv$" path != null || craneLib.filterCargoSources path type); }; + strictDeps = true; + + buildInputs = with pkgs; [ + openssl + ]; + + nativeBuildInputs = with pkgs; [ + pkg-config ]; }; - inherit - (import "${crate2nix}/tools.nix" {inherit pkgs;}) - generatedCargoNix - ; - # Create the cargo2nix project - project = - pkgs.callPackage - (generatedCargoNix { - inherit name; - src = ./.; - }) - { - # Individual crate overrides go here - # Example: https://github.com/balsoft/simple-osd-daemons/blob/6f85144934c0c1382c7a4d3a2bbb80106776e270/flake.nix#L28-L50 - defaultCrateOverrides = - pkgs.defaultCrateOverrides - // { - # The app crate itself is overriden here. Typically we - # configure non-Rust dependencies (see below) here. - ${name} = oldAttrs: - { - inherit buildInputs nativeBuildInputs; - } - // buildEnvVars; - }; + # Build just the cargo dependencies + cargoArtifacts = craneLib.buildDepsOnly commonArgs; + + # Build the actual package + little_learner_app = craneLib.buildPackage (commonArgs // { + inherit cargoArtifacts; + }); + in + { + packages = { + default = little_learner_app; + little_learner_app = little_learner_app; + }; + + apps.default = flake-utils.lib.mkApp { + drv = little_learner_app; + }; + + devShells = { + default = craneLib.devShell { + # Inherit the build inputs from commonArgs + buildInputs = commonArgs.buildInputs; + nativeBuildInputs = commonArgs.nativeBuildInputs; + + # Additional dev tools + packages = with pkgs; [ + rustToolchain + rust-analyzer + ]; + + RUST_SRC_PATH = "${rustToolchain}/lib/rustlib/src/rust/library"; }; - # Configuration for the non-Rust dependencies - buildInputs = with pkgs; [openssl.dev]; - nativeBuildInputs = with pkgs; [rustc cargo pkgconfig]; - buildEnvVars = { - PKG_CONFIG_PATH = "${pkgs.openssl.dev}/lib/pkgconfig"; - }; - in rec { - packages.${name} = project.workspaceMembers.${name}.build; + ci = pkgs.mkShell { + buildInputs = commonArgs.buildInputs ++ ([ + pkgs.nodePackages.markdown-link-check + pkgs.nixpkgs-fmt + pkgs.rustToolchain + ]); - # `nix build` - defaultPackage = packages.${name}; + nativeBuildInputs = commonArgs.nativeBuildInputs; - # `nix run` - apps.${name} = utils.lib.mkApp { - inherit name; - drv = packages.${name}; + RUST_SRC_PATH = "${rustToolchain}/lib/rustlib/src/rust/library"; + }; }; - defaultApp = apps.${name}; - # `nix develop` - devShells = { - ci = - pkgs.mkShell { - inherit nativeBuildInputs; - buildInputs = [pkgs.nodePackages.markdown-link-check pkgs.alejandra] ++ buildInputs; - RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; - } - // buildEnvVars; - default = - pkgs.mkShell - { - inherit buildInputs nativeBuildInputs; - RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; - } - // buildEnvVars; + checks = { + inherit little_learner_app; + + # Run cargo fmt check + fmt = craneLib.cargoFmt { + inherit (commonArgs) src; + }; + + # Run clippy + clippy = craneLib.cargoClippy (commonArgs // { + inherit cargoArtifacts; + cargoClippyExtraArgs = "--all-targets -- --deny warnings"; + }); + + # Run tests + tests = craneLib.cargoTest (commonArgs // { + inherit cargoArtifacts; + }); }; - } - ); + }); } diff --git a/little_learner/Cargo.toml b/little_learner/Cargo.toml index 16221cc..79c6fd9 100644 --- a/little_learner/Cargo.toml +++ b/little_learner/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "little_learner" -version = "0.1.0" -edition = "2021" +version.workspace = true +edition.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/little_learner/src/decider.rs b/little_learner/src/decider.rs index 9b97a0b..e47a63b 100644 --- a/little_learner/src/decider.rs +++ b/little_learner/src/decider.rs @@ -7,11 +7,7 @@ pub(crate) fn rectify(x: A) -> A where A: Zero + PartialOrd, { - if x < A::zero() { - A::zero() - } else { - x - } + if x < A::zero() { A::zero() } else { x } } fn linear( diff --git a/little_learner/src/gradient_descent.rs b/little_learner/src/gradient_descent.rs index 23bb89a..b8a47cf 100644 --- a/little_learner/src/gradient_descent.rs +++ b/little_learner/src/gradient_descent.rs @@ -1,4 +1,4 @@ -use crate::auto_diff::{grad, Differentiable, RankedDifferentiable}; +use crate::auto_diff::{Differentiable, RankedDifferentiable, grad}; use crate::hyper; use crate::loss::l2_loss_2; use crate::predictor::Predictor; @@ -139,8 +139,8 @@ mod tests { use crate::scalar::Scalar; use crate::traits::Zero; use ordered_float::NotNan; - use rand::rngs::StdRng; use rand::SeedableRng; + use rand::rngs::StdRng; #[test] fn test_iterate() { diff --git a/little_learner/src/lib.rs b/little_learner/src/lib.rs index 3cb333e..16e5e98 100644 --- a/little_learner/src/lib.rs +++ b/little_learner/src/lib.rs @@ -1,6 +1,5 @@ #![allow(incomplete_features)] #![feature(generic_const_exprs)] -#![feature(array_methods)] #![feature(closure_lifetime_binder)] pub mod auto_diff; diff --git a/little_learner/src/scalar.rs b/little_learner/src/scalar.rs index 72ebc88..9bb966e 100644 --- a/little_learner/src/scalar.rs +++ b/little_learner/src/scalar.rs @@ -2,7 +2,7 @@ use crate::traits::{Exp, One, Sqrt, Zero}; use core::hash::Hash; use std::cmp::Ordering; use std::{ - collections::{hash_map::Entry, HashMap}, + collections::{HashMap, hash_map::Entry}, fmt::Display, iter::Sum, ops::{Add, AddAssign, Div, Mul, Neg, Sub}, @@ -356,7 +356,7 @@ where #[cfg(test)] mod test_loss { - use crate::auto_diff::{grad, Differentiable, RankedDifferentiable}; + use crate::auto_diff::{Differentiable, RankedDifferentiable, grad}; use crate::scalar::Scalar; use crate::traits::Sqrt; use ordered_float::NotNan; diff --git a/little_learner_app/Cargo.toml b/little_learner_app/Cargo.toml index 33ae039..7413e52 100644 --- a/little_learner_app/Cargo.toml +++ b/little_learner_app/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "little_learner_app" -version = "0.1.0" -edition = "2021" +version.workspace = true +edition.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/little_learner_app/src/iris.rs b/little_learner_app/src/iris.rs index ea00024..ae3daa0 100644 --- a/little_learner_app/src/iris.rs +++ b/little_learner_app/src/iris.rs @@ -92,7 +92,7 @@ impl Iris { #[cfg(test)] mod test { - use crate::iris::{import, Iris, IrisType}; + use crate::iris::{Iris, IrisType, import}; const EXPECTED_FIRST: Iris = Iris { class: IrisType::Setosa, -- 2.51.0 From 166f4bf4b95d18d97b3bced41f338659a3272a48 Mon Sep 17 00:00:00 2001 From: Smaug123 <3138005+Smaug123@users.noreply.github.com> Date: Mon, 8 Sep 2025 23:18:44 +0100 Subject: [PATCH 2/5] Modernise --- flake.nix | 16 ++++++++++------ little_learner/src/auto_diff.rs | 7 +++---- little_learner/src/block.rs | 1 + 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/flake.nix b/flake.nix index 77bd2bb..e2803fb 100644 --- a/flake.nix +++ b/flake.nix @@ -27,7 +27,11 @@ # Common build inputs for all derivations commonArgs = { - src = pkgs.lib.cleanSourceWith { src = ./.; name = "source"; filter = path: type: (builtins.match ".*csv$" path != null || craneLib.filterCargoSources path type); }; + src = pkgs.lib.cleanSourceWith { + src = ./.; + name = "source"; + filter = path: type: (builtins.match ".*csv$" path != null || craneLib.filterCargoSources path type); + }; strictDeps = true; buildInputs = with pkgs; [ @@ -64,20 +68,20 @@ nativeBuildInputs = commonArgs.nativeBuildInputs; # Additional dev tools - packages = with pkgs; [ + packages = [ rustToolchain - rust-analyzer + pkgs.rust-analyzer ]; RUST_SRC_PATH = "${rustToolchain}/lib/rustlib/src/rust/library"; }; ci = pkgs.mkShell { - buildInputs = commonArgs.buildInputs ++ ([ + buildInputs = commonArgs.buildInputs ++ [ pkgs.nodePackages.markdown-link-check pkgs.nixpkgs-fmt - pkgs.rustToolchain - ]); + rustToolchain + ]; nativeBuildInputs = commonArgs.nativeBuildInputs; diff --git a/little_learner/src/auto_diff.rs b/little_learner/src/auto_diff.rs index eede557..0ba0870 100644 --- a/little_learner/src/auto_diff.rs +++ b/little_learner/src/auto_diff.rs @@ -727,10 +727,10 @@ impl RankedDifferentiableTagged { } } - pub fn map2_tagged<'a, 'b, B, C, Tag2, Tag3, F>( + pub fn map2_tagged<'a, B, C, Tag2, Tag3, F>( self: &'a RankedDifferentiableTagged, other: &'a RankedDifferentiableTagged, - f: &'b mut F, + f: &mut F, ) -> RankedDifferentiableTagged where F: FnMut(&Scalar, Tag, &Scalar, Tag2) -> (Scalar, Tag3), @@ -843,8 +843,7 @@ where F: FnMut( &[DifferentiableTagged; PARAM_RANK], ) -> RankedDifferentiableTagged, - A: ?Sized - + Clone + A: Clone + Hash + AddAssign + Add diff --git a/little_learner/src/block.rs b/little_learner/src/block.rs index f0bea64..ba2cb27 100644 --- a/little_learner/src/block.rs +++ b/little_learner/src/block.rs @@ -32,6 +32,7 @@ where } #[must_use] +#[expect(clippy::type_complexity)] pub fn dense<'b, A, Tag>( input_len: usize, neuron_count: usize, -- 2.51.0 From 7f696e12848bf1c501cbbb9f2393e1aa1023635e Mon Sep 17 00:00:00 2001 From: Smaug123 <3138005+Smaug123@users.noreply.github.com> Date: Mon, 8 Sep 2025 23:24:16 +0100 Subject: [PATCH 3/5] Fix --- .github/workflows/rust.yml | 6 +++--- .woodpecker/build.yaml | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 36bdf21..2274def 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -71,7 +71,7 @@ jobs: # ] # } - alejandra: + format: { "name": "Nix formatting", "runs-on": "ubuntu-latest", @@ -86,8 +86,8 @@ jobs: "with": { "extra_nix_config": "access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}" } }, { - "name": "Run Alejandra", - "run": "nix develop .#ci --command alejandra -- --check ." + "name": "Run nixpkgs-fmt", + "run": "nix develop .#ci --command nixpkgs-fmt -- --check ." } ] } diff --git a/.woodpecker/build.yaml b/.woodpecker/build.yaml index 0e1d70b..4385762 100644 --- a/.woodpecker/build.yaml +++ b/.woodpecker/build.yaml @@ -3,17 +3,18 @@ steps: image: nixos/nix commands: - echo 'experimental-features = flakes nix-command' >> /etc/nix/nix.conf + # Run through Nix + - nix build + - nix run + - nix flake check # Lint - nix develop --command cargo -- fmt --all -- --check - nix develop --command cargo -- clippy -- -D warnings -W clippy::must_use_candidate - - nix develop .#ci --command alejandra -- --check . + - nix develop .#ci --command nixpkgs-fmt -- --check . - nix develop .#ci --command markdown-link-check README.md # Test - nix develop --command cargo test --verbose --release - nix develop --command cargo test --verbose - # Run through Nix - - nix build - - nix run when: - event: "push" -- 2.51.0 From 745cc3049c61ffdda6ba17f57ace460b0ce6d274 Mon Sep 17 00:00:00 2001 From: Smaug123 <3138005+Smaug123@users.noreply.github.com> Date: Mon, 8 Sep 2025 23:33:13 +0100 Subject: [PATCH 4/5] Fix --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index e2803fb..2eaf31b 100644 --- a/flake.nix +++ b/flake.nix @@ -59,6 +59,7 @@ apps.default = flake-utils.lib.mkApp { drv = little_learner_app; + exePath = "/bin/little_learner_app"; }; devShells = { -- 2.51.0 From 64aa2d6f1726670018f21bf58ca79c9b579529f9 Mon Sep 17 00:00:00 2001 From: Smaug123 <3138005+Smaug123@users.noreply.github.com> Date: Mon, 8 Sep 2025 23:42:57 +0100 Subject: [PATCH 5/5] Fix --- .woodpecker/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker/build.yaml b/.woodpecker/build.yaml index 4385762..1d3889a 100644 --- a/.woodpecker/build.yaml +++ b/.woodpecker/build.yaml @@ -10,7 +10,7 @@ steps: # Lint - nix develop --command cargo -- fmt --all -- --check - nix develop --command cargo -- clippy -- -D warnings -W clippy::must_use_candidate - - nix develop .#ci --command nixpkgs-fmt -- --check . + - nix develop .#ci --command nixpkgs-fmt --check . - nix develop .#ci --command markdown-link-check README.md # Test - nix develop --command cargo test --verbose --release -- 2.51.0