freenode/#clasp - IRC Chatlog
Search
13:23:04
Bike
you're not supposed to throw exceptions out of C++ destructors because destructors are called while unwinding the stack in the course of exception handling, and if an exception is thrown while another exception is in flight, C++ terminates the entire program because it is a stupid language
13:23:48
Bike
"Because you see, what else could C++ do? There's an ambiguity: which exception out of the two do you want caught now? [...] That's right, terminate(). Solomon-style conflict resolution carried to the end."
13:25:16
Bike
in lisp the roughly equivalent situation would be signaling an error from a handler-bind handler (not handler-case)
13:25:57
Bike
because, and this is perhaps a bit subtle, in lisp we can handle exceptions before unwinding
13:26:38
Bike
so e.g. the second condition can be restarted in such a way that it goes back to the process of signaling the first condition, which ends up in the debugger. a bit convoluted, but no problem
13:27:15
Bike
actually i suppose the better analogy would be signaling an error from an unwind-protect cleanup
13:28:08
Bike
but the solution is the same - higher handlers can handle or restart the new condition, and in the latter case we just go back to the original unwinding process
13:28:51
Bike
in order to do this properly in clasp, every unwind protect catches every C++ exception, so that the cleanup can signal anew without getting recursive
13:29:37
Bike
bla bla bla explanations. i can explain C++ exception stuff more if anyone cares. i try not to be judgmental usually but this is a part of C++ i hate a lot
13:38:44
Bike
memory management gets a little tricky because, as it's used during unwind, the exception object can't be allocated on the stack. usually the C++ runtime has some fixed space for allocating exceptions in and/or just uses malloc
13:39:16
Bike
since you need some unbounded amount of space for exceptions given they can be any object and you can have an unlimited number of recursive (in a different way) exceptions, which again is fine in lisp, not so much in C++
13:39:24
scymtym
karlosz: reconstruct is supposed to find sub-expressions of an input form that a macro splices into a partially freshly consed expansion form. it only works if the spliced sub-expressions are EQ to their counterparts in the input form
13:49:04
beach
Bike: It truly is a crappy language. And it is getting worse every 3 years if I understand things correctly. This morning, I learned that C++ programmers avoid exceptions, probably for some of the reasons you mentioned.
13:52:18
Bike
i can also recommend the C++ FQA for more criticism https://yosefk.com/c++fqa/exceptions.html
13:54:55
beach
I'll put it on my reading list. I am not exposed to C++ on a daily basis, so I am not sure I'll invest that much time up front.
13:55:04
Bike
you can see this basically recommending automatic memory management and restarts instead of what C++ has
14:10:35
Bike
there are other pages on other parts of the language, of course, if you're the kind of person who enjoys this unix-hates handbook kind of thing
14:11:58
beach
I kind of do, in that it's part of my job to have a complete view of features and bugs of programming languages. And it is easier to have someone else point things out to me, than for me to acquire the experience to determine such things myself.
14:13:21
Bike
note that some parts of this are a little old, e.g. he mentions smart pointers being in a language draft, but they're pretty solidly in now
14:23:22
beach
I have said this before, but I'll say it again. If I were in drmeister's situation, I would start a parallel project and systematically rewrite the chemistry code that is now in C++ in Common Lisp. Now that Clasp is up and running, this could be done incrementally.
14:35:23
drmeister
beach: It's a good idea to develop chemistry code in Common Lisp - but we don't have the ability to define and work with packed structures yet. That's going to take a while.
14:37:15
drmeister
I'm currently debugging problems in the non-linear optimization code - it's all C++ double precision math.
14:38:16
drmeister
Lots of double precision parameters in structures and loops doing complex calculations on them.
14:39:53
Bike
at some point i would like to extend defstruct and hopefully defclass to allow "unboxed" slots, and then perhaps as a language extension define specialized arrays for them
14:40:33
beach
You can discuss such an extension with aeth who, if I remember correctly, wants that as well.
14:40:52
drmeister
Yeah - that's what I'm talking about and unboxed math on those slots and then we are talking.
14:41:23
Bike
i think the only actual extension required is saying that if a defstruct as such and such extension option, EQ on those objects is ambiguous, like for fixnums and characters
14:42:52
drmeister
SBCL has structs with unboxed slots - right? I heard from Doug Katzman that these structs posed problems when they ported to MPS. Namely they have maps of what slots are GC managed pointers and they had problems getting that to work with MPS because MPS doesn't let you look at any other GC managed memory when you are fixing one block of GC managed memory.
14:46:27
drmeister
The basic function of Cando is to take easy to work with graph representations of molecules and chemical systems and converts them into vectors of packed structures of numbers for efficient calculation.
14:47:00
drmeister
The graph representation of molecules is nicely handled by Common Lisp and automatic memory management.
14:49:17
Bike
«A “raw” slot is one whose declared type is a subtype of exactly one of: double-float, single-float, (complex double-float), (complex single-float), or sb-ext:word; but as an exception to the preceding, any subtype of fixnum is not stored as raw despite also being a subtype of sb-ext:word. »
15:09:34
drmeister
It's probably less trouble to leave fixnums as they are because of the way they are tagged.
15:10:09
drmeister
SBCL and Clasp use the same tagging for fixnums, we use 0 in the low bits. So there are several math operations that you can do without shifting.
15:12:05
aeth
drmeister: I understand leaving fixnums as they are, but unless it's declared as a sb-ext:word (which seems to be larger than a positive fixnum and only positive?) it looks like it's not optimized, so no e.g. (unsigned-byte 32) or (unsigned-byte 8)
15:12:39
drmeister
In sbcl you have structs with raw data types in slots but fixnums are left as they are - is that true?
15:14:10
drmeister
If so - why are fixnums left as they are and not shifted and stored as regular machine integers.
15:17:11
drmeister
Thinking - if you do integer division between two fixnums - then you need to shift the fixnums right first or shift the result left to turn the result into a fixnum.
15:18:21
drmeister
I'm getting deeper into the idea than I wanted. Feel free to leave this conversation on the floor.
15:19:31
stassats
it's a fixnum, it doesn't need any special treatment for slots/array elements, unlike word/sword
15:23:32
stassats
if you do some math you'll have to untag, but on the other hand you won't have to tag if you don't need to
15:29:12
drmeister
When I said packed above I should have said "structs containing memory adjacent, unboxed values".
15:30:36
drmeister
I'm doing a lot of arithmetic where I iterate and load 6 to 12 values out of a position vector (vector of doubles) and then operate on them using parameters (doubles) pulled out of a vector of structs.
15:34:19
drmeister
The NONBONDRB_xxx are C++ macros that read and write doubles into structs and vectors
15:34:42
drmeister
That code was generated by a program I wrote in Mathematica that does automatic differentiation.
15:35:14
drmeister
Uh - automatic differentiation and then optimization of the resulting expressions into reasonable C code.
15:40:10
drmeister
I needed one that would generate C code in the form that I needed it. I didn't spend a lot of time looking for other code that could do exactly what I wanted.
15:41:01
drmeister
I wouldn't be surprised if it's even older than that. It was one of the first parts of Cando that I wrote.
15:42:06
drmeister
https://github.com/cando-developers/cando/blob/master/src/mathematica/amber_energy_force_hessian.nb#L6
15:46:26
drmeister
So - you raise an excellent point. It may be a good idea to reevaluate the automatic differentiation approach that we use.
15:46:54
drmeister
If I can generate code that can be plugged into my geometry optimization code - I would be very interested in that.
15:47:13
drmeister
Also, I hate Mathematica because I can never get the damn license manager to work when I need it.
15:47:18
Bike
i kind of imagine power user options letting the programmer lay out pretty explicitly how things are laid out in arrays
15:49:46
drmeister
efm: The code that I linked to - that directory that contains it contains the Mathematica code generator for the dozen or so functions that I carry out automatic differentiation on.
15:50:53
drmeister
I calculate the first and second derivatives and generate C code that evaluates the expression and then first and second analytical derivatives and branches out if only say the function and the first derivative are needed.
15:51:30
drmeister
The second derivative is important because I implement a truncated Newton Raphson algorithm - one of the bigger free lunches in optimization theory.
15:52:49
drmeister
I'm actually debugging it today because I'm seeing occasional long bonds - and that indicates there is a problem somewhere.
15:55:37
drmeister
efm: I'd like to introduce you to Michael Yonkunas - he is our computational chemist.
15:56:35
yonkunas
Most of "us" meaning comp chem types use a machine with at least one GPU. I think this addition would be welcome during generation times.
15:57:44
efm
I'll poke at getting a single one of those expressions into Enoki on GPU. It's not my strong suit, but I might be able to figure it out.
15:58:33
yonkunas
stassats: yes of course. What I mean is that a bench chemist, a key demographic CANDO would like to target, may not have access to a GPU unless they are invested in these types of things.
16:00:00
yonkunas
efm: this is something I am interested inn and would eliminate a CANDO dependency to boot. If you want to work together I am up for it.
16:05:08
drmeister
I don't have it running at the moment. I'm on a loaner macbook Air while my macbook Pro with all my development software is going back to Apple to be repaired again (second time in two weeks).
16:35:18
Bike
replaced the set implementation with a deterministic one and now i can deterministically never produce the problem