From CG community
Jump to navigation Jump to search

JuliaPhan: who vietnamese ?

Default avatar.png C4r1_7he_n00bH4X0R: i am

WINWINWIN: Nicely done DomiKo

JuliaPhan: Zz_KuTeo_zZ ib for me please

JuliaPhan: i have some question, pleaase

LeBaoHoang8A4: Chi choi khong, de em invite

LeBaoHoang8A4: hoi nay em ban

JuliaPhan: let later

JuliaPhan: i'm having lunch

LeBaoHoang8A4: okok

LeBaoHoang8A4: I can play at 5PM

Default avatar.png C4r1_7he_n00bH4X0R: oh hi im in grade 8 too

LeBaoHoang8A4: REALLY?

LeBaoHoang8A4: where are you from?

LeBaoHoang8A4: which programming language do you use?

Default avatar.png C4r1_7he_n00bH4X0R: im from quang ngai

LeBaoHoang8A4: PASCAL?

Default avatar.png C4r1_7he_n00bH4X0R: i frequently use c# and python

LeBaoHoang8A4: I'm using JAVA

LeBaoHoang8A4: where are you learn coding?

Default avatar.png C4r1_7he_n00bH4X0R: on internet

LeBaoHoang8A4: OKOK

khailq: wow toàn master engrisk nói chuyện vs nhau

JuliaPhan: bữa có người bảo không chat bằng tiếng địa phương nên thôi mình cũng ngại

Default avatar.png HoangThien: Play game with me

JuliaPhan: It's time

JuliaPhan: come on

Default avatar.png alt0173: invite me u guys

OhayouWIbu: konnichiwa minna

CDRToast: I've been out of coding so long, after redoing the tutorial, what's a good next step to practice on?

[CG]Thibaud: easy puzzles CDRToast


Astrobytes: Good morning

Uljahn: :cat:

jrke: good morning to you astrobytes

DomiKo: hiiii

Astrobytes: DomiKo - UTTT Legend yet?

DomiKo: ohh yes :D

jacek: :tada:

Default avatar.png r-o-g-e-r: good morning

DomiKo: reached it 3:26...

Astrobytes: :tada: ::rocket:

DomiKo: reached it at 3:26...

Astrobytes: Nice one!

DomiKo: thank you

jacek: top 100?

DomiKo: but there is a lot to improve

DomiKo: not yet

DomiKo: 136 :(

DomiKo: but now

DomiKo: i have to make teccles heurictic stronger

DomiKo: because players in gold didnt use that

DomiKo: but in legened they use

WINWINWIN: Nicely done DomiKo

WINWINWIN: teccles heuristic?

DomiKo: MSmits told me

DomiKo: about it

DomiKo: "play the move that forces your opponent to play in the same miniboard you are playing in "

WINWINWIN: Ohh teccles is a CG user :) thought that it was a technical term

DomiKo: yea :D

Astrobytes: Not just CG, Halite

Astrobytes: Before it was on Kaggle

WINWINWIN: Halite was on another website?

Astrobytes: Yeah. teccles won it

DomiKo: hmmm i didn't know about Kaggle


DomiKo: that site stounds fun

DomiKo: sounds*

WINWINWIN: :) so forcing the opponent to play on your miniboard. Why exactly does that work?

DomiKo: its like when you have empty board

DomiKo: lets say you have to make a move in top left corner

DomiKo: and that board is empty

DomiKo: so do not calculate all move

DomiKo: and just make move in top left corver

WINWINWIN: Ok, it moves you directly to legend?

WINWINWIN: Any forum/techio post on it?

Astrobytes: No, it's not quite a -3vel ;)


DomiKo: pushing to legend

DomiKo: was a battle with top 3 guys

DomiKo: boss had 34 point

DomiKo: and second guy had 32...

DomiKo: so gap was really huge

WINWINWIN: :) Im in bottom gold. :(

DomiKo: from bottom to top

DomiKo: you need to make SPEEDD


DomiKo: that's what matter the most

WINWINWIN: Have been working on a MCTS for about a week now. But I get pretty annoyed while writing an evalutation function...

DomiKo: i dont know if you could reach that lvl of speed with python

struct: eval? what game?

DomiKo: UTTT

jacek: mcts doesnt need eval


WINWINWIN: Right now Minimax

DomiKo: ohhh

WINWINWIN: MCTS is nothing but frustrating dead ends. Im trying to get top 100 gold with a minimax

DomiKo: my previous solution

DomiKo: like from 1 year ago

DomiKo: reach like 150 in gold

WINWINWIN: minimax?

DomiKo: and that was minmax

DomiKo: but i know

DomiKo: that i optimized it a lot

jacek: what would be good eval for minimax?

DomiKo: idk

jacek: uttt is so unevaluable

DomiKo: yap

DomiKo: i eval it like a normal TTT game

dbdr: how do you eval TTT?

DomiKo: like shi....

dbdr: it's so shallow you can just go to terminal nodes, so eval is just WLD :)


DomiKo: i make some patterns

DomiKo: that could make me win

DomiKo: and if i see pattern i give points

DomiKo: that was pretty good in bottom/mid gold

struct: well 1 ms mcts is enough to get bottom gold


DomiKo: that could be true...

DomiKo: the gap

DomiKo: bettween top10 gold and resst

DomiKo: is soooo big

struct: depends on the perforamnce

struct: im sure that <500 rollouts are more than enough for bottom gold

DomiKo: yesterday i had like 90% winrate with all player < top 10

DomiKo: and like 50% in top10

Astrobytes: acat got gold with just MC iirc

DomiKo: he did it in java

Astrobytes: yeah :)

WINWINWIN: Who is the gold boss?

DomiKo: i know that he really don't like c++ :(

Astrobytes: He should have used Lua :P

DomiKo: yea ;)

MSmits: DomiKo, the reason that top gold is so much better than the rest of gold is that they're people that fought hard to get into legend and failed.

MSmits: the rest probably stopped soon after reaching gold

DomiKo: yea i guess

DomiKo: and thank you man

DomiKo: without you i woudn't reach legend <3

jacek: i though relu was shit, it didnt work with my xor example

MSmits: DomiKo np

struct: relu?

MSmits: activation function

MSmits: used for nn

jacek: then i changed the drelu from if x < 0 to x<= 0 and it worked!

jacek: but most sources talk about <

MSmits: maybe it depends on your implementation

jacek: or was it > 0? :thinking:

MSmits: if it was > 0 then that would make sense

MSmits: thats one negation away from your version

MSmits: btw, on Oware, do you currently have an opening book ?

MSmits: I saw you submitted a new versin

MSmits: version

MSmits: it does a weird 2nd move

jacek: i ditched opening book

MSmits: ah

jacek: which 2nd move

MSmits: the first p2 move

MSmits: you choose 4th pit

MSmits: noone else does

MSmits: doesnt mean it's bad

jacek: hmm

MSmits: my meta mcts started out thinking that was the best move

MSmits: but it's now at 5

MSmits: which is what my live bot uses and Agade as well

jacek: well my deeper search also says its 5->11->

struct: best move is d3

MSmits: hmm ok

MSmits: are you hinting that i should get back to Othello struct?

jacek: back?

MSmits: well i have coded a bit

MSmits: no working version yet

struct: It's your choice

struct: I don't want to force you

MSmits: mmh sure you do :P

MSmits: but its cool, i like the game

MSmits: not sure how the search will go, this one might not go as well as others I fear

MSmits: eval is difficult

struct: You might need to learn new stuff

MSmits: yeah

struct: Which is a good thing

MSmits: I guess so, yes

jacek: my book was based on old eval and was unneseccarily big

jacek: and i dont have size for both book and weights

