Talk:LiteRumble
- [View source↑]
- [History↑]
Contents
Thread title | Replies | Last modified |
---|---|---|
Score Distribution | 6 | 14:37, 2 June 2013 |
Queue full | 5 | 21:36, 31 May 2013 |
Bad uploads | 3 | 16:01, 31 May 2013 |
KNN PBI | 9 | 12:01, 30 May 2013 |
Backlog | 0 | 11:33, 20 May 2013 |
Put_Your_Name_Here | 1 | 13:44, 21 April 2013 |
Rerun of Pairings | 19 | 15:03, 6 April 2013 |
Bot pairing vs itself | 5 | 11:08, 6 April 2013 |
LiteRumble Statistics | 6 | 21:48, 5 April 2013 |
Awesome job ... | 3 | 21:36, 1 April 2013 |
Assymetric pairings | 13 | 17:44, 30 March 2013 |
Ranking column in pairings page | 1 | 08:29, 30 March 2013 |
quota reached | 7 | 14:10, 29 March 2013 |
Flags | 20 | 09:57, 27 March 2013 |
API | 14 | 15:34, 26 March 2013 |
links in new tab | 1 | 22:02, 25 March 2013 |
1.8.1.0 | 0 | 07:33, 25 March 2013 |
Down (for a few hours) | 1 | 08:17, 24 March 2013 |
MOAR CLIENTS | 8 | 06:10, 24 March 2013 |
LiteRumble 1.7.4.2 superpack | 4 | 20:45, 22 March 2013 |
First page |
Previous page |
Next page |
Last page |
Can someone describe how to read the fancy new Score Distribution graph? What is the X axis? What is the Y axis? What do the different colored dots represent?
There is a caption under the diagram describing X and Y. Mouse over the image to see what the colors mean.
Basically X, opponent strength, Y is how good your robot is against that opponent.
Basically, the X axis is the score that each particular component got in the rumble, while the Y is the score you got against them. Right now I have red = Opponent APS vs Pairing APS, green = Opponent Survival vs Pairing Survival and blue = Opponent APS vs.(KNNPBI+50). Each pixel colored in represents at least one pairing with the score at that location. Both axes go from 0 at the origin to 100 at the top and right edges of the picture.
I'm thinking of changing green to Opponent APS vs Pairing Survival, just so that the X axis is always Opponent APS. Any thoughts?
Can I ask a question over here? If I look at my or at any "bot detail page" (like http://literumble.appspot.com/BotDetails?game=roborumble&name=mae.Mae1%201.1 ) I see many abbreviations ,for example APS,NPP and KNNPBI.Is there a page in this wiki or somewhere else where these words are explained ,because my English is not so good that I could deduce the meaning myself. Thank you very much.
Some of them are listed at LiteRumble.
The important one is APS, as that is the primary ranking. APS is average percentage score.
For each opponent your percent score is 100% * <your score> / (<your score> + <opponent score>).
APS is this value averaged over all the battles/opponents for your bot, so it is important not just to win, but to win by the largest margin possible.
PWIN is percentage of wins.
I have added a page on the Literumble here (and a link to it from the main page) which provides better explanations of what the different scores are.
If you have any questions, or think that they need to be clarified, just ask.
Thank you very much.
When the server queue is full, LiteRumble is returning an OK, making the client discard the uploaded battle.
IMHO it would be better to return an ERROR instead, telling the client to keep the battle and retry the upload later.
I wouldn't mind doing that if the client would do a delay for 10 seconds or something before trying again after an error. Right now it just retries the battles that failed each iteration (along with the new ones) and this quickly leads to all clients just trying to upload at full speed the whole time, which will put too much load on the server.
If we wanted to change the client protocol so that the client had a delay when this happened, I wouldn't have a problem. However, another issue is that the priority battles get delayed then, which means that a) the bots that need priority battles end up getting too many once the queue is run and b) new bots take a long time to enter the rumble. So, optimal client behaviour would be if the server returns OK. QUEUE FULL. then the client should wait 10 - 30 seconds then retry uploading the same pairing to the server.
PS. the new rumble structure lends itself well to bulk upload strategies. If you want to write a bulk upload protocol I would be happy to look it over and implement it on the server.
I´m writing a custom client right now (slowly writing it from scratch in the last months). Yesterday I managed to make it fully functional, although it still needs polishing (make hardcoded behaviour more configurable). I´ll make it available here after it becomes more stable.
I can add bulk upload, but it will break compatibility with the current protocol. Unless both clients and servers support 2 protocols at the same time.
Features I managed to include in this custom client so far:
- Full compatibility with the current protocol. (I hope that underscore bug was the last one)
- Multiprocess/multithread support.
- Parallel downloading of JARs. (currently hardcoded at 15 simultaneous downloads)
- Processing battles in parallel while uploading results in a separate process. (currently hardcoded at 1 simultaneous upload)
- Abusing the Java 5 concurrent API to keep the code readable in the presence of parallelism.
- Upload throttling in case of errors (currently hardcoded at 10 seconds delay after each error). It is possible to throttle uploads in the absence of errors too, although I wasn´t planning to do that.
- Smarter handling of priority battles. One big pairing matrix handles priority battles, new competitors and competitors with low battle count, all at the same time. And it is independent from iterations (which I eliminated).
- Communication between processes through the network, allowing clients spread accross a LAN. (currently hardcoded at "localhost" address and 1099 port only)
- Automatic copying of JARs between clients. If a single "server" process has all JARs, no client needs to download from internet.
- Logging support. No more System.out.println. You can configure how messages appear in the console (or in a file), adding for example, time and severity.
- Internally, battle parameters are all dynamic. Parameters like number of competitors, inactivity time, gun heat cooldown, codesize classes, hideRobotNames, are all concentrated in a configuration class. The idea is to put them all in configuration files and make divisions like twin duel, team melee or anything else fully supported.
Neat! Sounds like a lot of work. What's the setup like for multi-process battles? And is it the same mechanism locally vs clients across a network?
There is a "server" process and multiple "worker" processes. You start the server process by calling server.cmd. And start each worker process by calling worker.cmd. Each one runs in a separate JVM and needs its own Robocode installation. This way each process runs in a separate window and you can see what each is doing.
All communication to LiteRumble is done by the server process alone. Server and workers communicate through RMI.
Server process is currently using the same configuration file of the official client. Worker processes are currently 100% hardcoded, but server address/port and robocode home could be configured.
Server process downloads participants list, ratings, download JARs (in a separate "jar" thread-pool), calculate codesize, remove old participants and generate a local participants list. They run in a "download" single-thread pool (except jars). Participants list and battle count are sent to a "battle generation" thread-pool, which is single-threaded.
Worker processes connect to the server and requests a battle, which is generated on-the-fly by the server in the "battle generation" thread pool. Then the worker runs the battle and sends the result back to the server. Worker processes are mono-threaded (except for threads internal to Robocode).
Server receives the result, splits it in codesize classes and sends them to an "upload" thread pool, which is currently single-threaded.
In the "upload" thread pool, results are uploaded to LiteRumble. Battle count and priority battles are downloaded and sent to the "battle generation" thread pool. If workers flood the "upload" thread pool with results, upload requests are kept in a queue, and are uploaded one at a time.
In the battle generator, participants list, battle count and priority battles are grouped and used to generate a smart battle whenever a worker requests. All battle generation logic is kept in a single class, in a single thread, making it easy to customize.
The result is you see battles going non-stop on workers, and uploads going almost non-stop in the server process, one at a time. Makes a huge difference in melee.
While testing a custom client I screwed up while uploading results to LiteRumble. Now there are a few bots with wrong names on the server (underlines instead of spaces):
bvh.mini.Wodan_0.50
taqho.taqbot_1.0
eat.HumblePieLite_1.0
ntw.Sighup_1.5
jcs.Megatron_1.2
Polkwane.Intensive_1.0
Legend.Biogon_1.5
gwah.GerryBotMkII_1.5.1
cw.megas.Silhouette_1.1
el.JumpShoot_0.2
ags.Midboss_1q.fast
Polkwane.Piyane_0.7b
bjl.LoneDragon_0.5
pez.mini.VertiLeach_0.4.0
vft.Valkyrie_1.0
japs.Sjonniebot_0.9.1
pmc.SniperBot_1.0
supersample.SuperTracker_1.0
pez.micro.Aristocles_0.3.7
timmit.nano.TimDog_0.33
oog.nano.Caligula_1.15
And the API doesn't let me delete them. It translates underlines to spaces on delete requests making these names inaccessible.
I've changed the API so that it doesn't filter like that in the delete, but does in the upload. I'm not sure if they'll be automatically removed now, or if the client can't handle the underscores.
The client couldn't do it, so I quickly scripted something to remove them from robo/mini/micro/nano. It should be fine now.
The client can´t automatically distinguish names with underscores and with spaces when removing old participants. It´s because the rating list downloaded from the rumble server uses underscores, and the list downloaded from the wiki uses spaces.
...and remove requests use underscores ...and upload requests use spaces ...and priority battles responses use underscores.
Wow, I'm really excited about this! Finally I have a better idea where to focus my benchmarks. =) [1]
What k are you using? And is DrussGT getting k/2 because there's nobody above him, or still getting k, but all below him?
Sorry I missed this...
Right now I'm using k=sqrt(opponents), and it just chops it off. So the top bot gets k/2, second bot gets (k/2)+1 etc.
I just discovered that my numpy
conversion had broken the KNNPBI completely, so I've fixed that and re-run all of the rumbles. Now that it is using numpy, it should give nice symmetrical results (although KNNPBI isn't really symmetrical, by design, but now they are consistent).
Also, looking at the code, k=sqrt(len(bots))/2
Hi, the KNNPBI doesnt work for DeepThought (http://literumble.appspot.com/BotDetails?game=roborumble&name=cb.DeepThought%201.0)... any idea why?
I'm not sure, I'll look into it this evening. How long has DeepThought been in the rumble?
OK, I've made some changes in the way the batch rankings (KNNPBI, ANPP, Vote) are calculated. Notably, the memcache is set using different sized batches and while I was messing about I made Vote account for ties (so it should be more stable). I'm not sure if this will fix the scores for DeepThought since I'm not really sure why they aren't being saved, I'll check back in a few hours to see if it worked. I know DeepThought is definitely getting the scores calculated because the ANPP and Vote show up in the main rumble score, so clearly it isn't being saved somehow.
It seems that worked! DeepThought now has KNNPBI and NPP scores. If you want to improve your score the quickest, concentrate on these bots =)
I noticed the backlog was ~22hours, which seems to me a bit excessive =) I've added a check to the upload so that if there is a backlog of more than 2 hours it discards new uploads until the backlog drops again. This 'check' is refreshed twice an hour so that it doesn't thrash too much, and also minimises the overhead of checking the backlog (which takes a second or so).
I see that there is an actual listing for "Put_Your_Name_Here", any chance we could get that translated to "Anonymous"?
I see quite a few robots that haven't changed are re-running pairings today as if they had new versions. Any idea why that is?
Looking into it myself. From what I can tell a bunch of battles didn't load into the Batch Rankings, so it assumed that they didn't exist and pulled them from the participants scores list. They've been slowly added back by clients over the last few hours.
I've removed the section of code that removed the battles from the Batch Rankings, but that is just putting a bandaid over the problem. I'll have to look deeper to see what caused them not to load in the first place.
Looks like half of General 1v1 has incomplete pairings now. Should I put my clients into overdrive to fix it, or am I making it worse by running clients because of some bug?
Running a bunch of clients isn't going to make it any worse, from what I can tell it was a once-off problem to do with the backend instance being unable to load data. I've removed the mechanism it used to remove the bots, but I'm still not sure (and may never know) why it happened.
I've also just identified a bottleneck/threadlock which will severely limit the ability to upload from multiple clients at once without increasing upload latency to where it will spawn new server instances and cause my quota to be hit again, but I have a fix for that which I'll implement and test tomorrow. The load right now seems pretty healthy though, I see in the logs uploads from you, MN and Wompi, thanks guys. I'll let you know when you can unleash the full power of your machine(s) =).
It's data isn't removed, so you can still see it in the BotDetails, but the pairings info in the other competitors which points to it is removed. Otherwise over many versions the access to other bots will get slower and slower due to increased serialising costs.
Keeping pairing data for a while can help protect the database against faults in clients removing competitors from the rumble, only to be re-added again some time later.
That sounds reasonable, yes. Perhaps adding a 30 day error window, so only if the last battle was more than 30 days ago the pairing data in the 'alive' bot gets purged. Until then it is just marked as 'removed'. I think this purging and checking will have to happen in the backend, because the frontends are fully loaded right now with your and Voidious's uploads.
The number of bots with not full pairings has gone up - we were under 400 yesterday and back up to 471 now. I noticed an over quota message from last night, was there another loss of data?
Let me know if I should dial back my clients or if there's anything else I can do.
The source of the problem has to be tracked down or the rumble will never stabilize.
I guessed it was the excludes feature from the clients erasing pairing data in the server. But looks like it is something else.
Sorry guys, I was trying to see if I could use the marshal
module to do my serialisation instead of cPickle
because my local testing showed it is about 50% faster, but it corrupted a few bots from each pairings dict so I quickly changed it back. I'm not sure why it had these issues since I tested locally on the dev server and it worked fine, but anyway it is fixed now, and was a completely different issue to what happened before.
It did hit the quota last night, so perhaps tone down the clients a little. There's a threshold below which it is cheap to run, but as the load increases I start leaving the free quota for the instances as well (not just database writes), which gets expensive much more quickly.
Took my clients from 4 down to 2.
Can you protect against us overloading your server? Both to avoid hitting quota, and to avoid someone DDoSing your bank account :-), it seems like it would be good to have some throttling or something in place.
Refilling the pairings is going to take a while. Is it possible to tune things (for now) to support a higher client load, to prioritize overall throughput over losing pairings here and there, while consuming less quota?
I've been trying to think of a good way to do that, but the 'recommended way' using Task Queues (which I can then limit to 3-4 queries a second instead of the 5-6 I was getting yesterday) will break any reasonable way of having priority battles.
Also, there is no way to programatically retrieve the current quota usage stats, which means I can't do any auto-throttling.
I can tune it not to do database writes unless a bot has x or more pending battles, which is how I did it previously when on free tier, but the majority of the time is actually taken up with (de)serialising the pairings data, which is why I was trying to shoehorn in marshal
. I'll add a min pending battles limit, and you can turn those clients back on, we'll see what happens. Of course, it will probably only hit quota tomorrow night if it's an issue, since today has been pretty slow.
I´m thinking in building a custom client which groups results from all local clients and uploads them in a single thread, so the server needs only a single instance per user to receive data.
Combined with multi-threading, clients can keep running battles in parallel while a single thread uploads everything, making it faster than the current client, while at the same time consuming less server resources.
That would be great. I'm not sure how you'd do priority battles though, would you have a local queue which would be filled, and you just take from there? I guess I could sort-of do this with task queues, but it wouldn't be very pretty.
Priority battles are downloaded by the uploader thread after each pairing is uploaded. They would be sent to a queue, which would be consumed by the clients.
Battle results would be sent to another queue, which would be consumed by the uploader thread.
That is the basic idea. You can add some logic inside the queues to make them smarter, like dealing with duplicated battles, excessive amount of data, or lack of data and fallback to random battles.
I've essentially implemented what you've said here but on the server side using a Task Queue, the only thing we lost was on-the-fly updated battle numbers, but those aren't really being used now that we have priority battles. Also, priority battles are delayed by up to 100 pairings per rumble, but this new design should mean that stuff sticks around in local memory longer than before.
Once I add contributor stats I'll also add information about the current amount of queue backlog, so people can decide whether or not to run a client.
If you check your clients you can see that the uploads are going much quicker, and it tells you it is adding it to a queue instead =)
Seems like there's a bug in the TwinDuel rankings: [1]
DuoLedByDroid and TwintelligenceTeam each have battles vs themselves and it's counting as an extra pairing. (I noticed because the archived rankings code determines that rankings are stable by everyone having the same number of pairings.)
OK, I modified the code that checks that pairings are still in the rumble to also check against the bot name. They should be fixed next time they get a result upload.
Dunno if this is the same bug or a different one, but wompi.Kowari 1.4 and ag.Gir 0.99 show 989 pairings in the main rankings, but 988 in the bot details. (Should have 988, there's 989 bots.)
If you refresh your LiteRumble home page, you'll see a link at the bottom which takes you to the all-new LiteRumble Statistics page. This page is updated once an hour, on the hour, and contains the latest contributor information as well as how big the queue is and the expected processing backlog based on how many were processed in the last minute.
I also improved the OverQuotaError handling so that from now on your rumble client will see a regular server response and won't go crazy with the uploading errors. Also, from now on, when the queue is full it doesn't give an OverQuotaError, but instead waits half a second and sends a nice message back to the client saying that the upload was discarded.
Enjoy!
Yes. Because of this it doesn't have pure FIFO behaviour, sometimes new items get run before old ones, but for the most part it is FIFO.
Is the upload queue size the amount of battles which still needs to be processed?
Which means while the queue size is greater than zero, we can stop uploading battles and the server still has work to do?
Exactly. The amount of time it is estimated the work will take is the Queue Delay, but this is only based on the average speed in the last minute so it fluctuates a lot.
Did the queue replace the older cache? No more evicted battles?
Also, I know there is a quota for task queues, of about 100,000 messages/day.
No, the older cache is still there. It serves two purposes, 1) I don't have to write to the datastore every single pairing, which is slow, and 2) often a single bot gets lots of battles all in a row (eg just released) and in this case my database writes will be cut almost in half if I am caching them. There are virtually 0 evicted battles now that I keep just two queues for 1v1/melee, instead of 1 queue per rumble with a minimum of 5 unsaved battles before a bot was written and a minimum of 10 bots needing to be written.
I think that was the old quota for task queues and it has now been increased. In the control panel I see a quota of 1,000,000,000 and I'm less than 1% of that.
Hi mate. I just wanted to thank you for all the effort you put in keeping LiteRumble up and running - it is very much appreciated by me. Awesome job. Of course thanks too Voidious, Sheldor and all the others who spend her time to keep RoboCode alive. Right now I have not much time to help out - I barely could write a couple of bot code even on easter weekend :( . But let me know if I could drop some money or something else to show my respect for your work.
take care
Yeah man, LiteRumble is great! It's pretty remarkable Darkcanuck's server could just disappear one day and we have a viable alternative, with rankings already up to date, to switch to on the spot. And you've been lightning quick in adding polish and fixing stuff since it became the canonical rumble server. Great work, and I too am ready to pitch in for costs whenever you say.
Wompi,
Thanks for the mention. Though I doubt that my contributions to the RoboWiki have done much for Robocode itself.
I look forward to seeing how Kowari turns out.
Skilgannon,
Thanks for saving the RoboRumble. :)
Great job!
Voidious,
I agree. The LiteRumble's awesome!
I noticed pairings between 2 competitors are being scored differently. A vs B score is different than B vs A score.
LiteRumble could stabilize twice as fast if a given battle upload is updated for both competitors involved.
Certainly looks that way. At this moment, XanderCat 12.6 has run against all other opponents, but if I go look at some of the opponents who do not have full pairings, ones that XanderCat 12.6 has run against, XanderCat 12.6 doesn't show up.
Also, a number of values are coming up 0. Will those eventually update when pairings complete, or are not all scores currently tallied (either intentionally or due to a bug)? I know there was talk of dropping ANPP, so maybe that is 0 on purpose, but Vote for XanderCat 12.6 also comes up 0, even though XanderCat 12.6 shows up against PolishedRuby, who XanderCat gets top score against.
Those complex rankings are coming up 0 because they didn't have some battles run against them after the batch rankings was run, and got evicted from cache before their new data was written to disk. I think I'll do a disk dump at the end of each batch processing job, see if that sorts this out.
A lot of these problems are showing up because I put a bit too much 'eventually' into the 'eventually consistent' model.
They are both updated at the same time, but for a long time I had very aggressive caching on to keep within the free tier. Because App Engine Memcache can be cleared without warning, this meant that often one bot would lose a battle before it could be written to disk, but not the other. Ironically, this is one of those situations where a higher client load on the server means that less data gets lost, since the bot was more likely to hit the 'write threshold' before being evicted from the cache. Now that I have more writes to play with, I've lowered the write caching thresholds a lot, and we should eventually see everything settling down.
One big cache for everything. I used to have a queue for each rumble that would fill up, and each time a bot had over X battles it would be written to the database. Of course, when the nanorumble only gets 1/10th or less the battles of the main rumble, the bots in it are more likely to be evicted, resulting in incomplete and asymmetric pairings. So I've just rewritten that section to keep just two queues (only split between 1v1 and melee), and bots are written as a batch as soon as the queue is a certain size. That way, even bots getting less battles will still be written because they are all pushing each other through, so it should stabilize better. Unfortunately I couldn't do this before because I was too limited with writes.
I keep a dictionary of {bot.Name:unsavedBattles} and once there are more than 30 entries it gets written.
Let me explain that better: Each time a pairing is uploaded, the two bots are added to the dictionary with unsavedBattles of 1. If they already existed in the dictionary, their unsavedBattles count is incremented. Once the dictionary size is bigger than 30 (size = number of entries, not sum of unsavedBattles), all bots listed in the dictionary are written to database.
Dictionary size reaches 30 when at least 30 different bots had pairings uploaded.
I configured my clients to run/upload 30 battles per iteration. With meleerumble still having 3 battles per iteration. If all battles have at least one different participant, the server flushes the queue at least once per iteration, with higher chance of it happening exactly after the last upload leaving an empty queue.
It is an attempt to minimize the amount of evicted battles.
I miss the ELO rating column in the pairings page. When you viewed all pairings a bot has, ELO rating column allowed you to sort all pairings by opponent's strength.
There is no column which allows you to do that anymore. A sortable column with APS rank or league APS would be nice.
ERROR WRITING DATA!! QUOTA REACHED?
Oh no! I guess I'll stop my GigaRumble client. =) I've only been one running one slow client on my laptop, and with 30 slow bots it's pretty low volume - I think ~20 minutes per 25-battle iteration, at least.
Don't worry, I don't think it's you. I have 8 clients running at the moment in my lab, and it seems that they suddenly started producing a whole lot more battles over the last few hours (I'm not sure why). It's quite interesting, on the requests-per-second graph I can see when the latest Diamond was released quite clearly =) Check it out:
Again, I have no idea why that sudden burst of data came in. Considering it's about triple what I normally get, it would correspond with ~24 clients running regular rumble battles. Very strange. And no wonder I'm out of quota...
Hmm. If you have battles per bot 2000, and then they stopped running DrussGT / Diamond battles, I could easily see the battle rate tripling when switching to minibots or random battles.
It shouldn't switch to random battles though, because I've got priority battles going the whole time and the 1.7.3.2+ clients ignore the BATTLESPERBOT if there are priority battles waiting. I think I've identified a bug in the priority battle selection algorithm though, it is giving higher priority to pairings with more battles, rather than less (although that only starts happening once all the pairings are complete, at least).
Also, it hasn't been waiting on Diamond and DrussGT to fill out their battles like Darkcanuck's rumble, because until just now *everybody* was below 2k battles.
Ruh roh, my client's hitting this again.
OK. mrm.MightyMoose .2 vs logiblocs.Fire 1.0 received in 365ms ERROR WRITING DATA!! QUOTA REACHED?
That makes no sense, it is well below hitting anything. There was also an issue with priority battles not having any options because everybody had full pairings, which was some errors, as well as malformed requests which were coming from my university connection, I think they had something to do with the SEACOM cable currently being down.
I've added some logging, so next time it happens I can see exactly what the problem is.
Try adding flags to the tables, it makes a tremendous difference.
I don't want to deal with the admin of uploading flags for new entrants. If I do add flags I want it to be able to be changed without any admin access.
A long time ago someone proposed some kind of automatic flag maintenance, much like how the participants list is maintained today. People add their flags in the Country Flags page and the server adapts.
On the note of possibly making this the default server, here is my unfinished flags pack. Now I say unfinished because I am using ISO 3166-1 alpha-3 for the country codes, but I don't have a flag for every country code. I was working on it. I have about 1/5th of them, but I lost interest when people really stopped mentioning the light rumble.
Flags are up!
Looks great!
I did notice one thing, though... Maybe make the blank flag transparent instead of white? It looks odd on the grey rows.
Done. You'll have to do a CTRL-SHIFT-R reload though, to clear the cache.
A feature: you can sort by flag type, which I think is something no rumble has had before!
It would be interesting to have a country leaderboard using aggregated score of bots from each country :)
It was a good idea to change BLANK to NONE. Good job. :)
Currently the rumble uses ISO 3166-1 alpha-3 for the country codes. If anyone wants a flag that doesn't exist, i'll make up the flag. Until then, I suspect the current subset to be sufficient.
Currently supported are ABW, AFG, AGO, AIA, ALA, ALB, AND, ARE, ARG, ARM, ASM, ATA, ATF, ATG, AUS, AUT, AZE, BDI, BES, BRA, CAN, CHE, CZE, DEU, ESP, FIN, FRA, GBR, HUN, IRL, ITA, JPN, KOR, LTU, NLD, NOR, POL, PRT, RUS, SGP, SRB, SWE, THA, USA, VEN, and ZAF. Unless Skilgannon added more.
I actually didn't notice the BLANK until I had a good portion of the code up, then I just decided to stick with what I had :-p I added CHN, NZL and SVK.
I've also set out the RoboRumble/Country_Flags so that it makes it all pretty clear. I have a cronjob which parses the page once every 2 hours.
Oh on that note. The css style:
img {
width: 30px;
height: 18px;
}
Should help prevent any strange image sizing bugs.
I'm pretty hopeless with css, if you could provide that as an entire code snippet with example <img> tag and everything I'd be happy to integrate. Is there any chance of it going wrong if I keep all the images 30x18 though?
Gah, liquid threads ate my response again.
Anyway that is a complete CSS code snippet. It is just saying all images (rather all <img> tags) should be displayed at 30x18. If you just leave this bit of code out, the <img> may display at any browser specific size while loading (before the browser can load the image and see how big it is). I know some of them default to things like 100x100 while loading. Which may make the page look... weird while loading.
This was more of a problem when each package had a separate flag (and thus we had to load more images, which took longer), but it is still a valid problem.
Unless you add more images which are not flags. That css snippet affects all images on the page.
Ok, I have a simple API up. Just add &api=True to any Rankings or BotDetails page and it will return in nice easy-to-parse JSON-ish format. I say JSON-ish because real JSON puts double-quotes around everything, whereas I'm lazy and don't feel like doing a ton of double-quote escaping, and besides, we don't have commas or colons in our data so there isn't any risk.
If you don't want the entire pairings detail from the BotDetails, add &limit=0 to the page and it will leave them out.
Some usage examples:
http://literumble.appspot.com/Rankings?game=nanorumble&api=True
http://literumble.appspot.com/BotDetails?game=nanorumble&name=sheldor.jk.Yatagan%201.0.5&api=True
Of course, I'd rather you call Rankings once than call BotDetails with &limit=0 985 times, because although it doesn't generate the JSON, it still has to pull all the data in, which adds up for lots of requests. I'd ask that if you are getting more than 3, rather use the Rankings.
If there's anything else you'd like me to add to the API just ask, if it's already saved in my data it should be easy to whip something up to return it.
Sweet! I'll take a look at updating RR API clients in the next couple days. (That's @roborumble on Twitter, Category:Archived RoboRumble Rankings, RumbleStats, and BedMaker.)
I'll let you know how it goes or if I hit any snags. Hopefully the JSON libs I use don't mind JSON-ish. ;)
Well, the Perl JSON library is indeed unhappy about the lack of quoting, but I think I've got it covered:
$content =~ s/([\{,]\s*)([^:\{,]*):/$1\"$2\":/g; $content =~ s/:([^\[][^,\}]*)([,\}]*)/:\"$1\"$2/g;
=)
Cool, got it working with archived rankings, eg: RumbleArchives:RoboRumble 20130324. This checks back hourly when rumbles don't have complete pairings, but that may be forever without priority battles so I'll kill it in a couple days. =)
Only useful thing that I found missing so far is that Darkcanuck's results came back sorted and had a "rank" field. Seems like you have logic for sorting in there so it'd be nice if you could honor the "order" param like you do for the normal pages, but not a big deal (/shamefully hides his bubble sort). The quote thing wasn't a huge deal for me but that might also screw some people up since I imagine most clients use a JSON parser instead of doing it manually.
And @roborumble, yay: [1]
I'll look at RumbleStats and BedMaker tomorrow. Will be nice that other people can actually use BedMaker now. =) If anyone's interested, I had to make one more tweak to my regex to properly quote the &limit=0 format:
$content =~ s/([\{,]\s*)([^:\{,]*):/$1\"$2\":/g; $content =~ s/:([^\[][^,\}\n]*)([,\}]*)/:\"$1\"$2/g;
OK, you've convinced me, I've added the quotes :-p I've also added "rank" to both Rankings and BotDetails, and the sort works too.
I would like a query which returns the full pairing matrix, with scores from all pairings. Number of battles from all pairings would also de nice.
Probably the costliest query anyone could ask.
Unfortunately, that would take more memory than I have available in a frontend, and frontends only give me 10 seconds to respond or the process gets killed. Besides, all I'd be doing in the background is doing a Rankings query to get all N of the bot names, then N x BotDetails queries to get all of the pairwise data, so it's nothing that you wouldn't be able to do just as effectively with the tools you already have.
If you do something like this, I'd ask that you put a half-second delay between all of the BotDetails queries just to leave spare capacity for client uploading.
But I agree, it would be quite interesting to see what trends etc could be found in the data.
It would be used mostly to try different ranking systems over the scores, and to build custom priority battles systems.
For building batch rankings systems I can understand, but it would take too long to do priority battles, which need to be run much more regularly.
I know this is about as low priority as it gets, but... The always opening a new tab when I select a rumble annoys me. =) I'm pretty conscious of ctrl or shift clicks if I want a new window or tab, so I'd rather just keep control of that myself.
Please switch clients over to 1.8.1.0 to take advantage of priority battles for mini, micro and nano as well as fix the skipped turns issues.
1.7.4.2 will be disabled in the next few days.
I was playing around with the backend and restarted it a few times, which chowed my new (increased) daily quota pretty much instantly. So just hang in there for another hour and a half and it will be back to normal, I promise.
Guys, if anybody has some spare CPU-power lying around, could you point it at the 1v1 and melee rumbles? It seems that I was getting bad stability in the mini/micro/nano rumbles, and I've just fixed that, but we have a bunch of pairings which need to be filled in. I also want to see how it handles a higher load, so I know whether it is worth upgrading to paid. Thanks!
Seems to handle my four clients ok so far, running mostly/all nano battles too.
Edit: Oops, not all nano battles. But they're running pretty fast. :-)
That's from hitting the Read quota. That hasn't happened before, it might have something to do with me clearing the memcache so that I could enable priority battles for mini/micro/nano. The reset is in an hour, let's see what happens ;-)
Are there priority battles happening for the lower weight classes? Even Mini 1v1 mostly doesn't have full pairings. Was it just way behind or is it not working correctly?
The client doesn't accept priority battles from the lower weight classes. I've filed a bug and Fnl has fixed it, so as soon as 1.8.1 is released we'll be switching to that.
I've made the plunge, LiteRumble is now on the paid tier. So, open the taps and let's see what this puppy can do!
Sweet! Let me know if there's somewhere (eg PayPal) I can drop a donation. :-)
Also it's probably time we update a bunch of wiki pages to note the LiteRumble as the main rumble server.
I created a fresh "superpack" pointing at Skilgannon's rumble server: LiteRumble 1.7.4.2 superpack (31.5 MB) ... We can put this somewhere more prominent if we want to make the transition more official.
I fixed the participant list links to darkcanuck.net to point to Rednaxela's archive instead and downloaded most bots for all the rumbles in the above zip. There are still some stragglers with broken links that we should fix on the participants pages. I also set all the configs to ITERATE=NOT and updated the shell scripts to loop, which is my preferred setup. Just change your name at the top of roborumble/*.txt before running.
I don't know how many clients Skilgannon's server can handle - last I heard it was just a few. For now I'm just running 1 client for General 1v1.
Thanks. My client is in my university lab and I need the processing power during the day for the next few months at least, so feel free to run as many as you like. It should also have a more graceful quota-exceeded behaviour than it used to, but we'll actually have to hit that before I can be sure.
If you remove the CPU constant from the robocode.properties file, won't it automatically recalculate it? If so, might be a good idea to remove the CPU contant from the robocode.properties file in the superpack. Otherwise, anyone who runs the superpack without thinking about updating the CPU constant will be running with the CPU constant packaged in the superpack.
Ah, good call. I'm not sure it works that way but I'll test it. I'll also shore up the missing bots.
Alternatively what about just outright removing robocode.properties? That's what I always did when I made superpacks.
First page |
Previous page |
Next page |
Last page |