That took a bit to digest.
I think you are asking about how to deal with callbacks to J.
The issue here is that there's four J verbs, which all need to be
handled through a callback into J.
There's also potentially a callback from J back into gsl to get a
uniformly distributed random number. But the mechanism there is
slightly awful (the example uses gsl's default behavior for uniform
random numbers which has a 32 bit legacy), so I think J's built in
random number generator should be preferred for this example.
With that in mind, the J side of things would look something like this:
p=:''
p=:p, N_TRIES=: 200
p=:p, ITERS_FIXED_T=: 1000
p=:p, STEP_SIZE=: 1.0
p=:p, K=: 1.0
p=:p, T_INITIAL=: 0.008
p=:p, MU_T=: 1.003
p=:p, T_MIN=: 2e_6
params=: p
E1=: {{ (^-(y-1)^2)*1 o.8*y }}
M1=: |@-
S1=: {{ (?0)*2*y-y*x }}
P1=: {{ 0 [9!:11 p [echo y [9!:11]12 [p=. 9!:10'' }}
The next part involves setting up the callback (15!:13 and
https://github.com/jsoftware/jsource/blob/master/jsrc/x15.c#L1425),
the J side of the callback would probably look something like this:
cdcallback=: {{
'fn yv xv'=. 3{. y
select. fn.
case. 0 do. cdresult=: E1 yv
case. 1 do. cdresult=: xv M1 yv
case. 2 do. cdresult=: xv S1 yv
case. 3 do. cdresult=: P1 y
end.
}}
The final step would be to wrap all of this in a C implementation with
a main(), which plugs itself into gsl_siman_solve
But it would probably be more space efficient and time efficient to
implement a workalike for gsl_siman_solve natively in J, perhaps based
on the writeup at https://en.wikipedia.org/wiki/Simulated_annealing#,
because the interface friction here has a rather high cost.
(Specifically, gsl_siman_solve expects that the most efficient way of
working with data structures is at the machine operation level. It
expects to be blind to array structure. Meanwhile, J expects that the
most efficient way of working with data structures is to require cache
coherence at the low level. The combination, from a programmer's
perspective, is sort of like a colony of ants trying to carry a sports
car.)
I hope this helps,
--
Raul
On Sat, Feb 27, 2021 at 7:08 AM Emir U <[email protected]> wrote:
>
> Hey Chris, thank you, those examples were very helpful. I haven't touched C
> in ages and the data structures in GSL are pretty hairy at times. It'd be
> very helpful to know how you'd approach something like the "Trivial Example"
> from https://www.gnu.org/software/gsl/doc/html/siman.html but with the 1D
> function specified from J. Emir
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm