Duh. What part of Sod's Law says that you always see a bug the first time you look at your own code *after* you've made the code public :-(

The 'sort' command below needs to be a numeric sort ....

sort pLines by item 1 of each   ----->   sort pLines numeric by item 1 of each

Sorry,

Alex.

On 20/01/2023 13:05, Alex Tweedly via use-livecode wrote:
Fascinating. Thank you so much for that Geoff.

I've been afraid to play with ChatGPT so far - too worried abut getting sucked in and spending way too much time ....

I did take a look at your third example (since I can never resist a performance challenge :-)

There are a number of minor tweaks that could be made to improve performance

1. set initial value to infinity rather than calculating a distance between the first two points.

2. "number of elements in pPoints" is unvarying within any one call - so extract it to a variable at the start

3. use the square of the distance rather than the actual distance - save N**2 calls to sqrt

4. use "DX * DX" rather than "DX ^ 2" (about 25% faster)

5. calculate distance in-line rather than call a function

but those all add up to maybe 10% performance improvement (or less - I didn't test it). That's useful - but not enough.

For a modest number of points (2000 random points), this takes approx 16.5 seconds !!

We need a better algorithm. If we use a "linear scan", we can change it from essentially Order(N**2) to approx Order(N).

Summary:

 - sort the points by X coordinate

 - while scanning the inner loop, as soon as the difference in Xcoord from the 'outer' point exceeds the minDist so far, you can reject not just this point, but all subsequent points, and hence exit the inner loop immediately.

This brings the time down from 16500 millisecs to 25 millisecs.

BUT - I have no clue how I'd go about describing this to ChatGPT :-)

NB I changed the input parameter to be the list of points rather than the array.

Code:

function closestPointsSQ pLines
   sort pLines by item 1 of each
   put pLines into pPoints
   split pPoints by CR
   put infinity into minDist
   put the number of elements in pPoints into N
   repeat with i = 1 to N-1
      repeat with j = i + 1 to N
         put item 1 of pPoints[j] - item 1 of pPoints[i] into t1
         if t1 * t1 > minDist then exit repeat
         put item 2 of pPoints[j] - item 2 of pPoints[i] into t2
         put t1 * t1 + t2 * t2 into dist
         if dist < minDist then
            put dist into minDist
            put pPoints[i] & " " & pPoints[j] into closestPoints
         else if dist = minDist then
            put return & pPoints[i] & " " & pPoints[j] after closestPoints
         end if
      end repeat
   end repeat
   return closestPoints
end closestPointsSQ

-- Alex.

On 20/01/2023 06:02, Geoff Canyon via use-livecode wrote:
I tested three use cases, with variations, using ChatGPT for (live)code
generation. There was a lot of back and forth. In the end, I solved all the
problems I set, but in some cases I had to hold ChatGPT's hand pretty
tightly.

That said, I learned some things as well -- about LiveCode. ChatGPT's code
for Fizz Buzz was faster than mine.

My code was faster for reversing lines. But ChatGPT, when asked to "make
the code faster" gave several suggestions, some of which were wrong or
impossible, but one of them was my method, and when I said "write that
option" it did, with only a few corrections needed.

And one of the ideas, while wrong, caused me to think of a different way to
solve the problem, and that way ended up being faster than my original
solution by over 3x on reversing 10k lines. Getting ChatGPT to write this
new method was *hard*.

In any case, I wrote it all down in a google doc
<https://docs.google.com/document/d/1W3j5WaFhYZaqSt0ceRQj8j160945gSwG_nyZsCBP6v4/edit?usp=sharing>.
If you're curious, have a read. That URL is open for comments/edit
suggestions. If you have any I'd love to hear them.

Thanks!

Geoff
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to