Rob, you are right. I lacked imagination to see that and "overdesigned". It's clearly see that due to simmetrical nature of *: and shift by 1, it's impossible to apply the filter after *: plot (; *:@-. * 1 < |) 4*(%~ i:) 200 NB. correct plot (; [: (* 1&<) *:@-.) 4*(%~ i:) 200 NB. filter after *:@-.
Here's another version I was contemplating 0j6": 1 +/ . (*:@- * <&|) (|. v1) p. (%~ i:) 30 676667.956501 +/ 1 (*:@- * <&|) px1 10 ----- Original Message ---- From: Rob Hodgkinson <[EMAIL PROTECTED]> To: Programming forum <[email protected]> Sent: Wednesday, June 28, 2006 5:45:46 AM Subject: RE: [Jprogramming] Precision query A question for Oleg - forgive me if I am incorrect in raising this as I do not feel so experienced to query J code as yet ... Oleg, I think your solution has introduced a small, subtle bug compared to Henry or Raul's, as your test 1&< is based on (1-px)^2, instead of on px. Ronan's data (v1) does not produce any px's in the test range _1<:px<:1, so your solution agrees with Henry/Raul in this instance. px =: (|. v1) p. (%~ i:) 30 NB. Ronan's px data from 60, v1 (<./ , >./) px NB. Range of px values _190.837 _30.0942 NB. None in range _1<:px<:1 oleg =: 3 : '+/ (* 1&<) *:-. y' henry =: [: +/ [: *: -. * _1&> + 1&< raul =: [: +/ [: *: (1-]) * 1 < | 0j6":(oleg , henry , raul) px 676667.956501 676667.956501 676667.956501 NB. No problems for Ronan's data However, if the px's were to contain values within _1<:px<:1 ... px1 =: _2 _0.7 _0.3 0.3 0.7 2 NB. Make up test data (oleg , henry , raul) px1 13.58 10 10 The difference being the test on px or (1-px)^2 for px, between _1 and 0... > px1 ; ((* 1&<)*:-. px1) ; ([: *: -. * _1&> +. 1&<) px1 _2 _0.7 _0.3 0.3 0.7 2 NB. px1 made up test data 9 2.89 1.69 0 0 0 NB. Oleg's test based on 1<(1-px1)^2 9 0 0 0 0 1 NB. Henry/Raul's test based on _1<:px1<:1 Is this a correct analysis ?.../Rob Hodgkinson PS: Written in Courier, but my emails seem to be transformed upon sending, apologies if this does not display nicely. -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Oleg Kobchenko Sent: Wednesday, 28 June 2006 4:49 PM To: Programming forum Subject: Re: [Jprogramming] Precision query 0j6": +/ (* 1&<) *:-. (|. v1) p. (%~ i:) 30 676667.956501 ----- Original Message ---- From: Henry Rich <[EMAIL PROTECTED]> To: Programming forum <[email protected]> Sent: Tuesday, June 27, 2006 9:56:31 PM Subject: RE: [Jprogramming] Precision query You need to do the 1-px thing like so: calcCost =: [: +/ [: *: -. * _1&> + 1&< and then, if you want to see the result in full precision, you have to ask for it: 15j6 ": calcCost (|. v1) p. dxVect 676667.956501 The default display doesn't show the lower digits. It doesn't seem right to me to look for values outside of [0,1] and then square the distance from 1. Shouldn't you square the distance from 1 if it's >1, and square the distance from _1 if it's <_1? That is, -.@:| instead of -. above Henry Rich > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Ronan Reilly > Sent: Tuesday, June 27, 2006 8:17 PM > To: Programming forum > Subject: [Jprogramming] Precision query > > Hi, > > In light of the recent discussion on precision and rounding > error, I have a > concrete example of a problem I'm having with rounding error (at least > that's where I think the problem lies). > > The goal is to write a cost function for a polynomial > evaluation so that any > result outside [-1,1] is penalised. The work is part of an > implementation > of a genetic algorithm. > > Here is a stripped down C function which I'm using as the > basis for my J > implementation (plus a sample vector for evaluation): > ==== > #include "stdio.h" > > double evaluate (int, double[]); > > int main() { > > double v1[]={54.735, 31.069, -79.616, -22.279, -76.028, > -42.021, -34.925, > -44.066, -53.706}; > printf ("evaluate: %f\n", evaluate(9, v1)); > > return; > } > > double evaluate(int D, double tmp[]) { > int const M=60; > int i, j; > double px, x, dx, result=0.0; > > x = -1.0; > dx = 2.0/(double)M; > for (i=0; i<=M; i++) { > px = tmp[0]; > for (j=1; j<D; j++) { > px = x*px + tmp[j]; > } > if (px<-1.0 || px>1.0) result+=(1.0-px)*(1.0-px); > x+=dx; > } > return result; > } > === > > Here is the equivalent J code: > > v1 =: 54.735 31.069 _79.616 _22.279 _76.028 _42.021 _34.925 > _44.066 _53.706 > dxVect =: +/\ _1, 60 $ 2 % 60 > calcCost =: [: +/ [: *: ] * _1&> + 1&< > > When I run the J code (J601 o beta) I get: > > calcCost (|. v1) p. dxVect > 665922 > > whereas running the C program gives me: > > evaluate: 676667.956501 > > The problem seems to be with calcCost, and I was wondering if > there was a > different way of formulating that function to reduce the > discrepancy in the > two results. > > Many thanks, > > Ronan > > > -- > Ronan Reilly > NUI Maynooth > > t: +353-1-7083847 > e: [EMAIL PROTECTED] > w: http://www.cs.nuim.ie; http://cortex.cs.nuim.ie > > > > ---------------------------------------------------------------------- > For information about J forums see > http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
