@@ -6,7 +6,7 @@ use crate::math::reference::Reference;
66pub struct Perturbation { }
77
88impl Perturbation {
9- pub fn iterate ( pixel_data : & mut [ PixelData ] , reference : & Reference ) {
9+ pub fn iterate_normal ( pixel_data : & mut [ PixelData ] , reference : & Reference ) {
1010 pixel_data. par_chunks_mut ( 4 )
1111 . for_each ( |pixel_data| {
1212 for pixel in pixel_data {
@@ -58,8 +58,6 @@ impl Perturbation {
5858 } else {
5959 // If the reference is not small, use the usual method
6060
61- // pixel.delta_current.mantissa = 2.0 * reference.data[pixel.iteration - reference.start_iteration].z_fixed * pixel.delta_current.mantissa + temp * pixel.delta_current.mantissa + scaled_delta_reference;
62-
6361 // 4 multiplications and 2 additions
6462 pixel. delta_current . mantissa *= z + reference_data. z_fixed ;
6563 // 2 additions
@@ -82,67 +80,94 @@ impl Perturbation {
8280 if !pixel. escaped && !pixel. glitched {
8381 pixel. iteration = reference. current_iteration ;
8482 }
83+ }
84+ } ) ;
85+ }
86+
87+ pub fn iterate_normal_plus_derivative ( pixel_data : & mut [ PixelData ] , reference : & Reference ) {
88+ pixel_data. par_chunks_mut ( 4 )
89+ . for_each ( |pixel_data| {
90+ for pixel in pixel_data {
91+ let mut scaled_iterations = 0 ;
92+ let mut scaled_scale_factor_1 = 1.0f64 . ldexp ( pixel. delta_current . exponent ) ;
93+ let mut scaled_scale_factor_2 = 1.0f64 . ldexp ( -pixel. derivative_current . exponent ) ;
94+ let mut scaled_delta_reference = 1.0f64 . ldexp ( pixel. delta_reference . exponent - pixel. delta_current . exponent ) * pixel. delta_reference . mantissa ;
95+
96+ let val1 = pixel. iteration - reference. start_iteration ;
97+ let val2 = reference. current_iteration - reference. start_iteration ;
98+ let reference_slice = & reference. reference_data [ val1..=val2] ;
8599
86- // while pixel.iteration < reference.current_iteration {
87- // let reference_data = &reference.reference_data[pixel.iteration - reference.start_iteration ];
100+ for additional_iterations in 0 ..= ( reference. current_iteration - pixel . iteration ) {
101+ let reference_data = & reference_slice [ additional_iterations ] ;
88102
89- // // 2 multiplications and 2 adds
90- // let z = reference_data.z_fixed + scaled_scale_factor_1 * pixel.delta_current.mantissa;
103+ // 2 multiplications and 2 adds
104+ let z = reference_data. z_fixed + scaled_scale_factor_1 * pixel. delta_current . mantissa ;
91105
92- // if pixel.delta_current.exponent > -500 {
93- // // 2 multiplications and one add
94- // let z_norm = z.norm_sqr();
106+ if pixel. delta_current . exponent > -500 {
107+ // 2 multiplications and one add
108+ let z_norm = z. norm_sqr ( ) ;
95109
96- // if z_norm < reference_data.z_tolerance {
97- // pixel.glitched = true;
98- // break;
99- // }
110+ if z_norm < reference_data. z_tolerance {
111+ pixel. iteration += additional_iterations;
112+ pixel. glitched = true ;
113+ break ;
114+ }
100115
101- // if z_norm > 1e16 {
102- // pixel.escaped = true;
103- // pixel.delta_current.mantissa = pixel.delta_current.to_float();
104- // pixel.delta_current.exponent = 0;
105- // break;
106- // }
107- // }
116+ if z_norm > 1e16 {
117+ pixel. iteration += additional_iterations;
118+ pixel. escaped = true ;
119+ pixel. delta_current . mantissa = pixel. delta_current . to_float ( ) ;
120+ pixel. delta_current . exponent = 0 ;
121+ break ;
122+ }
123+
124+ pixel. derivative_current . mantissa *= 2.0 * z;
125+ pixel. derivative_current . mantissa += scaled_scale_factor_2;
126+ }
108127
109- // if reference_data.extended_precision_required {
110- // // If the reference is small, use the slow extended method
111- // pixel.delta_current *= reference_data.z_extended * 2.0 + pixel.delta_current;
112- // pixel.delta_current += pixel.delta_reference;
128+ if reference_data. extended_precision_required {
129+ // If the reference is small, use the slow extended method
130+ pixel. delta_current *= reference_data. z_extended * 2.0 + pixel. delta_current ;
131+ pixel. delta_current += pixel. delta_reference ;
113132
114- // // reset the scaled counter
115- // pixel.delta_current.reduce();
133+ // reset the scaled counter
134+ pixel. delta_current . reduce ( ) ;
135+ pixel. derivative_current . reduce ( ) ;
116136
117- // scaled_scale_factor_1 = 1.0f64.ldexp(pixel.delta_current.exponent);
118- // scaled_delta_reference = 1.0f64.ldexp(pixel.delta_reference.exponent - pixel.delta_current.exponent) * pixel.delta_reference.mantissa;
137+ scaled_scale_factor_1 = 1.0f64 . ldexp ( pixel. delta_current . exponent ) ;
138+ scaled_scale_factor_2 = 1.0f64 . ldexp ( -pixel. derivative_current . exponent ) ;
139+ scaled_delta_reference = 1.0f64 . ldexp ( pixel. delta_reference . exponent - pixel. delta_current . exponent ) * pixel. delta_reference . mantissa ;
119140
120- // scaled_iterations = 0;
121- // } else {
122- // // If the reference is not small, use the usual method
141+ scaled_iterations = 0 ;
142+ } else {
143+ // If the reference is not small, use the usual method
123144
124- // // pixel.delta_current.mantissa = 2.0 * reference.data[pixel.iteration - reference.start_iteration].z_fixed * pixel.delta_current.mantissa + temp * pixel.delta_current.mantissa + scaled_delta_reference;
145+ // 4 multiplications and 2 additions
146+ pixel. delta_current . mantissa *= z + reference_data. z_fixed ;
147+ // 2 additions
148+ pixel. delta_current . mantissa += scaled_delta_reference;
125149
126- // // 4 multiplications and 2 additions
127- // pixel.delta_current.mantissa *= z + reference_data.z_fixed;
128- // // 2 additions
129- // pixel.delta_current.mantissa += scaled_delta_reference;
150+ scaled_iterations += 1 ;
130151
131- // scaled_iterations += 1;
152+ // check the counter, if it is > 250, do a normalisation
153+ if scaled_iterations > 250 {
154+ pixel. delta_current . reduce ( ) ;
155+ pixel. derivative_current . reduce ( ) ;
132156
133- // // check the counter, if it is > 250, do a normalisation
134- // if scaled_iterations > 250 {
135- // pixel.delta_current.reduce() ;
157+ scaled_scale_factor_1 = 1.0f64 . ldexp ( pixel . delta_current . exponent ) ;
158+ scaled_scale_factor_2 = 1.0f64 . ldexp ( -pixel . derivative_current . exponent ) ;
159+ scaled_delta_reference = 1.0f64 . ldexp ( pixel. delta_reference . exponent - pixel . delta_current . exponent ) * pixel . delta_reference . mantissa ;
136160
137- // scaled_scale_factor_1 = 1.0f64.ldexp(pixel.delta_current.exponent);
138- // scaled_delta_reference = 1.0f64.ldexp(pixel.delta_reference.exponent - pixel.delta_current.exponent) * pixel.delta_reference.mantissa;
161+ scaled_iterations = 0 ;
162+ }
163+ }
164+ }
139165
140- // scaled_iterations = 0;
141- // }
142- // }
166+ pixel. derivative_current . reduce ( ) ;
143167
144- // pixel.iteration += 1;
145- // }
168+ if !pixel. escaped && !pixel. glitched {
169+ pixel. iteration = reference. current_iteration ;
170+ }
146171 }
147172 } ) ;
148173 }
0 commit comments