alex at tweedly.net
Fri Jan 20 16:12:35 EST 2023
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
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
> 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).
> - 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.
> 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
> 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
>> That said, I learned some things as well -- about LiveCode. ChatGPT's
>> 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
>> new method was *hard*.
>> In any case, I wrote it all down in a google doc
>> 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.
>> use-livecode mailing list
>> use-livecode at lists.runrev.com
>> Please visit this url to subscribe, unsubscribe and manage your
>> subscription preferences:
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
More information about the use-livecode