IRC logs of #shogun for Friday, 2018-05-11

--- Log opened Fri May 11 00:00:01 2018
-!- travis-ci [~travis-ci@ec2-54-224-238-97.compute-1.amazonaws.com] has joined #shogun00:40
travis-ciit's Shubham Shukla's turn to pay the next round of drinks for the massacre he caused in shubham808/shogun: https://travis-ci.org/shubham808/shogun/builds/37744844600:40
-!- travis-ci [~travis-ci@ec2-54-224-238-97.compute-1.amazonaws.com] has left #shogun []00:40
-!- travis-ci [~travis-ci@ec2-54-224-238-97.compute-1.amazonaws.com] has joined #shogun00:46
travis-ciit's Shubham Shukla's turn to pay the next round of drinks for the massacre he caused in shubham808/shogun: https://travis-ci.org/shubham808/shogun/builds/37744844600:46
-!- travis-ci [~travis-ci@ec2-54-224-238-97.compute-1.amazonaws.com] has left #shogun []00:46
-!- HeikoS [~heiko@host81-153-166-104.range81-153.btcentralplus.com] has joined #shogun01:24
-!- mode/#shogun [+o HeikoS] by ChanServ01:24
-!- HeikoS [~heiko@host81-153-166-104.range81-153.btcentralplus.com] has quit [Client Quit]01:24
-!- Chris____ [8602a493@gateway/web/freenode/ip.134.2.164.147] has quit [Ping timeout: 260 seconds]07:47
-!- Chris___ [8602b65f@gateway/web/freenode/ip.134.2.182.95] has joined #shogun08:13
-!- shubham808 [dfb0b96c@gateway/web/freenode/ip.223.176.185.108] has joined #shogun08:44
-!- shubham808 [dfb0b96c@gateway/web/freenode/ip.223.176.185.108] has quit [Ping timeout: 260 seconds]09:21
-!- shubham808 [dfb0b96c@gateway/web/freenode/ip.223.176.185.108] has joined #shogun10:36
-!- shubham808 [dfb0b96c@gateway/web/freenode/ip.223.176.185.108] has quit [Ping timeout: 260 seconds]10:41
Chris___Hi wiking, are you there?10:48
@wikingyoyo10:48
@wikingyes yes10:48
@wikinghere10:48
@wikingshoot10:48
sukey1[https://github.com/shogun-toolbox/shogun] New branch feature/transformers created10:50
@wikingwuwei, i've created ^ this for you10:50
@wikingany preprocessor&converter changes should go into that branch10:50
Chris___I'm using nested cross validation (the inner one is done using CrossValidation), the outer one is done by hand since I don't know how to it with the CrossValidation function as well10:51
@wikingoh10:52
Chris___the problem is when I'm plotting the ROC values of the CrossValidation function using ParameterObserver I get a nice and smooth ROC curve10:52
Chris___when I fetch the values from the outer CV (without CrossValidation and ParameterObserver) it's not "smooth"10:52
@wikingmmm10:53
@wikingso when you do the outer CV10:53
@wikingwhat exactly do you do10:53
@wikingyou yourself do the splitting10:53
@wikingand then train/test?10:53
Chris___yes I split it, use the test set for the inner CV and hyperparameter selection10:54
Chris___the best parameters are then used to evaluate the outer test set10:54
@wikingmmm i'm not so sure if i get exactly why do you do this :)10:55
Chris___so in my case this is done 5 times, for each evaluation on the test set I save the roc values and compute the mean which is then used for plotting10:55
@wikingi mean i dont get why there's this double cv going on? :)10:57
@wikingor it's not a double cv10:57
@wikingyou just simply do once 'manually' your CV10:58
@wikingand once with shogun's cv?10:58
Chris___it's a nested CV10:58
Chris___5-fold outer CV on the whole dataset, 5-fold inner CV on the respective training set for hyperparameter optimization10:59
@wikingok i'm not sure if i get what this brings on your table :)10:59
@wikingi mean nestedness :)10:59
@wikingah i see11:00
@wikinghttp://jmlr.csail.mit.edu/papers/volume11/cawley10a/cawley10a.pdf11:00
@wiking?11:00
Chris___I didn't know this paper but I guess they argue why you should use nested CV?! :)11:03
@wiking:>11:13
@wikingyep11:13
@wikingit's about that11:13
-!- shubham808 [dfb0bfb4@gateway/web/freenode/ip.223.176.191.180] has joined #shogun11:15
Chris___so when I use the CrossValidation function with ParameterObserver I iterate over all folds for each observation and get the ROC values for each fold, when I plot this it generates a nice curve11:15
Chris___but somehow this is not possible when I just evaluate each fold "manually" and plot the corresponding ROC values11:16
-!- HeikoS [~heiko@host86-146-49-221.range86-146.btcentralplus.com] has joined #shogun11:34
-!- mode/#shogun [+o HeikoS] by ChanServ11:34
-!- travis-ci [~travis-ci@ec2-54-160-138-195.compute-1.amazonaws.com] has joined #shogun11:40
travis-ciit's Heiko Strathmann's turn to pay the next round of drinks for the massacre he caused in shogun-toolbox/shogun: https://travis-ci.org/shogun-toolbox/shogun/builds/37763719211:40
-!- travis-ci [~travis-ci@ec2-54-160-138-195.compute-1.amazonaws.com] has left #shogun []11:40
-!- travis-ci [~travis-ci@ec2-184-73-70-8.compute-1.amazonaws.com] has joined #shogun11:51
travis-ciit's Heiko Strathmann's turn to pay the next round of drinks for the massacre he caused in shogun-toolbox/shogun: https://travis-ci.org/shogun-toolbox/shogun/builds/37763719211:51
-!- travis-ci [~travis-ci@ec2-184-73-70-8.compute-1.amazonaws.com] has left #shogun []11:51
-!- shubham808 [dfb0bfb4@gateway/web/freenode/ip.223.176.191.180] has quit [Ping timeout: 260 seconds]11:52
-!- shubham808 [dfb0bfb4@gateway/web/freenode/ip.223.176.191.180] has joined #shogun11:55
-!- shubham808 [dfb0bfb4@gateway/web/freenode/ip.223.176.191.180] has quit [Ping timeout: 260 seconds]12:25
sukey1[https://github.com/shogun-toolbox/shogun] Pull Request https://github.com/shogun-toolbox/shogun/pull/4280 synchronized by shubham80812:57
sukey1[https://github.com/shogun-toolbox/shogun] Pull Request https://github.com/shogun-toolbox/shogun/pull/4280 synchronized by shubham80813:00
-!- shubham808 [dfb0bfb4@gateway/web/freenode/ip.223.176.191.180] has joined #shogun13:04
-!- iglesiasg [6cab80bd@gateway/web/freenode/ip.108.171.128.189] has joined #shogun13:05
-!- HeikoS [~heiko@host86-146-49-221.range86-146.btcentralplus.com] has quit [Ping timeout: 240 seconds]13:11
-!- HeikoS [~heiko@host86-146-49-221.range86-146.btcentralplus.com] has joined #shogun13:11
-!- mode/#shogun [+o HeikoS] by ChanServ13:11
iglesiasgHeikoS: hallo13:13
@HeikoSlala13:13
iglesiasgis there a way to see timeline of the updates to any wiki page?13:13
iglesiasgif for example I would like to see if any new page has been added or if there was a recent update to any page13:14
-!- shubham808 [dfb0bfb4@gateway/web/freenode/ip.223.176.191.180] has quit [Ping timeout: 260 seconds]13:30
@HeikoSiglesiasg: yes13:32
@HeikoSthere is13:32
@HeikoSbut only per page I think13:32
@HeikoSotherwise dont know13:33
@HeikoSbut would be good to have actually13:33
-!- travis-ci [~travis-ci@ec2-184-73-70-8.compute-1.amazonaws.com] has joined #shogun13:48
travis-ciit's Shubham Shukla's turn to pay the next round of drinks for the massacre he caused in shubham808/shogun: https://travis-ci.org/shubham808/shogun/builds/37767902613:48
-!- travis-ci [~travis-ci@ec2-184-73-70-8.compute-1.amazonaws.com] has left #shogun []13:48
-!- shubham808 [6adb02b3@gateway/web/freenode/ip.106.219.2.179] has joined #shogun13:59
-!- shubham808 [6adb02b3@gateway/web/freenode/ip.106.219.2.179] has quit [Ping timeout: 260 seconds]14:08
-!- travis-ci [~travis-ci@ec2-54-160-138-195.compute-1.amazonaws.com] has joined #shogun14:13
travis-ciit's Shubham Shukla's turn to pay the next round of drinks for the massacre he caused in shubham808/shogun: https://travis-ci.org/shubham808/shogun/builds/37767985614:13
-!- travis-ci [~travis-ci@ec2-54-160-138-195.compute-1.amazonaws.com] has left #shogun []14:13
-!- HeikoS [~heiko@host86-146-49-221.range86-146.btcentralplus.com] has quit [Ping timeout: 268 seconds]14:16
iglesiasgyeah per page of course, it's quite visible14:19
-!- iglesiasg [6cab80bd@gateway/web/freenode/ip.108.171.128.189] has quit [Quit: Page closed]14:20
-!- travis-ci [~travis-ci@ec2-54-160-138-195.compute-1.amazonaws.com] has joined #shogun14:53
travis-ciit's Shubham Shukla's turn to pay the next round of drinks for the massacre he caused in shubham808/shogun: https://travis-ci.org/shubham808/shogun/builds/37767985614:53
-!- travis-ci [~travis-ci@ec2-54-160-138-195.compute-1.amazonaws.com] has left #shogun []14:53
-!- shogun-buildbot [~shogun-bu@7nn.de] has quit [Remote host closed the connection]15:21
-!- shogun-buildbot [~shogun-bu@7nn.de] has joined #shogun15:21
@wikingshogun-buildbot: force build --branch=develop 'bionic - libshogun'15:21
-!- shubham808 [dfbda541@gateway/web/freenode/ip.223.189.165.65] has joined #shogun16:26
-!- Chris___ [8602b65f@gateway/web/freenode/ip.134.2.182.95] has quit [Ping timeout: 260 seconds]16:52
-!- HeikoS [~heiko@untrust-out.swc.ucl.ac.uk] has joined #shogun16:55
-!- mode/#shogun [+o HeikoS] by ChanServ16:55
sukey1[https://github.com/shogun-toolbox/shogun] Pull Request https://github.com/shogun-toolbox/shogun/pull/4280 merged by karlnapf17:18
sukey1[https://github.com/shogun-toolbox/shogun] New commit https://github.com/shogun-toolbox/shogun/commit/986f97ee9d25898b8a3f75fa9976cc55305b4fdc by karlnapf17:18
@wikingHeikoS, why did you merge it?17:18
@wikingHeikoS, it would have been good to have geektoni's comments fixed17:19
@wikingas not all of them were actually fixed17:19
@HeikoSwhich one is not?17:20
@wikingthe ones that are not shown17:20
@wikingoutdated17:20
@HeikoSI think they are all addressed17:22
@wikingmmm then i guess there's a bug in github?17:22
@HeikoSwiking: btw17:22
@wikingas those comments should be hidden17:22
@HeikoSwe ran into a design question17:22
@HeikoSabout constness and some17:22
@wikingin what context?17:22
@HeikoSturning const pointers into some17:23
@HeikoSlike shared_ptr<const bla*>17:23
@HeikoSlisitsyn argued that this generates too many types17:23
@HeikoSand suggested to move the const for objects into runtime17:23
@HeikoSi.e. a flag in some17:23
@wikingmiju17:24
@wikingi mean this is a bit like17:24
@wiking"lets not use compiler :)17:24
@wikingbecause we want interpeter17:24
@wiking:)17:24
@HeikoSindeed17:24
@HeikoSI know you wont like it17:24
@wikingi.e. i wouldn't throw out compiler features17:24
@HeikoSbut the type thing is true as well17:24
@wikingi mean when there's a const17:24
@HeikoSit is a general problem of shared ptr concept17:25
@wikingcompiler can do you many tricks17:25
@wikingwhen optimizing the codew17:25
@wikingnow if you hide this17:25
@wikingthen you are a bit playing against yourself17:25
@HeikoSlisitsyn said that one doesnt really see shared_ptr<const X*> in code17:25
@HeikoSbut I cannot judge this17:25
@HeikoSyeah I agree with you17:25
@wikingwhen are you passsing though17:25
@HeikoSbut the other solution is also shitty17:25
@wikingto shared_ptr a const?17:25
lisitsynhey17:25
@wiking*to17:25
@HeikoSlisitsyn: ah there we are17:26
@wikingHeikoS, what i mean is some is about swig17:26
@wikingyou can use shared_ptr internally17:26
@HeikoSwiking: shared_ptr has the same problem17:26
@wikingand there constness is sovled17:26
@wikingor?17:26
@wikingyou cannot pass a const A* to std::shared_ptR?17:26
@wikingor what?17:27
lisitsynI am not sure compiler things are that related to swig17:27
@wikingno they are not17:28
lisitsynI mean you can't optimize much when you pass around with Pysomething17:28
@wikingbut i mean17:28
@wikingif you start using Some<A> and have a flag17:28
@wikingfor constness17:28
@wikingthen the problem is that where do you have the clear cut?17:28
@wikingmeaning that somebody doesn't start to use within the lib17:28
@wikingthe same concept17:28
@wiking:(17:28
@wikingHeikoS, what's with shared_ptr and const A*?17:29
lisitsynyeah this concept is a bit tricky17:29
@wikingi'm not so sure if i udnerstand there the problem17:29
lisitsynbut I think we either don't use consts17:29
lisitsynor we trick it somehow because otherwise we get combinations17:29
lisitsynlike const vs non-const etc17:29
@HeikoSso I ran into this when converting labels, a few places in shogun have const pointers for labels, so then there suddenly have to be two methods for that17:31
@HeikoSdoable, but as lisitsyn says, there is a combinatorial expansion in type combinations17:32
lisitsynyeah I am afraid we'd have to double everything17:32
@wikingHeikoS, code?17:34
@wikingbecause i still dot really get the problem with shared_ptr17:34
lisitsynshared_ptr<T> and shared_ptr<const T> are two different types17:34
lisitsynthat's the problem we have17:34
@wikingyeah but you would have that problem anyways17:35
lisitsynno if you don't use const :D17:35
@wikingyeah17:35
@wiking:)17:35
@wikingbut i mean it's not coming from shared_ptr per se17:35
@wiking:)17:35
lisitsynfrom pointers also17:36
lisitsynit's just the same thing if you use pointers17:36
@wikingbut i mean you can create a generator for this in the worst case no?17:37
@wikingit's shitty17:37
lisitsynwhat's generator?17:37
@wikingi mean that you have a geneator macro17:37
@wikingthat creates both declaration17:37
@wikingconst-ed and non-const17:38
lisitsynbut if they are just the same17:38
lisitsynwhat's the point of using const then17:38
@wikingyeah dunno17:40
@wikingi feel that this is shitty :)17:40
@wikingno matter how you touch it17:40
@HeikoSI am currently blocked because some of shogun's code uses const poitners for labels and features (as it should!) but I cannot do the dynamic checking what type of labels it is without copy-pasting the method17:42
@HeikoSright now, most of shogun doesnt use const at all17:43
@HeikoSfor objects that is17:43
@HeikoSonly few more recent additions do that17:43
@HeikoSthats why the problem only appeared now17:43
@wikingmmm17:44
@wikingi guess this is a dispatch story?17:44
@wikingor?17:45
@wikinghence my question whether you can point me to a code17:45
@wikingor not17:45
@HeikoSit came up in the dispatching for labels yes17:45
@HeikoSe.g. binary_labels17:45
@HeikoSin CBinaryLabels.h17:45
@wikingyeah this is the same story17:45
@wikingof what i've mentioned previously17:46
@wikingthat actually these type of dispatchers17:46
@HeikoScalled from a method where I have a const pointer17:46
@HeikoSthis is internal code btw, not swig17:46
@wikingyeah17:50
@wikingbut then you can do17:50
@wikingbinary_label(THE CORRECT TYPE a)17:50
@wikingright?17:50
@wikingand then then compiler will choose the right thing for you17:50
@wikingwouldnt it?17:50
@wikingswig then of course would autogen the dispatcher17:50
@wikingas usual17:50
@HeikoSswig doesnt see this17:50
@wikingthen even better :L)17:50
@HeikoSI could have one17:50
@HeikoSSome<const BinaryLabels> binary_labels(const Labels*)17:50
@HeikoSand one17:50
@HeikoSSome<CBinaryLabels> binary_labels(CLabels*)17:50
@HeikoSyes17:50
@wikingbut17:50
@wikingi wonder why some?17:50
@wiking:)17:50
@wikingif it's internal17:50
@wikingi mean this is not crucial question of course17:50
@wikingbut if you never wanna expose this to swig then you dont have to use some...17:50
@HeikoSdont we want to switch to some auto-ref counting internally as well?17:50
@HeikoSbut that aside, you are right, no need to use Some17:50
@wikinganyhow17:50
@wikingthat doesn't matter17:50
lisitsynraw pointers? why? :)17:50
@wikingdo we and can we ever switch to some in swig interface?17:51
@HeikoSthought that was the plan?17:51
lisitsynsure17:51
@wikingas soon as we drop the ctors that use args17:51
@wikingright?17:51
lisitsynyes17:51
@wikingnmm17:52
@wikingthere goes kwargs17:52
@wiking:)17:52
@HeikoSonly cpp17:53
@wikingbtw HeikoS17:53
@wikingshouldn't it go17:53
@wikingSome<const BinaryLabels> binary_labels(Some<const Labels*>)17:53
@wiking?17:53
@wiking?17:53
@wikingjust for the sake of correctness?17:53
@HeikoSyes17:53
@wikingso that's already 417:53
@wikingright?17:53
@wikingmeaning for each factory like this17:53
@wikingif u wanna do const then you wanna do 4 of them17:54
@wiking:)17:54
@HeikoSyes17:54
@wiking:>17:54
@wikingthis is shity :)17:54
@wikingjust saying17:54
@wiking:>17:54
@wikingno personal whatever just sayign that again17:54
@wikingthis is way too much of blabla code17:54
@HeikoSit was the reason why the flag came up17:54
@HeikoSbecause of all those methods17:55
@wikingok so one question then17:55
@wikingsay that we coudl autofix it17:55
-!- shubham808 [dfbda541@gateway/web/freenode/ip.223.189.165.65] has quit [Ping timeout: 260 seconds]17:55
@wikingbut having everywhere SGO* wrapped with Some17:55
@wikingshould be doable?17:55
@wikingi mean say that somebody magically does it17:55
@wikingand we dont pass ever again17:55
@wikingSGO*17:55
@wikinganywhere17:56
@HeikoSI think there might be more issues17:56
@HeikoSsubclassing17:56
@wikinglike?17:56
@wikingcould you elaborate?17:56
@HeikoSSome<const BinaryLabels> binary_labels(Some<const Labels*>)17:56
@HeikoSyou cannot pass binary labels to this thing17:56
@HeikoSyou have to cast it17:56
@HeikoSand this problem will appear in more places17:57
@HeikoS(i think)17:57
@HeikoSotherwise (re your question), i dont know17:57
@HeikoShard to tell17:57
@HeikoSbut this one I see17:57
@HeikoS(and encountered when playing around with this)17:57
@wikingmmm17:58
@wikingi mean first of all17:58
@wikingwhy would you pass Some<BinaryLabels> every to binary_labels?17:58
@HeikoSjust an example17:58
@wikingbut no17:58
@HeikoSmaybe it is MulticlassLabels17:58
@wikingwhy would you do it? :)17:58
@HeikoSyou wouldnt17:58
@wikingbut you never pass17:59
@wikingMulticlassLabels17:59
@HeikoSin this case, you are right, you dont17:59
@wikingas MulticlassLabels to binary_labels17:59
@wikingright?17:59
@HeikoSbecause all you have is the base class pointer17:59
@wikingyou always have CLables17:59
@HeikoSin CMachine17:59
@HeikoSyes17:59
@HeikoSfor this one17:59
@wikingso17:59
@HeikoSthat is not an issue17:59
@wikingok so say that this is then not an issue17:59
@HeikoSit might be somewhere else though17:59
@wikingas we really just work with base calsses17:59
@HeikoSok sure17:59
@wikingi mean if you use base classes17:59
@wikingwrapping some/shared_ptr18:00
@wikingshouldn't be an issue18:00
@HeikoSyep18:00
@wikingi'm just wondering that say we drop18:00
@wikingSome18:00
@wikingi mean drop *18:00
@wikingand use only Some18:00
@wikingwould that mean that we only have to deal with Some<T> and Some<const T>18:00
@HeikoSthink so18:01
@wikingi.e. we are back to 218:01
@wikingi mean if we want const correctness18:02
@wikingi guess this is the price you have to pay18:02
@HeikoSyes it is18:02
@HeikoSquestion is: is it worth to pay it? :D18:02
@wikingi mean if it's copy-paste then macro it18:02
@HeikoSmacro is the third option, yes18:03
@wikingand that's it18:03
@HeikoSwith this, I am a bit afraid that this will have to be done for a lot of code18:03
@wikingthe question is whether we need or want18:03
@wikingconst correctness18:03
@wiking:)18:03
@HeikoSfor objects, yes18:03
@HeikoSfor SG* we want it definitely18:04
@wikingif yes18:04
@HeikoSwe have seen that this makes a big difference18:04
@wikingthen that's it18:04
@HeikoSfor objects, idk18:04
@wikingi mean Some only makes sense for SGO18:04
@HeikoSyeah sure18:05
@HeikoSI mean18:05
@wikingi.e.18:05
@wikingtemplate <class T>18:05
@wikingclass Some18:05
@wikingshould have a type-trait18:05
@HeikoSthe question whether we want const correctness only concerns Some18:05
@wikingfor T being SGO derived :)18:05
@HeikoSone big argument for the const correcness that I have seen in shogun is the thread safety18:06
@HeikoSlisitsyn what is your opinion on doing macros for this?18:08
-!- travis-ci [~travis-ci@ec2-54-160-138-195.compute-1.amazonaws.com] has joined #shogun18:08
travis-ciit's Shubham Shukla's turn to pay the next round of drinks for the massacre he caused in shogun-toolbox/shogun: https://travis-ci.org/shogun-toolbox/shogun/builds/37777802618:08
-!- travis-ci [~travis-ci@ec2-54-160-138-195.compute-1.amazonaws.com] has left #shogun []18:08
lisitsynHeikoS: I don't know18:10
lisitsynHeikoS: I see no problem in binary_labels(...) in particular18:10
lisitsynI mean if that's the only case18:11
lisitsynof const T18:11
lisitsynshould be fine18:11
@HeikoSthe ones I see are features and labels18:11
lisitsynyeah if it is just copy-paste thing to be done once18:11
lisitsynit is fine18:11
@HeikoSit gets more tricky if we have methods that accept a label and a feature18:11
lisitsynyeah18:11
lisitsynthat's what I am afraid of18:12
@HeikoSor more18:12
@HeikoSwiking, lisitsyn then what about this approach: we copy/paste/macro it for now, and if there is a situation where the combinations explode, we can discuss again?18:12
@wikingprobably18:12
lisitsynI am fine18:12
@wikingbtw18:12
@wikingwhen you have the new interface18:13
@wikingfit(X, y)18:13
@wikingwhat do you pass there? :)18:13
@wiking(const X, const y) ?18:13
@HeikoShaha18:13
@HeikoSthere is the example18:13
@wikingright?18:13
@HeikoSyes I think both should be const18:13
@wikingi mean i would say const18:13
@HeikoSeventially18:13
lisitsynI wouldn't bring much of constness into swig18:13
@HeikoSyes definitely18:13
@wikingok i mean18:13
@wikingSome<>18:13
lisitsynno target language has notion of const18:13
@wikingindeed18:14
@wikingbut passing18:14
lisitsynso bringing it to user interface is bothersome18:14
@wikingnon-const *18:14
@wikingto const *18:14
@wikingis ok18:14
@wiking:)18:14
lisitsynfor swig Some<Features> and Some<const Features> are completely different18:14
lisitsynhence you would need to cast it all the time18:14
lisitsynthat's why I think we shouldn't bring consts here18:14
@wikingmmm18:15
@HeikoSi think this can be solved with an interface method18:15
@wikingwhat i meant htat in c++ side you want to have those const18:15
@wikingin the fit/train method18:15
@wikingnow how do you interface this to the swig18:15
@wikingthat's a different story18:15
lisitsynyeah and that's why I suggested to lock things runtime18:15
lisitsyn:D18:15
@wiking:>18:15
@wikingmmm18:16
@wikingwe should then have SWIG specific18:16
@wikingSome18:16
@wikingor something18:16
@HeikoSI think that is ok18:16
lisitsynSome is already swig-specific, no? :)18:16
@wikingno18:16
@wikingHeikoS, is using some now18:16
@wikingfor c++ only18:16
@wiking:D18:16
@HeikoSthere is another SWIG interface that accepts the non-const, and then is calls the const version18:16
@HeikoSlisitsyn yes, I am18:16
@HeikoSthis is an internal helper method18:16
@wikingi mean i get you rpoint in the runtime thing but that should only happen18:17
@wikingmaxiumum18:17
@wikingon swig side18:17
@HeikoSwhat sucks about the additional SWIg method is that we will have to do it everytime that a c++ base interface accepts const18:17
@wikingor the swig wrapper18:17
lisitsynyes sure18:17
lisitsynI am talking about swig18:17
lisitsynonce it gets to swig we have troubles18:17
@wikingbut in the c++ side you wanna keep these things18:18
@wikingi.e. do const checking compile time18:18
@wiking;)18:18
@HeikoSlisitsyn what is the data strcuture for internal pointer smart managing then?18:18
lisitsynHeikoS: depends18:18
lisitsynyou can do raw pointers18:18
lisitsynif it is to be scoped inside the function18:19
lisitsynit is fine to do raw ptrs18:19
@HeikoSok18:19
@HeikoSso then18:19
@wikingSomeSwig<>18:19
@wiking:)18:19
@HeikoSmmh lisitsyn but there is a lot of other situations18:20
@HeikoSlike the members18:20
@HeikoSthat we SG_UNREF in the dtor18:20
@HeikoSwhy dont we use shared_ptr internally then?18:20
@HeikoSor whatever18:20
@wikingbecause then18:20
@wikinghow do you mix match18:20
@HeikoSyes18:20
@wikingshared_ptr and some18:20
@wiking:)18:20
@HeikoSand how to mix and match SomeSwig and Some?18:21
@HeikoSOR18:21
@wikingit's fine18:21
@wikingthey use the same ref-counter18:21
@wiking:)18:21
@HeikoSmmh18:21
@wikingshared_ptr and some has totally different ref coutner18:21
@HeikoSyeah I see18:21
@wikingshared_ptr has it's own ref counter18:21
@wikingsome is acting on SGO::RefCounter18:21
@HeikoSok then we can have a SwigSome that has the readlonly flag18:21
@HeikoSand the Some we have18:21
@HeikoSwhere we suck up the double code18:22
@wikingi mean SwigSome18:22
@wikingis just a glueing stuff18:22
@wikingfor swig iface18:22
@HeikoSyes18:22
@HeikoSand then eventually18:22
@wikingit shouldn't appear anywhere in c++ code itself18:22
@HeikoSmethods like18:22
@HeikoSCMachine::train18:22
@HeikoSwe will expose a special SwigSome version of it to Swiug18:22
@wikingyeah but jut define it in .i18:22
@HeikoSand this one will call CMachine::train(Some<const CFeatures>)18:23
@HeikoSyes18:23
@HeikoSexactly18:23
@HeikoSlike for put18:23
@HeikoSso this way18:23
@HeikoSwe have a consistent looking interface18:23
@wikingyou dont wanna contaminate the c++ code with that shit18:23
@HeikoSbut the c++ one is a bit smarter and still type safe18:23
@HeikoSnot so sure whats better there18:23
@HeikoSthis is a lot of code18:23
@wikingyou can add c++ code18:23
@wikingto the swig interface itself18:23
@HeikoSand hacking c++ code that is generated from swig is not really a good workflow18:23
@wikingsee sg_print ...cpp18:24
@HeikoSah yeah18:24
@wikingyou dont have to write the whole thing within .i18:24
@HeikoSwell, still takes ages18:24
@wikingwhat?18:24
@HeikoScompiling ...but this will be better soon anyways18:24
@wikingi mean in that case18:24
@wikingyou dont have to compile18:24
@wikingthe swig iface18:24
@wikingjust that particular .cpp18:24
@wiking:)18:24
@wikingyou can even write tests over that18:25
@HeikoSok cool18:25
@HeikoSyeah I see18:25
@wikingso that you dont require18:25
@wikingcompiling the whole swig iface18:25
@HeikoSget it18:25
@wikingjust write a simple unit test18:25
@HeikoSlisitsyn, so we use Some internally as well18:25
@wikingthat uses those wrappers18:25
@HeikoSe.g. as a member field?18:25
@wikingHeikoS, already happenbing some placess18:25
@HeikoSwiking: you have an example?18:25
@wikingi mean Unique18:25
lisitsynI don't see any point of using two different pointer holders18:26
@HeikoSmember of SGObject18:26
lisitsynyeah Unique is one thing18:26
@HeikoSlisitsyn: explain pls18:26
@wikinglisitsyn, you can derive it from Some :)18:26
lisitsynI am a bit lost18:26
@wikingHeikoS, SGObject::self18:26
lisitsynwhat's the problem we're solving?18:26
lisitsyn:)18:26
@wikingbut that's not some18:26
@wikingbut unique18:26
@wikingbut that's not part of the members18:26
@wikingas that's the members holder itself18:27
@wikinglisitsyn, i mean say we go with the runtime18:27
@HeikoSlisitsyn: the problem of say CMachine::train18:27
@HeikoSand the type of its inputs18:27
@HeikoSshould be Some<const ...> for c++18:27
@HeikoSbut Some<...> for swig18:27
lisitsynHeikoS: yeah but our target is not C++18:27
@wikinglisitsyn, not only :)18:27
lisitsynyeah or rather that18:28
@wikingor you wanna expose Some only on swig18:28
@wikingmeaning that keep the train(raw ptr) sotry?18:28
@wikingin c++18:28
@wikingi mean we wanna get rid of the shitty18:28
@wikingSG_(UN)REF stuff18:28
@wikingin c++18:28
@wikingi.e. -> Some18:28
-!- travis-ci [~travis-ci@ec2-184-73-70-8.compute-1.amazonaws.com] has joined #shogun18:28
travis-ciit's Shubham Shukla's turn to pay the next round of drinks for the massacre he caused in shogun-toolbox/shogun: https://travis-ci.org/shogun-toolbox/shogun/builds/37777802618:28
-!- travis-ci [~travis-ci@ec2-184-73-70-8.compute-1.amazonaws.com] has left #shogun []18:28
@wikingso if we convert all our raw ptrs to Some18:29
@HeikoSthere is two problems. 1. is ^.... and 2 is the one with CMachine::train18:29
lisitsynyeah that's why I think runtime consts is good :D18:29
@wikingnow the problem is that constness in swig18:29
@HeikoSit would solve both18:29
@wikingis foobar18:29
@HeikoSwith a single Some18:29
@HeikoSand no macros18:30
@wikingyeah but you loose18:30
@wikingthe whoel compiler feature18:30
@HeikoSand no additional swig code18:30
@wikingright? :)18:30
@HeikoSyes18:30
@HeikoS:)18:30
@wikingi mean i really dont understand then18:30
@wikingwhy do we use a compiler?18:30
@wikingwe should just write a code in an interpreted language18:30
@wiking:)18:30
@wikingit is a great thing18:30
@HeikoSsure18:30
@wikingto have the compiler figure out things for you18:31
lisitsynnot really18:31
@wikingand you dont need to do those things in runtime18:31
lisitsynI mean we have to live with that we target to some languages18:31
@wikingimo18:31
lisitsynthat don't have consts18:31
@wikingyeah18:31
lisitsynbut in C++ we will still use consts18:31
@wikingbut why does the c++ has to suffer that part?18:31
@wikingi mean i have a feeling18:31
@wikingthat currently everything is being sacrificed over interpretable languages desk18:31
@wikingand we push everything to be runtime18:32
@HeikoSlisitsyn: so I actually think the target lang not having const is easy to fix18:32
@HeikoSvia gluing code, so no casting needed18:32
@wikingi mean swig allows us to do some tricks18:32
@wikingwhen gluing shit together18:32
lisitsynI don't know18:32
@HeikoSi have another q18:33
@HeikoSfoo(const CLabels*)18:33
lisitsynit is not clear yet what's best18:33
@HeikoSI can call that with CLabels* or with const CLabels*18:33
@wikingHeikoS, yep18:33
@HeikoSbut foo(Some<const CLabels*>)18:33
@HeikoSI cannot call with Some<CLabels*>18:34
lisitsynoh that's easy to implement18:34
lisitsynI think this implicit cast can be implemented18:34
@HeikoSif this works, then I dont even need to do macros18:34
@HeikoSas these dispatcher methods for CMachine stuff will never alter the data18:35
lisitsynjust patch it then :P18:35
lisitsynlet me show you where18:35
lisitsynah wait18:35
lisitsynyou want Some<CLabels> -> Some<const CLabels>?18:35
lisitsynok so adding const, right?18:35
@HeikoSyes18:36
lisitsynhttps://github.com/shogun-toolbox/shogun/blob/develop/src/shogun/base/some.h#L2018:36
lisitsynHeikoS: ^ add one more here18:36
@HeikoSso I can offer methods that just read from labels18:36
lisitsynstd::remove_const18:36
lisitsynI mean ctor that takes Some<T without a const>18:36
lisitsynstrange shared_ptr doesn't have this one18:37
lisitsynit seems rather safe to me18:37
@HeikoScan you be a bit more explicit?18:39
lisitsynthere is Some(const Some<T>& other);18:39
lisitsynadd Some(const Some<std::remove_const<T>>& other);18:39
@wikingbtw18:40
lisitsyngood? :)18:40
@wikingwhen you pass const T*18:40
@HeikoSlisitsyn: thx18:41
@wikingto a function18:41
@wikingwhen do you wanna hold a ref to it after finishing the function itself?18:41
lisitsynyolo?18:42
lisitsyndon't get it18:42
@wikingtrain18:42
@wikingfor example18:42
lisitsynah18:42
@wikingdo you really fucking need to Some?18:42
lisitsynyes because this makes things safe18:42
@wikingcound't you just actually pass const Features^18:42
@wiking&18:42
lisitsynraw ptr is only fine if you don't own things18:43
@wikingwhen do you pass things that you own and they are const?18:43
@wikingor you suppose to own but its actually const18:43
lisitsynno, because it won't play good with swig18:43
lisitsynI don't see references and swig play nice together18:44
@wikingyeah but that's a gluing problem18:44
@wikingi'm really just talking now about c++ interface18:44
@wikingfor the sake of argument18:44
lisitsyneven for C++ I think pointers are much more flexible18:44
@wikingthat if you pass a const T*18:45
@wikingthen you really dont need to deal with the ref count18:45
@wikingor shouldn't18:45
@wikingunless you pass the ownership18:45
@wikingbut if you pass ownership then...18:45
@wiking?18:45
lisitsynthen you need refcount ;)18:45
lisitsynoh btw18:46
lisitsynthis is a good note18:46
lisitsynhow Some<const T> is going to work?18:46
lisitsyn:D18:46
@wiking:D18:46
lisitsynit should call ref()18:46
lisitsynwhich is obviously non-const18:46
lisitsynHeikoS: how did it work?18:46
@wikingmutable18:46
@wiking:D18:46
@HeikoSlisitsyn: conflicts18:46
@HeikoSSome(const Some<std::remove_const<T>>& other);18:47
lisitsynHeikoS: ref is not const18:47
@wikinglisitsyn, mutuable RefCount* wouldn't work?18:47
@HeikoSlisitsyn: so?18:47
lisitsynbut that's like playing with a shotgun18:47
lisitsyn:D18:47
@wikingyes18:47
@wikingindeed18:47
@wiking:)18:47
lisitsynHeikoS: how ref() is going to work?18:47
lisitsynin the some18:47
lisitsynSome<const T> should not even work18:48
lisitsyndid it compile?18:48
@wikingi mean this is why better that the ref count is actually out of the SGO :P and is in the wrapper (say Some)18:48
lisitsynyeah but it is here18:48
@wikingyeye18:48
@wikingi mnow18:48
@wiking*know18:48
@wikingjust saying that currently yeah it's foobar18:48
lisitsynHeikoS: Some<const T> should not compile18:48
lisitsyn:D18:48
lisitsynif it did I don't understand how could it18:49
lisitsynoh sorry guys have to go18:49
@wikinglisitsyn, ttyl18:49
@wikingbut i thunk18:49
@wikingatm really Some<const T>18:49
@wikingis really an oximoron18:49
@wikingin a way18:49
@wikingbecause Some allows you shared ownership18:50
@wikingwhere const actually somehow pushing you or telling you that you actually down own this thing18:50
@wikingHeikoS, http://coliru.stacked-crooked.com/a/c2357e9e83f886c718:52
@HeikoSsorry I wasnt paying attention for a while what is this?18:53
@wikingsimple example how in case of shared_ptr<const T> works automagically18:54
@wikingbut yeah lisitsyn had a good point18:54
@wikingwith teh current design18:54
@wikingSome<const SGObject>18:54
@wikingshouldn't even compile18:54
@wikingas it should call ref() on the passed SGO18:55
@wikingthat is modifying a member element of SGO18:55
@wikingwhich shoulnd't be possible18:55
@wikingbecause it's const18:55
@HeikoSah yeah so your example shows it works18:55
@wikingyeah with shared_ptr18:55
@HeikoSand yes I guess ref is non const so it cannot compile18:55
@wikingbut that's a very different story18:55
@wikingas the ref coutner is withing18:55
@HeikoSuh18:55
@wiking*within shared_ptr18:55
@HeikoSso are we back to square one then? :D18:55
@wikingwell18:56
@wikingmoving out the ref counter18:56
@wikingto some18:56
@wikingwould solve the problem18:56
@wiking:DDD18:56
@wikingbut that's gonna be a huge patch btw18:56
@wikingas you need to remove the whole sg_ref story18:56
@wikingetc etc18:56
@HeikoSwhat do you mean with moving out the ref counter?18:56
@wikingmeaning that Some is actually becoming more and more like shared_ptr18:57
@wikingi.e. that the ref counter is in Some18:57
@wikingnot in SGO18:57
@wikingwhich of course makes a lot of sense18:57
@wiking:P18:57
@wikingbecause if you want const SGO18:57
@wikingbut see my comment18:57
@wiking[18:49]  <wiking> because Some allows you shared ownership18:58
@wiking[18:50]  <wiking> where const actually somehow pushing you or telling you that you actually down own this thing18:58
@HeikoSyes18:58
@HeikoSmmh18:58
@wikingthat's why this concept of Some<const T> is contradictory in a way18:58
@HeikoSfoobar18:58
@HeikoSindeed18:58
@HeikoSgna18:58
@wikingand you actually just wanna pass18:58
@wikingconst T* or const T^18:58
@wikingconst T* or const T^18:58
@wikingT&18:58
@wikingi mean T const*18:58
@wikingor const T&18:58
@HeikoSI think I will change this dispatcher methods back to raw pointers for now18:59
@wikingand you sholuld be passing some<T> if you wanna share ownership18:59
@wikingbut now i have to go for 20 mins18:59
@wikingttyl18:59
@wikingi mean bbl18:59
@HeikoSok ill be gone by then probably18:59
-!- iglesiasg [~iglesias@f119189.upc-f.chello.nl] has joined #shogun18:59
@HeikoSsee you18:59
@wikingiglesiasg, hola18:59
@HeikoSiglesiasg: jo!18:59
@HeikoSmissed some good discussions :D18:59
@wikingHeikoS, btw18:59
@wikingi have looked into tf's random18:59
iglesiasgfrom today?18:59
@HeikoSiglesiasg: just literally ended19:00
@wikingthose hax0rs19:00
@wikingsolve the story actually writing their own19:00
iglesiasgwill go to logs :)19:00
@wikingNormalDistrib19:00
@wikingand UniformDistrib19:00
@wiking(in order to circumvent the differences19:00
@wikingbetween libc++ and libstdc++19:00
@HeikoSinteresting19:00
@HeikoSjust like us :)19:00
@wikingthey use the prng of c++1119:00
@wikingsince those are the same19:00
@wikingbut everything else19:01
@wikingah and one more thing :)19:01
@HeikoSand then transform themselves?19:01
@wikingyes19:01
@wikingthose hax0rs19:01
@wikingactually have 1 PRNG19:01
@wikingfor the seed19:01
@wiking:P19:01
@wikingwhich is global19:01
@wiking:D19:01
@HeikoSlol19:01
@HeikoSlol19:01
@wikingso if you run multiple sessions of TF19:01
@wikingyou are acutally19:01
@wikinglalalla19:01
@wikingcrazy man19:01
@wiking:)19:01
@wikingi thought we are shitty19:02
@wiking:DDD19:02
@HeikoSwe are19:02
@HeikoS :D19:02
@wikingbut now i realise that actually we are doing industry standard19:02
@wiking:D19:02
@HeikoSshogun is production code19:02
@wikingyeah i mean19:02
@HeikoSqualityzzzzz19:02
@wikinghonestly19:02
@wikingwehn i saw this one19:02
@wikingi'm like19:02
@wiking"facepalm: this is what we did like 6 years ago"19:02
@wiking:>19:02
@wikinganyhow19:02
@wikingnow i really gotta go19:03
@wikingbe back in 2019:03
@wikingbbl19:03
@HeikoSsee you19:03
@wikinghttps://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/lib/random/random.cc#L3619:03
@wiking\o/19:03
@wikingnote the static19:03
@wiking!19:03
@wikingand the fucking mutex19:03
@wiking:D19:03
@wikinghttps://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/lib/random/random_distributions.h#L40719:04
@wikinghttps://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/lib/random/random_distributions.h#L64619:05
@wiking:)19:05
@wikinglalala19:05
iglesiasgHAHAHA19:05
@wikingwe already have this in shogun19:05
@wiking\o/19:05
iglesiasgoh the capitals19:05
iglesiasgappropriate still though19:05
@wikingand actually i think our uniform dist -> norm dist actually i sfaster19:05
@wiking:P19:05
iglesiasgwent quickly through the logs - why Some<const T> is non-sense?19:05
@wiking(never gonna leave the office)19:06
iglesiasg:)19:06
iglesiasghahaha19:06
iglesiasgwe can take it later too19:06
@wikingbecause that says that hey19:06
@wikingi want to read-only the stuff19:06
@wikingfor the time i'm running this function19:06
@wikingand wanna have ownership over it19:06
@wikingafter the function has finished19:06
@wikingright?19:06
iglesiasgif the pointer is local to the function19:07
@HeikoSwiking: there is a problem with the dispatcher19:07
@wikingso actually you wanna own something that you can only read19:07
@HeikoSwiking: so it takes a const CLabels*19:07
@HeikoSwhat does it return?19:07
@wikingHeikoS, only const )19:07
@HeikoSsay it actually has to convert things19:07
iglesiasgthen after the function finishes it will have gone out of scope so then its "time of ownership" finishes as well19:07
@HeikoSso it needs to create a new instance19:07
@wikingiglesiasg, yeah but then whhy do you have to Some? :)19:07
@wikingi mean if you only pass the reference to it and use it only in function19:08
iglesiasgwiking, because you want to make sure that the underlying memory is not freed19:08
iglesiasgwiking, you want "read-only ownership"19:08
iglesiasgwiking, that makes sense I think, no?19:08
@wikingiglesiasg, what's the scenario19:08
@wikingwhen you actually would be able to do this19:08
@wikingFeatures* f;19:09
iglesiasgwiking, a performance evaluator for instance19:09
@wikingmachine->train(f);19:09
iglesiasgwiking, you get a couple of sets of labels to compare against each other19:09
iglesiasgwiking, so you want to read them but not modify them19:09
@wikingand then i do a delete f19:09
@wikingi mean this only would fuck you up19:09
iglesiasgwhy?19:09
@wikingif say you do the training in a back-thread19:09
iglesiasgI don19:09
iglesiasgoeps19:09
@wikingand do the delete before the thread finishes19:10
@wikingor?19:10
iglesiasgbut why delete?19:10
@wikingi mean how else i'm gonna kill the memory19:10
@wikingbefore the train finishes with f19:10
@wiking:)19:10
iglesiasgwhen the shared ptr goes of scope it decreases the ref count, no?19:10
@wikingbut say that we dont have now19:10
@wikingshared_ptr or some19:10
iglesiasgand frees memory only if none else is holding that19:10
@wikingi mean i'm just trying to see19:10
@wikinghow is it that you pass a const poitner/reference19:11
@wikingand suddenly while running that function19:11
@wikingthe memory would disappear19:11
iglesiasgah ok, I think I understand your concern19:11
@wikingi mean i can now only think of a scenario19:11
@wikingwhere you actually doing a bad coding practice19:11
iglesiasgI think a better way of thinking about this problem is in the way why smart pointers are really useful19:12
@wikingyeah but they are useful19:12
@wikingfor shared ownership19:12
@wikingbut then you actually do19:12
@wikingshared_ptr<T>19:12
@wikingnot a const19:12
iglesiasgand it is when the pattern malloc .... do stuff ... free is not that clear19:12
@wikingbecause you actually wanna do some hacks with T19:12
@wikingmost probably change it19:12
@wikingsome way or another19:12
iglesiasgmmm I see19:13
@wikingif you just read it19:13
@wikingthen i dont see why would you need to wrap it19:13
@wikingwith a shared_ptr19:13
iglesiasgI still read think shared_ptr<const T> is fair enough19:13
@wikingiglesiasg, yeah i. mean i'm not saying tha tyou cannot compile a code like that19:13
@HeikoSiglesiasg: I have a riddle for you19:13
@wikingbut thinking in Bjorn's way19:13
iglesiasgwiking, yeah19:13
iglesiasgwiking, I am saying that it is useful19:13
@wikingyou always wanna pass things the most simple way you can19:13
iglesiasgmmmm no no19:13
@wikingiglesiasg, i'm saying that i dont see the use-case19:13
iglesiasgthe simplest way would be all non-const19:14
@wikingwhere it actually makes sense19:14
iglesiasgbecause that's C++ default :)19:14
iglesiasgbut we know is not good19:14
@wikingiglesiasg, i mena not even sure19:14
@wikingwhether in a ctor of an obj19:14
@wikingwould make sense to pass a shared_ptr<const T>19:15
@wikingwhy wouldn't you just const T^19:15
@wiking&19:15
@wiking?19:15
iglesiasgof course!19:15
iglesiasgthat I understand19:15
iglesiasgand I think it is a very good question19:15
@wikingi mean currently imo19:16
@wikingthe ref coutner story of SGO19:16
iglesiasgbut then there is the case when you have data that you don't use with value semantics like T19:16
@wikingwas actually introduced because of swig19:16
iglesiasgyou always have a *19:16
iglesiasge.g. SGObject19:16
@wikingto be able to have ref() unref()19:16
@wikingand define this19:16
@wiking%feature("ref")   shogun::CSGObject "SG_REF($this);"19:16
@wiking%feature("unref") shogun::CSGObject "SG_UNREF($this);"19:16
@HeikoSthe fact that the refcounter is in the object is so weir19:17
@HeikoSd19:17
@HeikoSiglesiasg: hey maybe you have an idea here19:17
iglesiasgHeikoS, is this same as the riddle?19:17
iglesiasg:D19:17
@HeikoSyes19:17
@wikingHeikoS, that's because of swig19:17
@HeikoS:D19:17
@HeikoSin CMachine::train19:17
@HeikoSwe work with CMachine::labels19:17
@HeikoSright?19:18
iglesiasgok19:18
@HeikoSand since we only have base pointer19:18
@HeikoSwe need to dispatch it19:18
iglesiasgok19:18
@HeikoSwe used to just enforce the right type using dynamic_cast before19:18
@HeikoSbut now we want some automatic thing19:21
iglesiasgit makes sense the dynamic thing yeah19:21
iglesiasgit is casting still of course but good19:21
@HeikoSbut now it would be better to just say19:21
iglesiasgautomatic in what sense?19:21
@HeikoSbinay_labels(m_labels)19:21
@HeikoSCbinaryLabels* binay_labels(m_labels)19:21
@HeikoSif it is possible, it gives you the pointer19:21
@HeikoSif not, it moans19:21
@HeikoSit might convert internally, or just cast19:21
iglesiasgok19:21
iglesiasghow is it automatically?19:21
@HeikoSsay it might convert from [0,1] representation to [-1,+1]19:21
iglesiasgthe subclass type is in the function name, no?19:21
@HeikoSif m_labels was multiclass labels for example19:21
@HeikoSCBinaryLabels* binay_labels(CLabels*)19:21
@HeikoSautomatic in the sense that it checks what is in the argument and then either casts or converts19:21
iglesiasgoh ok19:21
@HeikoSiglesiasg: so far so good19:21
@HeikoSwe have that actually19:21
iglesiasgso this about the multiclass labels to binary case?19:21
@HeikoShttps://github.com/shogun-toolbox/shogun/blob/develop/src/shogun/labels/BinaryLabels.cpp#L16119:21
@HeikoSand here is an example where it converts19:22
@HeikoShttps://github.com/shogun-toolbox/shogun/blob/develop/src/shogun/labels/MulticlassLabels.cpp#L22619:22
@HeikoShttps://github.com/shogun-toolbox/shogun/blob/develop/src/shogun/labels/MulticlassLabels.cpp#L19619:22
iglesiasgok19:23
@wikingbtw /me wonders why we dont have a public member of each machine describing its label type? :) say something like using label_type = CMulticlassLabel for MulticlassMachine19:23
@HeikoSiglesiasg: so now19:24
@HeikoSI dont modify the passed argument right?19:24
iglesiasgwiking, something like typeid?19:24
@wikingso like Machine::label_type would actually always have the right label type...19:24
@wikingso when you do m->apply19:24
iglesiasgwiking, oh not only like typeid, because it is about the label type from the machine19:24
iglesiasgHeikoS, yeah19:25
@wikingthen you could simply do m->apply()->as<m::label_type>() :)19:25
@wikingso you get the right label based on the machine19:25
@wiking:)19:25
@HeikoSiglesiasg: ok so why not make the argument const19:25
iglesiasgHeikoS, what about as?19:25
@wikingthat cast should always work19:25
@HeikoSiglesiasg: as just tries to cast19:26
@HeikoSbut we want something more here19:26
@wikingmeaning you dont even need to do dynamic cast btw19:26
@HeikoSwe want to also potentially convert19:26
@HeikoSsay I have DenseLabels with data19:26
@HeikoSI cannot cast that to BinaryLabels19:26
@HeikoSI need to create a BinaryLabels instance, and pass the SGVector of the label data19:26
@HeikoSwiking: interesting idea!19:27
@wikinganyhow just an idea, but i think we could write helpers around this using swig that maybe on the end of the day when you do apply you actually right way get the right casted19:27
@wikinglabel19:27
@wikinginstead of having to do it manually19:27
@wikingwith the factory methods19:27
@wiking;P19:27
@HeikoSwe actually dont need factories in swig19:27
@HeikoSjust CLabels19:27
@HeikoSand then .get19:27
@wikingnever?19:27
@HeikoSiglesiasg: you see what I mean?19:27
@HeikoSwiking: no never19:27
iglesiasgHeikoS, BinaryLabels are DenseLabels19:27
@HeikoSiglesiasg: true19:28
@wikingHeikoS, coz u push everything inside c++?19:28
@wikingyeah ok because we always do19:28
@HeikoSbut can I cast DenseLabels to BinaryLabels?19:28
@wikingbase classes19:28
@wikinggotcha19:28
@HeikoSwiking: yes we just have CLabels19:28
@wikingbut on the other hand19:28
iglesiasgHeikoS, dynamic_cast no?19:28
@HeikoSit is the training data that requires dispatching19:28
@HeikoSiglesiasg: no19:28
@wikingthis could save some dynamic_Casts here and there19:28
@HeikoSI cannot cast a base type instance to sub-type isntance19:28
@wikingof course some machines would need to be split in this case19:29
@wiking:P19:29
@wikingwhich support both classification and regression19:29
@wikinganyhow19:29
@wikingi really wanna go home19:29
@wikingbbl19:29
iglesiasgHeikoS, you mean in general that that is not possible?19:29
@HeikoSnot that I know19:29
@HeikoSwiking: bye again :)19:29
iglesiasgmmm ok,let me try something quickly19:29
@HeikoSiglesiasg: but lets take the conversion case19:29
iglesiasgHeikoS, https://en.cppreference.com/w/cpp/language/dynamic_cast19:30
@HeikoSiglesiasg: like MCLabels and BinaryLabels19:30
iglesiasgbut just check the first line there19:30
iglesiasgconverts classes up, down, .... in the class hierarchy19:30
@HeikoSiglesiasg: but here we have DenseLabels instance19:30
@HeikoSit is not a DenseLabels pointer to a BinaryLabels instance19:30
iglesiasgok, I think I understand19:31
@HeikoSthe object itself it DenseLabels19:31
@HeikoSbut maybe lets take the conversion19:31
@HeikoSwe have multiclass labels for some reason19:31
iglesiasgthat will require creating a new object for sure then19:31
@HeikoSok19:31
iglesiasgif you want a BinaryLabels19:31
@HeikoSnow19:31
@HeikoSif my parameter is const CLabels*19:32
@HeikoSI can of course cast this to const CBinaryLabels*19:32
@HeikoS(if possible)19:32
iglesiasgok19:32
@HeikoSso my return type in that case would be: const CBinaryLabels*19:32
@HeikoSbut if I need to convert, i need to create a new instance19:32
@HeikoSso what is my return type then?19:33
iglesiasgalso const BinaryLabels?19:33
@HeikoSok cool19:33
@HeikoSnow my question is19:33
@HeikoShow does this work? :)19:33
@HeikoSauto result = new CBinaryLabels(); convert; return result;19:34
@HeikoSand the return type is const CBinaryLabels*19:34
sukey1[https://github.com/shogun-toolbox/shogun] Pull Request https://github.com/shogun-toolbox/shogun/pull/4281 opened by shubham80819:34
@HeikoSnow who destroys the object19:34
@HeikoS?19:34
iglesiasgI guess you should do19:34
iglesiasgconst auto* result = new...19:34
@HeikoSwho owns it?19:34
iglesiasgin this case the caller19:35
iglesiasgthis would be old-school memory management19:35
@HeikoSI would say so19:35
@HeikoSbut now19:35
@HeikoSthe caller cannot call SG_UNREF19:35
iglesiasgbut this is "bad nowadays"19:35
iglesiasgit should be in a smart pointer preferably19:35
@HeikoSbecause that modifies the object19:35
iglesiasgbad practice let's say not just bad19:35
iglesiasgaha! That's true lol19:36
@HeikoSso is it possible to offer a method like that even?19:36
iglesiasgI guess this could be listed in a smart pointer design discussion19:36
iglesiasgin the sense of discussing the approaches19:37
iglesiasgthe reference counter is part of the object19:37
iglesiasgor the object is part of the reference counter19:37
iglesiasgbut let's think about this19:37
@HeikoSyes19:37
@HeikoSI am blocked by this atm19:37
iglesiasgI don't see it that clear now19:37
iglesiasgso19:38
@HeikoSI wrote all those conversion things and now ran across a const CLabels* pointer, and now it seems screwed19:38
iglesiasgwhen we have a const CBinaryLabels* this means that the CBinaryLabels cannot be modified19:38
iglesiasgthe pointer can be reassigned19:38
iglesiasgagreed?19:38
@HeikoSy19:38
iglesiasgand the problem is of course that the ref count is part of the sgobject and therefore part of the binary labels as well19:39
@HeikoSy19:39
iglesiasgso yeah, ok19:40
iglesiasgwith more confidence now19:40
iglesiasgbut I think we are in the same step as 4 minutes ago when I ahad! xD19:40
@HeikoSit seems to me that a reference counter inside objects basically disabled any constness19:40
@HeikoSbut now I have a problem19:41
@HeikoSbecause19:41
iglesiasgok one second19:41
@HeikoSI can either have the parameter of the binary_labels method be non-const (then all this works, casting and creating new)19:41
@HeikoSbut then I cannot call it from a const pointer19:41
@HeikoSconst pointer I HAVE to cast, I cannot convert19:41
iglesiasgbut what does it actually happen if you try to compile some code that has a const SGObject*?19:42
iglesiasgdoes it really not compile at all?!19:42
@HeikoSno it works for example as modifier in a method that accepts a const SGObject*19:43
iglesiasgbecause what I am thinking is that after all ref and unref in SGObject are non-const methods19:43
@HeikoSbut not sure whether it is possible to instantiate a const SGO19:43
iglesiasgexactly19:43
iglesiasgI think you will be able to do so19:43
@HeikoSI can never ref count it19:43
iglesiasgyou just won't be able to call non-const methods19:43
iglesiasgnot via the REF and UNREF method, no19:44
@HeikoSnot at all actually19:44
iglesiasgbecause those after all fall back into calling ref unref methods, no?19:44
@HeikoScan't we make there counter mutable?19:44
iglesiasgmaybe there are tricks to do that19:45
iglesiasgmaking part of a const instance non-const19:45
iglesiasgI don't remember anything right now about it19:45
iglesiasgbut I think there are casting operators or rules for capturing types in templates that in a way "non-const" things19:45
@HeikoShttps://stackoverflow.com/questions/105014/does-the-mutable-keyword-have-any-purpose-other-than-allowing-the-variable-to?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa19:46
iglesiasgso you give it something that is const and/or volatile and it gets rid of those qualifiers19:46
@HeikoSI have no experience with it19:46
iglesiasgwtf is this bitwise and logical const? xD19:47
iglesiasgbut yeah19:47
@HeikoSlol :D19:47
@HeikoSok so bad news for my conversion method19:47
iglesiasgfrom the second answer and the question itself, it looks like mutable can come to rescue here19:47
@HeikoSnot possible to create new things and return const pointer to them and pass ownership19:48
iglesiasgyou sure? :)19:48
@HeikoSlisitsyn, wiking can we make the reference counter mutable? ^19:48
@HeikoSiglesiasg: no :)19:48
iglesiasglet's make it before they answer xD19:48
iglesiasgjust kidding19:48
@HeikoShehe19:49
@HeikoSseems like it might help19:49
@HeikoSthen we can make ref() method const19:50
@HeikoSuh19:50
@HeikoSfeels weird19:50
iglesiasgfml Some::ref calls T::ref hehehe19:50
iglesiasgbut let's think about this19:51
iglesiasgdoes your conversion function need to be aware of ownership?19:51
@HeikoSit doesnt care19:51
@HeikoSbut it might return the same thing that the caller gave, or not19:51
iglesiasgcan it just work with T* and assume that data T will always be there?19:51
iglesiasgok19:52
iglesiasgthat's fine then, no?19:52
@wikingHeikoS, that's when lisitsyn said - and i agree - that it's playing with a shotgun19:52
iglesiasgyes, it definitely sounds like it could get dangerous if not under control19:53
@wikinghence the argument of not doing Some<const T> as it really doesnt make much sense :P just pass const :)19:54
iglesiasgHeikoS, so, the conversion function can take a const T* and return and S*19:54
iglesiasgHeikoS, where is the pitfall in that view?19:54
iglesiasgwiking, que no haha why is that the same?19:54
@HeikoShow do you mean that?19:54
iglesiasgwhat hence19:54
@wikingiglesiasg, since you have a problem with the ref counter etc19:54
@wikingjust dont assume that you get ownership19:55
@wikingin this case of course it means that you need to copy19:55
@HeikoSiglesiasg: I think the problem is indeed ownership here19:55
iglesiasgwiking, oh ok sorry I was thinking still about the problem in general in the sense of shared ownership and const19:55
@HeikoSsince casting doesnt change ownership, but creating a new instance does (the caller gets ownership)19:55
iglesiasgyeah, for sure. Copy or moved19:55
iglesiasgit is a new object being created after all19:56
@wikingiglesiasg, moving is fine as well :)19:56
@HeikoSso the binary_labels method mixes ownership semantics19:56
@HeikoSwiking: you have thoughts on this?19:56
@wikingHeikoS, move19:56
@wikingi would simply move19:56
@wikingeverything19:56
iglesiasgqueen to d419:57
@wikingquestion is whether you need the original stuff19:57
@HeikoSyou do19:57
@wikingwhere?19:57
@wikingin sthe swig?19:57
@HeikoSit is a member of the CMachine19:57
@wikinglabel/19:57
@wiking?19:57
@wikingi mean in the long run we wanna drop that 'feature'19:57
@wikingno? :()19:57
@wiking:)19:57
@HeikoSdont understand what you mean19:58
@wikingit is a member of the CMachine19:58
@wikingthe clabels?19:58
@HeikoSyeah or features19:58
@wikingin both cases19:58
@wikingdo you think that it makes sense19:58
iglesiasgHeikoS, binary_labels function always creates new Some, no?19:58
@wikingto have ownership of those?19:58
@HeikoSwiking: no19:58
@HeikoSi see19:58
@HeikoSiglesiasg: currently, yes19:58
@HeikoSbut it doesnt accept a const arugment so that is fine19:59
@wikingi mean i really dont see why is it a good design acutally19:59
@wikingdo to CMachine(Features, Labels)19:59
iglesiasgwhy is one some small and the other Some big, I get confused :(19:59
@HeikoSSome is the class19:59
@HeikoSand some is a method to create a Some19:59
@wikingHeikoS, template :P19:59
@wikingbut yeah19:59
@HeikoSfunction, not method19:59
iglesiasgok, a make_some19:59
@wikingiglesiasg, ye19:59
@wikingdoes anybody have a good use-case for CMachine(Features, Labels)20:00
@wiking?20:00
iglesiasggood good20:00
@HeikoSidk20:00
@wikingbecause imo20:00
@wikingit's more confusing20:00
@wikingthan actually helping20:00
@wikingsee CMachine(Features, Labels)20:00
@wikingand then .train(Features)20:00
@wiking:P20:00
@wikingwtf is that :D20:00
iglesiasgyeahhhh it is odd20:00
@wikingand then if you want new Features20:01
@HeikoSthats just old ctors20:01
iglesiasgI think being restrictive here in the API could help20:01
@HeikoSits a shit this20:01
@wikingthen you need to20:01
@HeikoSbut thats all independent20:01
@wikingmachine.set_labels()20:01
@wikingright?20:01
@HeikoSwiking: yes20:01
@wikingi mean yes it's independent20:01
@wikingbut say we get rid of owning these stuff20:01
@wikingbecause we agree that this design20:01
@wikingis just not good20:01
@HeikoSok so what you are saying is that20:01
@HeikoSwe want to just pass const Cfeatures* in the train method20:01
@HeikoSand that's it20:02
@wikingconst Features, const Labels20:02
@wikinggo be precise20:02
iglesiasghaha20:02
@HeikoSokok20:02
@wikingand you get back a CLabels20:02
@wikingbut actually it should be const Clabels20:02
@wiking:P20:02
@HeikoSbut now this converting thing is still a problem in the way it is done right now20:02
@wikingyeah20:02
@wikingbut20:02
@wikingsay you have this done20:02
@HeikoSwe should kill it then20:02
@wikingmachines are not owning labels&features20:03
@HeikoSand force the user to pass the correct type20:03
@wikingthen you can actually start having a move pattern for binary_labels20:03
@HeikoSand in train we try to cast and if it doesnt work then bail20:03
@wikingand then you actually really just pass CLabels&&20:03
@wikingyeah i mean in train20:03
@wikingwe always need to do a typecheck anyways20:03
@HeikoSyeah20:03
@HeikoSI just liked the conversion thingi20:04
@HeikoS[0,1,2... ] to [-1,1] for example20:04
@wikingyeah the conversion just needs changing a bit20:04
@HeikoSbecause that creates a new instance20:04
@wikingthat can be changed with a move pattern20:04
@wikingor if you want then copy everything20:04
@wiking:)20:04
@wikingboth should be fine20:04
@wikingthe current way is a bit mix20:04
@HeikoSbut then the method cannot return const pointer20:04
@wikingand that's the bad part20:04
@wikingwhich method?20:04
@HeikoSdispatcher20:04
@HeikoSinside CMachine::train20:05
@HeikoSbecause casting gives you a const pointer20:05
@HeikoSbut converting gives you new obj, which cannot be a const poointer20:05
@HeikoSthe idea of "either cast or if not possible create new object and convert" mixes ownership20:06
@HeikoSsince second case gives ownership to caller20:06
@HeikoSand first case doesnt20:06
@wikingwell yeah :) except if you do a move ptr story in case of new object creation20:07
@wikingor?20:08
@wikingi mean in case it's casting20:08
@HeikoSI am unsure20:08
@wikingyou are working on the same obj20:08
@HeikoSwhat about the caller of CMacihne::train20:08
@wikingso nothing happens20:08
@HeikoShe stil lthinks he owns the obj20:08
@wikingif you actually have to convert it not only cast it20:08
@wikingthen actually drop the src and give a new object where you own the obj20:09
@wikingbut20:09
@wikingsince you should be passing20:09
@wikingconst CFeatures, const CLabels20:09
@HeikoSthats annoying as well as most of the time, a cast is sufficient20:09
@wikingmmm20:09
@wikingwhere are the current usecases20:10
@HeikoSI mean it doesnt really matter20:10
@wikingof the binary_labels20:10
@wikingfor example?20:10
@HeikoSas train is expensive anyways20:10
@HeikoSone usecase is examples20:10
@HeikoSthere we load labels from a file20:10
@HeikoSand we dont know what those labels are20:10
@HeikoSmc or binary20:10
@wikingwhy?20:10
@HeikoSso we put them in CDenseLabels20:10
@HeikoSbecause all we get is a csv file20:10
@wikingyeah but20:11
@wiking:)20:11
@wikingi mean we agreed that this is a shit anyways20:11
@wikinganyhow yeah20:11
@wikingso you read the labels20:11
@HeikoSit is20:11
@wikingand then you try to cast it20:11
@HeikoSbut thats how it currently is20:11
@wiking"cast"20:11
@HeikoSyes20:11
@wikingand that's a conversion20:11
@HeikoSand the "cast"20:11
@wikingright?20:11
@HeikoSjust steals the vector20:11
@HeikoSand creates a new isntance20:11
@wikingmmm20:11
@HeikoSnot steals20:11
@HeikoSassigns SGVector20:12
@HeikoSmmmh20:12
@wikingbut shouldn't we actually try to read in20:12
@wikingMC20:12
@wikingin the first place20:12
@HeikoScould20:13
@wikingand while reading and creating20:13
@wikingyou do the validation20:13
@wikingand if it's asdf20:13
@wikingthen fuck you20:13
@wiking:)20:13
@wikingand you throw an exception20:13
@HeikoSthere is just this thing that from a user API perspective20:13
@HeikoSthere is really no sense to distringuish MC and binary labels20:13
@wikingyeah20:13
@HeikoSthat was the idea20:13
@HeikoSso I was thinking at least we can have that in the API already20:13
@wikingi mean20:13
@HeikoSand then change internally at some point20:13
@wikingthis is in case swig20:13
@wikingno?20:13
@HeikoSany user-facing20:14
@wikingmmmm20:14
@wikingin c++ i would agrue20:14
@wikingthat it's better to be as specific as possible20:14
@wikingas soon as20:14
@HeikoSsure20:14
@wikingso that you actually throw exception20:14
@wikingnot in train20:14
@HeikoSbut even then20:14
@wikingbut already when you wanna MC a clearly binary labeled input20:14
@wikingor i mean20:14
@wikingthe other way round20:14
@wikingbecause Mc(binary ) should be fine20:15
@HeikoSyep20:15
@wikingbut yeah of course20:15
@wikingin a python settings20:15
@wikingyou really wanna be able to do20:16
@wikingm.train(X, y)20:16
@wikingand you shouldnt care too much about converting y to the right format20:16
@wikingetc etc20:16
@HeikoSexactly20:16
@wikingas i agree20:16
@wikingthat having the current20:16
@wikinglabels = BinaryLabels(v)20:16
@wikingis just annoying20:16
@HeikoSwe could also do more gluing code20:17
@HeikoSi.e. always just cast inside the algos20:17
@HeikoSi.e. no conversion20:17
@HeikoSbut then make swig code that converts20:17
@HeikoSbased on the enums of the machine20:17
@HeikoSah but thats not feasible to do20:18
@HeikoSas we first need train(const CFeatures, ..) to be the only place where things are passed20:18
@HeikoSotherwise we cannot glue efficiently20:18
@HeikoSchicken egg problem :(20:18
@wikingbtw20:18
@wikingwould the conversion20:18
@wikingof the old ctor style20:18
@wikingto a train(X, y)20:19
@wikingbe that heavy?20:19
@HeikoSlike inside ::train we do BinaryLabels(y) ?20:19
@wikingi mean really just to clear up this mess20:19
@wikingand remove the ownership20:19
@wikingof the labels/features20:19
@HeikoSyes I am tending towards this as well atm20:19
@wikingin the first place20:19
@HeikoSah20:20
@wikingwe all agree that that's a confusion concept20:20
@HeikoSsorry I see what you mean20:20
@HeikoSI think yes :(20:20
@wikingso how about first dropping that20:20
@wikingin a first round20:20
@HeikoShave to refactor a lot of code20:20
@HeikoSas a lot of code is accessing m_labels20:20
@HeikoSand m_features20:20
@HeikoSvia helper methods20:20
@wikingmm20:20
@HeikoSand there is some open design qs as well20:20
@HeikoSlike kernel machine20:20
@HeikoSneeds to keep a reference to features20:21
@HeikoSdoes it copy?20:21
@HeikoSor does it only copy the model features (like store_model_features?)20:21
@HeikoSor what?20:21
@HeikoSso not that clear20:21
@HeikoSI think what I will do for now (because I want to move on)20:21
@HeikoSis to create new instances in the conversion method, and then assign the members20:22
@HeikoSand then once we have a proper labels/features managment20:22
@wikingwho uses fatures20:22
@HeikoSwe can change that20:22
@wikingjust tried checking in kernel machine20:22
@HeikoSin a minimal way20:22
@HeikoSapply20:22
@HeikoSapply uses the features20:22
@HeikoSevery kernel machine20:22
@HeikoSand all gps20:22
@HeikoSas you need the kernel between training and test data20:22
@HeikoSwhich you dont know at training time because you dont know the test data20:23
@HeikoSlinear models dont need features20:23
@HeikoSkernel machines dont need labels20:23
@HeikoSactually no point in ever storing labels outside of train20:23
@HeikoSok I will go now20:24
@HeikoSwiking: see you later!20:24
@wikingttyl20:24
@wikingstarting with labels20:25
@wikingwith be a good idea actually20:25
@wikingjust to drop that20:25
iglesiasgI think I understand now what wiking was saying before when we were discussing20:28
iglesiasgso not about shared ownership in general but in Shogun, in particular the pattern that when a SGObject has a member of another SGObject generally it is owning and ref counted20:29
iglesiasgand yep I agree with that20:30
iglesiasgin general not clear why in e.g ?m = KNN() // a machine instance; m.train(features, labels)? the machine must own the features and labels20:31
iglesiasgin a way it makes it less restrictive20:32
iglesiasgbut not sure if it is eventually worth20:32
-!- HeikoS [~heiko@untrust-out.swc.ucl.ac.uk] has quit [Ping timeout: 255 seconds]20:35
@wikingiglesiasg, loco mode on: https://www.facebook.com/notes/protect-the-graph/pyre-fast-type-checking-for-python/2048520695388071/20:43
iglesiasghaha20:46
iglesiasgmaking Python more C++, nice20:47
iglesiasghahaha20:47
iglesiasgbut yeah, nice after all20:49
iglesiasgit will force people to write better code20:49
iglesiasgwiking, I started listening to a c++ podcast on the bike to and from job20:51
@wikingah cppcast?20:51
lisitsynfsck!20:51
@wikingits good20:51
@wikingi like that20:51
iglesiasgyeah, it is good20:51
iglesiasgtwo of the episodes I have listened to I really like20:51
lisitsynwiking: ok I actually start to agree const T* is just fine20:52
iglesiasgyeah CppCast20:52
iglesiasghttp://cppcast.com/2017/12/nicole-mazzuca/20:53
iglesiasgvery interesting from this guy Nicole Mazzuca20:53
iglesiasgit looked like he talked about similar stuff in CppCon, there?s a Youtube video20:54
iglesiasgbut video dangerous with the bike lol20:54
@wikinghttps://youtu.be/dkngdqDwfEo?t=26720:58
@wiking:>20:58
iglesiasgpoor leoncitos21:11
iglesiasg:(21:11
iglesiasgand the other animals too21:11
iglesiasghaha Trevor Noah appeared in suggested videos, my evening is lost now :P21:11
@wiking:>21:21
@wikingiglesiasg, https://www.youtube.com/watch?v=cODmIxsna0g21:37
@wiking;)21:37
@wikingwatch this it's only 24 minutes :P21:38
-!- iglesiasg [~iglesias@f119189.upc-f.chello.nl] has quit [Ping timeout: 256 seconds]21:39
-!- iglesiasg [~iglesias@f119189.upc-f.chello.nl] has joined #shogun21:43
-!- iglesiasg [~iglesias@f119189.upc-f.chello.nl] has quit [Ping timeout: 246 seconds]22:02
Trixis>=22:27
-!- HeikoS [~heiko@host86-146-49-221.range86-146.btcentralplus.com] has joined #shogun23:21
-!- mode/#shogun [+o HeikoS] by ChanServ23:22
sukey1[https://github.com/shogun-toolbox/shogun] Pull Request https://github.com/shogun-toolbox/shogun/pull/4281 merged by karlnapf23:31
sukey1[https://github.com/shogun-toolbox/shogun] New commit https://github.com/shogun-toolbox/shogun/commit/02ee9a54554a8b6a50f502f58ffe1c05a0a66a32 by karlnapf23:31
--- Log closed Sat May 12 00:00:03 2018

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