Hacker News new | past | comments | ask | show | jobs | submit login
TensorFlow Lite for Commodore 64 (github.com/nickbild)
142 points by todsacerdoti on July 7, 2022 | hide | past | favorite | 24 comments



The final step in their "How it works" diagram:

"Intelligent C64s restore themselves to their former position of prominence. The singularity is near."


Former?


Astronaut: Wait, it's all "if" statements?

Astronaut with gun: Always has been


It's worse, turns out in the end it's just 0s and 1s.


Lisp boffins who had been building AI this exact way for decades: noncommittal silence


I wonder if there is a 3rd astronaut wielding their feelings about the lack of goto statements in this code.


Dijkstra rolling in his grave.


you can put all the elegant sugar coating you want on it, but in the end your code gets executed as gotos.


Reminds me of the MOV compiler.

https://github.com/xoreaxeaxeax/movfuscator


In your dreams, von Neumann!


The observer astronaut back on Earth: you two weren't supposed to say that!


With no native floating point type and no parallelism whatsoever, I hate to admit it, but the C64 isn't the optimal platform for this sort of thing.

(Apropos floating point, are you SURE it runs the same, Nick? those aren't exactly IEEE 754 floats you've got there!)


This was really useful for me.

Seeing the c64 basic code produced (0) is only 6000 lines, a comparison to how a human would (re-)write the SIN() function is now feasible.

(0) https://github.com/nickbild/tflite_c64/blob/main/neural_net....

Edit: clarification


It’s actually 5580 / 10 = 558 lines because the line numbers increment by 10, and you can see the actual line count in the GitHub editor too :)


Of course, I was stupid. Thanks for correction!


These two if statements are repeated frequently. I bet they can be optimized but for the life of me, I can’t think of an improvement.

5550 if acc < -128 then acc = -128

5560 if acc > 127 then acc = 127

Anyone?


Write a function called clamp()?


acc = min(max(acc, -128), 127)?


Commodore 64 basic doesn’t have min or max functions.

DEF (https://www.c64-wiki.com/wiki/DEF) would be the way to do this, but I don’t see how to write a performant version in a single expression (you can’t use IF as an expression. You could cast to float, compute some specially chosen sigmoid function, and round to int, but that’s slow)

A USR function (https://www.c64-wiki.com/wiki/USR) would work, but that’s cheating.


Almost seems like you could get there by bit twiddling, but I'm not sure. What's "-1 AND 127" in Commodore basic?


127.

I don’t think bit masking alone will get you there. You want to map anything over 0x80 to 0x7F.

I think you can do something like

  x + (x < -127) * (x + 127) + (x > 127)) * (x - 127)
      ^^^^^^^^^^^^^^^^^^^^^^
can give you clamping, but haven’t checked it ((x < -127) is minus one for true or zero for false, so the part marked ^^^^ subtracts x + 127 from x when it is too low, and that’s equivalent to subtracting x (yielding zero) and subtracting -127 (yielding -127). The other part is similar, but for values that are too high.

That expression can be put in a DEF FN.


Can you benchmark this against a nvidia rtx 3090, must be close


Now fit it a gpt3 in there and BAM: local aidungeon


neato. what kind of chip you got in there, a dorito?




Consider applying for YC's Spring batch! Applications are open till Feb 11.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: