From 6fd0257f4d511cb7f98b5db5373773b74275b95c Mon Sep 17 00:00:00 2001 From: William Ball Date: Fri, 25 Jun 2021 10:52:42 -0400 Subject: [PATCH] updates --- fractal_dimension/bai_finch_rust/.projectile | 0 fractal_dimension/bai_finch_rust/Cargo.lock | 381 +++++-------------- fractal_dimension/bai_finch_rust/Cargo.toml | 9 +- fractal_dimension/bai_finch_rust/src/diff.rs | 57 +++ fractal_dimension/bai_finch_rust/src/main.rs | 193 +++------- 5 files changed, 214 insertions(+), 426 deletions(-) create mode 100644 fractal_dimension/bai_finch_rust/.projectile create mode 100644 fractal_dimension/bai_finch_rust/src/diff.rs diff --git a/fractal_dimension/bai_finch_rust/.projectile b/fractal_dimension/bai_finch_rust/.projectile new file mode 100644 index 0000000..e69de29 diff --git a/fractal_dimension/bai_finch_rust/Cargo.lock b/fractal_dimension/bai_finch_rust/Cargo.lock index 54b4e49..017b8a3 100644 --- a/fractal_dimension/bai_finch_rust/Cargo.lock +++ b/fractal_dimension/bai_finch_rust/Cargo.lock @@ -1,25 +1,12 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -[[package]] -name = "addr2line" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +version = 3 [[package]] name = "approx" -version = "0.5.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "072df7202e63b127ab55acfe16ce97013d5b97bf160489336d3f1840fd78e99e" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" dependencies = [ "num-traits", ] @@ -31,36 +18,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] -name = "backtrace" -version = "0.3.60" +name = "bacon-sci" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" +checksum = "e5d568d86ec0ca7d24caa67afff9605bc5bc3cae2642d6670ea5924b839ccabc" dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", + "nalgebra", + "num-complex", + "num-traits", + "phf", + "phf_codegen", ] [[package]] name = "bai_finch" version = "0.1.0" dependencies = [ - "gad", + "bacon-sci", "nalgebra", "num", - "peroxide", + "num-complex", + "simba", ] -[[package]] -name = "cc" -version = "1.0.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" - [[package]] name = "cfg-if" version = "1.0.0" @@ -68,76 +48,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "crossbeam-channel" -version = "0.5.1" +name = "generic-array" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" -dependencies = [ - "cfg-if", - "lazy_static", -] - -[[package]] -name = "gad" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b94905d25b4e536e7622e6cb447d722bae8fb0f2dd65eb2196c18e40bf54d1" -dependencies = [ - "backtrace", - "id-arena", - "num", - "serde", - "thiserror", + "typenum", + "version_check", ] [[package]] name = "getrandom" -version = "0.2.3" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if", "libc", "wasi", ] -[[package]] -name = "gimli" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" - -[[package]] -name = "hermit-abi" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" -dependencies = [ - "libc", -] - -[[package]] -name = "id-arena" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - [[package]] name = "libc" version = "0.2.97" @@ -152,64 +82,36 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "matrixmultiply" -version = "0.3.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a8a15b776d9dfaecd44b03c5828c2199cddff5247215858aac14624f8d6b741" +checksum = "916806ba0031cd542105d916a97c8572e1fa6dd79c9c51e7eb43a09ec2dd84c1" dependencies = [ - "num_cpus", - "once_cell", "rawpointer", - "thread-tree", -] - -[[package]] -name = "memchr" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" - -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", ] [[package]] name = "nalgebra" -version = "0.27.1" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "462fffe4002f4f2e1f6a9dcf12cc1a6fc0e15989014efc02a941d3e0f5dc2120" +checksum = "1a9002895a0de45e3cde58b36d0cf2f83249e7dba4a43ee64dafbf01bfd464ff" dependencies = [ "approx", + "generic-array", "matrixmultiply", - "nalgebra-macros", "num-complex", "num-rational", "num-traits", + "rand", + "rand_distr", "simba", "typenum", ] -[[package]] -name = "nalgebra-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "num" -version = "0.4.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" dependencies = [ "num-bigint", "num-complex", @@ -221,24 +123,22 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512" +checksum = "7d0a3d5e207573f948a9e5376662aa743a2ea13f7c50a554d7af443a73fbfeba" dependencies = [ "autocfg", "num-integer", "num-traits", - "serde", ] [[package]] name = "num-complex" -version = "0.4.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" +checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" dependencies = [ "num-traits", - "serde", ] [[package]] @@ -264,15 +164,14 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" dependencies = [ "autocfg", "num-bigint", "num-integer", "num-traits", - "serde", ] [[package]] @@ -285,37 +184,6 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" - -[[package]] -name = "order-stat" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa535d5117d3661134dbf1719b6f0ffe06f2375843b13935db186cd094105eb" - [[package]] name = "paste" version = "1.0.5" @@ -323,27 +191,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" [[package]] -name = "peroxide" -version = "0.30.9" +name = "phf" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acb182c4e420fa22bc0a6a9eecb4162c744d8262b7ce238a424aff7fd301735c" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" dependencies = [ - "matrixmultiply", - "order-stat", - "peroxide-ad", - "puruspe", - "rand", - "rand_distr", + "phf_shared", ] [[package]] -name = "peroxide-ad" -version = "0.3.0" +name = "phf_codegen" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6fba8ff3f40b67996f7c745f699babaa3e57ef5c8178ec999daf7eedc51dc8c" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" dependencies = [ - "quote", - "syn", + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", ] [[package]] @@ -352,47 +234,25 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -[[package]] -name = "proc-macro2" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "puruspe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7e158a385023d209d6d5f2585c4b468f6dcb3dd5aca9b75c4f1678c05bb375" - -[[package]] -name = "quote" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" -dependencies = [ - "proc-macro2", -] - [[package]] name = "rand" -version = "0.8.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ + "getrandom", "libc", "rand_chacha", "rand_core", "rand_hc", + "rand_pcg", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", "rand_core", @@ -400,18 +260,18 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ "getrandom", ] [[package]] name = "rand_distr" -version = "0.4.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051b398806e42b9cd04ad9ec8f81e355d0a382c543ac6672c62f5a5b452ef142" +checksum = "c9e9532ada3929fb8b2e9dbe28d1e06c9b2cc65813f074fcb6bd5fbefeff9d56" dependencies = [ "num-traits", "rand", @@ -419,9 +279,18 @@ dependencies = [ [[package]] name = "rand_hc" -version = "0.3.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" dependencies = [ "rand_core", ] @@ -432,37 +301,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" -[[package]] -name = "rustc-demangle" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" - -[[package]] -name = "serde" -version = "1.0.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "simba" -version = "0.5.1" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e82063457853d00243beda9952e910b82593e4b07ae9f721b9278a99a0d3d5c" +checksum = "17bfe642b1728a6e89137ad428ef5d4738eca4efaba9590f9e110b8944028621" dependencies = [ "approx", "num-complex", @@ -471,44 +314,10 @@ dependencies = [ ] [[package]] -name = "syn" -version = "1.0.73" +name = "siphasher" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "thiserror" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "thread-tree" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd15110864dc0eccbd281d13c15a5863f7739a6fbcf710190a6d13e797aa1a57" -dependencies = [ - "crossbeam-channel", -] +checksum = "cbce6d4507c7e4a3962091436e56e95290cb71fa302d0d270e32130b75fbff27" [[package]] name = "typenum" @@ -517,13 +326,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "version_check" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" diff --git a/fractal_dimension/bai_finch_rust/Cargo.toml b/fractal_dimension/bai_finch_rust/Cargo.toml index d3ba21d..58649dc 100644 --- a/fractal_dimension/bai_finch_rust/Cargo.toml +++ b/fractal_dimension/bai_finch_rust/Cargo.toml @@ -7,7 +7,8 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -num = "0.4.0" -nalgebra = "0.27.1" -peroxide = "0.30" -gad = "0.2.0" +num = "0.3.1" +nalgebra = "0.24.1" +bacon-sci = "*" +simba = "0.3.1" +num-complex = "0.3.1" diff --git a/fractal_dimension/bai_finch_rust/src/diff.rs b/fractal_dimension/bai_finch_rust/src/diff.rs new file mode 100644 index 0000000..a141136 --- /dev/null +++ b/fractal_dimension/bai_finch_rust/src/diff.rs @@ -0,0 +1,57 @@ +use num_complex::Complex64; +use simba::scalar::ComplexField; +use std::f64::consts::PI; + +pub type CFunction<'a> = &'a dyn Fn(Complex64) -> Complex64; +pub type Path<'a> = &'a dyn Fn(f64) -> Complex64; +pub type Rule<'a> = &'a dyn Fn(CFunction, Complex64, Complex64) -> Complex64; + +pub fn unit_circle(t: f64) -> Complex64 { + num::Complex::new((2.0 * PI * t).cos(), (2.0 * PI * t).sin()) +} + +pub fn trapezoid(f: CFunction, a: Complex64, b: Complex64) -> Complex64 { + 0.5 * (b - a) * (f(a) + f(b)) +} + +fn factorial(n: i32) -> i32 { + (1..=n).product() +} + +fn test(t: f64) -> Complex64 { + 1.0 / unit_circle(t) +} + +// pub fn diff(fun: CFunction, a: Complex64, n: i32) -> Result { +// let f = |t: f64| -> Complex64 { +// let z = unit_circle(t); +// fun(z) / (z - a).powi(n + 1) +// }; +// let integral = bacon_sci::integrate::integrate_fixed(0f64, 1f64, f, 10)?; +// Ok(integral * Complex64::new(factorial(n) as f64, 0.0) / Complex64::new(0.0, 2.0 * PI)) +// } + +pub fn diff(fun: CFunction, a: Complex64, n: i32) -> Result { + let f = |z: Complex64| -> Complex64 { + fun(z) / (z - a).powi(n + 1) + }; + let integral = integrate(&f, &unit_circle, &trapezoid); + Ok(integral * Complex64::new(factorial(n) as f64, 0.0) / Complex64::new(0.0, 2.0 * PI)) +} + +pub fn integrate(f: CFunction, path: Path, rule: Rule) -> Complex64 { + let increment = 0.00001; + let mut integral = Complex64::new(0.0, 0.0); + + let mut i = increment; + let mut previous_point = path(0.0); + while i <= 1.0 { + let point = path(i); + integral += rule(f, previous_point, point); + previous_point = point; + + i += increment; + } + + integral +} diff --git a/fractal_dimension/bai_finch_rust/src/main.rs b/fractal_dimension/bai_finch_rust/src/main.rs index 3f47909..fa30ad5 100644 --- a/fractal_dimension/bai_finch_rust/src/main.rs +++ b/fractal_dimension/bai_finch_rust/src/main.rs @@ -1,143 +1,32 @@ -use gad::prelude::*; -use nalgebra::{SMatrix, SVector}; -use num::Complex; +#![allow(dead_code)] + +mod diff; + +use diff::*; +use num_complex::Complex64; +use std::f64::consts::PI; +// use nalgebra::{SMatrix, SVector}; type F = f64; -type Matrix2x2 = SMatrix, 2, 2>; +// type NComplex = num::Complex; +// type Matrix2x2 = SMatrix, 2, 2>; +// type Complex = Complex64; -fn sum( - g: &mut GraphN, - ar: &Value, - ai: &Value, - br: &Value, - bi: &Value, -) -> Result<(Value, Value)> { - Ok((g.add(ar, br)?, g.add(ai, bi)?)) -} +// fn power_method( +// vec: SVector, +// mat: SMatrix, +// iterations: usize, +// ) -> NComplex { +// let mut current = vec; +// let mut previous = vec; +// for _ in 0..iterations { +// previous = current; +// current = mat * current; +// println!("current guess: {}", current[0] / previous[0]); +// } -fn product( - g: &mut GraphN, - ar: &Value, - ai: &Value, - br: &Value, - bi: &Value, -) -> Result<(Value, Value)> { - let t1 = g.mul(ar, br)?; - let t2 = g.mul(ai, bi)?; - let t3 = g.sub(&t1, &t2)?; - - let s1 = g.mul(ar, bi)?; - let s2 = g.mul(ai, br)?; - let s3 = g.add(&s1, &s2)?; - - Ok((t3, s3)) -} - -fn division( - g: &mut GraphN, - ar: &Value, - ai: &Value, - br: &Value, - bi: &Value, -) -> Result<(Value, Value)> { - let numerator1 = { - let t1 = g.mul(ar, br)?; - let t2 = g.mul(ai, bi)?; - g.add(&t1, &t2)? - }; - let denominator1 = { - let t1 = g.mul(br, br)?; - let t2 = g.mul(bi, bi)?; - g.add(&t1, &t2)? - }; - - let numerator2 = { - let t1 = g.mul(ar, bi)?; - let t2 = g.mul(ai, br)?; - g.sub(&t1, &t2)? - }; - let denominator2 = { - let t1 = g.mul(br, br)?; - let t2 = g.mul(bi, bi)?; - g.add(&t1, &t2)? - }; - - let f1 = g.div(&numerator1, &denominator1)?; - let f2 = g.div(&numerator2, &denominator2)?; - - Ok((f1, f2)) -} - -fn mobius_derivative(mat: Matrix2x2) -> Result<(Value, Value)> { - let mut g = GraphN::new(); - let x = g.variable(0.0); - let y = g.variable(0.0); - let a11r = g.constant(mat[(0, 0)].re); - let a12r = g.constant(mat[(0, 1)].re); - let a21r = g.constant(mat[(1, 0)].re); - let a22r = g.constant(mat[(1, 1)].re); - - let a11i = g.constant(mat[(0, 0)].im); - let a12i = g.constant(mat[(0, 1)].im); - let a21i = g.constant(mat[(1, 0)].im); - let a22i = g.constant(mat[(1, 1)].im); - - let (numeratorr, numeratori) = { - let (prodr, prodi) = product(&mut g, &x, &y, &a11r, &a11i)?; - sum(&mut g, &a12r, &a12i, &prodr, &prodi)? - }; - - let (denominatorr, denominatori) = { - let (prodr, prodi) = product(&mut g, &x, &y, &a21r, &a21i)?; - sum(&mut g, &a22r, &a22i, &prodr, &prodi)? - }; - - let (resultr, resulti) = division( - &mut g, - &numeratorr, - &numeratori, - &denominatorr, - &denominatori, - )?; - - let x = x.gid()?; - - let one = g.constant(1.0); - let one2 = g.constant(1.0); - let gradients1 = g.compute_gradients(resultr.gid()?, one)?; - let gradients2 = g.compute_gradients(resulti.gid()?, one2)?; - - let du_dx = gradients1.get(x).unwrap(); - let dv_dx = gradients2.get(x).unwrap(); - - Ok(Complex::new(*du_dx.data(), -*dv_dx.data())) -} - -fn next_order_derivative( - g: &mut GraphN, - expr: &GradientId, - var: &GradientId, -) -> Result> { - let dz = g.constant(1.0); - let dz_d = g.compute_gradients(*expr, dz)?; - Ok(dz_d.get(*var).unwrap().clone()) -} - -fn power_method( - vec: SVector, N>, - mat: SMatrix, N, N>, - iterations: usize, -) -> Complex { - let mut current = vec; - let mut previous = vec; - for _ in 0..iterations { - previous = current; - current = mat * current; - println!("current guess: {}", current[0] / previous[0]); - } - - current[0] / previous[0] -} +// current[0] / previous[0] +// } fn secant_method(f: fn(F) -> F, x0: F, x1: F, accuracy: F, iterations: usize) -> F { let mut x0 = x0; @@ -158,6 +47,13 @@ fn secant_method(f: fn(F) -> F, x0: F, x1: F, accuracy: F, iterations: usize) -> x0 } +fn dzdt(t: f64) -> Complex64 { + Complex64::new( + -2.0 * PI * (-2.0 * PI * t).sin(), + 2.0 * PI * ( 2.0 * PI * t).cos(), + ) +} + fn main() { // let g = Matrix2x2::new( // Complex::new(2.0 / 12.0, -2.0 / 12.0), @@ -172,4 +68,29 @@ fn main() { // Complex::new(0.0, 4.0 / 12.0), // Complex::new(-6.0 / 12.0, -8.0 / 12.0), // ); + + println!( + "{}", + diff(&|z: Complex64| z * z, Complex64::new(0.3, 0.3), 1).unwrap() + ); + + // println!( + // "{}", + // bacon_sci::integrate::integrate( + // 0.0, + // 1.0, + // &|t: f64| dzdt(t) + // / Complex64::new( + // (std::f64::consts::PI * 2.0 * t).cos(), + // (std::f64::consts::PI * 2.0 * t).sin() + // ), + // 0.001 + // ) + // .unwrap() + // ); + + println!( + "{}", + integrate(&|z: Complex64| 1.0 / z, &unit_circle, &trapezoid) + ); }