MSmits: what do you mean unnecessarily big? Too many moves?

MSmits: but isn't the book negligibly small? Mine always are

MSmits: I never made a book over 10 kb so far

MSmits: and thats without unicode compression

MSmits: I can probably make it 5x smaller, to 2kb max

jacek: well i had i.e. positions with only 1 legal moves

MSmits: maybe because my books are partially handcrafted. I only allow automated additions after 10k games played or so

MSmits: from that position

MSmits: thats about 5 hrs of meta mcts time

MSmits: for 1 move

struct: we need to fund MSmits reasearch

MSmits: lol, nah, i like it slow, means i can adjust whats going on if weird stuff happens

Astrobytes: In exchange for what? Smitsishares? :)

MSmits: jacek, btw, do you put whole board positions in your book?

Astrobytes: Or is it like kickstarter, we get a free opening book at every 10K goal

MSmits: like, the entire board state + a move?

MSmits: because that is horribly inefficient

jacek: i know

MSmits: { 5 { 5 } }

struct: isnt it best to keep track of current legal pages?

MSmits: this is my current oware book

MSmits: first player plays 5, second responds with 5

MSmits: there is no game state

jacek: and thats 10kb?

MSmits: no, thats my oware book

struct: so you have like {5{5{next{...}}}}

struct: ?

MSmits: yavalath is 8kb with somewhere around 1k moves or so?

MSmits: struct yeah

MSmits: say the opponent sometimes uses 4, it would be

jacek: how does meta mcts works for mcts w/ 0depth ept?

MSmits: { 5 { 5 } 4 { 2} }

MSmits: the first one is always the one *I* would pick

MSmits: the others are opponent replies with counters

jacek: do you use win/loss for the backpropagation as usual for meta then?

MSmits: for oware its more complicated, but yeah i would normally just back prop win/loss/draw

MSmits: for oware i backprop seeds

MSmits: I play a game to 15 seeds on board

MSmits: finish with end game databse

MSmits: and back prop the net score

MSmits: p1 - p2

MSmits: i do this because then i can do transpositions and disregard the current score

MSmits: so only the board state and the game turn matter, not the score

MSmits: the objective is to get maximum seeds

MSmits: from the current board state

MSmits: for this you dont need to know about past captures

MSmits: this is really bug-prone though, because when you backpropagate, you *do* need to take into account captures

MSmits: at ply 10, captures before 10 dont matter, but captures after 10 do

RaduAntonache89: is there a place to practice answering interview questions on this site? I just finished a test received from an employer and I was wondering if there are practice tests

RaduAntonache89: or does the employer provide his own questions and the site simply provides the delivery method?

Uljahn: try

Uljahn: also not sure about interview questions but you can practice by solving puzzles

[CG]Thibaud: RaduAntonache89 to practice interview questions, best is to do easy and medium puzzles here. Also, on CG for Work, we provide a library of test questions but the employer can add custom ones.

Tahini245: (╯°□°)╯︵ ┻━┻

RaduAntonache89: ok, thanks

jacek: i will treasure this moment

DomiKo: good job

MSmits: nice :)

MSmits: however, you beat me several times in recent submits and my bot beats re curse 60% :P

MSmits: maybe if I submit spam I could rank you above him

jacek: oh, and i even how 1 win against agad

MSmits: cool

MSmits: I draw almost half of games vs him no idea why

MSmits: with 48 seeds, getting half the seeds would seem to be more of a rare occurence

dbdr: maybe oware is a draw?

MSmits: probably. Awari is a draw for sure

MSmits: it is solved as draw when player 1 chooses the rightmost pit

struct: Othello might be a draw too

MSmits: any other pit and p2 wins

MSmits: people seem to think it is

MSmits: ah right, i need to get back to that :P

Hjax: yeah come beat us up at othello

MSmits: will try, but might be a week or two before i have a good bot. Going on short vacation soon

MSmits: I suppose I could code a bit while there :P

Washier: nobody should wait to code

MSmits: agreed

Hjax: so im looking at TD learning, and im wondering why you update after each turn to try to approximate the next turns eval rather than waiting until the end of the game and using the game result to update all moves made in that game

jacek: i was wondering too. but surprisingly it works

jacek: of course at first episode only final position and prefinal position werights will be updated

jacek: but doing more and more episodes, earlier and earlier weights will be updated

jacek: the other spectrum is Monte Carlo, waiting to finish

Hjax: im also trying to work out how many weights i can fit into the upload limit

Hjax: i suppose it depends on how granular i want my weights to be

Hjax: jacek did you search while training? or just pick the child that maximizes eval

Hjax: you said you ran a lot of training games right? how long did it take

dbdr: TD works because many things affect the final result

dbdr: if you affect it too much to early moves, there is a lot of noise

dbdr: if your moves in between are not optimal

dbdr: (which they are not, otherwise no need to learn ;) )

jacek: Hjax in TD i use child with max eval or 10% random

jacek: TD phase of few hundred thousands games takes about 30 minutes

jacek: every 100k i tested the eval during real fast matches against older candidate eval. if 55% win of 300 games, the new eval becomes new candidate

Hjax: i see

Hjax: how do you fit so many weights in your upload?

Hjax: are you just using really small (byte) weights?

jacek: 1 byte per weight

jacek: well actually 2 because im using hex and didnt bother with unicode yet

Washier: wow, trying to improve my othello bot is hard and confusing. try something new that seems to work locally and in the IDE, get murdered in the submit, but somehow beat tomatoes once :confused:

MSmits: maybe pm tomatoes to tell him he has a bug :P

struct: maybe he doesnt have binary version on ide

struct: and you are playing vs rust debug

Washier: wasnt a timeout, i took all 4 corners and smashed it. weird

MSmits: you know whats funny. If tomatoes' bot is completely deterministic, you can record the game and check for this series of moves and use it to always win :P

Washier: jeepers.

MSmits: :smiling_imp:

MSmits: it probably isnt though

Washier: its not deterministic though. i've lost like a 1000 games agains tomatoes

MSmits: that doesnt mean it isnt deterministic

jacek: youre destined to lose against him

Washier: haha

struct: Im gonna make anti tomatoes boss

MSmits: that can also mean you are not deterministic

Washier: i am

jacek: cucumber boss?

Washier: haha, or chef knife boss

MSmits: you always make the same moves in every game given the same gamestate?

struct: bug boss

Washier: yes, just plain minimax alpha-beta with a deterministic eval function

jacek: to be frank there are 3 unique stats after 2 moves

jacek: states

Washier: with symetry?

MSmits: washier, your search stops when calculation time is up and the CPU is not always equally fast

MSmits: so its not deterministic in every game

tomatoes: only 1st black move randomized

MSmits: yes but the calculation time difference between game gives you randomness anyway

MSmits: actually time is the same, number of cpu cycles varies

Washier: i dont time anything. i build the tree 5 deep or bust

MSmits: oh then you are completely deterministic yeah

Washier: always living on the edge

MSmits: why not just keep searching till time ends?

jacek: what if 2 moves have the same score?

MSmits: you might get deeper

Washier: i choose the first if two with same score

jacek: apparently iterative deepening is voodoo magic

Washier: yes, just lazy

MSmits: its easy to code

MSmits: just add a loop

MSmits: and a breaker with time check

jacek: people always say its a waste of time

Washier: iterative deepening is what i should do yes. but dont the scores need to propogate back up after each breadth search, that still stumps me

MSmits: jacek what time is wasted?

MSmits: Washier nothing has to backpropagate between iterations

MSmits: you're just doing the same search multiple times, only deeper

jacek: well instead of ab(5) you do ab(1) ab(2) ab(3) etc.

jacek: people cant grasp the concept ab(n-1) is tiny in comparison to ab(n)

