diff options
Diffstat (limited to 'aberth/aberth_kernel.fut')
-rw-r--r-- | aberth/aberth_kernel.fut | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/aberth/aberth_kernel.fut b/aberth/aberth_kernel.fut index fae1450..58b8838 100644 --- a/aberth/aberth_kernel.fut +++ b/aberth/aberth_kernel.fut @@ -128,11 +128,13 @@ let calc_index (value: f64) (left: f64) (right: f64) (steps: i32): i32 = let point_index (width: i32) (height: i32) - (top_left: complex) (bottom_right: complex) + (bottom_left: complex) (top_right: complex) (pt: complex) : i32 = - let xi = calc_index (c64.re pt) (c64.re top_left) (c64.re bottom_right) width - let yi = calc_index (c64.im pt) (c64.im bottom_right) (c64.im top_left) height + -- Range for 'yi' is reversed because image coordinates go down in the y + -- direction, while complex coordinates go up in the y direction + let xi = calc_index (c64.re pt) (c64.re bottom_left) (c64.re top_right) width + let yi = calc_index (c64.im pt) (c64.im top_right) (c64.im bottom_left) height in if 0 <= xi && xi < width && 0 <= yi && yi < height then width * yi + xi else -1 @@ -145,16 +147,19 @@ entry main_job : []i32 = -- Unnecessary to give each polynomial a different seed let rng = rand_engine.rng_from_seed [seed] - let top_left = c64.mk left top - let bottom_right = c64.mk right bottom - let indices = filter (\i -> i != -1) (flatten + let bottom_left = c64.mk left bottom + let top_right = c64.mk right top + let indices = flatten (map (\idx -> let p = derbyshire_at_index idx let (_, pts) = aberth.aberth p rng - let indices = map (point_index width height top_left bottom_right) pts - in indices) - (start_index ..< start_index + num_polys))) - in reduce_by_index (replicate (width * height) 0) (+) 0 indices (replicate (length indices) 1) + 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) entry main_all (width: i32) (height: i32) |