Skip to content

Commit ab04452

Browse files
committed
added jitter and fixed analytic derivatives
1 parent d34a350 commit ab04452

File tree

8 files changed

+99
-62
lines changed

8 files changed

+99
-62
lines changed

high.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ frame_offset = 0
88
zoom_scale = 2.0
99
display_glitches = false
1010
auto_adjust_iterations = true
11-
remove_centre = true
11+
remove_centre = false
1212
export = "png"
1313

1414
glitch_tolerance = 1.4e-6
@@ -22,4 +22,5 @@ valid_iteration_probe_multiplier = 0.01
2222

2323
experimental = true
2424

25-
analytic_derivative = true
25+
analytic_derivative = false
26+
jitter = false
File renamed without changes.

locations/hard.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
real = "-1.9997740601362903593126807559602500475710416233856384007148508574291012335984591928248364190215796259575718318799960175396106897245889581254834492701372949636783094955897931317174101259095891469501748126725148714587333938548443819033709904187344921523413310221887295870857771431011674873342592895504186325482220668710775749899926429101099841583206278295793058921625817004481783699245865364627140554117737774937789463895102748671351750212506004241754983473339789940659968568850689353099462034492524909310777724611601104714214019347435268544619054369865904944457792527241696528695821059623303046651934176389789308453627525109367436309636375268231073110318555064708363221007235298404379856922536028913291478442839193381367508575286692330907891402483843152933153748354825108021776358693600801782904774626935265722056455978643513448489091026679036353407968495795003386248005939867069799946547181378474054113117046900560609110812439442002663909295191705374444149326937073460052706389967886211172676612720028299452788285465688867116337489531157494508508315428488520037968118008255840569742557333862639124341116894229885253643651920014148109308402199399127712572209466874971603743536096235390414412927589954662603878558182262865151900604451937214289079939337905846647369517138325441736853526711818853134657265043099539402286244220638999824999819000131999789999857999958"
22
imag = "0.0000000032900403214794350534969786759266805967852946505878410088326046927853549452991056352681196631150325234171525664335353457621247922992470898021063583060218954321140472066153878996044171428801408137278072521468882260382336298800961530905692393992277070012433445706657829475924367459793505729004118759963065667029896464160298608486277109065108339157276150465318584383757554775431988245033409975361804443001325241206485033571912765723551757793318752425925728969073157628495924710926832527350298951594826689051400340011140584507852761857568007670527511272585460136585523090533629795012272916453744029579624949223464015705500594059847850617137983380334184205468184810116554041390142120676993959768153409797953194054452153167317775439590270326683890021272963306430827680201998682699627962109145863135950941097962048870017412568065614566213639455841624790306469846132055305041523313740204187090956921716703959797752042569621665723251356946610646735381744551743865516477084313729738832141633286400726001116308041460406558452004662264165125100793429491308397667995852591271957435535504083325331161340230101590756539955554407081416407239097101967362512942992702550533040602039494984081681370518238283847808934080198642728761205332894028474812918370467949299531287492728394399650466260849557177609714181271299409118059191938687461000000000000000000000000000000000000"
3-
zoom = "7.0E905"
3+
zoom = "7.0E401"
44
iterations = 20000000

locations/safari.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
real = "0.27533764774673799358866712482462788156671406989542628591627436306743751013023030130967197535665363986058288420463735384997362663584446169657773339617717365950286959762265485804783047336923365261060963100721927003791989610861331863571141065592841226995797739723012374298589823921181693139824190379745910243872940870200527"
22
imag = "0.006759649405327850670181700456194929502189750234614304846357269137106731032582471677573582008294494705826194131450773107049670717146785957633119244225710271178867840504202402362491296317894835321064971518673775630252745135294700216673815790733343134984120108524001799351076577642283751627469315124883962453013093853471895"
3-
zoom = "1.06316999999E170"
3+
zoom = "1.06316999999E307"
44
iterations = 6000000

src/math/perturbation.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use crate::util::{PixelData, FloatExp};
33
use rayon::prelude::*;
44
use crate::math::reference::Reference;
55

6+
use crate::util::ComplexExtended;
7+
68
pub struct Perturbation {}
79