MSmits: yeah, but they're wrong because ab(5) is like 5x longer than 1 - 4 together

MSmits: right

eulerscheZahl: jacek i think you have to leave a :thumbsup: on discord

jacek: ?

struct: :thumbsup:

eulerscheZahl: just do it

Washier: jacek, i def grasp that. ok, i'll put a loop around that puppy and go for it.

MSmits: btw, might be you will still get 5 deep, but maybe on end games get 9 deep or something because less moves

Washier: from 11 moves left i search the whole tree, basically sovle it.

MSmits: right, but maybe you can do it from 12

MSmits: in some cases

jacek: eulerscheZahl but i dun wanna

CDRToast: Good morning/ Day to all

Washier: ok yes, with i deepening i can improve move order and eliminate some moves completely?

struct: hi CDRToast

MSmits: you can do this yes

MSmits: you can store information from your previous search in some kind of array/table thing

MSmits: then prefer searching the best move first

MSmits: or at least the move your search thought was best

Washier: thats another thing that bothers me in othello, do TT's make sense at all? its not like chess\checkers with recurring states.

MSmits: you dont have to have recurring states

MSmits: you can also arrive to the same state by different routes

Washier: ah ok

MSmits: this is most easy to see in those games where you slowly fill up the board like in TTT

MSmits: TTT has no recurring states either

MSmits: but it does have many different ways to get to the same state

MSmits: btw if you've never done a transposition table, think about this

MSmits: its easy to do AB

MSmits: its easy to do TT

MSmits: not easy to do both

MSmits: you need to record the AB status into the TT

jacek: well in AB you have to be careful about lower and upper bound

MSmits: yeah and its really hard to wrap your head around

MSmits: unless you just take someone elses code and dont look at it again

Washier: have read about those bounds as part of the TT yes,

MSmits: i didnt know about this before and I coded a so-called perfectly playing TTT bot, that somehow sometimes made mistakes

MSmits: turned out this was the issue

jacek: does anyone use cg spunk in chrome? i run batch run and never ends and when i stopped it says stopping and nothing happens

dbdr: isn't cgspunk dead for years?

struct: ^

struct: try cgbenchmark I guess

jacek: whats the alternative

dbdr: cgbenchmark

dbdr: or write your own :)

jacek: ah that requires username/password but im using gmail auth for that

struct: delete

tomatoes: try password recover

Hjax: is there a rule against making a second account

Hjax: cgbenchmark doesnt submit anything

Washier: must be

Hjax: but i guess you wouldnt be able to test in higher leagues

RoboStac: you can only test against the boss until you've submitted once

RoboStac: so you'd not be able to do that for contests

Hjax: oh robo, random question, how big is your neural network?

Hjax: cant be super big if you want it to eval fast on cpu

RoboStac: 128 inputs -> 3 3x3Convolution layers of 8 filters each -> 3x3Convolution with 4 filters -> Dense with 64+1 outputs

Hjax: how many nodes can you search per move?

RoboStac: I average around 8000

Hjax: do you think thats why you arent able to beat dbd r? not enough time to search deeply?

Hjax: or do you think you can improve your current network more?

RoboStac: I've given up on that one as I doubled the amount of training games with no real improvements

RoboStac: trying a bigger network now

Hjax: oh youre going in the opposite direction

Hjax: even more knowledge with even fewer nodes?

RoboStac: my original one only had 3 conv layers instead of 4 and didn't get as far, so I feel like bigger might be better here

Hjax: when will the new net be ready? :)

RoboStac: last one was pretty much done after about 100k games and I'm only up to 25k so far

RoboStac: though it's already looking better

jacek: bigger net, slower?

RoboStac: yeah

RoboStac: both in time to play games and in theory in how long it takes to train

Washier: if this was kaggle, also bigger chance to overfit :)

jacek: meh, i still need to grasp the concept of training policy, not only value

Hjax: is training just value and using UCT1 a lot worse than policy + value + PUCT?

Hjax: i dont think ive ever seen a paper directly compare the two approaches

RoboStac: yeah, due to the low number of playouts the policy is fairly important

RoboStac: even with so few playouts I tend to solve games around the same time as others most of the time (with some exceptions as you've spotted before :))

Washier: how far from the end can the top bots solve games?

Hjax: 15 moves from the end roughly?

Hjax: thats when tric tends to say win or loss at least

Washier: jeepers

Hjax: my bot doesnt have solver yet

jacek: i mostly solve 11-12 before

Hjax: but usually im within 1% of win/loss by 10 moves before

Washier: wow. me too, yet i suck way more

Washier: so i lose way before 11 moves are left.

Hjax: yeah but you said you only search depth 5 before the end game right?

Washier: yes

Washier: figures

Hjax: im not sure how deep my search tree is with my mcts

Hjax: but its definitely much deeper than 5

jacek: i read about special endgame solvers

Washier: yes, so far i've been really lazy with that. way too much attention on eval. lot of work to look forward to :) really love Othello

Hjax: opposite of me Washier

Hjax: my bot is all search, no eval

jacek: you hate othello?

Hjax: har har :P

jacek: ahh

Washier: haha

Hjax: my only eval term is mobility

Washier: so tight around 10th spot on the leadbaord now. a lot of luck, unless i missed new submits

Washier: do you sort moves by the mobility?

Hjax: no

Hjax: i just assume whoever has more moves is winning in my search

Washier: so you dont play all games to the end?

jacek: no corners at least/

Hjax: i only play 6 random moves, and take mobility after

Washier: at each level

Hjax: no at the end of the 6 random moves

Hjax: every thing ive tried, including corners, has made it worse

Washier: ok, ty. yes, can confirm, mobility is the driver in my eval.

Washier: pirce count, meh.

Washier: *piece

Default avatar.png Dreamlxy: hi

Hjax: having fewer pieces than your opponent is better in the early game

Default avatar.png Dreamlxy: 有中国人么

Washier: i've read that yes. cant make it work though.

Washier: (trying different eval functions in diffrent stages of the game now)

Kagome: 没有中国人

jacek: meow?

Kagome: woof

Uljahn: Automaton2000: sugoi desu ne?

Automaton2000: i haven't even started yet

Default avatar.png bel3atar: wtf?

Washier: haha

Washier: <sound a sloth makes>

AbundantPuddle: What does the sloth say?

Washier: wazaaap. but softly

AbundantPuddle: Lmao

Washier: jacek, MRSmith, Hjax thanks. Just got my first promising result with iterative deepening. amazing how much more relevant you can make the search in the same amount of time.

Washier: also move ordering rocks

Hjax: :D

Washier: just love that feeling you get when AI surprises you. It is like magic

Hjax: submitting a new version soon?

Washier: tired, and honestly had a bottle of wine in the process. maybe later.

Hjax: oooh robo won a game against dbd r

Washier: wow

jacek: :scream:

RoboStac: so it turns out bigger is better :)

jacek: thats what she...

Washier: haha

eulerscheZahl: now i see why you refused the moderator thing :D

Astrobytes: Was WIN WIN WIN that nominated jacek, I said at the time I wasn't sure...

eulerscheZahl: the advantage of WIN*3: different timezone

Astrobytes: Yup. And he's very diplomatic. I nominated you, robo and dbd r btw ;)

jacek: why would anyone nominate me ~

eulerscheZahl: you could nominate people?

Astrobytes: Nah, Thibaud was asking the other morning

Hjax: and its not even done being trained yet right?

Hjax: @robo

Astrobytes: I have no idea jacek :P

jacek: phew

eulerscheZahl: ah, i see Astrobytes...

eulerscheZahl: i feel honored for getting mentioned ;)

eulerscheZahl: "struct might do it, not sure if jacek would" and you turned out to be right

