IRC logs of #shogun for Tuesday, 2012-05-15

--- Log opened Tue May 15 00:00:40 2012
-!- karlnapf [~heiko@host86-174-150-108.range86-174.btcentralplus.com] has joined #shogun00:10
-!- blackburn [~qdrgsm@188.122.250.167] has left #shogun []00:10
-!- karlnapf [~heiko@host86-174-150-108.range86-174.btcentralplus.com] has left #shogun []00:10
-!- ckwidmer [~chris@HSI-KBW-046-005-237-106.hsi8.kabel-badenwuerttemberg.de] has quit [Ping timeout: 272 seconds]00:39
-!- cronor [~cronor@e178176184.adsl.alicedsl.de] has quit [Quit: cronor]01:33
-!- av3ngr [av3ngr@nat/redhat/x-yqokwqfxztgfhxwp] has joined #shogun01:55
--- Log closed Tue May 15 02:05:45 2012
--- Log opened Tue May 15 02:05:51 2012
-!- shogun-toolbox [~shogun@7nn.de] has joined #shogun02:05
-!- Irssi: #shogun: Total of 8 nicks [1 ops, 0 halfops, 0 voices, 7 normal]02:05
-!- Irssi: Join to #shogun was synced in 6 secs02:05
-!- in3xes [~in3xes@106.78.49.114] has quit [Ping timeout: 260 seconds]03:31
-!- in3xes [~in3xes@210.212.58.168] has joined #shogun03:44
-!- in3xes_ [~in3xes@180.149.49.230] has joined #shogun04:00
-!- in3xes [~in3xes@210.212.58.168] has quit [Ping timeout: 265 seconds]04:04
-!- in3xes_ [~in3xes@180.149.49.230] has quit [Quit: Leaving]04:08
-!- Francis_Chan [~Adium@59.108.60.58] has joined #shogun06:27
-!- gsomix_ [~gsomix@83.234.54.38] has joined #shogun07:12
-!- gsomix_ is now known as gsomix08:01
gsomixhi all08:01
sonne|workhey hey08:34
-!- uricamic [~uricamic@2001:718:2:1634:8568:fb14:615c:1667] has joined #shogun08:41
-!- Francis_Chan [~Adium@59.108.60.58] has quit [Quit: Leaving.]08:52
sonne|workgsomix: now master of optics?09:01
gsomixsonne|work, haha. :) in future, maybe09:02
-!- cronor [~cronor@e178176184.adsl.alicedsl.de] has joined #shogun09:18
-!- cronor [~cronor@e178176184.adsl.alicedsl.de] has quit [Quit: cronor]09:24
sonne|workgsomix: so do you have another exam?09:35
sonne|workgsomix: or can you finish the dynarray stuff?09:35
gsomixsonne|work, exams will be in June. I just studied yesterday material for future research.09:39
sonne|workI see09:40
gsomixsonne|work, about dynarray. I need only add some doc's in code.09:41
sonne|workgsomix: so you finished the dynamicobjectarray stuff too?09:41
gsomixsonney2k, yep, yep.09:41
sonne|workgreat!09:41
sonne|workI would rather merge it now and you add the doc during the day or so09:42
gsomixsonne|work, ok, just a sec.09:44
gsomixsonne|work, please, check it.10:01
gsomixneed to go at uni10:28
gsomixcu10:28
-!- gsomix [~gsomix@83.234.54.38] has quit [Quit: Ex-Chat]10:28
-!- n4nd0 [~nando@n173-p203.kthopen.kth.se] has joined #shogun10:47
-!- av3ngr [av3ngr@nat/redhat/x-yqokwqfxztgfhxwp] has quit [Quit: That's all folks!]11:28
-!- uricamic [~uricamic@2001:718:2:1634:8568:fb14:615c:1667] has quit [Quit: Leaving.]12:30
-!- Francis_Chan [~Adium@58.194.224.109] has joined #shogun12:45
-!- n4nd0 [~nando@n173-p203.kthopen.kth.se] has quit [Ping timeout: 256 seconds]12:49
-!- n4nd0 [~nando@n173-p203.kthopen.kth.se] has joined #shogun12:55
sonne|workn4nd0: regarding dotfeatures - so you would derive from dot features and just put the labels inside them and implement new dense_dot etc operations using labels, input features and whatever Phi is wanted - right?13:08
n4nd0sonne|work: hey! sorry I didn't notice the bell rang13:44
n4nd0yes, that's exactly my idea13:44
n4nd0sonne|work: do you think it is ok?13:44
-!- Marty28 [~marty@cable-158-181-77-81.cust.telecolumbus.net] has joined #shogun13:46
sonne|workn4nd0: yes - makes a lot of sense though I would derive 'StructuredDotFeatures' or so first (that have a StructuredLabel) and then from that the other classes13:46
n4nd0sonne|work: all right13:47
n4nd0sonne|work: thank you, by the way, did you have time to take a look to the PR?13:48
sonne|workno not yet13:48
n4nd0ok :)13:49
n4nd0maybe someone can help me to make a decision, I need to select a course for next Fall13:50
n4nd0I was looking into optimization courses13:50
n4nd0and there is this one, Applied Linear Optimization, I don't know if the methods they teach there are interesting in machine learning13:50
n4nd0some of these methods are simplex, interior methods, stochastic programming, Lagrangian relaxation, integer programming, subgradient13:51
n4nd0any idea??13:51
sonne|workyes they are...13:52
n4nd0sonne|work: cool, thank you :)13:54
n4nd0I will take that course then13:54
-!- Marty28 [~marty@cable-158-181-77-81.cust.telecolumbus.net] has quit [Quit: Colloquy for iPad - http://colloquy.mobi]14:00
-!- wiking [~wiking@c-98-231-171-175.hsd1.md.comcast.net] has joined #shogun14:49
-!- wiking [~wiking@c-98-231-171-175.hsd1.md.comcast.net] has quit [Changing host]14:49
-!- wiking [~wiking@huwico/staff/wiking] has joined #shogun14:49
n4nd0hey wiking, how are you?15:07
wikingn4nd0: hey... a bit jet lag :))015:07
n4nd0wiking: oh yeah, I remember something about a conference15:08
n4nd0is that right?15:08
wikingyep15:08
wikingthis week15:08
n4nd0where is it?15:08
wikingin baltimore15:09
n4nd0nice15:09
n4nd0are you presenting something there?15:09
wikingyep15:21
wikingone of my paper15:21
-!- gsomix [~gsomix@83.234.54.38] has joined #shogun15:23
gsomixhey, hey15:23
n4nd0wiking: I wish you luck with it ;)15:24
n4nd0hey gsomix15:24
gsomixI got the first primitive task related to research.15:27
n4nd0wiking: I pushed some SO stuff to the repo, let me know if you have any comment related to your latent features part15:27
n4nd0gsomix: cool! what is it about?15:27
wikingaaah cool15:28
wikingi'll take a look at it now thnx for mentioning15:28
n4nd0wiking: I think we could provide another type of pointer function in StructuredModel for the latent features part15:28
n4nd0wiking: what do you think?15:28
sonne|workn4nd0: ahh btw would it be possible to not use function pointers?15:29
sonne|workbut instead some say CArgMax class or so15:29
gsomixn4nd0, optics. calculation of the optical element that gives a uniformly illuminated circle.15:29
gsomixsonne|work, what about patch?15:30
sonne|workgsomix: did you fix the SG_ADD stuff?15:30
n4nd0sonne|work: mmm we could do it like that but I liked the idea that wiking suggested since in that way the user that wants to use SO wouldn't need to create any class but rather just define some functions15:30
gsomixsonne|work, give me five minutes15:31
sonne|workn4nd0: I don't see the difference...15:32
sonne|workexcept that I don't like function ptrs...15:33
gsomixsonney2k, what about add_vector?15:33
-!- hoijui [~hoijui@141.23.65.251] has joined #shogun15:33
sonne|workgsomix: IIRC that should work too15:34
n4nd0sonne|work: so your plan would be to provide a CArgMax base class and extend it for every different argmax method?15:36
gsomixsonne|work, ok. but add_vector have num_of_elements argument. just another SG_ADD for num?15:37
sonne|workn4nd0: yes like CLossFunction15:37
sonne|workgsomix: errm I don't know by heart15:38
n4nd0sonne|work: ok ... why don't you like function pointers? :)15:38
sonne|workgsomix: if it doesn't work we stick with SG_ADD15:39
sonne|workn4nd0: hard to read15:39
gsomixsonne|work, I see.15:40
gsomixsorry15:40
sonne|workn4nd0: have a look at Lossfunction - it is very easy to understand - have a function ptr somewhere and you need heavy documentation...15:40
-!- hoijui [~hoijui@141.23.65.251] has quit [Quit: Leaving]15:44
sonne|workn4nd0: in addition, some argmax functions are *very* hefty so you want to split them up into several small functions15:44
n4nd0sonne|work: I think you have just saved me some work with the CLossFunction class :)15:45
sonne|workheh15:46
n4nd0I defined a new one for that but it looks like that one is the same we need in SO15:46
wikingsonney2k: the difference is huge15:48
wikingsonney2k: a lot of code duplication for no use15:48
wikingsonney2k: if u take a class inheritance then you already have to take care of ctors, dtors15:49
wikingand of course the actual implementation of the overridden function15:49
wikingand all this because you want a different way to calculate a given function15:50
wikingn4nd0: just checking your commits15:51
sonne|workwiking: but that is not just a small function15:53
wikingwell for me an argmax function in case of latent variable is about 5 lines15:54
wikingand PSI is quite the same15:54
sonne|workit is sth. like viterbi etc15:54
sonne|workso it can be HUGE15:54
wikingand?15:54
wikingi still don't see the point that depending on a size of a function15:55
sonne|workwiking: you will need ~5 helper functions to keep it tractable15:55
wikingthat would justify to wrap the whole thing into a class15:55
sonne|workand these are better suited to be in a class15:55
sonne|workwiking: it is the same rationale why we have CLossFunction as class15:55
wikingn4nd0: commented15:57
n4nd0wiking: thank you15:58
-!- puffin444 [62e3926e@gateway/web/freenode/ip.98.227.146.110] has joined #shogun16:47
-!- puffin444 [62e3926e@gateway/web/freenode/ip.98.227.146.110] has quit [Client Quit]16:51
@sonney2kgsomix, can I merge the request now?16:59
CIA-113shogun: Soeren Sonnenburg master * ra71d99e / (18 files in 6 dirs): Merge pull request #523 from gsomix/Arrays (+6 more commits...) - http://git.io/rgwtvQ17:01
@sonney2kgsomix, merged17:01
@sonney2kgsomix, ahh btw I just realize you did lots of casts like foo = (CPlifBase*)ptr; ... would you please use a white space after the ) ?17:02
@sonney2kthanks17:02
-!- n4nd0 [~nando@n173-p203.kthopen.kth.se] has quit [Quit: leaving]17:03
gsomixsonney2k, ok.17:04
@sonney2kgsomix, please update this patch with these small changes17:05
CIA-113shogun: Soeren Sonnenburg master * rc54f3e6 / (19 files in 3 dirs): Merge pull request #524 from pluskid/multiclass-ecoc (+10 more commits...) - http://git.io/-YN6Cw17:05
@sonney2kgsomix, btw what else did we have in the queue?17:05
@sonney2kI mean on your TODO list?17:06
gsomixsonney2k, save/loads, titled features with CMap and consts for methods in features.17:06
gsomixsonney2k, btw, blackburn have some bloody task for me.17:07
@sonney2kgsomix, ahh load/save... it seems like we need them sometimes17:07
@sonney2kgsomix, ignore him :D17:07
@sonney2kgsomix, so the load/save stuff is on hold until further notice17:07
@sonney2kwe realized that it is nice to be able to load e.g. old svm light ascii files etc17:07
@sonney2kor ascii features etc17:07
@sonney2khowever usually not any other Machine - so removing the functions there was ok17:08
@sonney2kgsomix, what is consts for methods in features?17:08
gsomixsonney2k, just add 'const' keywords.17:08
gsomixfor methods, that should be const.17:09
* sonney2k considers const useless17:09
@sonney2kanyway17:09
@sonney2kfeel free17:09
@sonney2kgsomix, I think after this we should do some bigger task17:09
@sonney2kgsomix, what do you prefer the swig director classes stuff?17:09
@sonney2kor the x-validation typemaps?17:10
@sonney2kall heavy stuff...17:10
gsomixsonney2k, director classes, I think.17:10
@sonney2kI attempted the first one but failed17:10
@sonney2kheh17:10
@sonney2kso in this case I would suggest you17:10
@sonney2k1) write some small example C++ class with just one virtual set/get method for some integer17:11
@sonney2k2) wrap this class with swig to python17:11
@sonney2k3) test if you can get/set stuff from python17:11
@sonney2k4) enable directors17:11
@sonney2k5) overload the C++ set function within python17:12
@sonney2k6) test if it works :)17:12
@sonney2kgsomix, does that make sense to you?17:12
@sonney2kif it works you have to figure out why it crashes when done from shogun....17:12
gsomixsonney2k, yep. I would do it anyway.17:13
@sonney2kgsomix, the x-validation task is probably easier17:14
@sonney2kit would mean to create typemaps for some more complex python objects and to construct some model selection stuff based on this17:15
@sonney2kgsomix, I have to talk to heiko how we want it to look like but it will be some list/dictionaries/tuples to parse no more17:16
@sonney2kgsomix, ahh note I will be away for some time in june so we need sth where you know what to do17:17
@sonney2kgsomix, in worst case you have to start to remove ASSERT() and replace them with meaningful error msgs (SG_ERROR("...")) when you get stuck :)17:18
@sonney2kgsomix, the director stuff is probably most interesting/difficult, the x-validation typemaps most useful for shogun people17:19
gsomixsonney2k, ok. I need some time for planning.17:20
gsomixbecause I have exams in early June.17:20
@sonney2kgot to leave train17:22
@sonney2kcu17:22
-!- Francis_Chan [~Adium@58.194.224.109] has quit [Ping timeout: 272 seconds]17:43
-!- blackburn [~qdrgsm@188.122.250.167] has joined #shogun17:45
-!- sonne|work [~sonnenbu@194.78.35.195] has quit [Ping timeout: 256 seconds]18:03
-!- Netsplit *.net <-> *.split quits: @sonney2k18:07
-!- Netsplit over, joins: @sonney2k18:13
blackburnsonney2k: ignore me?! I declare war :D18:14
-!- sonne|work [~sonnenbu@194.78.35.195] has joined #shogun18:18
-!- blackburn [~qdrgsm@188.122.250.167] has quit [Quit: Leaving.]18:18
-!- blackburn [~blackburn@188.122.250.167] has joined #shogun18:20
-!- wiking [~wiking@huwico/staff/wiking] has quit [Quit: wiking]18:29
-!- wiking [~wiking@c-98-231-171-175.hsd1.md.comcast.net] has joined #shogun18:32
-!- wiking [~wiking@c-98-231-171-175.hsd1.md.comcast.net] has quit [Changing host]18:32
-!- wiking [~wiking@huwico/staff/wiking] has joined #shogun18:32
shogun-buildbotbuild #540 of python_modular is complete: Failure [failed test_1]  Build details are at http://www.shogun-toolbox.org/buildbot/builders/python_modular/builds/540  blamelist: gsomix@gmail.com18:39
gsomixshogun-buildbot, bebebe.18:40
-!- blackburn [~blackburn@188.122.250.167] has quit [Quit: Leaving.]18:43
-!- blackburn [~blackburn@188.122.250.167] has joined #shogun18:44
-!- blackburn [~blackburn@188.122.250.167] has quit [Quit: Leaving.]19:27
-!- blackburn [~blackburn@188.122.250.167] has joined #shogun19:29
-!- n4nd0 [~nando@s83-179-44-135.cust.tele2.se] has joined #shogun19:48
shogun-buildbotbuild #541 of python_modular is complete: Success [build successful]  Build details are at http://www.shogun-toolbox.org/buildbot/builders/python_modular/builds/54119:58
-!- puffin444 [62e3926e@gateway/web/freenode/ip.98.227.146.110] has joined #shogun20:00
puffin444Hey20:00
blackburnhey20:05
blackburnpuffin444: how is it going?20:05
puffin444It's going well so far. I hope to make a presentation about my project next Wednesday.20:05
n4nd0puffin444: the diagrams in your mail look nice by the way ;)20:06
puffin444Thanks! I hope the design makes sense.20:06
puffin444blackburn, do you have any advice on presenting shogun?20:07
blackburnin general?20:07
n4nd0puffin444: have you seen some of the videolectures of shogun?20:08
n4nd0they could be a source of inspiration20:08
puffin444blackburn: Yes. I seem to recall that you once made a similar presentation, yes?20:09
puffin444n4ndo: Sure. Where are these videolectures?20:09
blackburnno I didn't :)20:09
puffin444blackburn: Maybe it was sonney2k then.20:09
blackburnyes probably20:09
n4nd0puffin444: there is one here by master S?ren http://videolectures.net/icml2010_sonnenburg_shog/20:10
n4nd0I think there are other videos as well in videolectures.net20:11
blackburnI have some suggestions though20:11
puffin444n4ndo: Thanks, this looks helpful20:11
n4nd0puffin444: and there are some other links at shogun's homepage, just look for videolecture20:11
n4nd0puffin444: no problem, just take into account that some of the things there may be a bit outdated20:12
n4nd0blackburn: right ^?20:12
puffin444What are your suggestions?20:13
blackburnn4nd0: yes can be outdate20:14
blackburnd20:14
blackburnpuffin444: stress that we have a lot of interfaces and we still tend to be largescale20:14
puffin444blackburn: Will do.20:15
blackburnyou can also claim it is used not only for bioinf20:15
blackburnI use it for kind of computer vision task (traffic sign recognition)20:15
puffin444I still don't have a time length for the presentation though. They call them "lightning talks", so I suspect they are short.20:15
puffin444Absolutely. I will mention examples of applications.20:16
blackburnit is important because for a while shogun was really biased to bioinf20:16
blackburnbut for now we have no active bioinformatician developers20:17
puffin444I'll try to come up with a rough collection of slides in the next few days or so and put them on the mailing list for review.20:18
blackburncool20:18
blackburnanother idea could be to describe how cool shogun will be after this gsoc :)20:19
puffin444I'll definitely emphasize that :)20:19
blackburnpuffin444: I can clarify what are our tasks about if you need it20:19
-!- gsomix [~gsomix@83.234.54.38] has quit [Ping timeout: 248 seconds]20:20
puffin444I am also unsure about my audience. I don't know how much they know about Statistics/Machine Learning vs. Computer Programming.20:20
blackburnI would rather assume they are totally lame in ML20:21
puffin444Frankly the host hasn't given me much information yet, so it looks like I'll have to pry it out of him :)20:21
puffin444Oh and I have a question about the ModelSelection framework20:24
blackburnso what is the question? ;)20:26
puffin444For hyperparameter learning I'm trying to minimize a log negative marginal likelihood function20:26
puffin444But it appears that modelselection uses a crossvalidation class to optimize quantites such as accuracy, precision, etc.20:26
puffin444My fear is that right now it would not make sense to use the ModelSelection framework for hyperparameter learning. Should I modify the framework to incorporate more general evalution?20:27
blackburnpuffin444: so you need no xval here?20:29
puffin444I do not believe so. I am not sure it makes sense to use cross validation to minimize the lnml function.20:29
puffin444I'll see what Oliver says about too.20:30
blackburnpuffin444: it looks like you can implement your own modelselection interface based class w/o using crossvalidation20:31
puffin444Are you suggesting a separate interface for use only with GPs?20:32
blackburnpuffin444: no I mean all you need is to implement a class with your own select_model()20:33
blackburnunder this ModelSelection interface20:33
blackburnwouldn't it work?20:34
puffin444Yes. I'll take a look at doing that.20:34
-!- gsomix [~gsomix@188.168.2.22] has joined #shogun20:34
blackburnit could be a little confusing that we have null crossvalidation here but I think it is ok20:35
puffin444I'll try to update the diagrams then with an addtional modelselection interface.20:37
-!- blackburn [~blackburn@188.122.250.167] has quit [Quit: Leaving.]20:43
-!- n4nd0 [~nando@s83-179-44-135.cust.tele2.se] has quit [Ping timeout: 252 seconds]20:54
-!- puffin444 [62e3926e@gateway/web/freenode/ip.98.227.146.110] has left #shogun []21:03
-!- shogun-buildbot [~shogun-bu@7nn.de] has quit [Quit: buildmaster reconfigured: bot disconnecting]21:20
-!- shogun-buildbot [~shogun-bu@7nn.de] has joined #shogun21:20
CIA-113shogun: Soeren Sonnenburg master * rc47b63e / src/shogun/lib/SGReferencedData.h : unconditionally use refcounting for SGVector/Matrix - http://git.io/fCQLhw21:34
-!- Marty28 [~marty@cable-158-181-77-81.cust.telecolumbus.net] has joined #shogun21:42
CIA-113shogun: Evgeniy Andreev master * rd7c7e59 / (4 files in 3 dirs): fixed codestyle and doc's - http://git.io/__1EXQ21:42
CIA-113shogun: Soeren Sonnenburg master * r2730c73 / (4 files in 3 dirs): Merge pull request #528 from gsomix/Arrays - http://git.io/9sY37w21:42
-!- n4nd0 [~nando@s83-179-44-135.cust.tele2.se] has joined #shogun21:49
@sonney2kn4nd0, it is just confusing to have these unrelated fixes in the patch... you could change them back and use git commit --amend22:00
@sonney2kand prepare a separate patch22:00
n4nd0sonney2k: ok I will take a look into how to do this now22:01
@sonney2kn4nd0, btw I hope you get more feedback22:01
n4nd0sonney2k: thank you very much for asking the others about it :)22:01
n4nd0sonney2k: about the function pointers thing, after the discussion with wiking, are you sure that you want the argmax following the strategy used in CLoss?22:02
-!- Marty28 [~marty@cable-158-181-77-81.cust.telecolumbus.net] has quit [Quit: Colloquy for iPad - http://colloquy.mobi]22:02
@sonney2kn4nd0, yes22:03
@sonney2klook at structure/DynProg.{cpp,h} for an argmax for segmentations22:03
@sonney2kit is ~2.5kLoC22:04
n4nd0a lot22:04
n4nd0it looks reasonable to have classes for that yeah, fut I king of liked the other idea too22:04
n4nd0look comfortable22:04
n4nd0it looks*22:04
n4nd0sonney2k: so I guess that for the delta loss the same, no function pointers22:05
n4nd0I will ask Nico about that tomorrow, but I think that there is no need for StructuredLoss, I understand that its functionality is the same of the CLoss you pointed out before for me22:06
@sonney2kn4nd0, yeah nico is not so familiar with shogun internals22:07
@sonney2k...though an SO expert22:07
n4nd0he's helping me a lot with his indications22:10
n4nd0I make backups of the IRC conversations just in case :D22:11
@sonney2kn4nd0, too bad that you are not discussing here on the channel...22:18
@sonney2kyou really should...22:18
n4nd0sonney2k: I thought of it but wouldn't that be a little like spamming the chat? I mean we would take over control of it for a while22:19
n4nd0but for me it is ok to do it ...22:19
@sonney2kn4nd0, no it is what this channel is for22:20
n4nd0all right22:20
@sonney2kI also only discuss things with gsomix in public here...22:20
@sonney2kso all my screwups are documented :D22:21
@sonney2kso I highly prefer many people to screw up here such that I can hide mine in the mass of others :)22:23
* gsomix woke up.22:24
gsomixsonney2k, I prefer a director classes as next task.22:24
n4nd0sonney2k: I like your strategy to hide screw ups :P22:26
@sonney2kgsomix, all right then director classes it is22:26
@sonney2kgsomix, just make sure you have some result within the next week - otherwise I won't be able to help if this all fails...22:27
@sonney2kthat means attempted 1-6)22:27
@sonney2kn4nd0, that is why no one wanted to post on mloss.org initially :D22:27
gsomixsonney2k, >> that means attempted 1-6) | could not parse. what do you mean?22:31
gsomixgood night guys22:38
@sonney2kgsomix, the plan I outlined above22:39
n4nd0good night gsomix22:39
@sonney2k<sonney2k> 1) write some small example C++ class with just one virtual set/get method for some integer22:39
@sonney2k<sonney2k> 2) wrap this class with swig to python22:39
@sonney2k<sonney2k> 3) test if you can get/set stuff from python22:39
@sonney2k<sonney2k> 4) enable directors22:39
@sonney2k<sonney2k> 5) overload the C++ set function within python22:39
@sonney2k<sonney2k> 6) test if it works :)22:39
gsomixsonney2k, aaa, I see... z-z-z22:40
* sonney2k ZZZZZzzzzzz...22:44
-!- n4nd0 [~nando@s83-179-44-135.cust.tele2.se] has left #shogun []23:33
--- Log closed Wed May 16 00:00:40 2012

Generated by irclog2html.py 2.10.0 by Marius Gedminas - find it at mg.pov.lt!