Files
2012-02-21 01:15:00 -05:00

1 line
48 KiB
JSON

[{"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376662.645113, "message": "ah ok, cool/", "group_id": 9959, "id": 1305429}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373764.031455, "message": "yep", "group_id": 9959, "id": 1304653}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373123.0271361, "message": "is the code in github?", "group_id": 9959, "id": 1304471}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307372637.7836771, "message": "I believe Chris is coming as well, so will we wait a few minutes?", "group_id": 9959, "id": 1304352}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307372588.161808, "message": "hi thouis", "group_id": 9959, "id": 1304343}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307372656.0806489, "message": "Something I forgot to mention in my comment, that I would like to get into the record before I forget. The use_backend function should accept a keyword argument for what to do in case of a not-implemented function. It should either transparently fall back to numpy, or fail.", "group_id": 9959, "id": 1304355}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307372901.6410439, "message": "Just convore, but we can do skype as well if you feel it works better", "group_id": 9959, "id": 1304415}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373326.681607, "message": "if you want to check it out", "group_id": 9959, "id": 1304528}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307372661.020489, "message": "Yes.", "group_id": 9959, "id": 1304359}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307372737.701699, "message": "Right", "group_id": 9959, "id": 1304374}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373722.621105, "message": "Side note: I wonder if it would be better to organize things as sk.imaging.backends.filters.convolve", "group_id": 9959, "id": 1304645}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373728.2847531, "message": "Yep I think we are agreed on that", "group_id": 9959, "id": 1304646}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373755.5057011, "message": "Right. But you can use use_backend() mixed with explicit imports", "group_id": 9959, "id": 1304652}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307372864.5773931, "message": "hey", "group_id": 9959, "id": 1304410}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307372919.8521161, "message": "I'm ok with this for now. We'll see how it plays out.", "group_id": 9959, "id": 1304419}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373423.997386, "message": "each function call registers itself at the backend manager", "group_id": 9959, "id": 1304552}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373501.9236391, "message": "or rather, it reassigns all registered functions to point to the backend counterparts", "group_id": 9959, "id": 1304578}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373804.305326, "message": "the use_backend function will not be able to alter that reference", "group_id": 9959, "id": 1304658}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373952.5305181, "message": "But a warning could be generated if there's something in sys.modules that came from scikit.image before the use_backend call was made, unless a \"warn=False\" flag is passed.", "group_id": 9959, "id": 1304693}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373604.5777371, "message": "backend(\"superfastconvolve\").convolve could perhaps be an alternate syntax", "group_id": 9959, "id": 1304611}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373523.8540201, "message": "@scolbert - I don't see where that occurs. Isn't everything in a filters.backend.XYZ module (for the XYZ backend)?", "group_id": 9959, "id": 1304587}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373882.536531, "message": "I see what you are saying.", "group_id": 9959, "id": 1304666}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307372583.640404, "message": "Hello.", "group_id": 9959, "id": 1304340}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373683.3144131, "message": "Especially if you do an from backends.superfastbackend import convolve as sfb_convolve", "group_id": 9959, "id": 1304635}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373739.9217329, "message": "but I'd be happy with both ways, actually I think thouis' is more pythonic", "group_id": 9959, "id": 1304648}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373846.640044, "message": "really? can't the edges module do the right thing at import, if use_backend has been called?", "group_id": 9959, "id": 1304663}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373319.25123, "message": "I've also added a test_backend.py file to the filter dir, just for testing", "group_id": 9959, "id": 1304522}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307372717.1909959, "message": "The default should probably be numpy, but if the user wants to be sure of using the accelerated backend, then they could pass fallback=None or fallback='Fail'", "group_id": 9959, "id": 1304368}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307372874.5868981, "message": "are we using a voip service or just convore?", "group_id": 9959, "id": 1304412}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307372972.7783611, "message": "@thouis I tend to agree that adding a kwarg to each function to specify a backend leads to some cruft. But, it would be nice to be able to change the backend for only a single call to a func.", "group_id": 9959, "id": 1304425}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373099.4862189, "message": "at the moment add_backends1 and add_backends2", "group_id": 9959, "id": 1304463}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373532.926183, "message": "i.e. you may find yourself doing:\n\n# use a fast, less precise convolution for my large images\nfor img in images:\n convolve(img, mask, backend='superfastconvolve')\n\n# go back to the normal high precision convolve\nconvolve(something, mask)", "group_id": 9959, "id": 1304590}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307372911.929208, "message": "Unfortunately not set up over here at the moment", "group_id": 9959, "id": 1304416}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307372962.0217381, "message": "Ok so let's start. I've implemented two prototypes of a backend system", "group_id": 9959, "id": 1304423}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307372982.7522459, "message": "Hi chris", "group_id": 9959, "id": 1304428}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373007.7472031, "message": "Howdy", "group_id": 9959, "id": 1304432}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373011.4238801, "message": "The first prototype adds the backend= keyword", "group_id": 9959, "id": 1304433}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373090.7542951, "message": "both implemented as decorators", "group_id": 9959, "id": 1304457}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373324.7887709, "message": "Sorry, missed that this had started", "group_id": 9959, "id": 1304526}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373350.002892, "message": "?", "group_id": 9959, "id": 1304535}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373863.7311251, "message": "if you call use_backend *before* the import, then that would be fine", "group_id": 9959, "id": 1304664}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373896.855129, "message": "else if there is a way I would be most glad to implement :)", "group_id": 9959, "id": 1304672}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374247.2356329, "message": "the import hacks may not be a good idea, though.", "group_id": 9959, "id": 1304757}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374247.52547, "message": "@thouis, the decorator could still add the documentation to the sentinel function. So what you would have is the sentinel func would have the algorithm description followed by the signatures for each backend implementation", "group_id": 9959, "id": 1304758}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373128.3190329, "message": "https://github.com/holtzhau/scikits.image/blob/7a7f57ac73157253543301ac81ff5a74f519f650/scikits/image/filter/edges.py", "group_id": 9959, "id": 1304473}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373225.295742, "message": "it is an if statement and a dictionary lookup but i guess it could be frowned upon", "group_id": 9959, "id": 1304497}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373414.393872, "message": "So the second prototype, inspired by what I understood you and Chris recommended, has a backend manager system", "group_id": 9959, "id": 1304550}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373779.7984431, "message": "If I understand you correctly, thouis, that is an issue yes.", "group_id": 9959, "id": 1304655}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374061.093173, "message": "class BackendManager(object):\n def register_func(....):\n\n def call_func(....):\n\n def switch_backend(....):\n\nbackend_mgr = BackendManager(...)\n\ndef add_backend(func):\n backend_mgr.register_func(func)\n .....\n\n\ndef use_backend(bknd):\n backend_mgr.switch_backend(bknd)\n\n\ndef sobel(*args, **kwargs):", "group_id": 9959, "id": 1304716}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373195.335371, "message": ":-) $ git branch backend_poc && git checkout backend_poc", "group_id": 9959, "id": 1304492}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373276.454515, "message": "it will be minimal wrt to the actual operation", "group_id": 9959, "id": 1304512}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373348.4362509, "message": "Hi thouis :)", "group_id": 9959, "id": 1304533}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307374121.1113269, "message": "Ok, the internal workings of all this are a bit new to me", "group_id": 9959, "id": 1304733}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373168.609894, "message": "so add_backends1 adds some overhead to each method call", "group_id": 9959, "id": 1304482}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373906.133363, "message": "It could cause some confusion though", "group_id": 9959, "id": 1304676}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374143.189045, "message": "using a mgr eliminates these import hacks, which I don't like at all. And the overhead is just a function call and a hash which is still minimal.", "group_id": 9959, "id": 1304738}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373431.3652129, "message": "during initialization", "group_id": 9959, "id": 1304556}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373449.17223, "message": "@thouis namespace pollution", "group_id": 9959, "id": 1304560}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373818.639667, "message": "So edges.sobel would be necessary", "group_id": 9959, "id": 1304660}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373153.06145, "message": "I apologize for putting it in edges.py, but it was most convenient while we still finalize somethings", "group_id": 9959, "id": 1304480}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373659.4825239, "message": "I'd be happy with that", "group_id": 9959, "id": 1304626}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373659.8660779, "message": "Sorry, I don't see how that's better than backends.superfastbackend.convolve()", "group_id": 9959, "id": 1304627}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373911.3107409, "message": "hmmm, what about having some sentinel functions, that just dispatch through a backend manager", "group_id": 9959, "id": 1304679}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374124.410053, "message": "@sccolbert - doesn't that make documentation difficult?", "group_id": 9959, "id": 1304734}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374145.379508, "message": "@holtzhau - I'm not saying that it's difficult, just somewhat confusing to end users.", "group_id": 9959, "id": 1304739}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373258.181946, "message": "an if + a hash will be around ~120ns on a fast machine. That's not too bad.", "group_id": 9959, "id": 1304503}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373347.8199069, "message": "@scolbert: for the single-call change use-case, why not just rely on explicit import", "group_id": 9959, "id": 1304532}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373450.3507431, "message": "The main way of switching a backend would be a use_backend(\"backend\") call", "group_id": 9959, "id": 1304561}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373481.4684539, "message": "that call reassigns the function in the module to point to the backend function, thus no overhead", "group_id": 9959, "id": 1304571}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373601.3685, "message": "also, I'm still reading the code on github", "group_id": 9959, "id": 1304610}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374235.3831711, "message": "it's trading more end-user work for developer work.", "group_id": 9959, "id": 1304754}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373573.623456, "message": "my argument is the case where you want to switch between backends in a module for some reason, you should have to pay a high switching cost.", "group_id": 9959, "id": 1304601}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373704.21945, "message": "Just saying there's a usecase where you don't want module level use_backend(...) calls all over the place", "group_id": 9959, "id": 1304639}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307373912.380794, "message": "Yes, use_backend() needs to be explicit in its documentation that previous imports are not handled.", "group_id": 9959, "id": 1304680}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373677.206919, "message": "I'm not saying it's better :)", "group_id": 9959, "id": 1304633}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307373789.294827, "message": "When you do\nfrom edges import sobel", "group_id": 9959, "id": 1304656}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374176.6510711, "message": "@thouis it makes docs more difficult, but I'll gladly pay for the complexity there in lieu of implementation complexity and import hacks", "group_id": 9959, "id": 1304744}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374218.832727, "message": "@sccolbert trading off documentation for implementation complexity is not a good trade.", "group_id": 9959, "id": 1304751}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307374065.0127289, "message": "Hmm perhaps one could access sys.modules and modify?", "group_id": 9959, "id": 1304718}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374277.1101811, "message": "so you would still get the docs. In fact, that would be a better doc since it would immediately tell you which backends implement the func", "group_id": 9959, "id": 1304764}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373932.588964, "message": "then you don't have to rebind anything", "group_id": 9959, "id": 1304688}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373947.1980491, "message": "something like:", "group_id": 9959, "id": 1304692}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374081.8235199, "message": "def sobel(...):\n backend_mgr.call_function('sobel', *args, **kwargs)", "group_id": 9959, "id": 1304720}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307373925.7134931, "message": "then, use_backend(...) just flips a switch in the manager", "group_id": 9959, "id": 1304686}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374090.6905119, "message": "@holtzhau: I think that's a bad idea.", "group_id": 9959, "id": 1304722}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374286.1490419, "message": "@sccolbert - but if I do help(sobel), I don't get immediate feedback about what backend is in use", "group_id": 9959, "id": 1304767}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374292.404542, "message": "which I do get from the import hacks", "group_id": 9959, "id": 1304769}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374321.562746, "message": "the import hacks could include \"see also\" for other backends, as well.", "group_id": 9959, "id": 1304771}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374713.3392589, "message": "is counter to all good software engineering practices", "group_id": 9959, "id": 1304884}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307374359.712358, "message": "If you could be a bit more specific with \"import hacks\", because some import magic will need to happen somewhere along the line", "group_id": 9959, "id": 1304784}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374366.4364541, "message": "@thouis swapping out docstrings when changing backends it too much magic for me. Explicity is better than implicit.", "group_id": 9959, "id": 1304787}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374597.2977581, "message": "In unknown code.", "group_id": 9959, "id": 1304851}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374923.677175, "message": "Ah. I see.", "group_id": 9959, "id": 1304944}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374385.1737659, "message": "if someone does use_backend('foo') from an interactive session, then does help(sobel)", "group_id": 9959, "id": 1304790}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374520.9854741, "message": "from the backend", "group_id": 9959, "id": 1304827}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374722.8701341, "message": "I don't think imports are CPython specific.", "group_id": 9959, "id": 1304887}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374858.764122, "message": "one sec", "group_id": 9959, "id": 1304928}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374906.6591859, "message": "from scikits.image import use_backend\n\nuse_backend('foo')\n\nfrom sickits.image import sobel\n\nsobel(img)\n\n\nuse_backend('bar')\n\nsobel(img)", "group_id": 9959, "id": 1304938}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374945.198828, "message": "My thought was that only a single call to use_backend() would be accepted.", "group_id": 9959, "id": 1304951}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374950.4272029, "message": "ah!", "group_id": 9959, "id": 1304952}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307375050.5897009, "message": "Ok Chris, so I'll implement a prototype of a more explicit manager structure and then me and Stefan can go through the bunch and go with something that works well.", "group_id": 9959, "id": 1304979}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374392.747613, "message": "they know they are using the 'foo' backend", "group_id": 9959, "id": 1304792}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374438.352773, "message": "Debugging someone else's code, trying to figure out what function is being called.", "group_id": 9959, "id": 1304804}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374616.6724501, "message": "(even if I wrote it, I probably forgot it, already).", "group_id": 9959, "id": 1304856}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374405.5938959, "message": "and can look specifically at the 'foo' section of the docstring", "group_id": 9959, "id": 1304796}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374456.8556161, "message": "or!", "group_id": 9959, "id": 1304808}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374501.9723179, "message": "sickits.image.sobel.which", "group_id": 9959, "id": 1304820}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374516.225625, "message": "which will return the actual function object that will be called", "group_id": 9959, "id": 1304824}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375136.0893421, "message": "yes!", "group_id": 9959, "id": 1305024}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375381.0745161, "message": "gah, only works with Ipython's ?", "group_id": 9959, "id": 1305089}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374410.9987049, "message": "I'm thinking more about working in pdb", "group_id": 9959, "id": 1304797}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374421.516947, "message": "in fact, I would claim it's nice to compare the two side by side", "group_id": 9959, "id": 1304800}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374593.7721939, "message": "That call to use_backend() could be far away.", "group_id": 9959, "id": 1304849}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307374815.1839099, "message": "if I say sobel=sobel_opencv, it is not considered awful to such an extent", "group_id": 9959, "id": 1304915}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374853.4348259, "message": "so what happens with this:\n\nfrom sickits.image import sobel", "group_id": 9959, "id": 1304924}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374974.849081, "message": "an therein lies our miscommunication :)", "group_id": 9959, "id": 1304960}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307375244.7463131, "message": "Not completely, but I'm happy enough.", "group_id": 9959, "id": 1305057}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375428.2706101, "message": "Help on Foo in module __main__ object:\n\nclass Foo(__builtin__.object)\n | Data descriptors defined here:\n | \n | __dict__\n | dictionary for instance variables (if defined)\n | \n | __weakref__\n | list of weak references to the object (if defined)\n(END) \n", "group_id": 9959, "id": 1305110}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374559.403342, "message": "which is indicated by use_backend", "group_id": 9959, "id": 1304839}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375015.2833941, "message": "I would like to support this kind of switching, which is why I like the idea of dispatching manager.", "group_id": 9959, "id": 1304969}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307375789.327899, "message": "With dispatch (whatever method used to implement it), they could have somewhat varying APIs", "group_id": 9959, "id": 1305196}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376177.7586999, "message": "Perhaps a good idea to operate from the same view point. I will think of a few use cases where we could need to apply that.", "group_id": 9959, "id": 1305274}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376367.8662469, "message": "Hehe", "group_id": 9959, "id": 1305347}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376763.3416309, "message": "Aw", "group_id": 9959, "id": 1305477}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374446.53315, "message": "@thouis, just have a scikits.image.which_backend()", "group_id": 9959, "id": 1304807}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376069.8777781, "message": "ah, ok", "group_id": 9959, "id": 1305250}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376182.7460949, "message": "I can definitely see the benefit of not needing to change call signatures when changing backends", "group_id": 9959, "id": 1305277}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376502.906769, "message": "The code looks a lot better than the opencv people's ;)", "group_id": 9959, "id": 1305383}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376590.145417, "message": "Nope, similar to yours", "group_id": 9959, "id": 1305410}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374549.959547, "message": "you wouldn't need to know any more than \"there are multiple backends\"", "group_id": 9959, "id": 1304837}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374616.694664, "message": "scikits.image.which_backend", "group_id": 9959, "id": 1304857}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374781.0937109, "message": "thats a god awful hack", "group_id": 9959, "id": 1304907}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374856.8871651, "message": "gah!", "group_id": 9959, "id": 1304925}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375201.946044, "message": "this makes everyone happy", "group_id": 9959, "id": 1305044}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374479.6144221, "message": "a 'which' property on the sentinel function", "group_id": 9959, "id": 1304815}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374482.1693161, "message": "@holtzhau It's possible to do it without import hacking, but maybe not the cleanest way", "group_id": 9959, "id": 1304816}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374544.0604429, "message": "If I get dropped into someone else's code, I'd like to be able to do sobel.__module__", "group_id": 9959, "id": 1304834}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374660.551904, "message": "I don't understand why it's preferred to write a dispatch system when that's what modules already give you.", "group_id": 9959, "id": 1304867}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374775.7960589, "message": "but you're talking about swapping out function objects in a modules namespace dynamically", "group_id": 9959, "id": 1304905}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374813.651243, "message": "no, I'm suggesting that when I import scikit.image.edges, it uses from backend.FOO import * where FOO is determined by the use_backend() call.", "group_id": 9959, "id": 1304913}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374943.8442659, "message": "you can't change what sobel does without a) swapping out the function or b) having the function go through a level of indirection", "group_id": 9959, "id": 1304950}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307375063.3061121, "message": "So a more end-user transparent option was my preference.", "group_id": 9959, "id": 1304989}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307375362.798857, "message": "But if I get useful information from help(), and possibly a pointer to a .which that I can chase easily, it's probably enough.", "group_id": 9959, "id": 1305082}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374524.1317279, "message": "Then I have to know more about the scikits backend system to know what sobel() does.", "group_id": 9959, "id": 1304828}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374552.8239031, "message": "and get the actual module it's in.", "group_id": 9959, "id": 1304838}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376409.5896759, "message": "It works quite well with numpy", "group_id": 9959, "id": 1305356}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374616.1072791, "message": "again", "group_id": 9959, "id": 1304855}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374640.848475, "message": "I don't see how that would ever be an inconvienence", "group_id": 9959, "id": 1304861}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307374700.0492799, "message": "because you're relying on import hacks and changing things out from under the user, not to mention relying on behavior that is CPython specific", "group_id": 9959, "id": 1304881}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307374830.905329, "message": "although it would be much more explicit", "group_id": 9959, "id": 1304918}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374830.9083891, "message": "...Or something similar", "group_id": 9959, "id": 1304919}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374967.439009, "message": "for that case, I would have fallen back to explicit imports", "group_id": 9959, "id": 1304957}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374748.4026539, "message": "And I'm not suggesting changing anything, except what order things are imported in the scikit submodules.", "group_id": 9959, "id": 1304897}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307375311.718915, "message": "Not sure if it still matches the introspection transparency I'm hoping for.", "group_id": 9959, "id": 1305073}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307375479.8670249, "message": "sccolbert: So in essence you would be satisfied by an extension of my first prototype, sans the keyword argument business", "group_id": 9959, "id": 1305121}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307374997.205488, "message": "use_backend() determines what happens in the \"from scikits.image import sobel\" line", "group_id": 9959, "id": 1304965}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375093.7042749, "message": "lemme prototype something real quick", "group_id": 9959, "id": 1305009}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307375111.2408459, "message": "I think most users might experiment with switching everything, or comparing one or two specific implementations, but generally would just call use_backend() once, and be done.", "group_id": 9959, "id": 1305012}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375223.354383, "message": "all the introspecting stuff can be defined as properties.", "group_id": 9959, "id": 1305048}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375385.410367, "message": "not help(...)", "group_id": 9959, "id": 1305092}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375421.8170769, "message": "not the same thing...", "group_id": 9959, "id": 1305107}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375100.6025541, "message": "I might have an idea....", "group_id": 9959, "id": 1305010}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376014.44471, "message": "or perhaps I don't understand what you're saying?", "group_id": 9959, "id": 1305230}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375147.8178439, "message": "In [1]: class Foo(object):\n ...: @property\n ...: def __doc__(self):\n ...: return 'what the heck'\n ...: \n ...: \n\nIn [2]: f = Foo()\n\nIn [3]: f?\nType: Foo\nBase Class: <class '__main__.Foo'>\nString Form: <__main__.Foo object at 0x1201af0>\nNamespace: Interactive\nFile: /Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/IPython/FakeModule.py\nDocstring:\n what the heck", "group_id": 9959, "id": 1305029}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376001.16558, "message": "@holtzhau, the dispatching function would just take *args, **kwargs", "group_id": 9959, "id": 1305227}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376097.538862, "message": "but it won't affect the current work", "group_id": 9959, "id": 1305256}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376224.810792, "message": "premature optimization and all that...", "group_id": 9959, "id": 1305292}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307376587.941308, "message": "bye", "group_id": 9959, "id": 1305408}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307375051.4145241, "message": "Okay. My feeling was that switching in a single piece of code would be uncommon for end-users.", "group_id": 9959, "id": 1304980}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376066.678062, "message": "of transparent switching", "group_id": 9959, "id": 1305249}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376780.47159, "message": "its a cython wrapper generator", "group_id": 9959, "id": 1305487}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376877.2740021, "message": "Sounds like fun", "group_id": 9959, "id": 1305534}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307375677.3497751, "message": "And then we need to find something that also handles the documentation right", "group_id": 9959, "id": 1305168}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307375694.5376599, "message": "A question I asked from last time, would different backends have different API's?", "group_id": 9959, "id": 1305176}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376039.0835061, "message": "I mean if you have code where you want to switch between two backends and their parameters are not compatible", "group_id": 9959, "id": 1305240}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375168.1270289, "message": "so, our sentinel functions can be class instances that dynamically look up the docs for a given backend", "group_id": 9959, "id": 1305034}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307375396.2261741, "message": "really? what does help() call?", "group_id": 9959, "id": 1305100}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376349.4205389, "message": "The results for rgb2hsv for example differ between opencv and our numpy version :)", "group_id": 9959, "id": 1305339}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376362.672616, "message": "don't rely on anything in opencv", "group_id": 9959, "id": 1305346}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376386.1109531, "message": "when I'm done with CWrap", "group_id": 9959, "id": 1305351}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375590.719583, "message": "@holtzhau something along those lines yes. You could have a centralized object that manages all registered functions, or some object that manages registered backends and then each backend has functions. Although I tend to like the first approach better.", "group_id": 9959, "id": 1305156}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307375732.7943699, "message": "I approached this problem with an understanding that the API would remain the same across the board, and the backends would adjust to match", "group_id": 9959, "id": 1305187}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376057.303498, "message": "removing some of the expectation of our backend system", "group_id": 9959, "id": 1305246}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376087.894794, "message": "yes, that will be a tradeoff we'll need to consider", "group_id": 9959, "id": 1305253}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376422.2709661, "message": "yeah, the opencv wrappers have improved since I wrote the stuff in the scikit", "group_id": 9959, "id": 1305359}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307375970.4898729, "message": "It is easy to switch between if their arguments match though", "group_id": 9959, "id": 1305224}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376204.232317, "message": "so I would say we should go that route first, and see what kind of performance hits we take on it", "group_id": 9959, "id": 1305285}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376311.27706, "message": "it needs some love anyway", "group_id": 9959, "id": 1305324}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375834.919234, "message": "what I would like to see in a docstring is this:\n\nsobel?\n\n\"\"\"\nA sobel convolution is......\nblah blah blah\n\nBackends\n--------------\nfoo : sobel(arg1, arg2)\n Uses the sobel operation from the foo imaging library.\n\nbar : sobel(arg1, arg2, arg3)\n Uses the sobel operation from the bar imaging library. Needs an extra arg because...\n\n\"\"\"", "group_id": 9959, "id": 1305203}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376475.930073, "message": "I'm quite impressed by your opencv wrapping though :)", "group_id": 9959, "id": 1305376}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307375877.1966519, "message": "That, plus what backend is currently being used (by module path)", "group_id": 9959, "id": 1305207}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376399.5414641, "message": "I'm using opencv's own python api itself", "group_id": 9959, "id": 1305355}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376713.049772, "message": "yep", "group_id": 9959, "id": 1305451}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376736.3199551, "message": "IPP's convolution is super fast", "group_id": 9959, "id": 1305462}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307375892.417161, "message": "i'm kinda anti having the backends massage arguments to fit a single api, since the backends may be so different, this could potentially lead to very expensive operations on each call.", "group_id": 9959, "id": 1305210}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376238.3322451, "message": "Right. So I will meet with Stefan, and then for next week I will present a more final version.", "group_id": 9959, "id": 1305300}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376296.5022421, "message": "Sobel for example was not such a good choice since the images one operates are not huge enough to see the advantages of opencl", "group_id": 9959, "id": 1305320}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376333.5664451, "message": "oh you mean for opencl implementations", "group_id": 9959, "id": 1305333}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376346.367209, "message": "i'd love to see an opencl 2d convolution", "group_id": 9959, "id": 1305336}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376397.096185, "message": "and replacing it with IPP backed routines", "group_id": 9959, "id": 1305354}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376427.9555299, "message": "check edges_sobel.py for an example", "group_id": 9959, "id": 1305362}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376502.603318, "message": "https://github.com/enthought/cwrap", "group_id": 9959, "id": 1305382}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376570.007628, "message": "Will check it out. Cheers thouis", "group_id": 9959, "id": 1305395}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376578.695101, "message": "seeya thouis", "group_id": 9959, "id": 1305402}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376701.541533, "message": "so that can be a backend by itself.", "group_id": 9959, "id": 1305447}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376381.1547019, "message": "i'm planning on deprecating it in the future", "group_id": 9959, "id": 1305349}, {"user_id": 34630, "stars": [], "topic_id": 38301, "date_created": 1307376551.67893, "message": "I have to go. Talk to you next week.", "group_id": 9959, "id": 1305392}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376250.0936589, "message": "Are there any modules that you would like to see backended?", "group_id": 9959, "id": 1305307}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376297.6195841, "message": "maybe color conversion?", "group_id": 9959, "id": 1305321}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376315.3710999, "message": "At the moment I am busy with color conversion", "group_id": 9959, "id": 1305326}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376888.776324, "message": "I'm still debating an api to expose user customizable conversion", "group_id": 9959, "id": 1305541}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376518.6713369, "message": "when I'm done with that, it will automatically generate wrappers for IPP", "group_id": 9959, "id": 1305385}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376893.629988, "message": "ala swig typemaps", "group_id": 9959, "id": 1305544}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376436.4907961, "message": "i mean edges_opencv", "group_id": 9959, "id": 1305366}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376983.89186, "message": "One must just be careful, auto conversion routines can get hairy quickly. Swig and me are good enemies :)", "group_id": 9959, "id": 1305567}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376574.572526, "message": "I like how opencv's new wrappers are using the array_interface for their image type, but I think they may still be copying memory if you pass in an array instead of an image. not sure though.", "group_id": 9959, "id": 1305400}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376723.191957, "message": "If your IPP primitives may help there", "group_id": 9959, "id": 1305455}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376764.785445, "message": "which ships with IPP", "group_id": 9959, "id": 1305479}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376624.0548899, "message": "grey = np.empty_like(rgb[:,:,0])\ncv.CvtColor(rgb, grey, cv.CV_RGB2GRAY)", "group_id": 9959, "id": 1305415}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376626.3185339, "message": "simply as that", "group_id": 9959, "id": 1305417}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376683.4563241, "message": "I'm also interested in helping the scikit get a fast convolution routine", "group_id": 9959, "id": 1305439}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376754.5608339, "message": "of course IPP is not open source, so people will either need an IPP license, or use EPD", "group_id": 9959, "id": 1305470}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376795.8644121, "message": "which will generate cython code to wrap a C library from it's header files", "group_id": 9959, "id": 1305495}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376844.7793131, "message": "your own little swig :)", "group_id": 9959, "id": 1305514}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376854.9323161, "message": "pretty much, yes.", "group_id": 9959, "id": 1305517}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376730.0110559, "message": "they will. IPP'", "group_id": 9959, "id": 1305459}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307376766.0591259, "message": "What is CWrap exactly?", "group_id": 9959, "id": 1305480}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376815.5906451, "message": "checkout test.h", "group_id": 9959, "id": 1305507}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376828.8823471, "message": "which got automatically converted to _test.pxd", "group_id": 9959, "id": 1305510}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376868.125684, "message": "I still need to write the code to generate test.pyx", "group_id": 9959, "id": 1305522}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376996.5870481, "message": ":)", "group_id": 9959, "id": 1305575}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307377010.253587, "message": "cheers", "group_id": 9959, "id": 1305586}, {"user_id": 22813, "stars": [], "topic_id": 38301, "date_created": 1307376812.105859, "message": "https://github.com/enthought/cwrap/tree/master/examples/test", "group_id": 9959, "id": 1305505}, {"user_id": 33626, "stars": [], "topic_id": 38301, "date_created": 1307377004.840224, "message": "Anyway gotto run, cheers", "group_id": 9959, "id": 1305581}, {"user_id": 33559, "stars": [], "topic_id": 38301, "date_created": 1308140662.966156, "message": "Pieter and I discussed the possibility of specifying a tuple as an argument to use_backend, such as", "group_id": 9959, "id": 1399916}, {"user_id": 33559, "stars": [], "topic_id": 38301, "date_created": 1308140707.143153, "message": "but then we have a list of backends to try, instead of only one", "group_id": 9959, "id": 1399920}, {"user_id": 33559, "stars": [], "topic_id": 38301, "date_created": 1308140722.8300121, "message": "also, we discussed having a logging module through which we can report when a backend does not contain a given function", "group_id": 9959, "id": 1399922}, {"user_id": 33559, "stars": [], "topic_id": 38301, "date_created": 1308140766.021843, "message": "currently, the backend implementation is pretty light-weight, which I like; minimal magic! Pieter will update next week, I presume (I'll be on the plane, so you guys will have to meet without me)", "group_id": 9959, "id": 1399931}, {"user_id": 33559, "stars": [], "topic_id": 38301, "date_created": 1308140645.070004, "message": "cwrap is going to be super useful when it is done", "group_id": 9959, "id": 1399914}, {"user_id": 33559, "stars": [], "topic_id": 38301, "date_created": 1308140679.1601989, "message": "use_backend((opencl, theano, numpy))", "group_id": 9959, "id": 1399917}, {"user_id": 33559, "stars": [], "topic_id": 38301, "date_created": 1308140690.324296, "message": "numpy would always be the fallback, so I didn't need to specify that explicitly", "group_id": 9959, "id": 1399918}, {"user_id": 33559, "stars": [], "topic_id": 38301, "date_created": 1308140730.219332, "message": "(the python logging module is pretty sucky)", "group_id": 9959, "id": 1399924}, {"user_id": 33559, "stars": [], "topic_id": 38301, "date_created": 1308140781.3802381, "message": "importantly, the docs now contain auto-generated \"see also\"'s, which I love", "group_id": 9959, "id": 1399933}]