Astrobytes: ;)

jacek: Automaton2000 what do you think

Automaton2000: but i see you have a way to use the same collision

eulerscheZahl: was that the doctor phonecall that made you go afk? got the results now?

AbundantPuddle: Is there a way to report or open a case about a clash? Because unless I am missing something, this is obviously wrong.

eulerscheZahl: which clash?

jacek: what wrong

Astrobytes: No, work related eulerscheZahl. Yeah, I have a vitamin D deficiency but it doesn't explain everything. And I can't get a bone density scan for a while because hospital isn't taking anyone for now. Speaking to my own doctor next week (spoke to different one today)

eulerscheZahl: you can give feedback after the clash. but tbh i'm not sure if anyone will read it

AbundantPuddle: average of string

eulerscheZahl: yes, you told about the density scan taking longer

eulerscheZahl: this?

Astrobytes: They have my referral but they're not even doing any right now :/

eulerscheZahl: or

eulerscheZahl: it's a horrible timing to get ill :(

Astrobytes: Yes, it truly is. Just my luck!

eulerscheZahl: so many average ascii puzzles

Astrobytes: Hey, no clash is too easy, or too similar it would seem

eulerscheZahl: right



eulerscheZahl: i can confirm the m

AbundantPuddle: So it's basically asking the average of the ascii codes then? Not the average of the length?

eulerscheZahl: i don't even know what your understanding of it means

eulerscheZahl: >>> s[len(s)//2] 'j'

AbundantPuddle: Yes, that is what I got

Hjax: i got a reverse puzzle once that was the sum of the ascii values of a string

Hjax: and i just didnt get it

eulerscheZahl: >>> s = .join(sorted(s)) >>> s[len(s)//2] 'l'

eulerscheZahl: such original, much creative

AbundantPuddle: It didn't say anything about sorting or ordered. It just asked for the average, which I took to mean the middle letter.

eulerscheZahl: and only with odd chars

Hjax: yeah, and without knowing how common those puzzles are, its just crappy to try to reverse

eulerscheZahl: agreed

AbundantPuddle: I appreciate you taking a look and explaining it to me. It was just my misunderstanding of the requirements. I do feel it could still be explained better though.

Uljahn: if there are bots playing CoCs, there should be bots for making CoC contributions and approving them :smiley:

eulerscheZahl: that sounds like a simple task

eulerscheZahl: step 1: automate joining in 50 clashes to get moderation rights there

eulerscheZahl: that's the nasty part, as it has captchas

eulerscheZahl: the rest is simple

AbundantPuddle: Bots writing bots. What can go wrong?

Uljahn: singularity is close, Automaton2000

Automaton2000: yeah i had to learn it though

Astrobytes: AbundantPuddle also props to you for not instantly going to the forum/discord and claiming there's a bug in the puzzle :+1:

AbundantPuddle: I'm gonna miss the good old days. What good old days? When people were killed by other people.

Astrobytes: Always good to check in chat first

eulerscheZahl: yeah. the chat is faster in replies and triggers less users to look into it

AbundantPuddle: I generally believe in the approval process and trust that items that make it through have been tested thoroughly by people much more intelligent than me. I just didn't understand how something (that seemed) so obviously wrong would have made it through.

Uljahn: :smirk:

eulerscheZahl: and it's one of the older contributions, sitting there for years

eulerscheZahl: reasonable thinking that it might be you and not the puzzle then

eulerscheZahl: we have that at least once a week: this puzzle was solved by 100k users. but there must be a bug in it, my code is correct

Astrobytes: lol, we need a PEBCAC bot for those. Yeah, most of the problematic ones are fairly recent, not much to worry about with the older ones.

eulerscheZahl: i keep forgetting what that acronym stands for

Astrobytes: Problem Exists Between Computer And Chair

eulerscheZahl: i just remembered it now :D

eulerscheZahl: partially, didn't get the E

Astrobytes: Lots of variations on it too

Default avatar.png Schwase: euler your comment about needing a dictionary for hooch clash made me chuckle

eulerscheZahl: problems of non-native speakers had no idea what an "orb" is

Astrobytes: that's a classic JBM statement that one right? :)

eulerscheZahl: the one he's remembered best for


AbundantPuddle: Lmao. Love that acronym.

eulerscheZahl: timestamp of your clash:

Default avatar.png Schwase: is JBM still active?

Astrobytes: Yeah sure

Default avatar.png Schwase: i have 5 easy practice challenges left to 100% easy and 3 of them are made by him lol

eulerscheZahl: at some point i had 100% for everything but very hard

eulerscheZahl: then community contributions got merged

Default avatar.png Schwase: its just that the content of his puzzles is very creative and unfamiliar to me

Default avatar.png Schwase: like smooth! what kind of game is that

eulerscheZahl: for me some puzzles are interesting and fun to solve

eulerscheZahl: for others i get the hell out of there

Default avatar.png Schwase: im determined haha

Default avatar.png Schwase: kinda surprised by a pathfinding puzzle in easy ngl

Default avatar.png Schwase: most of them i can solve just within the main

Default avatar.png Schwase: using pattern recognition etc

eulerscheZahl: oh, the lost child got approved

Default avatar.png Schwase: yeah

Default avatar.png Schwase: bout a week ago i think

Astrobytes: Yes unfortunately.

Astrobytes: I mean, it's fine but there's nothing to distinguish it from the other pathfinding puzzles.

eulerscheZahl: that's one of those puzzles i don't care about. maybe because i can code pathfinding without much thinking now

Default avatar.png Schwase: someone complained about the wording of it but like come on its simple pathfinding you dont need some great story for that kind of thing

eulerscheZahl: i miss the extra twist to get into it

Hjax: im not high enough level to approve contributions, i should do more puzzles

Astrobytes: Yep. AFAIK he'd planned to do something else but it got approved first

eulerscheZahl: The 12 year old child has lost is[sic!] mother

eulerscheZahl: obviously we can complain about the working here

Astrobytes: the working eh

eulerscheZahl: fail

Astrobytes: :D

Astrobytes: A somewhat epic one at that

eulerscheZahl: but seriously: don't put your contribution as pending when you aren't done

Astrobytes: Yep, agreed.

Astrobytes: WIP is there for a reason

eulerscheZahl: reminds me that i wanted to fix 2 or 3 grammar mistakes in the onitama statement :innocent:

Astrobytes: "player select(s)", "will th(e)n (be)", "exchanging it"

Astrobytes: Anything else I missed?

eulerscheZahl: maybe constantly addressing the player with "he" but meh

AbundantPuddle: layerpay elect(s)say illway enthay ebay

jacek: " The opponent on that cell will than get eliminated from the game" !!!!!!!

Astrobytes: Yeah I got that one

Astrobytes: You should all talk proper England like I does

jacek: karliso fix ur bot

eulerscheZahl: jacek fix ur message

jacek: how can you tell im not using book?

eulerscheZahl: i'm just assuming

jacek: and youre right :o

struct: error fixed by doing nothing :/

eulerscheZahl: BenjaminUrquhart where is my shrine sprite? :rage:

eulerscheZahl: and what error did you fix struct?

struct: javascript

eulerscheZahl: pixi?

struct: yes

jacek: one cant fix javascript

struct: I was accessing container before entities were drawn

struct: or added

struct: dont know how its possible

Washier: i feel like i should close this window. not my business :)

struct: ok happened again

struct: so its not fixe

eulerscheZahl: loud neighbors Washier?

Washier: interesting neighbours. and me being a looky look

Washier: just walking down the street really

PkZ: Does anyone know if A* is generally expected to succeed?

Astrobytes: Just closed mine, the Lord of Barkness/Doggie Barko got let out again

eulerscheZahl: if there is a way, A* will find it

eulerscheZahl: not necessarily the shortest path

PkZ: yeah but what if there is no way?

Washier: noob here. A* is sweet

PkZ: mine just goes in circles forever

eulerscheZahl: also depending on how good your heuristic function is

eulerscheZahl: you have a closed list to only visit each node once

Washier: even fast in C#

Hjax: if theres a path, A* will find it

Hjax: oh scroll

Astrobytes: So if you're going in circles then you have a bug

eulerscheZahl: at least we agree Hjax. almost word by word :D

Hjax: :D

Astrobytes: He's already started typing my thoughts before me euler

Hjax: have i?

Astrobytes: It's all downhill for me now

Astrobytes: Yeah

Washier: haha

eulerscheZahl: damn. i knew that you are slow Astrobytes. but that slow? :rofl:

Astrobytes: You beat me to it yesterday, and the other day as well

PkZ: My good old source wikipedia doesnt have a closed list :thinking:

Astrobytes: :grimacing:

PkZ: guess i should implement that

Washier: github

Astrobytes: PkZ

eulerscheZahl:*-Algorithmus german wiki has a closed list

eulerscheZahl: and the link isn't working, great

Astrobytes: The German for algorith is 'algorithmus'. How very grand sounding :)

