Economics of Go Books

Nobody gets rich by writing or selling books about go.

I recently had a 3-day sale where all the books at gobooks.com were 20% off. It was the first sale in the twelve years of Go Books. Integrating with the newest Stripe API made such a sale possible, as well as making sure authors and publishers would be paid based on the regular price – no need to coordinate with all of them, and no complications to the already complicated royalty calculations.

It was a great success – web sales were about 25x of normal during that period. The new Stripe integration held up. I found some issues, e.g. the data I’m collecting is no longer helping me automatically identify refunds, and exporting the Stripe purchases doesn’t currently include the coupon used.

Some numbers: In total, you all spent about $3,500 on a bit over 400 books during that sale – thank you! Almost $2,200 of that will be paid as royalty to authors and publishers. Stripe took about $230 (2.9% + $0.30 comes to almost 7% for these small transactions). Taxes of €54 will be going to the European Union. That leaves just over $1,000 for Smart Go. Yeah!

So clearly there was pent-up demand for a sale – I had no idea. What’s less clear is how this will affect the future: How many purchases were just pulled forward and would have happened anyway? Are readers now going to wait for the next sale (which won’t happen for a while) before buying any more books? And many of you will simply be very busy reading go books for a long time.

So what will Smart Go, Inc. do with that $1,000? Conversion of printed go books to digital is a human-intensive operation. Having electronic copies of the diagrams and text helps; for older books, those have to be re-created. Each inline diagram is lovingly created by hand. That big next book coming out soon? Conversion to Go Books format has cost me more than $3,000 so far.

As I said, nobody is getting rich by writing or selling books about go.

Go Books Sale

Not much progress on the Mac version of SmartGo One these last few weeks, thanks to the European Union. The EU now requires sales tax on go book sales, so I had to upgrade the integration of the gobooks.com backend with Stripe. Stripe’s newest checkout page handles collection of the appropriate taxes; I still get to do the fun part of submitting them. At least the EU lets you pay to a single country (I chose Ireland, so the forms are all in English), and they distribute from there.

So I’ve been working with PHP, MySQL, and webhooks, not my favorite activity, nor my area of expertise. At least I didn’t ship the bug where it sent you a free copy of SmartGo for Windows with every book purchase – I found that one before it went into production. Everything now seems to work well, but who knows what I messed up. Definitely needs more real-world testing.

The new checkout page not only deals with taxes, but also allows other payment options, like Apple Pay. And discounts now work. So to encourage you to buy those books you’ve long had your eye on, use coupon MINUS20 for 20% off any books at gobooks.com (also works for SmartGo for Windows).

This 20% discount is valid through Monday March 6. It’s the first discount in the 12 years of Go Books, so please grab this opportunity. (Note that royalties to authors and publishers are always based on the regular price, so they get their full payment.)

More improvements to gobooks.com (e.g. a shopping cart so you can buy multiple books at once, or complete a series) will have to wait for next year. Back to working on SmartGo One for the Mac.

KataGo and ChatGPT Failures

AlphaGo was an amazing breakthrough and very impressive in its ability to win against professional go players. It was really surprising that evaluating a go position using neural nets and machine learning would work as well as it did. And yet it kept beating professionals.

But now, some cracks are showing. In their excellent paper “Adversarial Policies Beat Superhuman Go AIs” (https://goattack.far.ai), Tony Wang, Adam Gleave, et al. are using an adversarial approach to figure out techniques that work against KataGo. And indeed: after a few tries, I managed to kill a huge group and win, and KataGo did not see it coming until too late. It doesn’t realize that its circular group that surrounds a dead group with a large eye needs enough outside liberties to actually remove that dead group.

Katago losing
KataGo doesn’t realize the dead white group has more liberties than the surrounding black group

This technique takes advantage of KataGo (1) not knowing enough about liberties and (2) not knowing enough about the topology of blocks on the go board. When training its model, there are special inputs only for 1, 2, or 3 liberties. There’s also no explicit concept of adjacent blocks; the neural net has to learn that concept from the board position. And the way the neural net is trained, it doesn’t create good enough abstractions for those concepts. In normal games, this is sufficient to play better than any human, but in corner cases, it falls apart.

I would argue that blocks of stones, liberty counts, and race to capture are an essential part of the underlying model you need when playing go (see e.g. Richard Hunter’s book “Counting Liberties and Winning Capturing Races”). And machine learning (at least the way we’re doing it now) is not a great way to build that model. You’ll end up with gaps of knowledge and approximations that will fall down at critical points.

Against that background, the failures of ChatGPT make more sense. Machine learning didn’t build a model of the world, it just learned to put words together in a way that seems to make sense. Often impressive, but a lot of recent examples demonstrate that it doesn’t actually understand what’s going on.

And machine learning for self-driving cars is also based on lots of inputs, but only a very limited model of the world. Like KataGo, it will fail in corner cases. And that’s scary.

SmartGo Too Strong

SmartGo One incorporates KataGo, a really strong go engine. For most players, it’s too strong. While you can increase handicap until you manage to win, getting beaten mercilessly is not that enjoyable.

Smartgo computer levels

The newest version tries to make playing against the computer more interesting. When you start a new game, you can choose between five different levels, from ‘SmartGo++’ (full strength, playing as well as it can) to ‘SmartGo—’ (making more mistakes and even some blunders). The default is the middle of the road ‘SmartGo’ that will try to make the game more balanced.

The trick with dumbing down computer play is that you don’t want the computer to play non-sensical moves. The approach I’ve taken is that SmartGo will still select one of the moves that KataGo generates, but instead of always picking the best move, allow it to choose moves that lose points or reduce its chance of winning. If the computer is further ahead, it can lose more, bringing the game closer to balance.

This is a first stab at this feature, I will likely refine this in versions to come. Please let me know how this works for you: Do you always keep the computer at maximum strength? Is the lowest level still way too strong? Do you enjoy playing against the computer more?

Read UGF, NGF, and GIB files

SmartGo One can now read go games in file formats other than SGF: UGF, NGF, and GIB (with file extensions .ugi, .ngf, and .gib). UGF is popular in Japan, NGF is used by the Korean wBaduk server, and GIB is used by the Korean Tygem server.

SmartGo One will show thumbnails for these files, with the file extension indicated in the lower right corner.

Thumbnails of 4 games in different file formats

Support for these file formats is read-only. If you make changes to the game, it will be saved as SGF, overwriting the imported file. Paste SGF will also accept games in those formats.

Unfortunately, I don’t have the spec for any of these file formats, so the files are interpreted based on reverse engineering as well as comments at Sensei’s Library. I’d love to get more sample files so I can make sure my code handles all the corner cases. And if you run into files that are not handled as well as they could be, please send me a copy at support@smartgo.com. Thanks!

Also, please let me know if I should revive my old code for reading the Ishi (.go) file format. Is anybody still using that one?