libera/#sicl - IRC Chatlog
Search
9:07:10
beach
bike: Do you remember when I had to add &ALLOW-OTHER-KEYS to a method in order to avoid an error that the keyword arguments in question were not recognized. Well, it doesn't recognize those keyword arguments as being supplied, so adding &ALLOW-OTHER-KEYS merely avoided the error, but did not make the arguments recognized.
9:14:07
beach
bike: Initially I thought it had to do with those keyword parameters having an initform associated with them, because the preceding one that doesn't was recognized. But I removed the initform, and they are still not recognized.
9:15:17
beach
bike: And I added a &REST ARGUMENTS parameter and it does contain the pairs for those unrecognized keyword arguments. I can't see that this is a problem on my end.
9:17:03
beach
bike: Initially, I had &KEY DOCUMENTATION (CLIENT ...) (ENVIRONMENT ...), but when I instead do &KEY (CLIENT ...) DOCUMENTATION (ENVIRONMENT ...), it works.
9:24:12
beach
bike: So there is something special about having DOCUMENTATION as the first keyword parameter.
9:35:03
beach
Searching for the cause of this issue revealed a difference between Maclina and the AST evaluator. Maclina correctly recognizes (FUNCTION NAME) at compile time, whereas the AST evaluator looks up the name at run time. The main difference happens in the case of (FUNCALL #'(SETF <mumble>) ...) where Maclina looks up (SETF <mumble>) at compile time.
9:48:52
paulapatience
yitzi: Yes, but right now WORD-SIZE is used, which I think is what you intended significand-word to be used for
9:49:27
paulapatience
yitzi: By the way, I pushed some refinements to the type declarations in Dragonbox, inspired by your refinements to the exponent type to Schubfach
9:50:11
paulapatience
yitzi: Here https://github.com/s-expressionists/Quaviver/blob/b4a5a32cdfb8d4ce41b0e8b925fc6efc2d222573/code/schubfach/implementation.lisp#L28
9:50:33
paulapatience
I figured you wanted to use https://github.com/s-expressionists/Quaviver/blob/b4a5a32cdfb8d4ce41b0e8b925fc6efc2d222573/code/interface.lisp#L82
9:51:09
paulapatience
(Right now the SIGNIFICAND-WORD type is wrong; SIGNIFICAND-SIZE is missing its argument)
9:51:13
yitzi
No, don't use that. Its slow and I don't know why. Its faster to declare unsigned-word directly
9:52:00
yitzi
Yeah, I caught the missing argument but haven't fixed it. That could be the slowness issue. Feel free to fix that if you want.
9:54:14
yitzi
I would like to use significand-word if it is the same speed, since it is a better abstraction. I made a whole bunch of changes and slowed everything down by mistake. So I had to back out and start over. I took care of round-to-odd and expt10 optimizations. I didn't touch the equivalent in dragonbox, but it seems like we could do the same compiler macro strategy to avoid passing the specific function to the dragonbox macros.
9:57:14
paulapatience
One thing is that Schubfach doesn't have any compiler notes on SBCL. And I noticed you added optimize speed
9:59:02
yitzi
On my serialization stuff I had to roll quaviver/math into the quaviver system because I needed the log-expt in the serializers
10:00:47
yitzi
For dragonbox, I am still curious about the floor-expt-log stuff. I don't see why the small shift variants are needed.
10:07:19
yitzi
If we need additional constants I was thinking of just having a hash table with the key being the constants instead of *log-3/4*. With compiler macros there would be zero overhead.
10:08:36
paulapatience
Oh, I think the small floor-log-expt things in Dragonbox are like that so that C++ can use the smaller types
10:09:46
paulapatience
E.g., if the exponents are between -102 and 102, it could use sb16 or some other more constrained type
10:11:15
yitzi
That is kind of suggesting that arithmetic-size isn't enough to dispatch on. Like you might need the exponent bounds also. I'd have to think about that.
10:23:11
paulapatience
yitzi: It seems to help a bit. schubfach/64 and dragonbox/64 are more or less evenly matched now.
10:23:54
paulapatience
yitzi: Also, the exponent bounds is exactly what Dragonbox uses. That's why I have the min-k/max-k functions.
11:53:13
bike
beach: i really have no idea what could be going on with this issue. is there any way to reproduce this outside of your CLOS/boot system?
12:02:36
yitzi
scymtym: I pushed some optimizations to quaviver/main for liebler. For the Eclector bench I now get master = 522 microseconds and liebler = 332 microseconds. I also replaced the call to the float converter with a literal "0d0" to measure the overhead in interpret-token and I got 216 microseconds. Subtracting that gives master = 306 and liebler = 116, which means liebler is about three times faster the Eclector's current COERCE method.
12:32:40
paulapatience
I kept the Dragonbox constants just because, but we don't need tables for them
12:33:18
yitzi
Ok. We may need tables for those if we do Jaffer optimization or fast_float. Both of them use log5.
12:35:23
yitzi
It probably doesn't matter one way or the other...just looking to decrease your burden in dragonbox.
12:41:05
yitzi
Ok, I've conflicts with the string branch due to the fact that I had to roll the math system into quaviver. I'd like to avoid having to resolve the conflicts constantly. Maybe I could just roll that part into main now.
12:41:52
yitzi
Basically it just renames the quaviver/math package to quaviver.math and loads it after "traits.lisp"
12:42:32
yitzi
Did we resolve the issue with "." in the package name? I seem to recall you didn't like it.
12:48:36
yitzi
paulapatience: I agree. I'm glad we were cautious about it in the beginning, but it is needed everywhere.
13:04:36
yitzi
paulapatience: I've pushed my cherry-pick to math in case you want to make sure I didn't jack anything up. I'll work on the additional constants now.
13:11:58
yitzi
paulapatience: Don't we already have floor-log10-expt2-minus-log10-4/3 via `(quaviver.math/floor-log-expt 10 2 x t)`?
13:22:35
yitzi
In the calculation it takes the reciprocal to get 4/3 so it can do subtraction instead
13:31:26
paulapatience
yitzi: I'm going to write the nth CL csv parser using Quaviver. It will allow me to test your the string stuff.
13:31:52
paulapatience
I actually don't need full CSV support; it will be delimiter-separated with the delimiter disallowed in the cells
13:33:06
yitzi
There are very relaxed writer/reader default methods. They are intended read and write "generic" floating points. Nothing has been tested yet, and it is a bit junky still. I need to add subclasses of parse-error, etc.
13:36:23
paulapatience
Oh, I thought you meant you had merged it already. Ok, I will take a look at it now.
13:38:54
paulapatience
I wrote a comment saying that I don't even know if they are faster or not than plain floor
13:39:20
paulapatience
So there's a chance we can just eliminate them without needing to port to quaviver.math
13:39:52
paulapatience
I think the issue is that in C++ there's no equivalent of CL:FLOOR's providing both the quotient and the remainder
13:41:36
yitzi
One downside to FLOOR is that it is unknown if (values (floor x y)) avoids the remainder calcuation. At least I don't know
13:41:51
bike
beach: okay, well let me know i guess. your examples work fine in isolation, as far as i can tell - just defining functions with those lambda lists that is - so i guess SICL must be doing something more complicated with maclina.
13:46:56
beach
The only weird thing I can think of is the CLIENT and ENVIRONMENT are really uninterned symbols because Eclector is programmed to transform them.
13:57:12
bike
naming question. Debug info consists of a table mapping regions of bytecode to various kinds of information (source locations, stuff about variable binding, etc.). What should I call these information and this table?
13:57:32
bike
in clasp they're "annotations", but that's a little confusing since the compiler uses annotations to mean something completely different.
14:00:34
yitzi
paulapatience: I think my constants slowed it down. How about we go back to your plan and merge math, you rebase and merge and then I work on the constants?
14:02:48
paulapatience
yitzi: Sounds good. I finished deleting all the floor-log-expt stuff from Dragonbox, so I can rebase and merge whenever you're done
14:25:02
yitzi
Thats wrong. I was trying to bring in some of scymtym's optimizations but I got a little bit confused because some were don't on an expanded macro....so results are uneven.
14:28:19
yitzi
I'd say fixnum unless there some obvious optimization. Just in case somebody does -2? I think we only every do (minusp sign)
14:29:04
yitzi
In other words, I suspect (integer -1 1) just means a type check, whereas fixnum will usually not be one.
14:55:40
yitzi
They should work. I fixed all of the long-float stuff. It should avoid long-float on dragonbox.
14:56:10
paulapatience
Yeah, but they started failing during one of my changes today. Now they are working again, but I didn't do anything.
14:57:20
paulapatience
https://github.com/s-expressionists/Quaviver/actions/runs/9889334868/job/27315163590
15:01:18
yitzi
paulapatience: v1 is main, v2 is log-expt moved into a separate file, v3 is log-expt split into separate floor-log-expt and floor-log-3/4-expt functions https://plaster.tymoon.eu/view/4489
15:14:39
yitzi
Did you get the part that I said about read-number? You may just be able to use the default one.
15:16:56
yitzi
Have three read-number variants right now. A common-lisp cient, a json client and the default is just a generic loose format version.
15:17:40
yitzi
Of course they are all half done right now, but the intention is to have keyword args that can control the various options.
15:21:56
yitzi
paulapatience: so you could start with a liebler instance and just do `(read-number client result-type 10 stream :plus-sign #\+ :minus-sign #\- :exponent-marker #\e :decimal-marker #\.)` if you want get started without writing your own client.
15:38:29
scymtym
yitzi: the optimized liebler from quaviver/main is faster than before. i wanted to know how fast it could theoretically go and got the second set of numbers: https://plaster.tymoon.eu/view/4485#4490 . i can try and submit some of the optimizations over time
15:45:16
scymtym
what is the policy for using definitions from one module in another module making them public for clients of the library?
15:55:12
paulapatience
In Dragonbox's case, I've used :: to access a private function from quaviver.math
15:55:38
paulapatience
Although the intention is to migrate the caller of the private function back to quaviver.math
16:00:44
yitzi
If we need to export and treat it as a public api we'd probably do that eventually. I don't have a problem with doing :: temporarily.