Astrobytes: *algorithm

Washier: algoritme

eulerscheZahl: next try

struct: or my code is too fast

struct: or pixi is too slow

eulerscheZahl: fail


Washier: so is euler monitoring struct fixing code here?

Astrobytes: lol jacek

eulerscheZahl: struct and me are just building a little game

Washier: aah

eulerscheZahl: me: engine struct: engine again in JS for smaller replays

Astrobytes: nice. Well, not nice for poor struct

Washier: picked it up because it hade the same patterns as my work chats

jacek: so struc took dirty job making javascript

Washier: fail. no. haha

struct: yes with poor documentationn

Washier: you can doo eeet

eulerscheZahl: don't worry, i'll return him without permanent mental damage when i'm done

Astrobytes: :D

eulerscheZahl: and when struct becomes a mod, he can't even delete his account anymore

eulerscheZahl: not without losing mod status

Washier: he made othello, so im partial

Washier: but what do i know

Astrobytes: Washier, struct made an oath to get legend in one night for a contest or he would delete his account.

Astrobytes: He deleted it.

Washier: holy sheet

eulerscheZahl: that's how the Yavalath game ended up being by Undefined

Astrobytes: Yep. It's now canon.

Hjax: he picked a horrible game to try to get legend in quickly

Astrobytes: Oh yeah

eulerscheZahl: he tried for longer, just without submitting

Washier: <popcorn>

Hjax: utg was so meta game focused

Astrobytes: true

Hjax: you really had to submit

eulerscheZahl: on saturday i said "no sleep till legend"

eulerscheZahl: turned into "no wakeup without legend", got pushed over night

Astrobytes: lol

Washier: what i like is that it is hard. takes a lot of work.

Washier: have not made legend of course

struct: Seems like the constructor is not called at all

struct: But how can this happen 50% of the time

Washier: oh boy

struct: anyone knows a good way to debug javascript?

struct: My current method is console.error()

dbdr: eulerscheZahl: I think A* is optimal

dbdr: i.e. finds the optimal path

Hjax: the first path A* finds isnt necessarily optimal though

Hjax: if you let it run long enough it will find the optimal path

dbdr: not if your heuristic is admissible

Hjax: which it doesnt have to be for A* to work

Default avatar.png JBM: Schwase: yeah, still around

dbdr: depends how you define "work" ;)

Hjax: it will find a path :D

dbdr: AFAIK the way it's designed is to be used with an admissible heuri, and then it does find the optimal path

dbdr: but you can use it in other ways if you want

eulerscheZahl: heuristic can be hard depending on your problem

eulerscheZahl: on grid based boards such as on CG you can use pythagorean distance, should do well

eulerscheZahl: but thinking bigger: navigation from Paris to Moscow

eulerscheZahl: you can't track every small road, so you navigate to the highway as fast as possible

dbdr: that's why it's a heuristic

eulerscheZahl: that's a reasonable heuristic. but not necessarily the shortest or fastest

Default avatar.png JBM: i'll go with "probably the fastest tho"

eulerscheZahl: exactly. but A* relies on it, so it can fail when the heuristic fails

dbdr: you could take a straight line at motorway speed

dbdr: that should be admissible

dbdr: and still reasonably good

eulerscheZahl: but not necessarily perfect. that's my point

dbdr: perfect in what sense?

eulerscheZahl: whatever your target function is

eulerscheZahl: speed, distance, fuel, ...

dbdr: no

dbdr: you will get the optimal

dbdr: unless you can find shorter than the straight line ;)

dbdr: at max speed

eulerscheZahl: A* is optimal, if your heuristic doesn't give you a higher cost than the actual

dbdr: exactly

Washier: yes. admisable

struct: Seems fixed

Astrobytes: Famous last words...

struct: Might be 100% fixed

struct: before I couldnt even change from SD-HD

struct: now its possible without breaking

eulerscheZahl: nice

Cappefra: hi everyone

Astrobytes: Hi

MSmits: yay my first othello gamr


MSmits: generate move works and i am just selecting the first one

MSmits: cuz why not

Scarfield: :muscle:

jacek: the game provides possible moves, how can we trust what youre saying

MSmits: lol

MSmits: I'm me, thats how

MSmits: I can't even keep things to myself I shouldn't be sharing

dbdr: the fastest dumb bot around ;)

MSmits: how would i lie :P

dbdr: no offense intended

MSmits: haha yeah

MSmits: but no AVX yet

MSmits: could be faster

MSmits: the "no pass turns" thing is interesting

MSmits: earlier I was studying the statement to find out how to pass

struct: Not sure if it was good idea or not

MSmits: I dont know either

MSmits: I dont mind it much

MSmits: so far

MSmits: it's server friendly though, why give players a turn if they cant do anything

struct: its more like if you have multiple turns in a row you can search more

MSmits: sure

MSmits: I will have a pass turn in my tree though

MSmits: makes so you can more easily alternate when backpropagating and such

MSmits: Reusing the tree will be challenging, but I can simply activate expert mode

struct: yeah

MSmits: but thats pretty low on my todo list, for now i'll just treat every turn as a new game

struct: Boss has around 40k rollouts

MSmits: from previous experience, reusing the tree is pretty minor

MSmits: ah ok

struct: on 2nd turn

MSmits: i'm not worried about the boss

MSmits: I'll beat it when i'm done

MSmits: but good to have abenchmark

dbdr: struct, do you want new code for the boss?

Hjax: are we adding another othello boss?

dbdr: just making the current one stronger

struct: Yeah dbdr, we cant let msmits reach wood 1

dbdr: MSmits needs a challenge

Hjax: lol

MSmits: sure :)

MSmits: oh crap now comes the sign stuff

tomatoes: pass moves in tree may skew minimax :thinking:

MSmits: yeah

MSmits: I don't minimax though :)

struct: What does skew means?

struct: favours?

MSmits: unbalances

struct: unbalances in what way?

MSmits: may favor one side or the other

tomatoes: i tried minimax style propagating

MSmits: if you have only 1 child when you expand, just expand again

MSmits: not just pass turns

MSmits: also turns with 1 move

MSmits: i do this in oware

MSmits: not in other games

MSmits: if it almost never happens there's not much point to it

struct: Here might happen more

MSmits: yeah

MSmits: mmh I got over a million rollouts on turn 1 and then crashed on turn 2 :P

MSmits: didnt read all the input or something

MSmits: oh right, dont put the output statement inside your loop to select best move

