freenode/#clasp - IRC Chatlog
Search
17:07:47
drmeister
(:= *smarts-graph* (chem:make-chem-info-graph (chem:compile-smarts "[N:1][C:2]")))
17:08:15
drmeister
It finds two solutions to that smarts search - which is correct and not what we get from my code - it would only find one.
17:08:37
drmeister
Now I just need to figure out how to take control of the callback to record the results.
17:36:55
selwyn
could one define a clbind translator that would convert a common lisp function to and from a function pointer?
17:37:17
selwyn
the motivation would be to pass this pointer to c++ libraries that expect a callback
17:38:58
drmeister
selwyn: I've done that many times - I just create a C++ lambda and invoke the Common Lisp function object within it. Then I pass the lambda to the C++ code.
17:39:51
drmeister
This is not quite the same thing - but it should lead you in the right direction...
17:40:55
drmeister
Be careful not to pass Clasp tagged pointer to C++ code that will hang onto them - that will lead to problems.
17:41:09
drmeister
But in this case the function object shouldn't live beyond the function invocation.
17:41:59
drmeister
There is a way to tell the GC that objects are to be allocated in a non-moving pool.
17:43:50
drmeister
That policy tells the GC that the class chem::MoleculeGraph_O is to be allocated in a non-moving pool but it can be collected if the GC can't trace to it from a root.
17:46:15
selwyn
one more question: what do _sp and _O stand for? I see them everywhere in c++ source code
17:46:49
drmeister
_O is a C++ class that is managed by the GC. _sp is a template class that contains a tagged pointer to a _O object.
17:47:11
drmeister
_sp is a wrapper for tagged pointers. the _sp came from waaaaaaay back where I was using boost::smart_ptr
17:49:29
selwyn
right. and the pointers are tagged in order to implement the GC? do they include reference counts or something
17:51:03
drmeister
It's tracing garbage collection in boehm and copying, tracing garbage collection with MPS.
17:51:42
drmeister
The three least significant bits mean different things are stored in the single word that is wrapped in an _sp object.
17:53:14
drmeister
https://github.com/clasp-developers/clasp/blob/work/include/clasp/gctools/configure_memory.h#L41
17:53:58
drmeister
There are three immediate types. Fixnum (62bits) single-float (4bytes) and character(4bytes)
17:59:43
selwyn
does clasp use boost or std in the implementation, of, say cl:sort or other functions specified by the common lisp standard that require an implementation of some interesting algorithms
18:08:00
drmeister
selwyn: We can't use std containers because they aren't GC aware - I've created duplicate classes (gc::Vec0<xxx> is a drop in replacement for std::vector<xxx>) that are GC aware.
18:08:41
drmeister
So we can't use c++ algorithms with any container that will store a GC pointer unless you take special care.
18:09:10
drmeister
We can use C++ algorithms and boost algorithms if you take care with the memory models.
18:09:35
drmeister
I just used vf2_subgraph_is and a boatload of boost::graph stuff and it's working great.
18:10:24
drmeister
that being said - I have reimplemented sort in a GC aware way - because then I don't have to deal with indirection and pinning of objects.
18:16:32
drmeister
Seriously though - when we are shifting and masking 8-byte words - does it make a difference/
18:18:04
drmeister
stassats: I found and fixed the race condition that you diagnosed a couple of days ago.
18:31:21
drmeister
stassats: each symbol has an int64 index into a tread local vector. It wasn’t atomic and I needed to use cas to avoid a race if two threads wrote to it at the same time
18:50:41
drmeister
It’s really important to remain calm while debugging. It would have been easy to panic with that one.
21:42:39
drmeister
Try loading magicl into clasp - it should work. Clasp is a pretty compliant common lisp at this point - and anything that doesn't work is a bug in Clasp that we need to fix.
21:43:16
selwyn
there are some implementation-dependent parts in magicl; only SBCL and CCL are supported upstream
21:45:04
selwyn
only a few changes need to be made here https://github.com/rigetti/magicl/blob/master/src/with-array-pointers.lisp .. magicl hangs on loading. i will sort this out later
21:48:03
drmeister
It doesn't look too bad - it needs support for array pointers, pinning objects in memory and floating point error trapping. The floating point error trapping is the only thing that gives me pause.
21:48:50
drmeister
For the floating point error stuff we could look at what ECL does and do that thing.
21:49:07
selwyn
i implemented the first two using core:static-vector-pointer. would this be the right tool for the job?
21:50:28
drmeister
It would work - but it looks to me like they wanted to use native vectors and then pin them temporarily while the foreign library works on them. That's easy to support - boehm doesn't move things and MPS doesn't move things when there is a pointer to the thing on the stack.
21:51:09
drmeister
But static vectors would work perfectly well - it's just when you have a lot of them they will fragment memory.
21:55:25
drmeister
What if I gave you a funcall-with-pinned-objects functions (sys:funcall-with-pinned-objects list-of-pinned-objects thunk) - it would put pointes to the objects in the list onto the stack and then call the thunk - would that be performant enough?
21:57:20
selwyn
yes it would. i am not actually too concerned about performance for this application, but it would be in the spirit of a linear algebra library to be as performant as can be
22:08:30
drmeister
The array-storage-vector function in sbcl - what does it do with displaced arrays?
22:08:59
drmeister
It doesn't work with them - right? array-storage-vector just gives you the simple-vector that underlies the storage of whatever array you pass it.
22:18:56
drmeister
Would you be able to work from there - you could fork magicl, put in a few #+clasp and use those new functions to implement what you need.
22:27:24
drmeister
The CL code from ECL that is not the ECL compiler is shared - but we've made a lot of modifications.
22:30:29
drmeister
I'm just compiling those functions - it is recompiling almost all of the C++ (sigh)
22:31:57
drmeister
I'm going off of what it looks like magicl needs, sbcl provides and what you told me and my own guesses. I haven't tested anything - but they use facilities that I already had in place.
23:41:31
drmeister
::notify selwyn I pushed the changes to add those array storage vector functions to the 'work' branch.