Results of the integration tests are in:
.............................................................
...........................*#*...............................
............................*................................
.......................**#######**#..........................
.....................**############..........................
.............*.#....*##############*.........................
............*#####***##############*.........................
#*********#########*##############...........................
............*#####***##############*.........................
.............*.#....*##############*.........................
.....................**############..........................
.......................**#######**#..........................
............................*................................
...........................*#*...............................
.............................................................
That's with an iteration max of 1000 and 72-bit mantissas. Yeah, it's a very shallow deep zoom, and it's using the new expression optimizer. The optimizer's only effect on this particular mapping being to change 2
xy to (
xy +
xy) in the next-
y part of the calculations (which it does because bignum multiplies are so much slower than bignum adds). (*s indicate points whose periods were not detected.)
Still, everything seems to hang together and work together at this point. Now work can begin on building the higher-level stuff.
The code I executed at my REPL to generate that, by the way, being
(def *l* (make-iteration-loops 72 *n-complex* 2 2 '[(:= z (+ (** z 2) c))] '[] nil '(0 0) '(-1.9913844699254 0)))
(asciibrot 30 15 *l* 1000)
Yes, it really does transform
'[(:= z (+ (** z 2) c))] on the fly into an optimized, for non-bignums only 7 nanosecond, loop that can be called upon at any future time, all by itself without further human intervention.
Well, almost.
The quoted lists at the end of the first line are a
z and
c pair that gives rise to an ergodic orbit on the spike. The benchmarking make-iteration-loops uses to choose alternative loop generation parameters didn't work too well with dummy loops -- either for code cache or branch prediction reasons, I'm not sure which. Using a live loop presents a problem if it bails out too early. So an interior point needs to be supplied, and for it to decide between circular and square trap around finite attractors/period checks, it needs not to converge too fast.
I'll experiment to see how sensitive the timing data are to the speed of escape/convergence of the supplied point. If worst comes to worst, for complex single-variable maps and quats, hypers, and any other algebraic rings that embed the complex plane, solving for the fixed points and then for parameter points such that the derivative at some fixed point is
, which is irrationally indifferent. (For the quadratic Mandelbrot, there are two such parameter points, belonging to the M-set and lying between seahorse valley and the period-3 bulbs; zooming there shows cauliflower shapes and gets into very high iterations very quickly, and the most common images of Siegel disk Julia sets correspond to these points. The orbit of zero is ergodic for all
z2 +
c Siegel disk parameters.) But I'm not sure what I'll do about systems of more than one variable or of one real variable in that eventuality.