MSmits: ok 1.3 million rollouts on turn 1. 150k rollouts on turn 2. Also it solves the game 9 plies before the end.


MSmits: but thats with an eval of 0

MSmits: should be able to solve much better with an actual eval

jacek: so typical mcts?

MSmits: yeah same numbers I get in most games

jacek: and the bot is 40k rollouts, how can you lose so easily

MSmits: cuz an eval of 0

MSmits: every position is worth 0

jacek: youre doing ept?

MSmits: yeah

MSmits: well early as in no random rollout

jacek: x_X

MSmits: it works well in onitama and oware

MSmits: dunno about here

jacek: with eval...

MSmits: yes of course lol

MSmits: I just finished my sim and mcts framework. Eval is next :)

MSmits: then i need to fix reusing the tree, AVX the move generation and such

MSmits: I am just happy i didnt get stuck on mcts bugs for hours this time

MSmits: it's a first

jacek: yet

jacek: wait for multiple passes

RoboStac: if your eval is 0 how can you know your sign swapping is right? :)

MSmits: why would it be a problem

MSmits: the solver sign swapping has to be correct Robo, backpropagation of eval could have a sign error, but thats easy to fix

MSmits: jacek why would multiple passes be a problem for mcts?

MSmits: I just add a single child as a pass turn, same board

RoboStac: it's only a problem for tree reuse

MSmits: yeah i know

MSmits: you guys warned me thankfully

jacek: i bet there is some hidden bug anyway

MSmits: could be

MSmits: I took most of my code from my Oware bot, the only annoying part was the fact that I start with a playerID, instead of always being the first player

MSmits: i was worried about this causing me problems

MSmits: btw, this way seems more natural to me

MSmits: Oware is weird for flipping the board on you without telling you

MSmits: i literally count the number of pits with 4 seeds in them to see which player I am :P

jacek: i think that was part of the challenge?

MSmits: it certainly is when you're trying to use an opening and end game book that requires you to know how many turns you have left

Astrobytes: I appear to have fixed a bug

MSmits: which game?

Astrobytes: Othello

Astrobytes: I still have major issues that were depending on the bug, but that's a job for tomorrow

MSmits: well good that you fixed it

MSmits: I am working on eval now

MSmits: trying to figure out how to incorporate mobility without having to count the number of moves for every child

Astrobytes: Over-optimising already :D

MSmits: mmh yeah i guess. It just seems so expensive to run this function for every child

Astrobytes: mobility just as in available moves or incorporating frontiers?

MSmits: I got the frontiers thing

MSmits: so just available moves

MSmits: I guess the frontier thing is just as expensive

MSmits: so for now I'll just generate them

MSmits: optimize later

Astrobytes: Yeah tbh I really don't think that's particularly expensive

MSmits: maybe not

Default avatar.png RogerRoger: Is the chat broken on CoC?

Astrobytes: It's just some popcounts right

Default avatar.png RogerRoger: Once the clash begins the chat closes and never comes back even at the end of the clash

jacek: yeah, it happens for some time now

Astrobytes: Hm, has anyone reported that on discord/forum?

Default avatar.png RogerRoger: bummer, that takes some of the fun away

Astrobytes: It shouldn't happen, it should be available. Not a lot of people use it but it should still work

Astrobytes: Welp. 11th again in Othello but this time I gained a bunch of points. Bug neutralised. Work shall resume tomorrow

Astrobytes: Goodnight all, take care

MSmits: gn Astrobytes

Default avatar.png FLQ4: gn

Default avatar.png Hexdro: star man share?

darkhorse64: You are making mince meat of the boss, MSmits

MSmits: yeah

awesometj: i need some help

darkhorse64: I'd hope my creature would resist a bit more

MSmits: I was expecting it to, knowing the quality of your bots

MSmits: I'm solving 15 plies before the end of the game

darkhorse64: There is no solver in the boss and it's only full random rollouts

MSmits: ahh thats different

awesometj: hey

MSmits: my othello bot is very similar to oware,

awesometj: hello

MSmits: sup awesometj

awesometj: sup

awesometj: MSmtis

MSmits: you can use tab to finish my name

MSmits: just type ms + tab

awesometj: ms+tab

MSmits: :face_palm:

struct: lol

struct: MSmits not 100% win rate, cancel the submit

Scarfield: wow nice submit smitty, 1st so far?

MSmits: it's still a very early version

struct: you had 1 timeout

struct: btrw

MSmits: no tree reuse, no avx

MSmits: ohh

awesometj: what are you guys or girls talking about

Scarfield: othello


MSmits: it didnt time out during search

tomatoes: memory?

MSmits: nah, it just never accepted my output

MSmits: not sure

MSmits: I think I was just too late

struct: how much time of the 150ms are you using?

MSmits: 145

dbdr: that was quick MSmits, gg!

MSmits: this happens to me in other games as well

MSmits: thanks dbdr

awesometj: u lose

MSmits: only 15 people in wood 1

MSmits: the difference in rating is insane

MSmits: mostly Renard and up

struct: dbd r is almost undefeated

MSmits: yeah

MSmits: need to figure out this expert mode

struct: after reading the board

struct: you get an extra input

struct: after your first output

MSmits: yeah

MSmits: do you still get all actions as well?

Scarfield: "pass" or moves like "a2;c4"

struct: all actions made since your last playable turn

MSmits: i mean

MSmits: do you still get all legal actions

struct: yeah

MSmits: the stuff i dont use

MSmits: ok

Scarfield: how many rollouts do you get?

MSmits: lemme see

MSmits: rollouts are a bit tricky to compare but Turn 1: 1,2 million. Turn 2 84k

MSmits: but a single rollout is not what you would expect

Scarfield: depends on what i am expecting :p

MSmits: those 84k rollouts are actually 644k root visits

MSmits: because i eval every child

MSmits: and backpropagate that

struct: you rollout every child?

MSmits: I dont rollout

MSmits: I eval

Scarfield: damn, i have "some" optimization left

struct: ah ept right?

MSmits: yeah

darkhorse64: 0 depth ?

MSmits: currently yeah

MSmits: i always start with that these days, its easier to code

MSmits: random rollout functions can be tough

MSmits: sometimes it's a lot of code and it can be slow

MSmits: btw, i also tried it on uttt, was not even half bad. I think rank 20-30

MSmits: my eval was ok I guess

darkhorse64: It's not even EPT anymore, or Very Early PT

MSmits: its not even mcts because no random

struct: What do we call it?

MSmits: well you can call it EPT depth 0, but it's still fundamentally different

Scarfield: Immediate Propagation Termination Tree Search

MSmits: sure why not

dbdr: UCTS

MSmits: yeah

MSmits: though you can backpropagate many different ways

dbdr: yes, that's the other aspect

darkhorse64: You coined it ? It's very accurate

MSmits: you can back prop the average child value, the highest child value , do some kind of deeper minimax search from the leaf

dbdr: yes, never heard it before

MSmits: yay top 10 :)

dbdr: I mean it's UCT + TS

dbdr: UCT is the exploration formula

MSmits: is it UCT or UCB

MSmits: i hear both

darkhorse64: UCB applied to Trees

MSmits: is that really what UCT means?

darkhorse64: Yes

MSmits: oh

Scarfield: Upper Confidence Tree

Scarfield: Upper Confidence Bound

MSmits: it's weird to have part of your acronym be an acronym


dbdr: GNU's Not Unix, MSmits

Scarfield: UCBT would have been to much to write

MSmits: I wonder how well I picked the weights

struct: Are they different?

struct: wtf

dbdr: part of the acronym is the acronym

Scarfield: yea i see, thought it was just either Tree or Bound, today i learned :p

MSmits: yeah, I forgot what a gnu was

