Open in new window / Try shogun cloud
--- Log opened Tue Jun 21 00:00:49 2016
-!- HeikoS [] has joined #shogun00:13
-!- mode/#shogun [+o HeikoS] by ChanServ00:13
-!- HeikoS [] has quit [Quit: Leaving.]01:49
-!- HeikoS [] has joined #shogun01:56
-!- mode/#shogun [+o HeikoS] by ChanServ01:56
-!- HeikoS [] has quit [Remote host closed the connection]01:56
-!- OXPHOS [c68f0c0c@gateway/web/freenode/ip.] has joined #shogun02:13
-!- OXPHOS [c68f0c0c@gateway/web/freenode/ip.] has quit [Ping timeout: 250 seconds]02:37
-!- GandalfTheWizard [~Eva@] has joined #shogun03:09
-!- Saurabh7 [~Saurabh7@] has joined #shogun05:06
shogun-buildbotbuild #25 of memleak - valgrind is complete: Failure [failed memory check]  Build details are at  blamelist: Heiko Strathmann <>, Saurabh7 <>05:25
shogun-buildbotbuild #1026 of nightly_none is complete: Failure [failed test]  Build details are at  blamelist: Heiko Strathmann <>, Saurabh7 <>05:29
-!- sonne|osx [] has joined #shogun05:52
shogun-buildbotbuild #1156 of nightly_default is complete: Failure [failed test test_1 notebooks]  Build details are at  blamelist: Heiko Strathmann <>, Saurabh7 <>06:15
shogun-buildbotbuild #533 of deb1 - libshogun - PR is complete: Failure [failed cookbook]  Build details are at  blamelist: OXPHOS06:15
shogun-buildbotbuild #534 of deb1 - libshogun - PR is complete: Success [build successful]  Build details are at
-!- sonne|osx [] has quit [Quit: sonne|osx]06:40
-!- Saurabh7 [~Saurabh7@] has quit [Read error: Connection reset by peer]08:11
-!- Saurabh7 [~Saurabh7@] has joined #shogun08:26
-!- besser82 [~besser82@fedora/besser82] has joined #shogun08:31
-!- mode/#shogun [+o besser82] by ChanServ08:31
-!- GandalfTheWizard [~Eva@] has quit [Quit: Leaving.]09:09
-!- Saurabh7 [~Saurabh7@] has quit [Ping timeout: 260 seconds]09:18
-!- besser82 [~besser82@fedora/besser82] has quit [Ping timeout: 260 seconds]09:24
-!- Saurabh7 [~Saurabh7@] has joined #shogun09:25
-!- sanuj [~sanuj@] has joined #shogun10:30
-!- OXPHOS [c68f0c0c@gateway/web/freenode/ip.] has joined #shogun10:30
sanujlisitsyn, what warning do you want for the %newobject PR?10:30
sanujOXPHOS, hey, you are online? :o10:31
OXPHOSsanuj: hello:) I'm in China now10:32
sanujOXPHOS, i see :)10:32
OXPHOSsanuj have to connect to irc via vpn ;(10:32
sanujOXPHOS, where do you live in china?10:33
OXPHOSsanuj: in a city 300km to Beijing10:33
lisitsynsanuj: say one wants to add another layer10:33
lisitsynsanuj: we've got to warn people to update swig as well10:33
sanujlisitsyn, you mean, if someone adds a new layer in NeuralNetwork.h then swig has to be also updated with %newobject?10:35
sanujlisitsyn, did you talk to heiko about templates in swig10:35
lisitsynsanuj: yeah but it is quite difficult anyway10:35
sanujlisitsyn, he wants to merge tags first in the feature branch and then look at swig10:36
lisitsynI agree10:36
sanuji think the only thing missing are unit-test for any10:36
sanuji can't make the coverage thing work10:36
sanujlisitsyn, well heiko said wiking will update the cmakelist for coverage to work10:37
sanujlisitsyn, he had asked me to try gconv10:38
sanujbut for that i need to compile the source code with some flags for gconv to work10:39
sanujlisitsyn, here is the flag
sanujbut i don't know what am i supposed to do after building with this flag10:41
sanujand i think it does not work10:41
-!- HeikoS [] has joined #shogun10:41
-!- mode/#shogun [+o HeikoS] by ChanServ10:41
-!- lisitsyn is now known as bazdmeg11:00
bazdmegCAN'T TOUCH THIS11:01
bazdmegshogun-buildbot: dance11:01
sanujbazdmeg !!!!11:02
-!- bazdmeg is now known as YOLO11:02
-!- YOLO is now known as bazdmeg11:02
sanujbazdmeg, aren't you in office?11:02
bazdmegnot yet11:03
-!- [Chris] [~Chris]] has quit [Ping timeout: 276 seconds]11:03
sanujokay bazdmeg11:03
-!- sanuj [~sanuj@] has quit [Ping timeout: 250 seconds]11:35
@HeikoSOXPHOS: hihi12:09
OXPHOSHeikoS: hey!12:11
@HeikoSOXPHOS: we are about to finish the linalg draft12:11
@HeikoSIll send a link and you can check a bit12:11
@HeikoSwe are in the final changes12:11
@HeikoSOXPHOS: sent you a pm12:11
@HeikoSlet me know whether it wporked12:12
-!- lambday [8028b10a@gateway/web/freenode/ip.] has joined #shogun12:12
-!- mode/#shogun [+o lambday] by ChanServ12:12
OXPHOSHeikoS: thx! checking12:12
OXPHOSlambday: hello12:12
-!- sanuj [~sanuj@] has joined #shogun12:14
@lambdayOXPHOS: hello!12:27
@HeikoSOXPHOS: sooooo12:29
@HeikoSwe are done12:29
@HeikoSOXPHOS: shall we walk you through this a bit?12:29
@HeikoSOXPHOS: key points12:30
OXPHOSHeikoS: coooool! I'm thinking about some questions but plz go ahead12:30
@HeikoS1.) runtime change of backend possible12:30
@HeikoS2.) runtime addition of backend possible12:31
@HeikoS3.) simple API12:31
@HeikoS4.) GPU algorithms can always be executed on CPU backend if no GPU backend is available12:31
@HeikoSOXPHOS: you see, there is no #ifdefs or any backend specific code in SGVector or the base classes12:31
@HeikoSor the linalg methods, e.g. linalg::dot12:32
@HeikoSthey all just call backends12:32
@HeikoSOXPHOS: so I will just point to some line numbers with a few comments12:32
@HeikoSline 10-19: use cases: how this is used from shogun algos12:32
@HeikoSshould be pretty clear12:32
@HeikoSline 23ff: changes /additions to SGVector, we decided to putGPU memory things in there to make everything a bit more compact12:33
@HeikoSnote it is only one constructor, and a new member in line 4312:33
@HeikoSAlso note:12:34
@HeikoStransfering to GPU always creates a NEW SGVector12:34
@HeikoSwhere the vector field is NULL, and gpu_vector is non-null12:34
@HeikoStransfering back as well12:34
@HeikoSok, now a tricky one12:34
@HeikoSline 5312:34
@lambdaythere can only be CPU data OR GPU data in SGVector.. not both at the same time..12:34
@lambdaythis is to have the proper refcount12:35
@HeikoSOXPHOS: line 49ff is the backend base, that is, it defines all the methods that are implemented in sublcasses12:35
@HeikoSthe subclasses can use eigen3/vienna/cuda, etc12:35
@HeikoSso the base class containts some virtual methods12:35
@HeikoSsince we cannot template virtual methods (google it if you are confused), we need to explicitly write these methods for all types we want12:36
@HeikoSOXPHOS: we do this automatically via these macros12:36
@HeikoSplease make sure you understand that :)12:36
@HeikoSOXPHOS: good?12:36
OXPHOSHeikoS: yes I got the idea..can work on details by myself12:36
@HeikoSOXPHOS: now check line 83ff, which defines the dot product12:37
@HeikoSyou see, this thing checks whether both inputs live on gpu, and then calls gpu_backend's dot, otherwise cpu backend's dot12:37
-!- sanuj [~sanuj@] has quit [Read error: Connection reset by peer]12:37
@HeikoSagain, there is NO #ifdef/Vienna or whatsoever12:37
@HeikoSso it is possible to change the pointer that get_gpu_backend() returns at runtime12:38
@HeikoSsame for cpu12:38
OXPHOSsure onGPU() == registered12:38
@HeikoSOXPHOS: on_gpu == to_gpu() was called12:38
@HeikoSi.e. the SGVector memory lives on GPU12:38
@HeikoSregistered == get_gpu_backend() != NULL12:38
@HeikoSsee e.g. line 09512:39
@HeikoSit checks whether the GPU backend is available12:39
@HeikoSand then transfers12:39
@HeikoSif not, doesnt transfer12:39
@HeikoSso in dot in line 83, we know that vector.on_gpu() is true, there *is* a backend registered12:39
@HeikoSOXPHOS: the backend pointers are stored in line 127ff12:40
@HeikoSOXPHOS: and then we wrote some mini example backend implementations in eigen3 and Vienna12:40
@HeikoSline 137ff12:40
@HeikoSnot again, that we are overloading virtual methods, so we cannot template but need to use this macro trick12:40
@HeikoSthe actual code for dot product is in line 154ff12:41
@HeikoSfor eigen case12:41
@HeikoSOXPHOS: so far so good, please let us know any questions you have12:41
@HeikoSOXPHOS: now the plan12:41
@HeikoSOXPHOS: this needs to be implemented before midterm next week. that is this week12:42
@HeikoSOXPHOS: as we drafted most thing, it should be just a matter of translating this into compiling code12:42
@HeikoSso a week is more than enough I think12:42
@HeikoSshould only take 2 days, so if you get stuck, ask us immediately12:42
@HeikoSit is a good goal for midterm to have this done12:42
@HeikoSin feature branch12:42
@HeikoSOXPHOS: thoughts?12:43
OXPHOSHeikoS: sure! make sense12:43
@HeikoSOXPHOS: ok then, make sure you understand every line of this draft12:43
@HeikoSOXPHOS: and also, more importantly, the high level idea12:43
@HeikoSi.e. the 4 points I started with12:43
@HeikoSat 11:2912:43
OXPHOSyep that is clear12:44
@HeikoSOXPHOS:  ok then12:44
@HeikoSI also suggest: we start a new feature branch12:44
OXPHOSthinking about the ref_counts of to_GPU() but no gpu backend - should be a shallow copy?12:44
@HeikoSOXPHOS: check line12:45
@lambdayto_gpu creates a new SGVector with ref-count 012:45
@HeikoSit returns the same vector12:45
@HeikoSlambday: no new vector12:45
@lambdayoh if no gpu backend, same vector12:45
@HeikoSOXPHOS: same in line 11712:46
@HeikoSOXPHOS: so lambday will create a branch for you12:46
@HeikoSspawned from develop12:46
@HeikoSand then the order of things to be added should be12:46
@HeikoS1.) SGVector changes / additions12:46
@HeikoS2.) base classes of backend and memory12:47
@HeikoSsorry, actually12:47
@HeikoS1.) gpu memory base class12:47
@HeikoS2.) SGVector changes12:47
@HeikoS3.) LinalgBackendBase12:47
@HeikoS(with to_gpu and from_gpu first)12:47
@HeikoS4.) add dot to LinalgBackendBase12:48
@HeikoS5. add subclasses for eigen3 and vienna12:48
@HeikoS6. unit test for dot and to/from_gpu12:48
@HeikoS7. polish12:48
@HeikoS8. refactor old methods12:48
OXPHOSI see12:48
@HeikoS8 takes time12:49
@HeikoSso that we can do next week12:49
@HeikoSbut 1-7 is quite simple with this draft12:49
@HeikoSso this week it should have priority over anything else12:49
@HeikoSOXPHOS: cool then12:50
@HeikoSI gotta go12:50
OXPHOSHeikoS: sure! ready to work12:50
@HeikoSOXPHOS: just ask if anything is unclear, it took us a while to figure this out ourselves ;)12:50
OXPHOSHeikoS: np. thx!12:50
Saurabh7HeikoS, yo12:51
@HeikoSSaurabh7:  hi!12:51
@HeikoSSorry, I have to leave soon, you still there in a few hours?12:51
Saurabh7HeikoS, rre12:51
Saurabh7ok i wll be here12:51
@HeikoSSaurabh7: cool, thanks!12:52
Saurabh7I will write a mail ?12:52
@HeikoSyes good! :)12:52
-!- HeikoS [] has quit [Quit: Leaving.]12:55
-!- sanuj [~sanuj@] has joined #shogun12:58
-!- Saurabh7 [~Saurabh7@] has quit [Ping timeout: 260 seconds]13:00
-!- Saurabh7 [~Saurabh7@] has joined #shogun13:12
-!- sanuj [~sanuj@] has quit [Ping timeout: 276 seconds]13:18
-!- Saurabh7 [~Saurabh7@] has quit [Quit: Leaving]13:24
-!- sanuj [~sanuj@] has joined #shogun13:39
-!- OXPHOS [c68f0c0c@gateway/web/freenode/ip.] has quit [Ping timeout: 250 seconds]14:02
-!- lambday [8028b10a@gateway/web/freenode/ip.] has quit [Quit: Page closed]14:19
-!- lambday [8028b10a@gateway/web/freenode/ip.] has joined #shogun14:31
-!- mode/#shogun [+o lambday] by ChanServ14:31
bazdmeglambday: what's up14:32
@lambdaybazdmeg: you know any other one?14:32
@lambdaysuggest me something in russian14:32
@lambdayoh wait14:32
bazdmeglambday: blyad14:32
@lambdayi think i remember14:32
-!- lambday is now known as blyad14:33
bazdmeglambday: although this is not really good for you14:33
-!- sanuj [~sanuj@] has quit [Ping timeout: 260 seconds]14:33
@blyadwhat's blyad ?14:33
bazdmegblyad: bitch! sorry :D14:33
-!- c4goldsw [5da420e6@gateway/web/cgi-irc/] has joined #shogun14:33
bazdmegblyad: use ebat14:33
bazdmegthis is bazdmeg14:33
-!- blyad is now known as bitch14:33
@bitchoh fuck this is already registered14:33
-!- bitch is now known as ebat14:33
@ebatbazdmeg: you saw the design?14:34
@ebatwith macro?14:34
bazdmegebat: yes this is what I suggested14:35
bazdmegwhen Heiko tried to bazdmeg my brains out14:35
c4goldswLol who are you guys bazdmeg ebat?14:35
@ebatwe both were pretty bazdmeg-ged for last 2 days with this thing!14:35
bazdmegyeah bazdmegged out14:35
@ebatc4goldsw: surprise! :D14:36
c4goldswokay I have better things to do time to work14:36
-!- TanNguyen [~dra@] has joined #shogun14:41
-!- sanuj [~sanuj@] has joined #shogun15:09
-!- ebat [8028b10a@gateway/web/freenode/ip.] has quit [Ping timeout: 250 seconds]15:13
-!- besser82 [~besser82@fedora/besser82] has joined #shogun15:50
-!- mode/#shogun [+o besser82] by ChanServ15:50
-!- sanuj [~sanuj@] has quit [Ping timeout: 252 seconds]16:28
-!- sanuj [~sanuj@] has joined #shogun16:29
-!- lambday [8028b10a@gateway/web/freenode/ip.] has joined #shogun16:59
-!- mode/#shogun [+o lambday] by ChanServ16:59
-!- HeikoS [] has joined #shogun17:00
-!- mode/#shogun [+o HeikoS] by ChanServ17:00
-!- shogun-notifier- [] has joined #shogun17:05
shogun-notifier-shogun: lambday :develop * 5f4b032 / / (6 files):
shogun-notifier-shogun: Refactored EuclideanDistance to work with any CDotFeatures17:05
shogun-notifier-shogun: Heiko Strathmann :develop * 616b4f9 / / (6 files):
shogun-notifier-shogun: Merge pull request #3295 from lambday/develop17:05
shogun-notifier-shogun: Refactored EuclideanDistance to work with any CDotFeatures17:06
bazdmeguhmm bazdmeg17:07
shogun-buildbotbuild #733 of trusty - libshogun - viennacl is complete: Failure [failed compile]  Build details are at  blamelist: Heiko Strathmann <>, lambday <>17:07
@HeikoSbazdmeg: bazdmeg!!!17:10
@HeikoSbazdmeg: what about sanuj 's PR?17:11
@HeikoSits getting out of controll17:11
@HeikoScan we please merge things before starting to work on swig?17:11
bazdmeglike everything around us17:11
@HeikoSsanuj: lets merge the tag parts17:11
@HeikoSand then have a new (small!) PR for swig addition17:11
sanuj HeikoS sure sure17:12
@HeikoSbazdmeg: can we merge things into develop?17:12
@HeikoSor does that break things?17:12
@HeikoSlike is it additions?17:12
@HeikoSor deep changes?17:12
bazdmegsorry I am out of touch for a few hours17:12
@HeikoSout of touch?17:13
@HeikoSnext hours or last? :)17:13
@HeikoSbazdmeg: what is this badzmeg???17:13
sanujHeikoS, inspired from wiking17:13
sanuji guess17:13
@HeikoSsanuj: ok then, I can merge17:13
@HeikoSit is a feature branch so all good17:13
@HeikoSsanuj: lets stripe this down to minimal size that passes the build17:14
@HeikoSbut obviously keep your changes17:14
sanujokay, i'll shift it to new branch (swig stuff)17:14
shogun-notifier-shogun-data: OXPHOS :master * 403ddb0 / testsuite/meta/binary_classifier/linear_svm.dat:
shogun-notifier-shogun-data: add linear_svm test dataset17:15
shogun-notifier-shogun-data: Heiko Strathmann :master * eba3fbe / testsuite/meta/binary_classifier/linear_svm.dat:
shogun-notifier-shogun-data: Merge pull request #105 from OXPHOS/temp17:15
shogun-notifier-shogun-data: add linear_svm test dataset17:15
shogun-notifier-shogun-data: OXPHOS :master * 3e214f1 / testsuite/meta/ (20 files):
shogun-notifier-shogun-data: separate classifiers17:16
shogun-notifier-shogun-data: Heiko Strathmann :master * ca2c244 / testsuite/meta/ (20 files):
shogun-notifier-shogun-data: Merge pull request #104 from OXPHOS/master17:16
shogun-notifier-shogun-data: separate classifiers17:16
sanujHeikoS, can i put intermediate commits on a separate branch?17:24
@HeikoSsanuj: what do you mean?17:24
sanujlike i have more commits after the swig commits17:24
shogun-notifier-shogun-data: Saurabh7 :master * af30f7a / testsuite/meta/classifier/random_forest.dat:
shogun-notifier-shogun-data: rf data17:25
shogun-notifier-shogun-data: Heiko Strathmann :master * 7b23694 / testsuite/meta/classifier/random_forest.dat:
shogun-notifier-shogun-data: Merge pull request #106 from Saurabh7/rfdata17:25
shogun-notifier-shogun-data: rf data17:25
sanujbut i want to keep the commits that are after swig commits on the same branch17:25
sanujand move the intermediate swig commits on a different branch17:25
@HeikoSsanuj: yes17:25
-!- arianepaola [~ariane@unaffiliated/arianepaola] has quit [Quit: Leaving.]17:26
@HeikoSallows you to grasp any commit to the current branch17:26
@HeikoSgoogle it17:26
@HeikoSbetter make a backup before you start17:26
@HeikoSbut its easy17:27
@HeikoSto use17:28
-!- arianepaola [~ariane@unaffiliated/arianepaola] has joined #shogun17:32
@HeikoSbazdmeg: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!17:49
@HeikoSbazdmeg: I had to remove your wrap17:51
@HeikoSbroke too many things17:51
@HeikoSgotta do that properly17:51
shogun-notifier-shogun: Heiko Strathmann :develop * 340d1ce / examples/meta/generator/
shogun-notifier-shogun: raise exception after all17:53
shogun-notifier-shogun: Heiko Strathmann :develop * 35f902d / examples/meta/generator/targets/cpp.json:
shogun-notifier-shogun: remove wrap as it hinders other things, gotta do that properly17:53
shogun-buildbotbuild #734 of trusty - libshogun - viennacl is complete: Failure [failed compile]  Build details are at  blamelist: Heiko Strathmann <>17:54
bazdmegHeikoS: ?18:01
bazdmeg??? how can that break anythngi18:03
shogun-notifier-shogun: Heiko Strathmann :feature/meta_vector_matrix * b00b20f / examples/meta/generator/targets/cpp.json:
shogun-notifier-shogun: add matrix and vector types for cpp18:08
shogun-notifier-shogun: Heiko Strathmann :feature/meta_vector_matrix * 5850ba3 / examples/meta/generator/targets/cpp.json:
shogun-notifier-shogun: added long real vector and matrix18:08
shogun-notifier-shogun: Heiko Strathmann :feature/meta_vector_matrix * 4726424 / examples/meta/src/tests/,examples/meta/src/tests/
shogun-notifier-shogun: meta example tests for vector and matrix types18:08
@HeikoSbesser82: joooo18:09
c4goldswHeikoS ello18:12
@HeikoSc4goldsw: jo18:12
c4goldswI have more questions in regards to the CRegressionLabels - specifically, how they're used in LARs.  Once that's sorted, I should be able to submit a PR.18:13
c4goldswYou said that for our purposes, when doing regression y would be in R.18:14
c4goldswCRegressionLabels only returns values in float64, and it can't be templated18:15
c4goldswHold on18:15
c4goldswIt's taking me a while to type18:15
@HeikoSdont worry18:15
c4goldswI'll mention your name when  I'm done18:16
@HeikoSokok :)18:16
c4goldswSo, even though I've templated things related to CDenseFeatures, the second line shows where the a generic eigen map and a float64 eigen map are multiplied18:18
c4goldswWhat can be done about this?  One solution is to template CRegressionLabels, but this would only be suitable for things R.  This also leads to the question of whether you'd want this to work for int32 / 64, which is also in R but can run into problems as they can't store fractional parts18:19
c4goldswSo HeikoS, what do you recommend?18:19
c4goldswI could also cast the eigen map into float6418:20
c4goldswOn line 15018:20
c4goldswWhich actually seems like a decent solution18:22
-!- Saurabh7 [~Saurabh7@] has joined #shogun18:24
@HeikoSok hi18:27
@HeikoSc4goldsw:  let me see18:27
Saurabh7HeikoS, yo18:27
c4goldswOn second thoughts the casting won't work18:28
@HeikoSc4goldsw: soooo18:28
@HeikoSas said yesterday, the first step would be18:28
@HeikoSto accept any CDeanseFeatures<T> as input18:28
@HeikoSno need to template the LARS class itself18:29
@HeikoSbecause the input data is what counts18:29
c4goldswyes, that was clear18:29
@HeikoSso for labels18:29
@HeikoSI am not sure what you want to do18:29
@HeikoSI mean labels can just be 64 bit, as there are not that many of them18:30
@HeikoSc4goldsw: so I guess a first step (patch) is just to get rid of the float64_t in CDenseFeatures18:30
@HeikoSand just leave labels as they are18:30
@HeikoSdoes that make sense?18:30
@HeikoSSaurabh7: jo!18:30
@HeikoSc4goldsw: so when you are saying that is done18:31
@HeikoScan you share a pr?18:31
@HeikoSto discuss?18:31
Saurabh7HeikoS, jst saw mails, sending the data again18:31
@HeikoSI think we could change the labels to be templated as well18:31
@HeikoSbut not sure whether that is worth the effort18:31
@HeikoSmatrices is where it matters18:32
@HeikoSand regression labels are always R anyways18:32
@HeikoSit is just whether they are 32 or 64 bit18:32
@HeikoSc4goldsw: so you just need to do something like18:32
@HeikoStypedef Eigen::Matrix<T, -1, -1> MatrixXT;18:33
@HeikoSand then do Map<MatrixXT>(feats->get_feature_matrix(), num_feats, num_vectors)18:33
c4goldswThat's been done :)18:34
@HeikoSthen send the PR :)18:34
c4goldswBut I'm still a little uncertain about how to proceed because of line 15018:34
@HeikoSand add a test where you make it work with float32 features18:35
@HeikoSthis one?18:35
c4goldswYes.  The problem is that map_y is in float_64, whilst map_Xr is templated18:35
c4goldswThat was what I was asking about18:35
c4goldswOr rather18:36
@HeikoSah yes18:36
@HeikoSof course18:36
c4goldswTHAT is the problem18:36
@HeikoSwell ok18:36
c4goldswget_lables returns float64 vectors18:36
@HeikoSlabels are not changed18:36
@HeikoSonly read18:37
@HeikoSso you can create a copy18:37
@HeikoSin the right memory length18:37
@HeikoSlet me ask lambday18:37
c4goldswHeikoS: Or, if you go back to line 150, I could just cast map_Xr to float64 then right?18:37
c4goldswBecause the values are only read, so there would really be no change.18:38
c4goldswI could cast by doing this on to eigen matrix:
@HeikoSlambday is of the opinion that this works18:39
@HeikoSand should just give double18:40
@HeikoSor do you get a compile error?18:40
c4goldswThat what works?  The casting idea?18:40
@HeikoSnope sorry18:40
sanujHeikoS, i have updated the tags PR and squashed my commits
@HeikoSc4goldsw: ok the solution is18:44
@HeikoSto add template methods to CLabels18:44
@HeikoSthis is very similar to CKernel::get_kernel_matrix()18:45
c4goldswchecking that method now18:45
@HeikoSyou need to add templated methods get_labels<T>()18:45
@HeikoSand those will return a *copy* of the 64bit labels18:45
@HeikoSfor all cases but for float64_t18:46
@HeikoSso that is ONE option18:46
@HeikoSthe other one is to template labels18:46
@HeikoSjust discussing here18:46
@HeikoSI tend toward the copy18:47
@HeikoSso CLabels::get_labels<float32_t>()18:47
@HeikoSand in there, you do18:47
@HeikoSSGVector<T> labels_copy(num_labels);18:48
@HeikoSfor (i in range(num_labels)) { labels_copy[i] = labels[i]; }18:48
@HeikoSsomething like that18:48
@HeikoSthen in the LARS18:48
@HeikoSyou call that templated method, that now works with a copy of the labels in 32bit width18:48
@HeikoSsanuj:  checking18:48
c4goldswHmm, okay18:49
-!- besser82 [~besser82@fedora/besser82] has quit [Ping timeout: 276 seconds]18:49
c4goldswHeikoS: Is it a problem that the labels aren't float64_t?  This goes back to my question yesterday of how the labels are used18:49
c4goldswWhat if the type we're using for LARs is an int type?18:50
@HeikoSc4goldsw: doesnt make sense18:50
c4goldswWhich can't store fractional parts?18:50
c4goldswAh ok18:50
@HeikoSI mean the data can be int18:50
c4goldswGood.  That clears up my understanding18:50
@HeikoSbut inside LARS the X*y result needs to be float18:51
c4goldswHeikoS: Okay, it's good to hear that.  When I tried to compile with float64, the class compiles but this error occurs:
@HeikoSthere it appears to me that you templated the LARS class18:54
@HeikoSwithout instantiating the templates18:54
@HeikoSso you need to instantiate the templates to get rid of that18:54
@HeikoSthis is not what we discussed18:54
@HeikoSit makes no sense to template the LARS class itself18:55
@HeikoSwe cannot template every algorithm in shogun18:55
@HeikoSexplosion of classes18:55
@HeikoSwe just want it to work with all template versions for CDesneFeatures18:55
c4goldswTo be more specific, I was just compiling with the instatiation of LARS<float64>18:56
c4goldswHeikoS in fact here, this is what I have:
c4goldswGo to the bottom, I've instatiated LARS<float64_t> at the bottom18:57
@HeikoSyou dont want that18:58
@HeikoSyou just want CLeastAngleRegression18:58
@HeikoSwhich deals with CDenseFeatures<T>18:58
c4goldswNow this is all clear18:58
@HeikoSrather than only CDenseFeatures<float64_t>18:58
c4goldswSo I just need to template the methods that use CDenseFeatures18:58
c4goldswRather than the entire class18:58
@HeikoSyes the helper methods you can template18:58
@HeikoSas they take SGMatrix<T>18:58
c4goldswGreat, that makes sense.  Sorry for the misunderstanding18:59
@HeikoSoh and use a typedef for the Eigen::Matrix<T,-1,-1>18:59
@HeikoSno worries18:59
@HeikoSc4goldsw: so my thinking is this:19:00
c4goldswI was going to do that, I know it's messy  / hard to read19:00
@HeikoSmodular interfaces dont do templates19:00
@HeikoSpython e.g.19:00
@HeikoSthere is no template19:00
@HeikoSso we translate templated type as19:00
@HeikoSetc etc19:00
@HeikoSthat means 10 new interface types for every templated class19:00
@HeikoSso we want to keep this down19:00
@HeikoSand only template stuff that really needs to be19:01
@HeikoSalgorithm classes dont need to be19:01
@HeikoSthey just need to be able to deal with features that are templated, but this happens all inside19:01
c4goldswGood, that makes sense19:01
@HeikoSc4goldsw: cool19:01
@HeikoSc4goldsw: so the tldr is19:01
@HeikoSyou want to get rid of19:01
@HeikoSCDenseFeatures<float64_t> feats = (CDenseFeatures<float64_t>*) m_feats19:02
shogun-notifier-shogun: lambday :develop * d43c1cd / src/shogun/distance/EuclideanDistance.cpp:
shogun-notifier-shogun: fix uninitialized memory read error in CEuclideanDistance and a typo19:03
shogun-notifier-shogun: Soumyajit De :develop * 1fede5d / src/shogun/distance/EuclideanDistance.cpp:
shogun-notifier-shogun: Merge pull request #3307 from lambday/feature/euclidean_refactor_bugfix19:03
shogun-notifier-shogun: fix uninitialized memory read error in CEuclideanDistance and a typo19:03
shogun-buildbotbuild #735 of trusty - libshogun - viennacl is complete: Failure [failed compile]  Build details are at  blamelist: lambday <>19:04
sanujHeikoS, can you also see
shogun-buildbotbuild #736 of trusty - libshogun - viennacl is complete: Failure [failed compile]  Build details are at  blamelist: Soumyajit De <>19:05
@HeikoSsanuj: question19:06
c4goldswHeikoS alright, this also makes sense now (I know that's starting to sound like a stock phrase but really, it does).  Thanks for the help.  I should have the PR in by tomorrow19:06
@HeikoSc4goldsw: cool!19:06
@HeikoSsanuj: so CSGObject::set19:06
-!- c4goldsw [5da420e6@gateway/web/cgi-irc/] has quit [Quit: - A hand crafted IRC client]19:06
@HeikoSreturns what it got if there was nothing before, otherwise returns the thing that was there before19:06
sanujHeikoS, bazdmeg told me to do indicate whether a parameter with a particular name already exists19:07
@HeikoSsanuj: what is the use case?19:07
sanuji mean ==> is a parameter being overwritten?19:07
@HeikoSwhy not boolean?19:07
@HeikoSwhy the value?19:08
@HeikoSbazdmeg: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!19:08
@HeikoSwhat is this bazdmeg???19:08
@HeikoSno, seriously, I dont get  it19:08
sanujbazdmeg !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!19:08
@HeikoSput a comment in the PR :)19:08
@HeikoSreading more of it19:08
sanujHeikoS, it returns the overwritten value19:08
sanujif the user wants to save it somewhere19:09
@HeikoSthen the user should call get19:09
@HeikoSin this case, user needs to do a comparison between argument passed and result returned, and the decide to store if they are different19:09
sanujask bazdmeg :D19:09
@HeikoSthis is slightly ridiulous19:09
@HeikoSsanuj: its your project :D19:10
@HeikoSso I ask you19:10
@HeikoSyou should have an opinion on this19:10
sanujI'm not sure19:10
sanujHeikoS, i think when we added this we didn't have has() and hastype()19:11
@HeikoSmake it void19:11
@HeikoSuser should check himself19:11
@HeikoSwhether there is already something19:11
@HeikoSjust use has19:11
@HeikoSand then get19:11
@HeikoSif interested in storing19:12
@HeikoSneeds to be known at compile time anyways19:12
@HeikoSso point19:12
sanujHeikoS, i'll make it void right now and update it19:13
@HeikoSsanuj:  ok next question >:D19:14
@HeikoSsanuj: why this?19:14
@HeikoSdoes every BaseTag have a hash?19:14
@HeikoSor sometimes only string?19:14
@HeikoSso why do you compare the strings?19:15
sanujHeikoS, every BaseTag has a hash19:15
@HeikoSoperator== is called all the time, e.g. for every get19:16
@HeikoSstring comparisons cost19:16
@HeikoSso I think string comparison should go19:16
@HeikoSand only compare hash19:16
@HeikoSstring is just for user to identify19:16
sanujHeikoS, nice suggestion19:17
@HeikoSsanuj: minor: why do you use name_ and _name19:17
@HeikoSany conflict?19:17
@HeikoSwhich one?19:17
sanujHeikoS, 'name' raises warnings19:18
@HeikoSwe call members m_name19:18
@HeikoSwhat warning?19:18
@HeikoS"shadows a member of this"?19:18
sanujHeikoS, yep19:18
sanuji'll change it to m_name19:18
@HeikoSm_name then for member please19:18
Saurabh7HeikoS, you had some ideas about making multicore ?19:19
@HeikoSSaurabh7: yeah19:19
@HeikoSSaurabh7: lets discuss in 5min19:20
@HeikoSsanuj: another one :)19:21
@HeikoSthis "training data"19:21
@HeikoSI dont see why users/devs should be allowed to just add new parameters to instances19:22
@HeikoSbut rather we only want to allow to change parameters that are registered in the class itself, right?19:22
@HeikoSwith SG_ADD19:22
sanujHeikoS, you want them to add parameters with fixed names?19:23
@HeikoSbut SG_ADD is not there yet, so I guess we can't test otherwise19:23
@HeikoSsanuj: yeah of course19:23
@HeikoSsanuj: like SG_ADD19:23
@HeikoSonly those parameters should be possible to add19:23
@HeikoSso to reproduce the unit test you did there, you need to create a mock object19:23
@HeikoSwhere you in the constructor add a tag parameter19:23
@HeikoSand then we set this in the test19:23
@HeikoSsanuj: understand that?19:23
@HeikoSsanuj: I will explain in PR19:25
sanujHeikoS, i seeeeeeeeee19:33
sanujHeikoS, i need to discuss this with bazdmeg19:35
sanujHeikoS, why didn't you tell me all this last week when you reviewed the same PR??19:36
@HeikoSsanuj: I just put a little draft for a test19:39
@HeikoSsanuj: PR was too big19:40
@HeikoSto review19:40
sanujHeikoS, okay :D19:40
@HeikoSthen, its hard to realise such things19:40
@HeikoSalso, too many GSoC projects :D19:40
sanujHeikoS, less than last to last time19:40
@HeikoSand finally, again, this is your project, not mine ;)19:40
@HeikoSso you have to try to check out such things as well19:41
sanujHeikoS, yesss okay19:41
@HeikoSbut dont worry19:41
@HeikoSall good19:41
@HeikoSthis is a good patch19:41
@HeikoSwe just need to make it better19:41
sanujHeikoS, thanks :D19:41
@HeikoSsanuj: updated comment19:45
@HeikoSthe code I pasted is now a bit different19:45
@HeikoSsanuj: ok then, you got some things to update19:48
@HeikoSlet me know when all comments are addressed, and we will see what else we can find in there ;)19:48
@HeikoSI gotta talk to Saurabh7 now19:48
sanujHeikoS, okay, thanks19:49
Saurabh7HeikoS, hey19:50
Saurabh7so what do you think how would we start with the thread safety19:51
@HeikoSso the way to do it19:53
@HeikoSis similar to the way we did it in xvalidation19:53
@HeikoSbut without clone19:53
@HeikoSbut rather a shallow copy19:53
@HeikoSso everytime you want to thread-safe subset19:53
@HeikoSyou create a shallow copy of the CFeature object19:54
@HeikoSlambday in fact did that already :)19:54
@HeikoSyou can copy that19:54
Saurabh7yes thats should be easy with densefeatures attleast19:54
@HeikoSthe sub-set stack is still shared, right?19:54
@HeikoSsince it is shallow copy19:54
@HeikoSin fact, lambday already clones the subset stack in his method19:55
Saurabh7it shouldnt be the same obj right19:55
Saurabh7the stack19:55
@HeikoSexactly it needs to be a new one19:55
@HeikoSso the way to do it19:55
@lambdaySaurabh7: yeah I kinda clone the subset19:55
@HeikoSis to call the method something like19:55
@HeikoSand then in there create a shallow copy of the features19:56
@HeikoSthen create a clone of the (collapsed!!!) subset stack19:56
@HeikoSthen the new features object can be assigned subsets19:56
@HeikoSmake sure to not clone the full subset stacj19:56
@HeikoSbut rather collapse it before, I think there is a method19:56
Saurabh7what exactly do you mean by collapse19:56
@HeikoSSaurabh7: imagine you have 100 vector on subsetstack19:58
@HeikoSthen lookup means looking up 100 vector indices19:58
@HeikoSthats slow19:58
@HeikoSso the subset stack always stores the "collapsed" version19:58
@HeikoSthat contains all these 100 mappings19:58
@HeikoSyou can get it with get_last_subset19:58
Saurabh7oh yes yes i saw that19:59
Saurabh7got it19:59
@HeikoSso in this shallow_subset_copy() method19:59
@HeikoSyou create a new subset stack19:59
@HeikoSand initialise it with get_last_subset() of the original features19:59
@HeikoSgot that?19:59
@HeikoSSaurabh7: then, when this is done, I want you to make all methods that you use inside the parallel code: const19:59
@HeikoSI guess you use20:00
@HeikoSget_feature_matrix() returns a copy if subset is active, so that should not be used20:00
Saurabh7no mat operators20:00
Saurabh7i mean mat operators are used ()20:00
@HeikoSwhich ones do you use?20:00
@HeikoSget_feature_matrix must not be used when subsets are active20:01
@HeikoSotherwise, c9opy20:01
@HeikoSso how do you access the features?20:01
@HeikoSso basically, you can only use get_feature_vector20:02
@HeikoSsince this does not copy the memory20:02
Saurabh7HeikoS, get_feature_matrix is used20:02
Saurabh7and then its accesed  , right now20:02
Saurabh7so I will try to change that20:03
@HeikoScheck line 89 of CDenseFeatures20:03
@HeikoStemplate<class ST> ST* CDenseFeatures<ST>::get_feature_vector(int32_t num, int32_t& len, bool& dofree)20:03
@HeikoSand the wrapped one20:03
@HeikoStemplate<class ST> SGVector<ST> CDenseFeatures<ST>::get_feature_vector(int32_t num)20:03
@HeikoSthese guys do not copy20:03
@HeikoSget_feature_matrix() always copies20:03
@HeikoSif you have a subset active20:04
@HeikoSSaurabh7: try it20:04
@HeikoSif you need to to linear algebra operations on the (subsetted) feature matrix, you need to copy20:04
Saurabh7HeikoS, ok I will cahnge that20:04
@HeikoSbut for random forest, I dont think you need to20:04
Saurabh7so the subset are set on features20:04
Saurabh7get matrix20:05
Saurabh7^ this is what it is right now20:05
@HeikoSSaurabh7: btw, can you make the existing patch merge ready before you start?20:05
@HeikoSSaurabh7: yes20:05
@HeikoS1.) create shallow copies of features, each with a new subset stack initialised to the get_active_subset of old features20:05
@HeikoS2.) only use get_feature_vector20:05
Saurabh7HeikoS, ok I will see if anything is left to polish in the patch20:06
@HeikoS3.) make everything inside parallel const20:06
@HeikoSSaurabh7: cool20:06
Saurabh7so actually it was being copied everytime, interesting20:06
@HeikoSSaurabh7: yes20:06
@HeikoSmemcpy is fast20:06
@HeikoSbut not doing it is faster20:06
Saurabh7so the shallow copy method , I add ti to densefeatures ?20:07
Saurabh7HeikoS, ^20:07
@HeikoSSaurabh7: no to CFeatures20:08
@HeikoSSaurabh7: and then overload in CDenseFetaures20:08
@HeikoSthis also has to work with other features20:08
@HeikoSwill need to make that work for string features as well later20:08
Saurabh7and what about labels20:08
@HeikoSwhen we touch x-validation again to also share the data20:08
@HeikoSSaurabh7: same story for labels, yes20:08
@HeikoShave a look, they have the same subset stack things inside20:09
Saurabh7yep ok20:09
Saurabh7alright looks clear this one :)20:09
shogun-notifier-shogun: Heiko Strathmann :feature/meta_vector_matrix * 01b9a58 / examples/meta/src/tests/,examples/meta/src/tests/
shogun-notifier-shogun: not test long real vector for now, travis doesn't like it20:10
@HeikoSSaurabh7: great20:10
@HeikoSI gotta leave now20:10
@HeikoSSaurabh7: will be in France until Monday, I take my computer, so send me emails if things are unclear. I will also try to merge things, dont panic if I dont though. IRC will be limited20:10
@HeikoSsanuj: ^20:10
Saurabh7HeikoS, cool , mail frm tmrw ?20:11
Saurabh7yep cool20:11
sanujHeikoS, okayy20:11
@HeikoSSaurabh7: yep!20:11
@HeikoSsee you guys20:12
@HeikoSkeep up the good work :)20:12
@HeikoSbazdmeg: bazdmeg!!!!!20:12
@HeikoSwiking: bazdmeg!!!!!20:12
sanujHeikoS, take care, have fun in france20:12
@HeikoSlambday: bazdmeg!!!!!20:12
@HeikoSshogun-buildbot: dance20:12
Saurabh7whats that :D20:12
Saurabh7ok gn every120:13
-!- Saurabh7 [~Saurabh7@] has quit [Quit: Leaving]20:13
-!- HeikoS [] has quit [Quit: Leaving.]20:13
-!- travis-ci [] has joined #shogun20:14
travis-ciit's Heiko Strathmann's turn to pay the next round of drinks for the massacre he caused in shogun-toolbox/shogun:
-!- travis-ci [] has left #shogun []20:14
-!- sanuj [~sanuj@] has quit [Remote host closed the connection]20:16
-!- lambday [8028b10a@gateway/web/freenode/ip.] has quit [Quit: Page closed]20:23
-!- TanNguyen [~dra@] has quit [Ping timeout: 264 seconds]21:31
-!- TanNguyen [~dra@] has joined #shogun21:44
-!- lambday [569de6b3@gateway/web/freenode/ip.] has joined #shogun21:56
-!- mode/#shogun [+o lambday] by ChanServ21:56
-!- besser82 [~besser82@fedora/besser82] has joined #shogun22:11
-!- mode/#shogun [+o besser82] by ChanServ22:11
bazdmegwhat the fuuzz22:20
bazdmeglambday: do oyu have any idea22:20
bazdmegwhy heiko reverted wrap22:20
@lambdaybazdmeg: nope.. what's wrap?22:21
bazdmeguhmm that's a functions22:21
bazdmegthat wraps pointers to some22:21
bazdmegbut returns the object otherwise22:21
bazdmegso it's like a wrap for pointers to make them delete once used22:21
@lambdaybazdmeg: yeah I understand22:21
@lambdaybazdmeg: but sorry he didn't discuss anything about that with me22:22
-!- travis-ci [] has joined #shogun22:22
travis-ciit's Heiko Strathmann's turn to pay the next round of drinks for the massacre he caused in shogun-toolbox/shogun:
-!- travis-ci [] has left #shogun []22:22
@lambdaybazdmeg: checked the irc log..22:23
@lambdaybazdmeg: apparently things were broken22:23
bazdmegfuck my life!22:24
@lambdaybazdmeg: whoa22:25
-!- HeikoS_web [8028d5f1@gateway/web/freenode/ip.] has joined #shogun22:59
HeikoS_webwiking bazdmeg23:00
bazdmegHeikoS_web: what's wrong23:00
bazdmegwith wrap23:00
HeikoS_webevery assignment is wrapped23:00
HeikoS_websee my feature branch23:00
HeikoS_webthere i want to assign numbers to vectors23:00
bazdmegis it aesthetic?23:01
bazdmeglike wrap(3) is ugly?23:01
HeikoS_webno i thought it broke the assignment23:01
HeikoS_webbut actually23:01
bazdmegno way23:01
HeikoS_webi might not have been careful23:01
HeikoS_webi cant check right now23:01
HeikoS_webcan you push the json change back to my feature branch_23:01
HeikoS_webthe travis there is currently broken, but we can see what happens if this is added back23:02
HeikoS_webalso feel free to add vector instantiation support in the jsons of the language bindings that fail23:02
HeikoS_webgotta go23:04
HeikoS_websee you later23:04
HeikoS_webmight change that tomorrow23:04
bazdmegok will try a bit later23:04
HeikoS_webbazdmeg: I told sanuj to change a few things btw23:07
HeikoS_webbazdmeg: lots of the stuff in there didnt make sense23:07
HeikoS_webkind of involved, but still23:07
bazdmegwhat stuff23:07
HeikoS_webbazdmeg: e.g. setters should only work for previously registered tags23:08
bazdmegwhy so?23:08
HeikoS_weblike i should not be able to set "training_data" of CDenseFeatures23:08
HeikoS_webbecause I should only be able to write to things that were member variables before23:08
bazdmeguhmm ok that's the next step23:08
HeikoS_webwhy next step? can do that now23:08
HeikoS_webcan unit test with mock classes23:09
HeikoS_webthere has to be a public setter that checks and a private setter to that replaces SG_ADD23:09
HeikoS_webthe other things were23:09
HeikoS_webwhy does the == operator compare the strings? no need23:09
HeikoS_webjust hash23:09
HeikoS_webthird was, why does set return things?23:09
HeikoS_webin this weird way23:10
HeikoS_webthat if something was there, it is returned23:10
HeikoS_webotherwise argument23:10
bazdmegwell it should be returning Maybe23:10
-!- shogun-notifier- [] has quit [Quit: transmission timeout]23:10
HeikoS_webjust use has23:10
HeikoS_webbefore set call23:10
HeikoS_weband then use get if want to save it23:10
bazdmegwell maybe23:10
HeikoS_webthere also is question:23:11
HeikoS_webdo we merge this to develop?23:11
HeikoS_weband then hack the SG_ADD?23:12
bazdmegif we start using it like with SG_ADD23:12
bazdmegthen to develop23:12
HeikoS_weband another one is: we dont need member variables anymore right?23:12
HeikoS_webso should this be re-factored?23:12
bazdmegat some point23:12
bazdmegHeikoS_web: with some magic in SG_ADD23:12
HeikoS_weband all member variable soccurences are replaced with the get call23:12
bazdmegwe can make them point to the same place23:12
HeikoS_webyeah but definition I mean23:12
bazdmegso get_something23:13
bazdmegand get("something")23:13
bazdmegis the same23:13
HeikoS_webyeah sure, just ::set(m_member, "bla"(23:13
HeikoS_webbut in fact23:13
HeikoS_webwe dont even need to declare the member anymore, am I right?23:13
bazdmegHeikoS_web: we have to23:13
HeikoS_webit can just live in the map, being put there in constructor with SG_ADD23:13
bazdmeglike in SG_ADD23:13
bazdmegjust in sg_add23:13
HeikoS_webbut I can also do23:13
HeikoS_web::set(SGVEctor<...>, "member"(23:14
HeikoS_web::set(SGVector<T>(), "member"(23:14
HeikoS_weband then the thing just lives in the map23:15
HeikoS_webno more declaration23:15
HeikoS_webkinda weird23:15
HeikoS_webno member variable declared23:15
HeikoS_weball members added at runtime23:15
HeikoS_webbut its cool23:16
bazdmegwhy weird23:16
bazdmegis python weird?23:16
HeikoS_webthats exactly it23:16
HeikoS_webanyway,this refactor is insane anyways23:16
HeikoS_webso first step, we just register the member23:16
HeikoS_webusing SG_add change23:16
bazdmegwe don't finish it tihs year23:16
HeikoS_webso I want to merge this stuff soon23:16
HeikoS_webI mean the current patch23:16
bazdmegok I think I need to do some SG_ADD hackery23:17
HeikoS_webquestion: to develop?23:17
bazdmegit would be really tricky23:17
HeikoS_webor not23:17
bazdmeg*with* SG_ADD23:17
HeikoS_webit is not too bad23:17
bazdmegit can go to develop23:17
HeikoS_webas SG_ADD already takes name23:17
HeikoS_weband reference23:17
HeikoS_webthe old one m_parameter->add, is harder23:17
bazdmegit should go to develop but *with* SG_ADD23:17
HeikoS_webso we merge this to feature branch first23:17
HeikoS_webthen polish a bit23:17
HeikoS_webthen add SG_ADD23:18
HeikoS_weband then merge23:18
HeikoS_webto develop23:18
HeikoS_webwhile developing SWIg stuff in parallel23:18
HeikoS_webbazdmeg: see my comments on the PR23:18
HeikoS_webafter that, I am fine to merge23:18
HeikoS_webbazdmeg: Ill leave that to you23:18
HeikoS_weboh one thing is23:18
HeikoS_web100% test coverage23:18
HeikoS_webhe didnt do that yet right?23:19
HeikoS_webwe will see23:19
HeikoS_webgotta go home now23:19
HeikoS_websee you23:19
-!- OXPHOS [c68f0c0c@gateway/web/freenode/ip.] has joined #shogun23:40
--- Log closed Wed Jun 22 00:00:50 2016