810
impl Perturbation {
@@ -120,16 +122,16 @@ impl Perturbation {
120122
pixel.delta_current.exponent = 0;
121123
break;
122124
}
123-
124-
pixel.derivative_current.mantissa *= 2.0 * z;
125-
pixel.derivative_current.mantissa += scaled_scale_factor_2;
126125
}
127126

128127
if reference_data.extended_precision_required {
129128
// If the reference is small, use the slow extended method
130-
pixel.delta_current *= reference_data.z_extended * 2.0 + pixel.delta_current;
129+
pixel.delta_current *= reference_data.z_extended * 2.0;
131130
pixel.delta_current += pixel.delta_reference;
132131

132+
pixel.derivative_current *= reference_data.z_extended * 2.0;
133+
pixel.derivative_current += ComplexExtended::new2(1.0, 0.0, 0);
134+
133135
// reset the scaled counter
134136
pixel.delta_current.reduce();
135137
pixel.derivative_current.reduce();
@@ -147,6 +149,9 @@ impl Perturbation {
147149
// 2 additions
148150
pixel.delta_current.mantissa += scaled_delta_reference;
149151

152+
pixel.derivative_current.mantissa *= 2.0 * z;
153+
pixel.derivative_current.mantissa += scaled_scale_factor_2;
154+
150155
scaled_iterations += 1;
151156

152157
// check the counter, if it is > 250, do a normalisation

src/math/series_approximation.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ impl SeriesApproximation {
435435
// println!("{:?}", approximation);
436436

437437
// approximation *= point_delta;
438+
approximation.reduce();
438439
approximation
439440
}
440441
}

src/renderer.rs

Lines changed: 39 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ use std::io::Write;
66
use std::cmp::max;
77

88
use rand::seq::SliceRandom;
9+
use rand::Rng;
10+
911
use rayon::prelude::*;
1012
use config::Config;
1113

@@ -27,6 +29,7 @@ pub struct FractalRenderer {
2729
render_indices: Vec<usize>,
2830
remove_centre: bool,
2931
analytic_derivative: bool,
32+
jitter: bool,
3033
experimental: bool,
3134
}
3235

@@ -55,7 +58,7 @@ impl FractalRenderer {
5558
let glitch_tolerance = settings.get_float("glitch_tolerance").unwrap_or(1.4e-6) as f64;
5659
let data_storage_interval = settings.get_int("data_storage_interval").unwrap_or(10) as usize;
5760
let analytic_derivative = settings.get_bool("analytic_derivative").unwrap_or(false);
58-
61+
let jitter = settings.get_bool("jitter").unwrap_or(false);
5962

6063
let data_type = match settings.get_str("export").unwrap_or(String::from("COLOUR")).to_ascii_uppercase().as_ref() {
6164
"RAW" | "EXR" => DataType::RAW,
@@ -135,6 +138,7 @@ impl FractalRenderer {
135138
render_indices,
136139
remove_centre,
137140
analytic_derivative,
141+
jitter,
138142
experimental
139143
}
140144
}
@@ -207,20 +211,32 @@ impl FractalRenderer {
207211
self.remove_centre = false;
208212
}
209213

214+
215+
210216
let mut pixel_data = (&self.render_indices).into_par_iter()
211217
.map(|index| {
212-
let i = index % self.image_width;
213-
let j = index / self.image_width;
218+
let image_x = index % self.image_width;
219+
let image_y = index / self.image_width;
220+
221+
let mut i = image_x as f64;
222+
let mut j = image_y as f64;
223+
224+
if self.jitter {
225+
let mut rng = rand::thread_rng();
226+
227+
i += rng.gen_range(-0.2, 0.2);
228+
j += rng.gen_range(-0.2, 0.2);
229+
}
214230

215231
// This could be changed to account for jittering if needed
216232
let element = ComplexFixed::new(
217-
i as f64 * delta_pixel * cos_rotate - j as f64 * delta_pixel * sin_rotate + delta_top_left.re,
218-
i as f64 * delta_pixel * sin_rotate + j as f64 * delta_pixel * cos_rotate + delta_top_left.im
233+
i * delta_pixel * cos_rotate - j * delta_pixel * sin_rotate + delta_top_left.re,
234+
i * delta_pixel * sin_rotate + j * delta_pixel * cos_rotate + delta_top_left.im
219235
);
220236

221237
let chosen_iteration = if self.experimental {
222-
let test1 = ((self.series_approximation.probe_sampling - 1) as f64 * i as f64 / self.image_width as f64).floor() as usize;
223-
let test2 = ((self.series_approximation.probe_sampling - 1) as f64 * j as f64 / self.image_height as f64).floor() as usize;
238+
let test1 = ((self.series_approximation.probe_sampling - 1) as f64 * i / self.image_width as f64).floor() as usize;
239+
let test2 = ((self.series_approximation.probe_sampling - 1) as f64 * j / self.image_height as f64).floor() as usize;
224240

225241
let index = test2 * (self.series_approximation.probe_sampling - 1) + test1;
226242

@@ -239,8 +255,8 @@ impl FractalRenderer {
239255
};
240256

241257
PixelData {
242-
image_x: i,
243-
image_y: j,
258+
image_x,
259+
image_y,
244260
iteration: chosen_iteration,
245261
delta_centre: point_delta,
246262
delta_reference: point_delta,
@@ -285,48 +301,26 @@ impl FractalRenderer {
285301
correction_references += 1;
286302
glitch_reference.run();
287303

288-
// Experimental but does not work very well. There are quite a few glitches that still happen with this
289-
if false {
304+
let delta_current_reference = self.series_approximation.evaluate(glitch_reference_pixel.delta_centre, glitch_reference.start_iteration);
305+
306+
if self.analytic_derivative {
290307
pixel_data.par_iter_mut()
291308
.for_each(|pixel| {
292-
let chosen_iteration = {
293-
let test1 = ((self.series_approximation.probe_sampling - 1) as f64 * pixel.image_x as f64 / self.image_width as f64).floor() as usize;
294-
let test2 = ((self.series_approximation.probe_sampling - 1) as f64 * pixel.image_y as f64 / self.image_height as f64).floor() as usize;
295-
296-
let index = test2 * (self.series_approximation.probe_sampling - 1) + test1;
297-
298-
self.series_approximation.valid_interpolation[index]
299-
};
300-
301-
let delta_current_reference = self.series_approximation.evaluate(glitch_reference_pixel.delta_centre, chosen_iteration);
302-
303-
pixel.iteration = chosen_iteration;
309+
pixel.iteration = glitch_reference.start_iteration;
304310
pixel.glitched = false;
305-
pixel.delta_current = self.series_approximation.evaluate( pixel.delta_centre, chosen_iteration) - delta_current_reference;
311+
pixel.delta_current = self.series_approximation.evaluate( pixel.delta_centre, glitch_reference.start_iteration) - delta_current_reference;
306312
pixel.delta_reference = pixel.delta_centre - glitch_reference_pixel.delta_centre;
313+
pixel.derivative_current = self.series_approximation.evaluate_derivative(pixel.delta_centre, glitch_reference.start_iteration);
307314
});
308315
} else {
309-
let delta_current_reference = self.series_approximation.evaluate(glitch_reference_pixel.delta_centre, glitch_reference.start_iteration);
310-
311-
if self.analytic_derivative {
312-
pixel_data.par_iter_mut()
313-
.for_each(|pixel| {
314-
pixel.iteration = glitch_reference.start_iteration;
315-
pixel.glitched = false;
316-
pixel.delta_current = self.series_approximation.evaluate( pixel.delta_centre, glitch_reference.start_iteration) - delta_current_reference;
317-
pixel.delta_reference = pixel.delta_centre - glitch_reference_pixel.delta_centre;
318-
pixel.derivative_current = self.series_approximation.evaluate_derivative(pixel.delta_centre, glitch_reference.start_iteration);
319-
});
320-
} else {
321-
pixel_data.par_iter_mut()
322-
.for_each(|pixel| {
323-
pixel.iteration = glitch_reference.start_iteration;
324-
pixel.glitched = false;
325-
pixel.delta_current = self.series_approximation.evaluate( pixel.delta_centre, glitch_reference.start_iteration) - delta_current_reference;
326-
pixel.delta_reference = pixel.delta_centre - glitch_reference_pixel.delta_centre;
327-
});
328-
}
329-
};
316+
pixel_data.par_iter_mut()
317+
.for_each(|pixel| {
318+
pixel.iteration = glitch_reference.start_iteration;
319+
pixel.glitched = false;
320+
pixel.delta_current = self.series_approximation.evaluate( pixel.delta_centre, glitch_reference.start_iteration) - delta_current_reference;
321+
pixel.delta_reference = pixel.delta_centre - glitch_reference_pixel.delta_centre;
322+
});
323+
}
330324

331325
if self.analytic_derivative {
332326
Perturbation::iterate_normal_plus_derivative(&mut pixel_data, &glitch_reference);

src/util/data_export.rs

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,20 @@ impl DataExport {
120120
self.rgb[k] = out;
121121
self.rgb[k + 1] = out;
122122
self.rgb[k + 2] = out;
123+
124+
// if pixel.image_x == 960 && pixel.image_y > 540 && pixel.image_y < 740 {
125+
// println!("{:?} {:?} {:?} {:?} {:?} {:?}",
126+
// reference.reference_data[pixel.iteration - reference.start_iteration].z_extended,
127+
// pixel.delta_current,
128+
// pixel.derivative_current,
129+
// temp,
130+
// de,
131+
// out,
132+
// );
133+
// }
123134
}
135+
136+
124137
};
125138

126139
// self.iterations[k / 3] = pixel.iteration as u32;
@@ -142,20 +155,43 @@ impl DataExport {
142155
self.smooth_f16[k] = f16::from_f32(1.0 - (z_norm.ln() / escape_radius_ln).log2());
143156

144157
if self.analytic_derivative && pixel.iteration < maximum_iteration {
145-
let temp = (reference.reference_data[pixel.iteration - reference.start_iteration].z_extended + pixel.delta_current).norm();
158+
let temp1 = reference.reference_data[pixel.iteration - reference.start_iteration].z_extended + pixel.delta_current;
159+
let temp2 = temp1.norm();
160+
161+
// let de = 2.0 * temp * (temp.mantissa.ln() + temp.exponent as f64 * 2.0f64.ln()) / pixel.derivative_current.norm();
162+
163+
// let temp2 = pixel.derivative_current.mantissa.norm();
164+
165+
// let temp_x = pixel.derivative_current.mantissa.re / temp2;
166+
// let temp_y = pixel.derivative_current.mantissa.im / temp2;
167+
168+
// // println!("{}", f16::from_f64((de / delta_pixel).to_float().tanh()));
169+
// let value = (de / delta_pixel).to_float().tanh();
170+
171+
// u/v is temp
172+
// J is [deri_x, deri_y, -deri_y, deri_x]
173+
174+
let mut deri = pixel.derivative_current;
175+
deri.mantissa *= delta_pixel.mantissa;
176+
deri.exponent += delta_pixel.exponent;
177+
178+
let deri = deri.to_float();
146179

147-
let de = 2.0 * temp * (temp.mantissa.ln() + temp.exponent as f64 * 2.0f64.ln()) / pixel.derivative_current.norm();
180+
let num = 2.0 * temp2 * (temp2.mantissa.ln() + temp2.exponent as f64 * 2.0f64.ln());
148181

149-
let temp2 = pixel.derivative_current.mantissa.norm();
182+
let mut norm_u = temp1;
183+
let temp3 = temp1.norm();
184+
norm_u.mantissa /= temp3.mantissa;
185+
norm_u.exponent -= temp3.exponent;
150186

151-
let temp_x = pixel.derivative_current.mantissa.re / temp2;
152-
let temp_y = pixel.derivative_current.mantissa.im / temp2;
187+
let norm_u = norm_u.to_float();
153188

154-
// println!("{}", f16::from_f64((de / delta_pixel).to_float().tanh()));
155-
let value = (de / delta_pixel).to_float().tanh();
189+
let mut den = deri;
190+
den.re = norm_u.re * deri.re + norm_u.im * deri.im;
191+
den.im = -norm_u.re * deri.im + norm_u.im * deri.re;
156192

157-
self.distance_x[k] = f16::from_f64(temp_x * value);
158-
self.distance_y[k] = f16::from_f64(temp_y * value);
193+
self.distance_x[k] = f16::from_f64(num.to_float() / den.re);
194+
self.distance_y[k] = f16::from_f64(num.to_float() / den.im);
159195

160196
// println!("{} {} {} {}", temp_x * value, temp_y * value, value, ((temp_x * value).powi(2) + (temp_y * value).powi(2)).sqrt());
161197
}

0 commit comments

Comments
 (0)