MSmits: I mean the animal

dbdr: it's an animal that is not unix ;)

MSmits: apparently

darkhorse64: gn all

Scarfield: :wave:

dbdr: gnu darkhorse64

Scarfield: lel

Scarfield: :water_buffalo:

MSmits: gn darkhorse64

Hjax: MSmits you have no chill

MSmits: chili? The food?

MSmits: not a fan

Hjax: no, chill

MSmits: ahhhh

Hjax: "it will probably rake me a few weeks to get something that wins games"

Hjax: *4 hours later* top 10

MSmits: hey, it's Robo's fault

Hjax: how is it robos fault?

MSmits: he shared a link where there was move generation code

Hjax: lol

Hjax: what search / eval are you doing right now?

MSmits: the sim usually takes me a lot of time

MSmits: EPT depth 0

MSmits: or UCTS

Hjax: with what eval?

MSmits: mcts with no random, just eval

MSmits: frontier, corners, move count

MSmits: with weights for each

Hjax: interesting

tomatoes: same :grinning:

Hjax: i still dont know what i was doing wrong with frontier / corners / move count

Hjax: but its about 5 points worse than just move count

MSmits: well you do the > 0 = win thing

Hjax: i do, i think tomatoes does that too

MSmits: ah, well thats not it then

MSmits: float normalized = evalScore / MAX_ADVANTAGE; return evalScore > 0 ? min(1.0f, normalized) : max(-1.0f, normalized);

MSmits: capped between -1 and 1

MSmits: because it cant be higher than win or loss

Hjax: im going to try to write a fancy n tuples eval this weekend

MSmits: doesnt that require training off line or something?

Hjax: it does

MSmits: hmm ok

MSmits: is it just a weight field>?

MSmits: that results from training?

MSmits: i should read that paper

Hjax: yeah, huge array of numbers

MSmits: why huge?>

tomatoes: 3^tuple_size

MSmits: whats tuple_size

Hjax: basically you take some part of the board, and index into a weights array based on the position in just that part of the board

tomatoes: pattern/part of the field

Hjax: so if your tuple size is 5, you have some pattern of 5 locations on the game board

MSmits: how many cells are you looking at around that cell?

MSmits: hmm

MSmits: ok

Hjax: the shape and number is up to you

Hjax: and then you have a bunch of these tuples, and weights arrays

Hjax: and you sum them

MSmits: ok so it is just a bunch of patterns you're looking up?

tomatoes: it seems

Hjax: its a score for every possible set of pieces in that subset of the board

MSmits: interesting

Hjax: for each subset of the board, you do the lookup

MSmits: right

Hjax: and add to some total score

MSmits: jace k does this?

tomatoes: i've only read, didnt try to implement yet

Hjax: yes

MSmits: dbd r doesnt?

Hjax: unknown

MSmits: oh

Hjax: he said he has 300k weights

Hjax: so hes doing something

struct: doenst he have a crazy amount of weights?

MSmits: dbd r has 300k weights?

Hjax: but he hasnt said if its n tuples

struct: doesnt probcut require weights?

Hjax: it does, but not that many weights

Hjax: "they compress well" -dbd r when i asked how on earth he has 300k weights

MSmits: well i'll focus on implementing AVX and such before I do the eval

Hjax: jace k said he has 60k weights i think?

tomatoes: 30 :thinking:

Hjax: was it 30?

Hjax: my bad

Hjax: i dont have avx or anything fancy like that

tomatoes: im not sure now

MSmits: avx is actually not that hard to use. It's just hard to find a use for

Hjax: but my code only spends 20% of its total time in move gen / make

Hjax: so its not really the bottleneck anyway

MSmits: i dont expect it to help a lot, but i am sure it will and that means I can finally use AVX in a bot

MSmits: I never have before. Well i tried but it never helped

MSmits: i could do csb, but i dont want to.. i know it helps there

MSmits: if I ever get back i will

Hjax: i was trying to work out how many weights i can fit in my submission here

Hjax: and what n tuples scheme i want to use

Hjax: shape / size

MSmits: how many different weight sizes do you want?>

MSmits: as in how many bits per weight?

Hjax: i wasnt sure of that either

Hjax: i was thinking a byte is probably enough

MSmits: say you use 1 byte

MSmits: then at max you can have 200k weights

MSmits: unless you have many equal weights and can compress it somehow

struct: 🚀 === 4 bytes

MSmits: you have to figure out how to deal with symmetry also

Hjax: ive mostly worked that out already

Hjax: well, ive worked out how to rotate bitboards

MSmits: I'd say you read in your weights in the first 2 seconds and then multipley the array by 4

MSmits: then you dont need to rotate anything during the search

MSmits: or by 8 actually

Hjax: yeah i was about to say, its by 8

MSmits: right yeah

MSmits: i do this for opening book in yavalath

Hjax: i was thinking i would pre rotate the masks

Hjax: that get the part of the board for the tuples

MSmits: I read the book, then have a map to all 11 other symmetries of each move

Hjax: then i just PEXT the board position

Hjax: and index into my table

MSmits: yeah thats good

Hjax: i just need to make sure the bits are in the right order

Hjax: if the low bit is the corner in one rotation, the low bit needs to be the corner in all rotations

MSmits: have fun with that :P

Hjax: its a bit easier if my tuples are all straight lines

Hjax: because then they are either backwards or not

MSmits: they wont be

MSmits: well

MSmits: they will be rectangles

MSmits: 3 by 2 and such

Hjax: i was thinking 4x1 chunks might be pretty reasonable

MSmits: i thought that paper had bigger chunks?

Hjax: depends on the paper

Hjax: i found one that swore 1x2 was best for othello

MSmits: 1x2 ??

Hjax: yep

Hjax: i dont buy that

MSmits: that wont give you many weights at all

Hjax: but i can experiment with different weight sizes and shapes

MSmits: yeah

Hjax: 4x1 just seemed like a straight forward place to start

Hjax: nice and friendly with rotations

MSmits: this is basically like having lookup arrays for miniboards in uttt

Hjax: i think of it as a really dumb neural network

MSmits: well dumb on the side of the program. It's actually more intelligent on the side of the programmer

MSmits: with a real NN the programmer doesnt have a clue what is going on

Hjax: the wikipedia page for it compared it to the kernel trick SVMs use

MSmits: no idea about that

Hjax: where you are mapping the state to a higher dimensional space

MSmits: that sounds cool

Hjax: SVMs just try to find a plane that separates your data

Hjax: used for supervised learning classifiers

MSmits: ahh ok

MSmits: I saw a lecture about that

starmaq: hello

MSmits: hi

Hjax: but even if you have ugly data that doesnt look like you can separate it

Hjax: if you map it into a higher dimensional space

MSmits: yeah i get that, more degrees of freedom

Hjax: yeah

MSmits: makes sense

MSmits: it's like fitting a function with more parameters

Hjax: in the case of n tuples, it lets you encode positional knowledge by looking at a lot of chunks of the board

Hjax: a single square on the board is probably in several tuples

Hjax: and then can be good and bad at the same time

Hjax: for different reasons

MSmits: right

MSmits: do you train this the same way as a nn?

Hjax: the papers recommend doing TD learning

MSmits: never done that

Hjax: i found a big database of high quality othello games though

MSmits: it seemed weird to me

Hjax: so i was thinking i would also try a pure supervised approach

MSmits: ah right you said that

MSmits: I would prefer to combine this with a meta mcts

MSmits: and use data from that

struct: this database is from games played by AIs or players?

Hjax: selfplay games by logistello

Hjax: its pretty easy to find

MSmits: sounds nice

Hjax: theres about 150k games in it i believe

Hjax: which should be enough to train some decent weights

struct: 1997 last version

