diff options
-rw-r--r-- | aberth/aberth_kernel.fut | 14 | ||||
-rw-r--r-- | aberth/futhark.pkg | 2 | ||||
-rw-r--r-- | aberth/kernel.cpp | 1 | ||||
-rw-r--r-- | aberth/polygen.cpp | 1 |
4 files changed, 11 insertions, 7 deletions
diff --git a/aberth/aberth_kernel.fut b/aberth/aberth_kernel.fut index fd4d943..5d851f0 100644 --- a/aberth/aberth_kernel.fut +++ b/aberth/aberth_kernel.fut @@ -29,7 +29,8 @@ let evaln_d (p: poly) (nterms: i32) (pt: f32): f32 = let eval_d (p: poly) (pt: f32): f32 = evaln_d p (length p) pt let derivative (p: poly): *poly = - map (\(i, v) -> f32.i32 i * v) (zip (1..<PolyN) (tail p)) ++ [0] + let res = map (\(i, v) -> f32.i32 i * v) (tail (zip (0..<PolyN) p)) ++ [0] + in res :> poly -- Cauchy's bound: https://en.wikipedia.org/wiki/Geometrical_properties_of_polynomial_roots#Lagrange's_and_Cauchy's_bounds let max_root_norm (p: poly): f32 = @@ -44,14 +45,14 @@ module aberth = { let gen_coord (r: f32) (rng: *rand_engine.rng): *(rand_engine.rng, f32) = uniform_real.rand (-r, r) rng - let gen_coord_c (r: f32) (rng: rand_engine.rng): (rand_engine.rng, complex) = + let gen_coord_c (r: f32) (rng: *rand_engine.rng): (rand_engine.rng, complex) = let (rng, x) = gen_coord r rng let (rng, y) = gen_coord r rng in (rng, cplx.mk x y) let generate (ctx: context) (rng: *rand_engine.rng): *(rand_engine.rng, approx) = let rngs = rand_engine.split_rng N rng - let (rngs, approx) = unzip (map (gen_coord_c ctx.radius) rngs) + let (rngs, approx) = unzip (map (\rng -> gen_coord_c ctx.radius (copy rng)) rngs) let rng = rand_engine.join_rng rngs in (rng, approx) @@ -107,7 +108,8 @@ module aberth = { -- Set the constant coefficient to 1; nextDerbyshire will never change it let init_derbyshire: poly = - [1] ++ replicate (PolyN - 1) (-1) + let res = [1] ++ replicate (PolyN - 1) (-1) + in res :> poly let next_derbyshire (p: *poly): *(bool, poly) = let (_, p, looped) = @@ -152,14 +154,14 @@ entry main_job let indices = flatten (map (\idx -> let p = derbyshire_at_index idx - let (_, pts) = aberth.aberth p rng + let (_, pts) = aberth.aberth p (copy rng) in map (point_index width height bottom_left top_right) pts) (start_index ..< start_index + num_polys)) let filtered = filter (\i -> i != -1) indices in reduce_by_index (replicate (width * height) 0) (+) 0 filtered - (replicate (length filtered) 1) + (map (const 1) filtered) entry main_all (width: i32) (height: i32) diff --git a/aberth/futhark.pkg b/aberth/futhark.pkg index 963e457..c136912 100644 --- a/aberth/futhark.pkg +++ b/aberth/futhark.pkg @@ -1,4 +1,4 @@ require { github.com/diku-dk/complex 0.1.2 #790bf261a6a36a9454b55f3f8109ac5cb1f4bf6e - github.com/diku-dk/cpprandom 1.1.4 #7dd47f3f2f5a8fa24d6847b34d9f8a9091b5d94a + github.com/diku-dk/cpprandom 1.2.1 #869304710af3a023683d6670316d55dafd973c71 } diff --git a/aberth/kernel.cpp b/aberth/kernel.cpp index 36c3102..92d2d20 100644 --- a/aberth/kernel.cpp +++ b/aberth/kernel.cpp @@ -1,4 +1,5 @@ #include <iostream> +#include <cassert> #include "kernel.h" extern "C" { diff --git a/aberth/polygen.cpp b/aberth/polygen.cpp index e606dc8..d846e90 100644 --- a/aberth/polygen.cpp +++ b/aberth/polygen.cpp @@ -1,3 +1,4 @@ +#include <cassert> #include "polygen.h" #include "util.h" |