Hjax: sure, but it was the best othello program for a long time

MSmits: you'll get good weights from that for sure

Hjax: the games are probably not blunders all over the place

Hjax: so its high enough quality to train on

MSmits: the fact that it's old is probably mostly going to affect performance

MSmits: not the accuracy of the weights

Hjax: yeah im sure its eval is excellent

Hjax: it actually uses ntuples too

Hjax: the shapes were hand crafted

Hjax: and then trained through self play

MSmits: nice


Hjax: the self played games are there, as well as a bunch of details about how the program works

MSmits: thanks


MSmits: i know 1 ply before tric trac that I lost :P

MSmits: not even done optimizing, with crap eval and already solve sooner than his ab/TT bot :P


struct: book from ntest

Hjax: i havent added solver yet

MSmits: it always surprises me how well mcts can solve

MSmits: intuitively you'd think minimax is better at this


Hjax: tric knows i win before i know i win

MSmits: what was your search type again?

Hjax: mcts ept depth 6

MSmits: ohh ok

MSmits: well it makes sense my way solves faster, I skip the random rollout

Hjax: ill switch to depth 0 when i have my n tuples done probably

Hjax: ill do some testing to see whats better

MSmits: that would be great, let me know if you want to share those results

Hjax: im not planning on keeping any secrets in othello

MSmits: ah ok

Hjax: so ill absolutely let you know :)

MSmits: I share most, but not all

struct: It seems that there are no winning moves

struct: just losing moves

MSmits: weird

Hjax: how many nodes per move do you search smits?

Hjax: are you a lot faster than me?

struct: at least if you follow the book moves

MSmits: oh, let me see

struct: the books stop

MSmits: ROOT: visits: 656754

struct: after a certain depth

MSmits: every node has 1 value backpropagated

MSmits: so 657k nodes checked

Hjax: is that on a fast machine or a slow one

MSmits: let me try a few times

Hjax: i either get 530k or 660k

Hjax: depending on which game runner i get

MSmits: this is turn 2?

Hjax: turn 1

MSmits: I was talking about turn 2

Hjax: oh wow lol

struct: :D

Hjax: im getting about 60k

Hjax: past turn 1

MSmits: turn 1 is 6.6 Million

Hjax: that would destroy my node pool

MSmits: const int NODE_MAX = 20000000;

MSmits: i currently dont reuse the tree

Hjax: i do

MSmits: not sure what it would do to my node pool

MSmits: i was going to work on that

MSmits: but then there was interesting conversation here

MSmits: and i'm tired

Hjax: lets see how many playouts i get with depth 0

MSmits: btw

MSmits: i get so many nodes because i eval each child

MSmits: so one expansion phase = x moves = x nodes

Hjax: oh so you uct less

MSmits: yes

Hjax: i see

MSmits: also i skip over 1 child expansions

MSmits: i just expand again

MSmits: so passes and 1 move situations

MSmits: oh and another thing

MSmits: I save the board on the node

MSmits: so I dont have to generate moves and apply them every time i go down the tree

Hjax: why would you have to generate moves?

MSmits: hmm, sorry you dont

MSmits: i mean apply the moves

MSmits: thats also costly

MSmits: i only UCT when going down the tree, at the end I expand and apply the move

Hjax: yeah i might switch to that, i was concerned about memory usage

MSmits: it's two uint64_t

MSmits: not too bad

MSmits: assuming you keep the other stuff small

Hjax: a boolean too?

MSmits: which boolean?

Hjax: whose turn it is?

MSmits: nah

MSmits: selectedCount & 1

MSmits: if it's 1 it's your turn

Hjax: selectedCount?

struct: your node is two uint64=

struct: ?

MSmits: no the boardstate is

struct: ah

MSmits: selected count is the number of nodes i selected

MSmits: when going down the tree

MSmits: a selection is a turn

Hjax: oh true

MSmits: i store them in an array

Hjax: so when i first wrote this

MSmits: so i can easily backprop

Hjax: i was dumb and didnt have pass nodes

Hjax: but now i do, so i guess i dont need the boolean

MSmits: yeah, i usually dont have it

MSmits: also, I dont have any pointers

MSmits: just an integer index

MSmits: to the first node

Hjax: same

Hjax: although my selection is recursive


Hjax: not a stack

MSmits: ah, i always use a while loop

Hjax: i tried both when i was using java, it didnt seem to make much of a difference

MSmits: probably doesnt

Hjax: i just like recursion better conceptually

MSmits: sometimes I do

MSmits: when i get into a recursion frame of mind I accidentally turn simple loops into recursions also :P

MSmits: I showed dbd r a function I wrote that I thought was really cool and he said, so... you're just looping from 1 to n?

Hjax: lol


Hjax: my node right now

MSmits: hmm when you calculate the value of a node you divide a float by an integer

MSmits: better have two floats I think

Hjax: it gets typecast first

Hjax: but probably slightly slower

MSmits: yeah, ihavent done any tests recently, but from what i remember, mcts works better if you keep them as two floats

MSmits: slightly faster

MSmits: incrementing rollouts is slower when they are floats

MSmits: but its a small price

Hjax: well im getting lots of things i can tweak, not sure how much more speed ill get

MSmits: do AVX

MSmits: I think its the biggest speedup you can do, even if it is only 10-15%

tomatoes: i had increment problem with float

MSmits: hey, how are endgame books in this game? They seem useless to me because there are too many board configs, but I am not sure

tomatoes: its broken at 2^24

MSmits: huh

MSmits: oh

MSmits: of course

MSmits: some bits are taken up by the scale part of the float

Hjax: i dont think endgame tablebases work in othello

struct: by the end is already too late

Hjax: the game gets more complex, not less complex

Hjax: and yeah youve solved by then

MSmits: thats not a problem though

MSmits: well the more complex part is

MSmits: but you solve even sooner if you havea working endgame book

MSmits: because you shave off nodes at the end of your tree

MSmits: i do this in oware

Hjax: yeah, chess engines do this

MSmits: all boards with <= 6 seeds will end the tree immediately

Hjax: every position with 7 or fewer pieces are solved

Hjax: no need to search more

struct: and they are very small

MSmits: yeah

struct: 10k bytes

MSmits: checkers too

struct: /s

MSmits: what is small struct?

Hjax: he was kidding

struct: I was being sarcasting

MSmits: ohh

Hjax: chess TBs are massive

MSmits: in oware they are tiny

MSmits: well unless you want more than 6 seeds :P

MSmits: my 15 seed db is 4gb

MSmits: but endgame db for oware are actually harder to generate than endgame db for chess because you need to keep all future states in memory

Hjax: so depth 0 is a 50% speedup for me

Hjax: and its awful lol

MSmits: nice

Hjax: because my eval is awful

MSmits: oh :(

tomatoes: do you have random child selection?

MSmits: I dont

MSmits: I eval all children so they're all visited the first time their parent gets expanded

MSmits: after that it's UCT

tomatoes: same

MSmits: you should try onitama and oware next

MSmits: your search will do well in both those games

MSmits: I need to go get some sleep. gn all!

Hjax: goodnight

tomatoes: gn

Hjax: struct are you able to make changes to othello?

struct: depends

struct: what Hjax?

Hjax: struct the viewer doesnt show legal moves if you step through it with the arrows

Hjax: since the legal moves briefly vanish between animations

struct: I see, I will check if its possible to fix it

struct: so from what I read in my code

struct: i commit at 0.00 :/

struct: I will try another thing

struct: I think its possible to do

struct: but not easy

Hjax: its not a huge deal, its just a mild annoyance

struct: yeah Its like the frame at 0 is not equal to 0

struct: :p

Hjax: :P

Default avatar.png Edwing123: Hello