JPEG XL

Info

rules 57
github 35276
reddit 647

JPEG XL

tools 4225
website 1655
adoption 20712
image-compression-forum 0

General chat

welcome 3810
introduce-yourself 291
color 1414
photography 3435
other-codecs 23765
on-topic 24923
off-topic 22701

Voice Channels

General 2147

Archived

bot-spam 4380

jxl-art

Traneptora
2024-02-03 11:45:36
with regard to bit depth, a modular stream is a method of encoding one or more channels, each of which is a rectangle of integers of a specific size those integers can be negative, they can be large, they can be lots of things after decoding a modular JXL stream, if the values are pixel values they will be clamped, so negative values are clamped to zero and values greater than 2^depth will be clamped to 2^depth
Qon
Traneptora but that's a limitation of hardware, not a limitation of language design
2024-02-03 11:45:40
Each pixel is a computation iteration from previously generated pixels. So you can loop until you run out of pixels.
Traneptora
2024-02-03 11:46:10
sure, but each channel's size is fixed in advance
Qon
2024-02-03 11:46:20
Yep. So is my computer.
2024-02-03 11:46:32
I can't download more RAM
Traneptora
2024-02-03 11:46:57
no, but modular is limited mathematically to declaring how many iterations the loop will have before the calculation starts
2024-02-03 11:47:05
and then is limited by that declaration
2024-02-03 11:47:32
a computer program can just be something like ```python while True: pass ``` which theoretically will not stop
Qon
2024-02-03 11:47:44
With infinite image size you get infinite loops.
Traneptora
2024-02-03 11:47:51
except you can't have infinite image size
Qon
2024-02-03 11:48:19
Yes, jxl doesn't support that. But my computer will eventually die. It has finite computation in time as well....
Traneptora
2024-02-03 11:48:28
that doesn't make JXL more turing complete
2024-02-03 11:48:37
it just means your computer is also not ideal
Qon
2024-02-03 11:48:50
Yes, that was my argument.
Traneptora
2024-02-03 11:49:15
sure, but "my computer is not an ideal turing machine because hardware has limits" doesn't have anything to do with the statement of whether or not modular mode of JXL is a programming language
2024-02-03 11:50:00
modular mode of JXL isn't a programming language because you declare the number of iterations in advance and run exactly that many times which makes it strictly weaker than programming languages, from a computability standpoint
2024-02-03 11:51:40
> I'm not convinced it isn't a programming language. It seems like it could even be turing complete. This is what you said, and I'm giving you a specific reason why it's a weaker form of computation, as an explanation for why it's not a turing-complete programming language. "real-life hardware is not ideal" is not a counterargument to this
Qon
2024-02-03 11:53:54
the size of a jxl image has limits, just like my computer hardware. Neither is an ideal turing computer. If jxl supports arbitrarily large size (it doesn't) then I can set a number that guarantees it will outlive the universe. I think a fixed runtime is about as limiting as fixed memory. Both my computer and jxl images will run for a finite time with finite memory already set (I just don't know the number of CPU cycles that my computer will last).
Traneptora
2024-02-03 11:54:15
fixed size that outlives the universe has nothing to do with turing completeness
2024-02-03 11:54:41
turing machines are mathematical constructions decoupled with physics
2024-02-03 11:55:19
a lot of the theorems on computability stop being interesting if you put a finite cap on runtimes
Qon
2024-02-03 11:55:20
Well when I say my computer is turing complete I'm not saying that it is strictly equivalent to the mathematical ideal turing machine, because of course that is impossible
Traneptora
2024-02-03 11:55:53
it's not comparable though, because modular images declare their size in advance and run for exactly that time
2024-02-03 11:56:11
this means a lot of interesting questions like "will this program halt on this input" (aka the halting problem) have trivial answers in modular mode JXL streams
2024-02-03 11:56:20
yes, all MA trees halt on all inputs
2024-02-03 11:56:29
next question
2024-02-03 11:56:36
so it's fundamentally different
Qon
2024-02-03 11:58:41
You can run programs in jxl images. The fact that the jxl image ends doesn't mean the mathematical program that was running in it halted. It just means you shut the hardware off.
Traneptora
2024-02-04 12:01:03
I mean what you're really asking then is not "are modular streams programming languages" but rather "is the MA tree model as powerful a method of computation as turing machines" but the answer is *also* no. For example, an MA tree can't output a 1 every 8 pixels, and a 0 for the other 7 using only the tree
2024-02-04 12:02:38
MA trees are stateless - you walk down the tree for each pixel, but the tree itself does not change for each pixel. So only the predictors that are described in JXL can be used, and "the pixel that was 8 pixels to the left of this one" is not one of those predictors
2024-02-04 12:03:15
this can be done with turing machines by having 8 states that you rotate between
JXL Art Bot
2024-02-04 12:09:47
**Qon** _“cellular automaton rule 110”_ 2024 image/jxl 44 bytes https://jxl-art.surma.technology/?zcode=C89MKclQMDQwMODySM1MzyiBsJ0yS1JSC0AyXEHOIQoGXFyZaQqVCnZAloICkOkHZUI44bogvq4hWAAipOvnClcCAroKwalAs9H4BiTrMESzFNMEXVyWoBtJohag8gqgWktLSy50hXApCy5sFsGUAgA%3D
Qon
2024-02-04 12:10:28
"Rule 110 has the perhaps surprising property that it is Turing complete, and thus capable of universal computation."
Traneptora I mean what you're really asking then is not "are modular streams programming languages" but rather "is the MA tree model as powerful a method of computation as turing machines" but the answer is *also* no. For example, an MA tree can't output a 1 every 8 pixels, and a 0 for the other 7 using only the tree
2024-02-04 12:13:00
It can't do it "per pixel". But it can compute arbitrary functions (which can be computed in finite time and memory) if given enough time (height) and memory (width).
2024-02-04 12:20:05
I get "e is undefined" when I try to generate larger images.
Traneptora
2024-02-04 12:21:09
except forthe fact that the width has to be declared in advance
2024-02-04 12:21:44
also rule 110 requires a specific repeating background pattern for Cook's theorem to hold
2024-02-04 12:22:05
which is a pattern that MA trees cannot generate
Qon
Traneptora which is a pattern that MA trees cannot generate
2024-02-04 12:23:40
Why not?
Traneptora
2024-02-04 12:23:50
because it's too wide
Qon
2024-02-04 12:24:10
Define "too wide"
Traneptora
2024-02-04 12:24:16
the repeating pattern looks like this
2024-02-04 12:24:45
MA tree predictors can't generate that top row because they don't have properties that look back far enough
2024-02-04 12:24:57
this pattern of "glider guns" is required for Cook's proof regarding rule 110
kkourin
2024-02-04 12:25:37
if you limit the time and memory, you can just hard code every output of the function?
Qon
Traneptora MA tree predictors can't generate that top row because they don't have properties that look back far enough
2024-02-04 12:26:27
The pattern is just a single pixel high. 110 never looks back (up) more than 1 pixel, the row above.
Traneptora
2024-02-04 12:26:43
Yes, but Cook's proof requires you to start with that pattern
2024-02-04 12:26:52
and the MA tree can't generate it
Qon
2024-02-04 12:26:56
I can start with the pattern...
Traneptora
2024-02-04 12:27:09
you can't generate it with an MA tree
Qon
2024-02-04 12:27:44
Can you point to the precise technical limitation which forbids it?
2024-02-04 12:28:12
Because I know how to encode arbitrary patterns. Is the tree depth limited or what?
Traneptora
2024-02-04 12:28:14
I already explained, it's the same reason you can't have an MA output a pixel value of 1 every eight pixels and 0 otherwise
2024-02-04 12:28:30
there is no property to look eight pixels to the left
Qon
Traneptora I already explained, it's the same reason you can't have an MA output a pixel value of 1 every eight pixels and 0 otherwise
2024-02-04 12:28:46
I don't need it, I can write the pixels in manually
Traneptora
2024-02-04 12:28:52
that's called residuals
2024-02-04 12:29:16
at that point you're not computing anything, you're just putting data already there and calling it a day
Qon
2024-02-04 12:29:30
That is what a program is, data.
Traneptora
2024-02-04 12:29:36
what
2024-02-04 12:29:45
programs are finite
2024-02-04 12:29:58
what you're proposing would require you to hardcode in infinitely many residuals
Qon
2024-02-04 12:30:17
The first line of pixels is the setup pattern, program and data. The lines below are generated by pxl
Traneptora
2024-02-04 12:30:30
again, programs are finite
Qon
Traneptora what you're proposing would require you to hardcode in infinitely many residuals
2024-02-04 12:30:48
Well, `Width` many pixels
Traneptora
2024-02-04 12:30:56
yes and cook's proof requires an infinite canvas
2024-02-04 12:31:30
so if you're arguing that "rule 110 is turing complete" you need to look at the conditions for that proof you need an infinite canvas with an infinitely repeating background pattern laid out in advance
2024-02-04 12:31:42
You can read his paper yourself if you'd like
2024-02-04 12:31:43
https://wpmedia.wolfram.com/sites/13/2018/02/15-1-1.pdf
Qon
2024-02-04 12:32:10
Look, I'm not claiming that turing machines according to the strict definition can actually exist.
Traneptora
2024-02-04 12:32:17
that's not what I'm saying
2024-02-04 12:32:32
I'm saying the MA tree model cannot generate the conditions laid out in that proof
2024-02-04 12:32:34
and programs are finite
2024-02-04 12:32:50
so being able to encode rule 110 doesn't actually mean much
Qon
2024-02-04 12:32:52
My computer can't simulate a turing machine either....
Traneptora
2024-02-04 12:32:59
also irrelevant
2024-02-04 12:33:23
As a model of computation, MA trees are weaker than turing machines. That's all there is to it. There's things that an MA tree cannot do.
2024-02-04 12:33:26
I listed one of them already.
2024-02-04 12:34:32
This feels like if you tried to argue that you can program with discrete finite automata, and I pointed out a thing they can't compute and you went "well my computer isn't a turing machine"
2024-02-04 12:34:39
so?
2024-02-04 12:34:56
MA trees are expressive but there's many things they cannot do
Qon
Traneptora This feels like if you tried to argue that you can program with discrete finite automata, and I pointed out a thing they can't compute and you went "well my computer isn't a turing machine"
2024-02-04 12:35:26
No, 110 can encode a turing machine.
Traneptora
Qon No, 110 can encode a turing machine.
2024-02-04 12:35:50
*with an infinite canvas and a specific repeating setup pattern*
2024-02-04 12:36:07
a specific repeating setup pattern that, I remind you, MA trees cannot generate
2024-02-04 12:36:17
per my last message
2024-02-04 12:36:53
you can always hardcode in the pattern on a *finite* canvas, but not on an *infinite* canvas that would require you to *generate* it
Qon
Traneptora *with an infinite canvas and a specific repeating setup pattern*
2024-02-04 12:37:13
I can't generate the pattern by describing it once, but I can write out the whole pattern by describing each pixel. The tree can grow without limits
Traneptora
2024-02-04 12:37:26
no, the MA tree does not change
2024-02-04 12:37:40
and you can't hardcode the pattern on an infinite canvas
2024-02-04 12:37:42
only on a finite one
2024-02-04 12:37:56
if you hardcoded the pattern on an infinite canvas, that would make your program inifnite in size. but programs are finite
Qon
2024-02-04 12:37:59
I didn't say the tree could change
Traneptora
2024-02-04 12:38:11
then what does "the tree can grow without limits" mean
Qon
2024-02-04 12:38:15
And yes I can only encode finite trees
Traneptora then what does "the tree can grow without limits" mean
2024-02-04 12:38:56
It means it can be arbitrarily large.
Traneptora
2024-02-04 12:39:25
no, the tree is fixed in size
2024-02-04 12:39:45
it will never be bigger than it started
Qon
2024-02-04 12:40:12
I'm not saying it is grown by pxl, I'm saying a computer program can generate the pattern for the first row
Traneptora
2024-02-04 12:40:21
not for an infinite canvas it can't
Qon
Traneptora it will never be bigger than it started
2024-02-04 12:40:23
exactly
Traneptora
2024-02-04 12:40:31
this matters because the canvas has to be infinite for Cook's theorem on rule 110 to hold
Qon
Traneptora not for an infinite canvas it can't
2024-02-04 12:40:34
I've never said otherwise
Traneptora
2024-02-04 12:40:43
you kept citing cook's theorem on rule 110
2024-02-04 12:40:50
which require the canvas to be infinite
2024-02-04 12:41:03
it's one of the hypotheses of the theorem
2024-02-04 12:41:20
if the width is finite, then cook's theorem doesn't apply
Qon
2024-02-04 12:42:18
You say that like all programs require infinite memory and time to run....
Traneptora
2024-02-04 12:42:39
Cook's theorem about rule 110 specifically is a statement about an infinite canvas with a specific repeating pattern
2024-02-04 12:43:03
so yes when I cite mathematical theorems that have hypotheses I don't try to apply them to situations where those hypotheses do not hold
2024-02-04 12:43:46
MA trees cannot generate that repeating pattern (I already explained why) so you'd need to hardcode it, which doesn't work because programs are finite
2024-02-04 12:43:56
and thus Cook's theorem can't be used
Qon
Traneptora MA trees cannot generate that repeating pattern (I already explained why) so you'd need to hardcode it, which doesn't work because programs are finite
2024-02-04 12:44:37
That's not really relevant since pxl images have finite size anyways.
Traneptora
2024-02-04 12:44:56
indeed, and since their canvas sizes are *finite* we can't use Cook's theorem
Qon
2024-02-04 12:46:42
So what is your point? pxl isn't programming because programming requires infinite memory?
Traneptora
2024-02-04 12:47:04
no, it's not programming because *there's things it can't do*
2024-02-04 12:47:32
being able to encode the rule for 110 *doesn't change this* because *rule 110 is not turing-complete on a finite canvas*
Qon
2024-02-04 12:47:52
Well there's things C can't do either, so it isn't programming?
Traneptora
2024-02-04 12:48:10
<:thonkery:853085697408499752>
2024-02-04 12:48:33
I presented a specific thing it can't do, algorithmically, that turing machines can do
2024-02-04 12:48:39
what else do you want me to say
2024-02-04 12:49:25
it's not a turing-complete language because there's algorithmic deficiencies in it that cannot be overcome by better hardware or larger finite program sizes
2024-02-04 12:49:38
it can't generate repeating patterns with large repeat distances
2024-02-04 12:49:40
as one example
Qon
Traneptora it's not a turing-complete language because there's algorithmic deficiencies in it that cannot be overcome by better hardware or larger finite program sizes
2024-02-04 12:50:14
Like C then?
Traneptora
2024-02-04 12:50:23
I don't see what you're getting at by bringing up C
Qon
2024-02-04 12:50:40
Are you trolling me?
Traneptora
2024-02-04 12:51:22
do you normally join random discords and ask technical mathematical questions and then when you don't like the answer you get accuse the person of trolling you
2024-02-04 12:51:26
or is this your first time doing so
2024-02-04 12:51:48
C is also not turing complete because integers in C are capped in size
2024-02-04 12:52:06
but it has literally nothing to do with whether or not MA trees can compute specific things
2024-02-04 12:52:49
it was never a competition with C
2024-02-04 12:53:00
MA trees can't do these specific things that turing machines can do
2024-02-04 12:53:01
that is all
2024-02-04 12:53:26
some *fairly basic tasks* mind you, like determining if x is a multiple of 7
2024-02-04 12:53:49
C lacking arbitrary-sized integers doesn't change this
Qon
2024-02-04 12:54:29
"In colloquial usage, the terms "Turing-complete" and "Turing-equivalent" are used to mean that any real-world general-purpose computer or computer language can approximately simulate the computational aspects of any other real-world general-purpose computer or computer language."
Traneptora
2024-02-04 12:54:47
yes, and MA trees are not able to do some very basic tasks like determine if x is a multiple of 7
2024-02-04 12:55:25
that are pretty easily done on a turing machine or C or things accepted as turing-equivalent
2024-02-04 12:56:00
I'm not being weirdly semantical here. I'm saying that some relaively ordinary tasks you'd want to do in computation can't be done with MA trees
2024-02-04 12:56:12
like determine if x is a multiple of y, etc.
Qon
Traneptora I'm not being weirdly semantical here. I'm saying that some relaively ordinary tasks you'd want to do in computation can't be done with MA trees
2024-02-04 12:56:48
I agree that it isn't practically possible, if that is your whole point
Traneptora
2024-02-04 12:57:05
my whole point is that MA trees are a weaker form of computation and some taks are simply impossible
2024-02-04 12:57:14
relatively basic tasks
2024-02-04 12:57:23
"is x a multiple of y" is not a question MA trees can answer
kkourin
2024-02-04 12:57:33
can C do it?
Traneptora
2024-02-04 12:57:35
easily
Qon
Traneptora "is x a multiple of y" is not a question MA trees can answer
2024-02-04 12:57:45
Can 110 do it?
kkourin
2024-02-04 12:57:47
for arbitarily large input X?
Traneptora
Qon Can 110 do it?
2024-02-04 12:58:06
with an infinite canvas and a specific repeating input pattern that MA trees can't generate
Qon
2024-02-04 12:59:00
Can 110 do it with finite memory?
Traneptora
2024-02-04 12:59:05
no
2024-02-04 12:59:32
110 can't do much interesting if you don't give it an infinite canvas to work with
Qon
Traneptora no
2024-02-04 01:00:07
Ok then either you or I don't understand rule 110.
kkourin
2024-02-04 01:00:13
To me it sounds like the problem here is that you both cannot agree on a defiition of being roughly turing equivalent
Traneptora
2024-02-04 01:00:26
well, no, not really
kkourin for arbitarily large input X?
2024-02-04 01:00:46
C can't handle arbitrarily large input for any problem because it's got fixed integer size but for anything that fits inside its integers, you can just do `y && (x / y) * y == x`
kkourin
2024-02-04 01:01:04
No, I would say the problem of C is not fied integer size, but fixed pointer size
2024-02-04 01:01:08
You can represent the input as a string
Traneptora
2024-02-04 01:01:09
pointers are integers
Qon
2024-02-04 01:01:18
If 110 requires infinite pattern then it also requires infinite time. And then it will never give a return value...
kkourin
2024-02-04 01:01:23
And go well beyong the integer max
Traneptora
Qon If 110 requires infinite pattern then it also requires infinite time. And then it will never give a return value...
2024-02-04 01:01:43
more specifically, it requires at least as much memory as runtime
2024-02-04 01:01:50
if runtime is uncapped then memory is also uncapped
kkourin
2024-02-04 01:01:54
Your program will not look like y && (x / y) * y == x though
Traneptora
kkourin And go well beyong the integer max
2024-02-04 01:02:29
sure, I've laready pointed out that the limitation of C is that integers have finite size. this includes the fact that `sizeof(void *)` is a compile-time constant
2024-02-04 01:02:58
pointer size being capped is the same problem
kkourin
2024-02-04 01:03:33
And similarily, whatever JXL thing you guys are talking about is also limited right?
Traneptora
2024-02-04 01:03:39
well, no
kkourin
2024-02-04 01:03:47
How is that limitation different than the pointer size limitation of C?
Traneptora
2024-02-04 01:04:21
wdym?
Qon
Traneptora yes, and MA trees are not able to do some very basic tasks like determine if x is a multiple of 7
2024-02-04 01:04:25
So 110 can do x % 7 with finite memory then....
Traneptora
2024-02-04 01:04:38
except it can't
2024-02-04 01:04:50
as I already mentioned
Qon
2024-02-04 01:05:12
When X is `int` sized?
Traneptora
2024-02-04 01:05:30
sure, but you can just hardcode that for all 2^32 values of that
2024-02-04 01:06:05
my whole point is that MA trees are a weaker form of computation and some tasks are simply impossible relatively basic tasks If your point is that "well normal programming languages aren't turing-complete either" then sure they aren't but there's a real, pragmatic difference between the MA tree model and languages that are commonly accepted as turing-equivalent that is not pathological
Qon
2024-02-04 01:06:21
How does that change things? Any function can be hardcoded if the input is limited
kkourin
2024-02-04 01:06:44
Well for me in C it is "close to turing complete" in that you can probably just modify a few lines to the spec to get true turing completeness
2024-02-04 01:06:49
But it soundsl ike you could do the same for JXL right?
Traneptora
2024-02-04 01:06:54
no
2024-02-04 01:07:02
because MA trees lack the properties required
2024-02-04 01:07:14
they can't backreference far enough
kkourin
2024-02-04 01:07:28
Like, if "X" flag is s, give me the infinite canvas or whatever you need for the rule 110 proof tow ork
Traneptora
2024-02-04 01:07:43
the problem here is that the infinite canvas *also* requires a specific repeating pattern that the MA tree can't generate
2024-02-04 01:08:08
it's like asking your C program to not only have infinite memory but a specifc (noncomputable) initial memory layout in that infinite space
2024-02-04 01:08:24
sure if the initial layout is computable, you can always generate it on demand
2024-02-04 01:08:36
but in this case the tool you use is not able to generate that initial memory layout
kkourin
2024-02-04 01:08:37
Yeah well X flag can do that too
Qon
2024-02-04 01:08:54
X flag is not part of MA tree
2024-02-04 01:09:10
it's a hypothetical pxl extension
Traneptora
2024-02-04 01:09:28
in order for MA trees to be able to compute anything you'd need to start with an initial configuration that the method of computation cannot populate
kkourin
2024-02-04 01:09:38
Like, X flag can be spec'd to tell the decoder to execute as if the needed initial configuration is there
Traneptora
2024-02-04 01:09:52
the problem is the initial memory space layout is not computable by the method of computation
Qon
Traneptora the problem is the initial memory space layout is not computable by the method of computation
2024-02-04 01:10:25
Not by the tree, but pxl isn't just the tree
Traneptora
2024-02-04 01:10:45
but like, in C even with infinite memory you couldn't compute busy beaver
2024-02-04 01:10:54
you'd need it to be loaded into memory beforehand
2024-02-04 01:11:01
which sorta defeats the point
Qon
2024-02-04 01:11:23
I'm not trying to compute things C can't
Traneptora
2024-02-04 01:11:33
that was addressed at kk
kkourin
2024-02-04 01:12:42
Well admittedly I don't know much about this rule 110 proof, but I'm assuming asking to load busy before into memory is not really the same as getting the decoder to start with whatever initial pattern is needed
Traneptora
kkourin Well admittedly I don't know much about this rule 110 proof, but I'm assuming asking to load busy before into memory is not really the same as getting the decoder to start with whatever initial pattern is needed
2024-02-04 01:13:05
it is equivalent if the computation method can't compute the initial pattern
2024-02-04 01:13:27
an initial pattern that is incomputable by the method of computation without that pattern
kkourin
2024-02-04 01:13:37
Yes I agree I am adding to the computation method. But how is that different from giving C infinitely large pointers?
Qon
2024-02-04 01:13:42
I can set `Width 1000` and I can write a tree that gives me any pattern I want for the top pixel row containing background pattern of width 1000, X, Y and an program for computing X % Y.
2024-02-04 01:13:58
Though 1000 isn't actually enough.
kkourin
2024-02-04 01:14:25
I think there's no "Real" line you can draw for what is a reasonable addition
Traneptora
kkourin Yes I agree I am adding to the computation method. But how is that different from giving C infinitely large pointers?
2024-02-04 01:15:17
it's different because if you gave C infinite address space, it could conceivably compute anything a turing machine could, with a finite program but you can't make MA trees compute anything a turing machine can compute unless you populate the infinite address space with a precalculated initial pattern that the MA tree itself is not able to generate
2024-02-04 01:16:09
that's the primary difference - it requires infinite input data that is not computable without it, with respect to the method of computation
Qon
2024-02-04 01:16:51
wikipedia says "Repeating "patches" like text, dots, or sprites." are a feature of pxl
Traneptora
2024-02-04 01:17:02
you keep saying pxl, I assume you mean JXL
2024-02-04 01:17:09
and patches are frames that are overlaid
2024-02-04 01:17:16
with a specific list of coordinates
2024-02-04 01:17:20
they're not actually repeating
Qon
2024-02-04 01:17:24
I mean jxl, yes 😸
Traneptora
2024-02-04 01:17:34
they don't actually repeat, and they also don't affect MA prediction
2024-02-04 01:17:37
or MA trees
kkourin
Traneptora that's the primary difference - it requires infinite input data that is not computable without it, with respect to the method of computation
2024-02-04 01:17:47
I am not giving it infinite input data though. I am augmenting the computational model itself. I think that is the same as augmenting the address space of C
Traneptora
2024-02-04 01:17:48
they're overlaid during frame composition after modular channels have been decoded
Qon
2024-02-04 01:17:57
I'm not talking about jus the trees, I'm talking about JPEG XL
Traneptora
kkourin I am not giving it infinite input data though. I am augmenting the computational model itself. I think that is the same as augmenting the address space of C
2024-02-04 01:18:19
yes, but the computational model is *unable* to do everything a turing machine can do *unless* you populate its initial memory with something it can't compute
2024-02-04 01:18:39
that's the difference
2024-02-04 01:19:00
if you allow infinite memory but populate with zeroes, you can't compute certain things
2024-02-04 01:19:13
such as "is x a multiple of y"
2024-02-04 01:20:05
in that sense the model of computation is weaker than turing machines
yurume
2024-02-04 01:20:15
I think you both are using the term *turing completeness* in somewhat different senses
kkourin
2024-02-04 01:20:18
But how do you even apply this rule in the example of C getting infinite memory? Why do the rules that get added have to do anything with the existing capabiltiies?
Traneptora
kkourin But how do you even apply this rule in the example of C getting infinite memory? Why do the rules that get added have to do anything with the existing capabiltiies?
2024-02-04 01:20:50
if you wanted to modify MA trees in a way that they could compute anything in a proper sense you'd need to add some feature that would allow them to populate repeating patterns across large distances
2024-02-04 01:21:05
atm the only way to do that is by using lz77 on entropy residuals, which is outside the scope of the MA tree model
yurume
2024-02-04 01:21:07
there is a dedicated term *bounded storage machine* that describes a FSM with limited storage but the storage can be arbitrarily extended to make it turing-complete in its limit
Traneptora
2024-02-04 01:21:26
yes, and C is turing complete in this sense but MA trees are not
yurume
2024-02-04 01:21:38
so JPEG XL can encode a (very inefficient) BSM, normal computer is a (good) BSM, C is also a (good) BSM
Traneptora
2024-02-04 01:22:07
well JPEG XL can't encode a BSM because modular channels are fixed in width and height
yurume
2024-02-04 01:22:40
that can be said to C as well, where it does have tons of other limits 🙂
2024-02-04 01:23:08
I think the "limit" model of BSM will necessarily have to disregard such things
Traneptora
2024-02-04 01:23:10
yes, but even if MA trees were extended to have infinite channel sizes you still don't get a turing complete machine in the limit
2024-02-04 01:23:23
because you can't populate the initial memory required to make that work
2024-02-04 01:23:35
you could if you rely on Lz77 of residuals
yurume
2024-02-04 01:23:38
indeed, MA trees *themselves* are not enough to make it TM
Traneptora
2024-02-04 01:23:42
but again that's outside the scope of the MA tree model
yurume
2024-02-04 01:24:13
I carefully said "JPEG XL" above to avoid that pitfall
Qon
2024-02-04 01:24:24
So have I, over and over
Traneptora
2024-02-04 01:24:28
even then lz77 still wouldn't allow infinite repeats of the residuals
2024-02-04 01:24:47
at best you increase the encoded size proportional to the log of the width
2024-02-04 01:25:07
so you'll still end up with infinite program data required to generate that initial repeating pattern
Qon
Traneptora because you can't populate the initial memory required to make that work
2024-02-04 01:25:17
I can do it explicitly, pixel by pixel.
Traneptora
2024-02-04 01:25:27
which would constitute an infinite program
yurume
2024-02-04 01:25:31
it will eventually depend on how you would generalize JPEG XL into arbitrary size
Traneptora
2024-02-04 01:25:34
and programs are finite, as I have continued to remind you
Qon
Traneptora which would constitute an infinite program
2024-02-04 01:26:04
Wrong. I have finite width, so the explicit descriptions of top row pixels is finite
yurume
2024-02-04 01:26:06
for example, some scheme is considered a BSM even though itself doesn't have any looping mechanism (like JPEG XL here)
Traneptora
yurume for example, some scheme is considered a BSM even though itself doesn't have any looping mechanism (like JPEG XL here)
2024-02-04 01:26:47
sure, but my point is that you'd still have residuals encoded scale with the log of the memory allocated which means that the limit of the bounded state machine creates infinite programs in the limit contrast with C where in the limit the program size stays finite
yurume
2024-02-04 01:26:51
rigorously speaking the scheme *plus a trivial looping mechanism* is a BSM, but you know what you are saying
2024-02-04 01:27:19
so it can be argued that JPEG XL plus a trivial extension would make a proper BSM
Traneptora
2024-02-04 01:27:26
yea, you'd have to modify it in some way
yurume
2024-02-04 01:27:59
being a file format there are tons of other issues to extend them, but that's to be expected and accounted for the BSM argument anyway
Traneptora
2024-02-04 01:28:01
essentially if you modified lz77 to have a special wildcard to indicate infinite-length lz77 match then
2024-02-04 01:28:12
that's what would be required
yurume
2024-02-04 01:28:51
after all, the term bounded storage machine was invented by esolang community where a pure TM is not always achievable for wacky reasons
2024-02-04 01:29:22
(I think there is a rigorous definition as well, but I never saw the term being that rigorously used anyway)
2024-02-04 01:29:34
so there is a catch-all term for you all
kkourin
Traneptora if you wanted to modify MA trees in a way that they could compute anything in a proper sense you'd need to add some feature that would allow them to populate repeating patterns across large distances
2024-02-04 01:29:54
Ok, but I think you are really depending right now on what is definition of something being "in the computational model" and what isn't. I would say that changing the rules of C to no longer have limited size pointers is as much as an addition as giving JXL a way of initializing with a repeating pattern. In neither case could the rule have been "simulated" but the original model... otherwise we would not be talking about them at all
2024-02-04 01:30:44
As far as BSMs go, I think there is a point to be made that probably you could add a variable to the C spec N, and like yurume said, as N -> infinity, you get turing completeness, and perhaps this is not possible with the JXL spec
Traneptora
2024-02-04 01:31:18
indeed, even as channel sizes grow without bound, program sizes would also have to grow without bound unless you added a way to loop inputs infinitely
2024-02-04 01:31:37
you need a certain something else
2024-02-04 01:31:50
just increasing channel size by itself isn't enough
Qon
2024-02-04 01:32:44
"channel" means patterns from trees that can be at most 1024x1024?
kkourin
2024-02-04 01:32:51
Though I think the decision that there needs to be some variable you can pick out in the spec to call it a "Reasonable extension to turing completeness" is sort of arbitrary
Traneptora
2024-02-04 01:33:01
channel in this case refers to one matrix of integers encoded by the modular stream
2024-02-04 01:33:11
in practice, you have red, then green, then blue one after another
2024-02-04 01:33:19
but that's not really important for this specific discussion
2024-02-04 01:33:48
one-channel modular and N-channel modular is functionally equivalent for this purpose
kkourin Though I think the decision that there needs to be some variable you can pick out in the spec to call it a "Reasonable extension to turing completeness" is sort of arbitrary
2024-02-04 01:38:27
basically the big thing you'd need is a special lz77 length
2024-02-04 01:38:38
it would allow you to loop an entropy-coded stream infinitely many times with finite size
2024-02-04 01:38:53
currently you can only do that if the stream has one symbol
2024-02-04 01:39:17
if you could do that, then you could have an infinitely looping residual with a finite program size
2024-02-04 01:39:24
which would solve all of the issues listed above
2024-02-04 01:40:07
e.g. you could encode 0, 0, 0, 0, 0, 0, 0, 1 and then a "length = inf, distance = 8" lz77 pair
2024-02-04 01:40:16
which atm you can't do
kkourin
2024-02-04 01:40:56
well I guess the technical details are sorted out then... but I guess you still think this is not a fair comparison to giving C an infinite pointer size?
2024-02-04 01:41:55
(thanks, I don't know nearly enough about jxl to come up with that)
Traneptora
2024-02-04 01:43:03
the reason I think it's not equivalent is one is adding a specific feature that is not present in any iterations of the bounded-state-machine and one is just a natural consequence of taking a limit as the size of the bounded-state-machine gets larger
kkourin
Traneptora the reason I think it's not equivalent is one is adding a specific feature that is not present in any iterations of the bounded-state-machine and one is just a natural consequence of taking a limit as the size of the bounded-state-machine gets larger
2024-02-04 01:54:21
Well, I can probably agree that in the current way JXL is specified, there is no "natural" value you could bind to "storage_size" in the definition of BSM to give turing completeness in the limit. But I guess that to me that is just a bit unsatisfactory as a guideline for what can be considered turing complete enough
Qon
2024-02-04 01:54:35
Does https://jxl-art.surma.technology/ support images larger than 1024x1024?
Traneptora
kkourin Well, I can probably agree that in the current way JXL is specified, there is no "natural" value you could bind to "storage_size" in the definition of BSM to give turing completeness in the limit. But I guess that to me that is just a bit unsatisfactory as a guideline for what can be considered turing complete enough
2024-02-04 01:54:44
the natural value is channel width and height
2024-02-04 01:54:53
channel width being effectively "memory" and "height" being computation time
monad
Qon Does https://jxl-art.surma.technology/ support images larger than 1024x1024?
2024-02-04 01:59:05
yes ...
Qon
monad yes ...
2024-02-04 02:02:45
The examples I see all seem to be 1024x1024 or smaller. Do you havea link for a larger image?
monad
2024-02-04 02:09:24
nope
Qon
0b5vr yee, I've reached to output the simple Rule 30 so far
2024-02-04 02:27:57
Seems I'm not the first to make cellular automatons in jxl :)
Traneptora the repeating pattern looks like this
2024-02-04 02:47:07
What is the repeating bitstring for the top row for that pattern?
Traneptora
Qon What is the repeating bitstring for the top row for that pattern?
2024-02-04 02:52:26
I'd have to dig deeper into the paper to find the generator
2024-02-04 02:52:35
it is in the paper above, you can check though
Qon
2024-02-04 02:52:47
I can't find that image in the paper
2024-02-04 02:53:55
Unless that is part of figure 11?
2024-02-04 02:54:19
page 22
Traneptora
2024-02-04 02:57:04
according to wikipedia's article on rule 110 it's `00010011011111`
Qon
Traneptora according to wikipedia's article on rule 110 it's `00010011011111`
2024-02-04 02:59:55
That doesn't include the gliders
Traneptora
2024-02-04 03:00:14
I think if you start with that and repeat it does produce a form of glider
Qon
2024-02-04 03:01:01
It produces the static between the gliders
2024-02-04 03:01:57
https://jxl-art.surma.technology/?zcode=ldq9jhtHEATg_J6CL3DATv_M7CYODAhwpMSBXkBn6zIHF9hvb55PkOzzN4EYkctiEc1usKqm99Pz55cvt3FEPfzy9Pz7l5e35z8_v3x--uP1nYfn325_3X66HQ-32_3px69P3158enx9_Tj-ufB26fHjh2-Q18fj7denO-m718cPf2K8-9L_MzzuvuQ95Q995A7-8468_yqv2O-ob9fHfPj3F3y_3ht8bvA7_sP4Yxl_xAZP_uu6BL-uZfQ0Ook-T6JPc59t9IabZV7rInqV0eZeg-hp7ukqZxvNdl5t7l5Gm7tdZbvz5V6WuSuN3nC7ynTn071Mc4cnNswdrjLc-eFeDnMPT-zYcLvKw50_3MvD3Acn9rzIfV6n0W00e3me5j6X0eY-y2h2_lzs5bnMvdLoDbernOz8OcNoczcn9mxzt6tsdv4s97LMXW30httVpjuf7mWaOz2xYe5wleHOh3s5zD08sdbvc7hKq_d5uJeHuQ9P7LHhZpXLyr2uMJrc6-TELiv3OqfR7Pxa7OVa5l5t9IbbVVq51yyjzT05scvKvdpVWrlXu5dl7lpGm7tcpZV7pXuZ5s40esPtKq3cK9xL-_A1PLFW7mXTvqzc63Av7cDX4Yk9Ntysclq551VGp9Gc2Gnlnnbr08o9T_Zy2n_PtYw2t936tHLPyV5O--850-gNt6u0cs92L-2_Z3Fip5V72q1PK_dM99L-e2YbveF2lVbuGe6l_fcMT6yVe9qtTyv3dJCe9t_z8MRauafd-rRyt1N023_3lUZvuFllW7nbKbrtv3txYtvK3XbrbeVup-i2_-7ZRm-4XaWVu52i2_67mxPbVu62W28rdztFt_135zLa3HbrbeVup-i2_-7wxMaG21Vaudspuu2_-_DEWrnbbr2t3OUUXfbfdbXRG25WWVbucoou--86ObFl5S679bJyl1N02X_XXEab2269rNzlFF3239Vp9IbbVVq5yym67L8rObFl5S679bJyl1N02X9XeGJjw-0qrdzlFF323zU8sVbuslsvK3c5Raf9d17L6Da6jGbn0yk67b_zTKM33K7Syp1O0Wn_nZMTm1butFtPK3c6Raf9d3YbveF2lVbudIpO--8sTmxaudNuPa3c6RSd9t8Znlgrd9qtp5U7naLT_ju9-Mqx4XaVVu50ik777_DOK6zcYbceVu5wig777_DOK84NN6sMK3c4RYf9d3jnFVbusFsPK3c4RYf9d3jnFVbusFsPK3c4RYf9d3jnFbXhdpVW7nCKDvvv8M4rrNxhtx5W7nCKDvvv8M4rxobbVVq5wyk67L_DO69h5R5268PKPZyih_338M5rWLmH3fqwcg-n6GH_PbzzGmvD7Sqt3MMpeth_D--8hpV72K0PK_dwih7238M7r1Ebbldp5R5O0cP-e3jnNazcw259WLmHU_Sw_x7eeY3NPSt262N3x8rmhpjN_TC722E2d7f4Pg6v_r2d95Lbu2Ivf73n9GrM2ysvgbxL8XLEewAfHft014ekPmv04aHPyXy04tMPHyI4iztcO0c6ejgd2GTbq9p82mdZmq2eFiH_l_vP2f9DnF-OGbvGH4F1_Qf59e2_AQ
2024-02-04 03:02:05
From `00010011011111`
2024-02-04 03:02:40
The pattern is too short to contain the gliders
2024-02-04 03:12:46
Rule 110 with a single 1 produces a triangle with a similar (but slightly different and noticeably shorter) pattern that grows to the left. Maybe the background pattern can also be grown in a similar way?
2024-02-04 03:17:50
the tree or jxl doesn't need to be able to produce arbitrary repeating patterns in channels if a 1D cellular automaton (like 110 itself) can generate just the (a) correct pattern.
2024-02-04 03:34:40
Actually, I think I solved how to make a pattern that repeats infinitely.
_wb_
Traneptora I mean what you're really asking then is not "are modular streams programming languages" but rather "is the MA tree model as powerful a method of computation as turing machines" but the answer is *also* no. For example, an MA tree can't output a 1 every 8 pixels, and a 0 for the other 7 using only the tree
2024-02-04 08:08:24
If you allow using an invisible extra channel (which you RCT-permute to the front), you could use it to record state and do things like that, since you can access values from previous channels from the MA tree. So you could have an "auxiliary computation" in one channel that produces sample values that cycle every N pixels, and in the next channel you can do conditional stuff based on that...
Traneptora
_wb_ If you allow using an invisible extra channel (which you RCT-permute to the front), you could use it to record state and do things like that, since you can access values from previous channels from the MA tree. So you could have an "auxiliary computation" in one channel that produces sample values that cycle every N pixels, and in the next channel you can do conditional stuff based on that...
2024-02-04 08:10:24
how do you actually get the cyclic values though
2024-02-04 08:11:30
you could have it be fixed-width, sure, but how do you make it cycle
_wb_
2024-02-04 08:14:13
``` if x > 0 if W > 7 - Set 0 - W + 1 - Set 0 ```
2024-02-04 08:14:41
Something like that will do
Traneptora
2024-02-04 08:15:01
sure, but how does that make it repeat
2024-02-04 08:15:16
like, that would make an increasing staircase
2024-02-04 08:15:26
but you couldn't use that strategy to make an arbitrary specific pattern repeat
2024-02-04 08:15:31
like, 0, 0, 0, 0, 0, 0, 0, 1
2024-02-04 08:16:05
I believe to do that, you have to make the residuals repeat. the MA tree itself can't
_wb_
2024-02-04 08:16:10
Then in the next channel do ``` if Prev > 6 - Set 1 - Set 0 ```
Traneptora
2024-02-04 08:16:30
ah, yea, you could do *that*
2024-02-04 08:16:36
but how would you make an arbitrary pattern repeat
2024-02-04 08:16:50
something, like, say, 00010011011111
_wb_
2024-02-04 08:16:53
Just a longer tree that hardcodes the whole pattern
2024-02-04 08:17:29
But at some point you're better off just using lz77 🙂
Traneptora
2024-02-04 08:17:36
ye, but lz77 can't infinitely repeat
2024-02-04 08:17:40
that's the key
2024-02-04 08:17:49
there's no special length value for "forever"
_wb_
2024-02-04 08:18:17
Infinitely enough, just set the length to the image dimension
Traneptora
2024-02-04 08:18:55
well the thought experiment involved infinite-ly wide and infintely deep images
2024-02-04 08:19:10
since you'd need that to try computation
2024-02-04 08:19:30
you could always populate the tree upper-left out diagonally so it would still be able to be done
2024-02-04 08:19:45
or rather, any pixel with finite coordinates would be reachable in finite time even if it's not in the first row
2024-02-04 08:20:22
the fact that you have to declare the channel width and height in advance of the modular stream makes arbitrary computation not possible, so the thought experiment was what if you used the MA tree model on an infinite canvas
_wb_
2024-02-04 08:21:32
Anyway, about Turing completeness: no, jxl is by design not Turing complete (everything decodes in finite time so the halting problem is trivial). It's expressive though, and some kinds of generalizations would be TC.
Traneptora
2024-02-04 08:22:00
ye, the idea was that on an infinite canvas with a specific repeating pattern populated in, rule 110 could simulate arbitrary turing machines (cook, 2004)
2024-02-04 08:22:19
and since you can encode rule110 with MA trees fairly easily, you'd just need to be able to make that periodic initial state
2024-02-04 08:23:03
the easiest way to do that is with periodic residuals, but the only way to have actual zero bpp (after initial overhead) is to have a single symbol with frequency 1.0
2024-02-04 08:23:19
at least in the current entropy stream declaration
2024-02-04 08:24:01
otherwise you're locked to something that scales with the log of the image width
2024-02-04 08:24:08
which is still unbounded
_wb_
2024-02-04 08:24:43
Periodic initial state could be done with a first row that is just counting modulo the length of the pattern, and then a second row that fills in the pattern based on the value of N. And then the actual cellular automaton starts at row 3...
Traneptora
2024-02-04 08:25:35
huh, I guess you could do that
2024-02-04 08:26:07
requires you to leave the realm of binary
2024-02-04 08:26:22
though I suppose that does work
_wb_
2024-02-04 08:29:19
But of course an infinite width image is not allowed by the spec. Largest you can do is via a palette metachannel (where the width is the number of palette colors), anything else is limited to the max group size of 1024.
Traneptora
2024-02-04 08:29:30
ye, it was more of a thought experiment
2024-02-04 08:29:52
in theory you could do an unbounded width and you could still populate each pixel in finite time, and populate all pixels in countable time
Qon
_wb_ If you allow using an invisible extra channel (which you RCT-permute to the front), you could use it to record state and do things like that, since you can access values from previous channels from the MA tree. So you could have an "auxiliary computation" in one channel that produces sample values that cycle every N pixels, and in the next channel you can do conditional stuff based on that...
2024-02-04 12:04:26
Yes, that was my idea. Doesn't have to be invisible but it's a bonus :)
Traneptora in theory you could do an unbounded width and you could still populate each pixel in finite time, and populate all pixels in countable time
2024-02-04 12:06:28
So are you convinced now, now that I (and wb) solved arbitrarily repeating patterns?
_wb_
2024-02-04 12:19:38
JXL as it is is not Turing complete, by design, unlike some other formats that basically allow a full programming language with loops and all to be executed (like PostScript or SVG), which means security trouble since decoding an image might not terminate (so you need to sandbox it, with a timeout etc).
2024-02-04 12:20:32
But the modular bitstream is very expressive and can represent a lot of things in asymptotically zero bits, including many types of cellular automata.
Qon
2024-02-04 12:31:27
Yep. But the resulting image is, if given unbounded channel size. :D
JXL Art Bot
2024-02-04 01:34:29
**Qon** _“cellular automaton rule 110 repeating glider pattern for TM”_ 2024 image/jxl 355 bytes https://jxl-art.surma.technology/?zcode=ldixbttAEIThXk%2FBPiDA3bvjkU0KAwFSuUmhF7ATq0uhJm8fygqcgM5HwKqOooa%2FuNobzfJ8ebq%2BDDFlPX19vvx4ud7XD5fr0%2FPP25nT5fvwa%2Fi8LYZhWz5uy2lb3g%2FO4%2B14jNc37m%2BNj1%2FePnJ7jcO35%2BsQu%2BPpw4rYQd9fYRRkf8kPSv4U4O9dbwe11NP%2FvtvrqXLaX%2FDt1ERVrlRlt6pZ5W%2BYQVXMVIVZUaw6YLkaU6dqSqvIKusqVVm7VbNV%2FJXLslC1mLU0qw5YrEbp7KjSq1Vm9aBqNmt2NeZmFXujNLNat8qs5mo0d1R1b1SzarHqgOVqFHdUcW8Us9I7Jc1KVyPdUeHeCLPCOyUOWK7G5I6a3BuTWRN3Sq5k5bpY1axib%2BRi1jJbZdZilt0me7fKLHtUdnZvzr4vu03OxaoDlqvR2L3Z0iqzKndlVrPsUVnZvVnch3abLM2qA5ar4USUzjZpt8n0rgyz7FHpRJTONmm3yck7ZTLLHpVOROFsE3abWItVByxWI5yIwtkmFrM6d0p0s7qr4UQUzjYxmzU3qw5YroYTUTjbRDOrcadENau6Gk5EUX1fTkRhj4piluevsNuE56%2Fw%2FBX2qPD8FZ6%2Fwm4Tnr8iDliuhuev8PwVdhuPX56%2BbFCevTx62Wc8eHnusjU5BznQ2GE8cnnisik5ATnK2Fs8bHnWsh05%2BzjE2FXqwQMJP1nwUOy5x6OIE7uDrbOmw5X%2FP%2F2XZue3rdrpuE9ZalaNkHeK3YfO%2FzyV2z%2FNG7ezn4b4DQ%3D%3D
Qon
2024-02-04 01:35:49
The pattern is 436 pixels wide so it doesn't repeat many times in an image with Width 1024 though.
2024-02-04 01:37:27
The repeating pattern contains 3 gliders
_wb_ If you allow using an invisible extra channel (which you RCT-permute to the front), you could use it to record state and do things like that, since you can access values from previous channels from the MA tree. So you could have an "auxiliary computation" in one channel that produces sample values that cycle every N pixels, and in the next channel you can do conditional stuff based on that...
2024-02-04 01:46:28
The extra channel is not needed.
Traneptora well the thought experiment involved infinite-ly wide and infintely deep images
2024-02-04 01:50:28
Arbitrarily wide and deep, infinite is not needed.
Traneptora requires you to leave the realm of binary
2024-02-04 01:55:35
It works with `Bitdepth 1`, because the pixels can apparently hold larger values for computation until rendered.
JXL Art Bot
2024-02-04 01:57:59
**Qon** _“cellular automaton rule 110 with 00010011011111 repeating”_ 2024 image/jxl 56 bytes https://jxl-art.surma.technology/?zcode=C89MKclQMDQwMuHySM1MzyhRMDPhcsosSUktAIlzZaYpVCrYARkKCkCmH5BpAGRCOOG6IL6uIVgAIqTr5wpXAgK6CsGpJQqGaHwDknUYolmKaYIuLkvQjSRRCzQAEL4Gciy4sLkMKGHOhW4YVMIUlw5jXDqMMHSgKQoHRYsRFzb36wIltRUMAQ%3D%3D
Qon
Traneptora something, like, say, 00010011011111
2024-02-04 01:58:39
`00010011011111` repeating
2024-02-04 02:00:41
FramePos 0 -1 if you really don't like the top row not being part of the CA pattern below
2024-02-04 02:03:05
The pattern starts with the leftmost pixel sliced off. Since it's a repeating pattern that doesn't really matter, the rightmost end will get sliced off if it's not a multiple of pattern width anyways.
2024-02-04 02:04:50
And any repeating pattern can be rotated, it doesn't really have a true beginning or end.
Traneptora
Qon Arbitrarily wide and deep, infinite is not needed.
2024-02-04 03:56:14
it would have to be infinitely wide in the limit, because the "rule 110 computer" stops being a thing when it collides with the side of the image
2024-02-04 03:56:40
unbounded runtime would requires unbounded menory
Qon
2024-02-04 03:57:34
<@794205442175402004> Is FLIF and FUIF better for elementary cellular automata than JPEG XL? From your article it seems like they support larger images than 1024x1024, which is beyond the jxl channels. Or can you compose channels side by side have them interact in jxl?
_wb_
2024-02-04 03:59:50
FLIF/FUIF cannot do 0 bits per symbol, every symbol has a minimum cost of some small fraction of a bit (corresponding to a 4095/4096 chance). And their MA trees don't contain predictors in the leaf nodes so expressivity is much lower.
Qon
Traneptora it would have to be infinitely wide in the limit, because the "rule 110 computer" stops being a thing when it collides with the side of the image
2024-02-04 04:01:11
It just has to be wide enough. If the function requires infinite memory and never returns it doesn't actually perform an algorithm to compute a function.
Traneptora
Qon <@794205442175402004> Is FLIF and FUIF better for elementary cellular automata than JPEG XL? From your article it seems like they support larger images than 1024x1024, which is beyond the jxl channels. Or can you compose channels side by side have them interact in jxl?
2024-02-04 04:01:46
1024x1024 is not a JXL restriction
_wb_
2024-02-04 04:02:17
But yes, FLIF/FUIF doesn't have tiling so you can do arbitrarily large CAs while in JXL you can only do 1024x1024 at a time (meaning the next row/column doesn't get predicted)
Traneptora
2024-02-04 04:02:36
it's just the group size, yea
2024-02-04 04:02:53
Like you can do it
2024-02-04 04:03:11
but it's a practical format limitation
2024-02-04 04:03:23
like having fixed size streams
2024-02-04 04:04:00
That if you just want to talk about modular as a computation model, isn't that relevant
_wb_
2024-02-04 04:04:18
Groups are independent though, so e.g. for a cellular automaton every 1024th row will not see what's above it so it wouldn't compress well.
Qon
_wb_ But yes, FLIF/FUIF doesn't have tiling so you can do arbitrarily large CAs while in JXL you can only do 1024x1024 at a time (meaning the next row/column doesn't get predicted)
2024-02-04 04:04:22
Ok. Why this limit? It seems to be for parallelization, but the encoder could just choose 1024 as channel W and H in that case. Would be nice for CA have arbitrarily large channels.
Traneptora
2024-02-04 04:04:42
Sure, but that's a practical format restriction
2024-02-04 04:04:57
not a restriction of the computation model
2024-02-04 04:05:32
if you allow arbitrarily large image sizes as a thought experiment there's no reason the groupsize couldn't be tweaked
_wb_
2024-02-04 04:06:11
We wanted to keep a reasonably small limit so it is possible to make a chunked decoder that uses limited memory. 1 megapixel seemed a reasonable max chunk size.
2024-02-04 04:07:48
Also to basically guarantee that for typical camera-sized photos, lossless decode can use at least a few cores even when using the biggest group size.
2024-02-04 04:08:35
But of course this is something that could be generalized/relaxed to "no limit"
2024-02-04 04:09:29
(well there's still the max image/frame dimension of 2^30 x 2^30, would have to relax that too I guess)
Qon
2024-02-04 04:10:07
The decoder could decode rows with similar memory with 1M width, you would lose arbitrary chunk loading order and get sequential, but only for images that chose channels with large size.
2024-02-04 04:11:55
I guess the format is frozen so there's not really any point to ask for features though q:
_wb_
2024-02-04 04:23:52
I mean, images of CA output will still compress insanely well even if one row and one column of 1024 pixels each per megapixel is not predicted. Still 99.8% of the pixels can be encoded using literally 0 bits per pixel.
2024-02-04 04:34:54
(provided the tree learning figures out the CA rule)
Qon
2024-02-04 04:45:53
Yeah sure, but I want to set Width to 2^20 at jxl-art.surma.technology and then have it just work :)
2024-02-04 04:50:29
For generating jxl art. Sure the 1 Mpxl square chunks are good enough for image encoding from pixel data. But I'm not doing that, I'm just writing trees.
veluca
_wb_ (provided the tree learning figures out the CA rule)
2024-02-04 09:53:19
which is a big if 😛
Qon
_wb_ (provided the tree learning figures out the CA rule)
2024-02-05 05:49:04
Can it learn the rotation and flip as well? Or do ECA images growing up or left take orders of magnitude more space because the tree rules aren't aligned with the rules used to generate the images?
_wb_
2024-02-05 06:06:27
The encoding itself is always top to bottom, and libjxl isn't going to try different orientations. But if you have such an image, you can manually rotate/flip it so it becomes top-to-bottom, and then add some Exif orientation to the PNG input you give to cjxl to make it look the way you want again...
JXL Art Bot
2024-02-06 01:00:36
**silly goober** _“double flag”_ 2024 image/jxl 119 bytes https://jxl-art.surma.technology/?zcode=jVTLTsMwELz7K%2FZcCdW7ifO4cKCqxIkDIPVcaNJagqYSloC%2FJ6SO68em6S07k33NTvKgza45mQPk4nn1ClJs9K6PSOaVeGz0%2FmAAJeViuYBV9%2Fmmj1ujuyN0LZjvDtqP7f4LFkshdAu%2FcN%2FnA9hHhdgHLizqYgg9oLSAg8oSHeSB5IEOrggD2CMoIgDu4Gk9zJZk%2FPQZWNcJNZDvdqNJElnyv99LYyC7ylZimuOasjswoF2K8lpwpVHNlYgAWy%2FrTTCzv22A4gYZeYXS7YNhvMAem6QMXUUSY1eRkqmrSCHnqowU76qMCs5Vm2lXpaWuHGGyHAOOB1ZS3GhK9jAzHp%2B2MG%2FRZNAIGKeW4TuJGkGaC2z2GfcHiDY4UxREmI9%2Fp%2BEX5AygfCOVRRUaqabLB5qMySjNaMyqy%2BkaKhp0izpFXZIOcfVL5bHqHw%3D%3D
lonjil
2024-02-06 02:23:44
I'm gonna learn to jxl art, something might show up here soon
2024-02-06 02:46:44
gosh, this is unintuitive
veluca
lonjil gosh, this is unintuitive
2024-02-06 02:58:54
you mean what you get as you change the tree?
lonjil
2024-02-06 02:59:25
yeah
veluca
2024-02-06 03:00:07
yup the long range effects can be pretty hard to predict
JXL Art Bot
2024-02-06 03:06:18
**Lonnie** _“Flag of Sweden”_ 2024 image/jxl 81 bytes https://jxl-art.surma.technology/?zcode=tZExDsIwDEV3n%2BJfAMmx2kIXBliYAYkD0ECzMWSA21OiNgpOQIDElv8i%2FbzYK%2Bc7e%2FE9FrRd78F0cN0jMdPGunPvUQ9HcifcsIRpWwLGICGEeI13CZAIAjoOiCOIyCQImGFnPUwzL1FuSDP%2B8QUpMa6yfqkretFfaC%2FZ5%2B6puWrNOrWtNk0t1R6yLfznB9%2F0Cr2b%2BfPEP5tMaqo9J8s7
lonjil
2024-02-06 03:07:27
Now the question, did I do anything non-optimal, so that this same result could be gotten from a smaller file?
Traneptora
2024-02-06 03:14:13
it may be cheaper to do this with patches, but I don't know
lonjil
2024-02-06 03:15:19
Patches will be a lot cheaper once I want to do USA's flag, all those stars...
JXL Art Bot
2024-02-06 03:29:51
**\_wb\_** _“Flag of Sweden, 10 bytes shorter”_ 2024 image/jxl 71 bytes https://jxl-art.surma.technology/?zcode=tZCxDsIwDER3f8X9QCUnohVdGGBhYgAkPoAGmo0hA%2Fx9owiZJM4AA1vuObqzb%2BvD5B5hxoqOuzOYLn6Kas1Me%2Bfvc0Afn%2BRveGEDM44EvIVNIsmnzDJgBSR0jYgFCDIZAjqcXIDhBhyoJp9fHQ6iVFQjqBFTh%2BQRlaUy1Oske0uF7El1pZr6w%2FK%2FmGpPOaI449tKTN3JQGXcAg%3D%3D
lonjil
2024-02-06 03:40:52
nice! 77 bytes if you only change the tree structure, not the bit depth. The change in the the yellow is imperceptible, but the blue is different enough that I can tell even without putting the colors right next to each other.
lonjil Patches will be a lot cheaper once I want to do USA's flag, all those stars...
2024-02-06 04:08:58
hm, jxl_from_tree doesn't have any sort of patch support, does it?
_wb_
2024-02-06 04:12:39
nope — feel free to propose a PR to add that 🙂
lonjil
2024-02-06 04:14:11
Back when I was working on my later cancelled JXL decoder, I didn't get to the point where I had to figure out how patches work, so I guess I have some learning to do now.
Qon
2024-02-06 04:22:00
<@794205442175402004> did you run it through libjxl or did you handcraft to optimize? And why?
_wb_
Qon <@794205442175402004> did you run it through libjxl or did you handcraft to optimize? And why?
2024-02-06 04:23:13
handcraft, libjxl is unlikely to figure out trees like that
MSLP
2024-02-06 04:24:44
Can the answer for "why?" be "for the glory of Kingdom of Sweden of course"?
lonjil
2024-02-06 04:25:24
I'm gonna have fun making many flags in JXL, started with Sweden because that is where I am from :)
Qon
_wb_ handcraft, libjxl is unlikely to figure out trees like that
2024-02-06 04:25:40
Because it is written to figure out local rules, like those in an ECA, instead of finding regions?
_wb_
2024-02-06 04:27:54
the current tree learning algorithm finds a single split decision at a time. Probably x/y coords aren't even considered as split properties until e9. The thing with greedy search is that it doesn't find a global optimum
veluca
2024-02-06 04:28:11
the libjxl tree learning uses a greedy algorithm, it's not going to find trees as good as these ones 😄
_wb_
2024-02-06 04:28:32
like in that image: a single test on x or y is not really going to segment the pixels in a very useful way from the pov of entropy coding
2024-02-06 04:29:56
this is one of the reasons why there is still significant potential in encoder improvements: less greedy tree learning could be quite beneficial also in the general case (I assume mostly for nonphoto though)
Qon
2024-02-06 04:30:03
Would it find some regions though? Like a grid of 3x3 cells with borders on the color change?
lonjil
lonjil Back when I was working on my later cancelled JXL decoder, I didn't get to the point where I had to figure out how patches work, so I guess I have some learning to do now.
2024-02-06 04:30:57
Looking in the standard... Since jxl_from_tree already has support for multiple frames, I guess the first thing to add would be another header option to say that the current frame should be for reference only, and presumably something to say that a frame is cropped? And to use patches you'd have a new repeatable option with all the attributes a patch has. I think that data then needs to be entropy coded when put into a jxl file? And finally, it would be good to have some way of adding non-tree image data to a frame, in case the thing you want to use as a patch a hundred times doesn't work well as a tree.
_wb_
Qon Would it find some regions though? Like a grid of 3x3 cells with borders on the color change?
2024-02-06 04:36:48
it will likely figure out some useful rules that help a lot with entropy coding, with some special debug build you can make it output the tree if you really want to know what it does with a specific image (that's how I found a tree to reproduce the XOR pattern, I let libjxl find a tree and then simplified it because the greedy tree was not optimal and not fully zero-residual)
lonjil Looking in the standard... Since jxl_from_tree already has support for multiple frames, I guess the first thing to add would be another header option to say that the current frame should be for reference only, and presumably something to say that a frame is cropped? And to use patches you'd have a new repeatable option with all the attributes a patch has. I think that data then needs to be entropy coded when put into a jxl file? And finally, it would be good to have some way of adding non-tree image data to a frame, in case the thing you want to use as a patch a hundred times doesn't work well as a tree.
2024-02-06 04:41:07
Yes — jxl_from_tree basically calls internal encoder functions directly so the way to do it would be to add some way to pass patch coords to the encoder (via some vector in cparams or something) and then override patch detection to just pretend it detected the passed patches so it writes them to the bitstream. It's a bit of a tricky code plumbing exercise though
lonjil
2024-02-06 04:42:30
I've never used C++ for anything ever, so that will be fun.
2024-02-06 05:25:35
So it's pretty simple to create vertical, horizontal, or diagonal boundaries with the N, NW, W, etc, predictors, but is there a simple way of doing other angles?
Qon
lonjil So it's pretty simple to create vertical, horizontal, or diagonal boundaries with the N, NW, W, etc, predictors, but is there a simple way of doing other angles?
2024-02-06 06:10:05
https://jxl-art.surma.technology/?zcode=c8osSUktKMlQMOTKTFOoVLBTMOBSUNBV8ANiQwgzXEFbwRAA
2024-02-06 06:10:34
I haven't figured out layering yet, but I think it can be done?
_wb_
2024-02-06 06:10:55
I suppose it should be possible to do at least angles in between of the form ``` 1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 ``` or ``` 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 ``` with some suitable test involving WW or NN or something
Qon
2024-02-06 06:11:50
My method allows any angle
2024-02-06 06:12:19
But needs more on top to make it useful
_wb_
2024-02-06 06:12:20
yes that kind of thing works too, cannot really do a sharp line between two arbitrary colors that way though
Qon
2024-02-06 06:13:10
Thought I could use Prev for that, but those are on color channels not frames
_wb_
2024-02-06 06:13:14
although I guess you could use that in the alpha channel and use layers with clamped alpha, or something
Qon
2024-02-06 06:13:29
Exactly
2024-02-06 06:14:28
I haven't figured out layering, but if layers can be read than you can test and filter with those angled sheets
2024-02-06 06:14:39
for the sharp lines
2024-02-06 06:16:28
Splines should be able to do arbitrary lines as well, or are they missing some feature to be useful for this?
JXL Art Bot
2024-02-06 06:22:38
**Qon** _“arbitrary angles + repetition”_ 2024 image/jxl 34 bytes https://jxl-art.surma.technology/?zcode=c8osSUktKMlQMOTKTFOoVLBTMOBSUNBV8ANiCwMIAAuEK2grGEMFAA%3D%3D
lonjil
2024-02-06 06:23:25
neato
Traneptora
2024-02-06 06:24:32
the belgian flag is a testcase in the ffmpeg fate suite
2024-02-06 06:25:17
Qon
Traneptora
2024-02-06 06:26:15
png? My browser does not yet support .jxl <:SadOrange:806131742636507177>
Traneptora
2024-02-06 06:26:44
lonjil
2024-02-06 07:11:31
I'm looking at the code now and I'm seeing that there are a lot of options not explained on Surma's jxl-art site's help page
Traneptora
2024-02-06 07:18:36
ye, documentation could be improved
**Qon** _“arbitrary angles + repetition”_ 2024 image/jxl 34 bytes https://jxl-art.surma.technology/?zcode=c8osSUktKMlQMOTKTFOoVLBTMOBSUNBV8ANiCwMIAAuEK2grGEMFAA%3D%3D
2024-02-06 07:19:03
this is creating an interesting optical illusion
2024-02-06 07:19:16
I keep seeing rainbows that aren't there
2024-02-06 07:19:29
perpendicular to the diagonal lines
Qon
lonjil Now the question, did I do anything non-optimal, so that this same result could be gotten from a smaller file?
2024-02-06 08:09:19
https://jxl-art.surma.technology/?zcode=c8osSUktKMlQMOEKz0wB0hYGBlweqZnpGSUKpkCmY05BRiKXX36JT2JxCRdXZppCsoKdghGXgoKuQnBqiYKhKZAJFTUEMuHiBmAOVAbCgcmZofAMUEyvBJluacmFkAUbAhI2BAvDzTRCMQXsDiRZQygX2RwUBQgBuBFGmEKmXMhGALVWYHdfxaBwHwA Fläg öf Sweden, 14 bytes longer I just wanted to try layers.
lonjil
2024-02-06 08:10:16
Ah, cool
Qon
2024-02-06 08:11:12
background color is specified once, each yellow line is specified once
Traneptora I keep seeing rainbows that aren't there
2024-02-06 08:13:05
Yeah it kind of messes with your eyes a bit
2024-02-06 08:13:40
A bit hard to focus on as well
2024-02-06 08:15:47
And going closer/farther from my display and it looks like it compresses and expands.
_wb_
Traneptora the belgian flag is a testcase in the ffmpeg fate suite
2024-02-06 09:04:22
As a Belgian, I approve.
Traneptora
_wb_ As a Belgian, I approve.
2024-02-06 09:05:05
I did it cause it was a random piece of JXL art I had on file at the time <:kek:857018203640561677>
_wb_
2024-02-06 09:05:05
Also I keep being amazed at how our flag is just the French flag with the blue channel removed.
Traneptora
2024-02-06 09:05:19
... I hate that
2024-02-06 09:05:22
that's so accurate
_wb_
2024-02-06 09:11:59
We're basically just a smaller, warmer "night shift color theme" version of France, I guess.
JXL Art Bot
2024-02-06 11:28:35
**Qon** _“Flag of USA w/o stars”_ 2024 image/jxl 100 bytes https://jxl-art.surma.technology/?zcode=ZVBBDsIgELzvK%2FYDJkChlIuJnjyYxsSD58aikJi0UWL091JCpdADYWdmZ2dhb12vR2ewgYvt%2FU0J43DQ9m4cikrB7jGaDtrBHbuXA7A3vOIWGSBu8KwdMiF8HWnqy1moeQBRIQHMGpU5bGiW8I2GRVgAp6d%2BTzhEJnuJSdyi9UdQqbhQNSRxSvj4MZwoWFpiMFMEylnZIuvY7PWpQck%2FUfxC6uFiRVU%2F
Qon
2024-02-06 11:28:54
Making stars is tricky...
lonjil
2024-02-06 11:29:22
hopefully I'll get patches working soon :p
Qon
2024-02-06 11:30:34
If I could read previous frames and have more access to blend modes I might be able to write the tree equations...
**Qon** _“Flag of USA w/o stars”_ 2024 image/jxl 100 bytes https://jxl-art.surma.technology/?zcode=ZVBBDsIgELzvK%2FYDJkChlIuJnjyYxsSD58aikJi0UWL091JCpdADYWdmZ2dhb12vR2ewgYvt%2FU0J43DQ9m4cikrB7jGaDtrBHbuXA7A3vOIWGSBu8KwdMiF8HWnqy1moeQBRIQHMGpU5bGiW8I2GRVgAp6d%2BTzhEJnuJSdyi9UdQqbhQNSRxSvj4MZwoWFpiMFMEylnZIuvY7PWpQck%2FUfxC6uFiRVU%2F
2024-02-06 11:32:29
It uses the stripes trick to keep bytes down
lonjil
2024-02-06 11:33:33
looking at the code, blendmodes can be accessed, even though it isn't documented (and the surma site appears to be using a new enough version) ```c++ } else if (t == "BlendMode") { t = tok(); if (t == "kAdd") { io.frames[0].blendmode = BlendMode::kAdd; } else if (t == "kReplace") { io.frames[0].blendmode = BlendMode::kReplace; } else if (t == "kBlend") { io.frames[0].blendmode = BlendMode::kBlend; } else if (t == "kAlphaWeightedAdd") { io.frames[0].blendmode = BlendMode::kAlphaWeightedAdd; } else if (t == "kMul") { io.frames[0].blendmode = BlendMode::kMul; } else { fprintf(stderr, "Invalid BlendMode: %s\n", t.c_str()); return false; } } ```
2024-02-07 10:06:50
<@265247121261854722> I noticed your thinking reaction. Here is an example showing how to set blendmodes: https://jxl-art.surma.technology/?zcode=ZVDLDoIwELzvV-wPmLSlBXoxkZMHISYePBNbhUiEaDX695amUB6Hpjs7uzOTzWqjdGcqTOFcK_tTwjjsdX2rDIpIwq7pqhKK1hzKlwGor3jBLTJA3OBJG2RC2Nq3qS0HIuYOeIY4MHA0mcOUjg5Zox8qb5XGe_5uer-fX59YO3B86k-PXYAgtsTEZyrsEzSRXMgYAjnxc2Xv-LWynEiYSvggTBJYas-CrWPMbhMGZDI2FjcKM1ysWtEf
Qon
lonjil <@265247121261854722> I noticed your thinking reaction. Here is an example showing how to set blendmodes: https://jxl-art.surma.technology/?zcode=ZVDLDoIwELzvV-wPmLSlBXoxkZMHISYePBNbhUiEaDX695amUB6Hpjs7uzOTzWqjdGcqTOFcK_tTwjjsdX2rDIpIwq7pqhKK1hzKlwGor3jBLTJA3OBJG2RC2Nq3qS0HIuYOeIY4MHA0mcOUjg5Zox8qb5XGe_5uer-fX59YO3B86k-PXYAgtsTEZyrsEzSRXMgYAjnxc2Xv-LWynEiYSvggTBJYas-CrWPMbhMGZDI2FjcKM1ysWtEf
2024-02-07 10:14:36
Thanks! <:FeelsReadingMan:808827102278451241> <:BlobYay:806132268186861619>
lonjil
2024-02-07 10:16:05
It seems that if you set a blend mode on a frame, all later frames get that blend mode unless you set a new one.
2024-02-07 10:52:57
I'm a bit confused by something. These tree files behave opposite of what I would expect: ``` Bitdepth 2 RCT 0 NotLast - Set 1 - Set 3 ``` ``` Bitdepth 2 RCT 0 NotLast - Set 3 - Set 1 ``` my expectation is that the first tree goes into the first frame, and that then the second tree goes into the second frame which gets drawn on top of the first frame. So the first example should have a gray first frame, and a white second frame, and the final image should be white. And I expect the second example to have a white first frame, a gray second frame, and a grey final image. But I observe the opposite of this. If I add `Alpha`, the second example continues to be pure white, and the first examples becomes a lighter gray, further making it seem like the first tree is the second frame.
2024-02-07 10:56:24
the documentation makes it seem like its behaving backwards 🤔 > NotLast: This is not the last frame/layer (not enabled by default). This flag can be used to do multi-layer images. After encoding this layer, another layer will be encoded, which gets alpha-blended over the first layer
2024-02-07 11:04:25
yeah, no matter how I set the alpha values in this one, it never outputs a red image. Only blue or white. ``` Bitdepth 1 RCT 0 NotLast Alpha if c > 2 - Set 1 if c > 1 - Set 1 - Set 0 if c > 2 - Set 1 if c > 0 - Set 0 - Set 1 ``` is there something obvious I'm missing?
2024-02-07 11:14:21
On Surma's website, it works as I would expect...
2024-02-07 11:15:27
that uses v0.7 so I guess I'm in for another bisection
w
2024-02-07 11:31:02
it's also red on https://embed.moe/jxl_from_tree end of 2022
lonjil
2024-02-07 11:37:18
I can at least confirm that a version of libjxl from the middle of 2022 worked correctly
_wb_
2024-02-07 05:24:25
the streaming encode refactoring probably messed up jxl_from_tree in more than one way
lonjil
2024-02-07 05:25:37
This problem was caused by an older change, in November
2024-02-07 05:26:19
When tests and jxl_from_tree were changed to use cparams instead of PassesEncoderState
Qon
lonjil looking at the code, blendmodes can be accessed, even though it isn't documented (and the surma site appears to be using a new enough version) ```c++ } else if (t == "BlendMode") { t = tok(); if (t == "kAdd") { io.frames[0].blendmode = BlendMode::kAdd; } else if (t == "kReplace") { io.frames[0].blendmode = BlendMode::kReplace; } else if (t == "kBlend") { io.frames[0].blendmode = BlendMode::kBlend; } else if (t == "kAlphaWeightedAdd") { io.frames[0].blendmode = BlendMode::kAlphaWeightedAdd; } else if (t == "kMul") { io.frames[0].blendmode = BlendMode::kMul; } else { fprintf(stderr, "Invalid BlendMode: %s\n", t.c_str()); return false; } } ```
2024-02-08 11:00:00
Is there a (mathematical and/or text) description for each blend mode. kMul is easy enough to understand from name, but not all have the same as a blend mode in other software. And not many modes to choose from.
veluca
2024-02-08 11:00:24
there's the code and the spec, I guess
2024-02-08 11:01:37
https://github.com/libjxl/libjxl/blob/6c0b3106a8a1ef65ba36c24bfcd9402c3140ae2d/lib/jxl/blending.cc#L32 code
Qon
veluca there's the code and the spec, I guess
2024-02-08 11:30:24
Thanks. Is there a link to spec also?
veluca
2024-02-08 11:34:34
unfortunately nothing I can share 😦
2024-02-08 11:36:53
Qon
veluca
2024-02-08 12:05:22
Ooh this pic shows kAdd, which wasn't in the previous snippet and didn't see it at first in source. And kMulAdd isn't in source. But kAdd seems to work so that's something
veluca
Qon Ooh this pic shows kAdd, which wasn't in the previous snippet and didn't see it at first in source. And kMulAdd isn't in source. But kAdd seems to work so that's something
2024-02-08 12:06:32
kMulAdd has to be somewhere in the source xD
lonjil
2024-02-08 12:08:53
It's called kAlphaWeightedAdd in the source
spider-mario
2024-02-08 12:50:12
ah, right, we might have renamed it at some point, presumably to make things clearer
2024-02-08 12:50:17
the spec must be from before the rename
JXL Art Bot
2024-02-08 09:05:32
**Qon** _“BW Star”_ 2024 image/jxl 410 bytes https://jxl-art.surma.technology/?zcode=zZVLT8MwDMfv%2BRS%2Bo0h5OskFaZy3CYkD54kWgag2BB2Cb0%2B6PvJoVXpBa0%2F5O67tn%2By6m%2Br95UD2p3p7%2BKwJeX2GJ7gFQQAoPJQ1CK2HM0v8vr2f5tzfevHjhdTGi%2BDcnLurVlxkH34w3H%2BUX43tkqh%2F4uSpjZGg93ADVGiMwrdVicjp0TsZa5GkcSSziLNogsQ51wbJMkQ6wagYWsFwxCYlm2LThl%2BBbQEatygzNGoVWmmXoyU4Pen1muWYy4gEMmeFSzqwcCgHthhlGmSMkUJkPcnqb6uP2tE1QxgtjeLz%2B%2BHfqwzf%2FXhuukK5cU6ZuZWGTq5mbNCpfJFNzI3LN9IUWih%2FldOjHIbpuavKY7E7FSW87c7VHz8l2ojojU1REBLcfgE%3D
_wb_
2024-02-08 09:10:04
Wow, nice one!
Traneptora
2024-02-08 09:10:28
it makes for a good frame blending exercise for jxl-oxide <:kek:857018203640561677>
2024-02-08 09:10:41
jxlatte and jxl-oxide both decode this in ~1.6s on my machine
2024-02-08 09:11:11
jxlatte is very much not optimized so I'd expect jxloxide to do better
_wb_
2024-02-08 09:11:42
Might not be a valid bitstream though, technically speaking. Seems to use more than the int16 range which a containerless jxl is allowed to use (not that anyone checks that)
Traneptora
2024-02-08 09:11:57
it takes advantage of 32-bit wraparound
2024-02-08 09:12:09
however all three decoders decode it to the same PNG
JXL Art Bot
2024-02-08 09:13:20
**Qon** _“BW 5 point Star, inverted blend shown”_ 2024 image/jxl 445 bytes https://jxl-art.surma.technology/?zcode=zZU9T8MwEIZ3%2FwrvKNL562wvSGWmFRIDc0WCQEQUQUDw73GbOP6IG2VBTSaffbLfJ%2B%2F5vGnfn%2Fdkd%2Bhu958dIS9P9JFeU04oreh901Gu1DiGJO%2FH5SnG3KoLfl0glHZBSD6Oh6U%2BOIV%2B%2B3Hi7qP5Ps6dDvJffHg6ByTEO3pFK64w2r5XxaOkB5ekjUGS7iPAIM6icRKfuTZIyBCrAqMENBxwwiYElNiUZhdgW4DGDIoMrTISjTDL0RIcT3o5syzYjIgjWMNt4sDCohzZYpQyyBQjhcg8yfT36iM7BjO4VkJLNt8f%2Fl1luPfTuhmEMm2t1HMtDa1YTdmglXkjK9SNzTtSCS3IX2X1SIuhem7a5q3eHuqGvm6%2F2tEZzfJnyd95xmKXdFQGqVzfwxmLfUuNnLOsOv8vQhSp39R1UT0s1g7nlc974cd%2F
Qon
2024-02-08 09:14:22
^ I made the star by making the outside white and then inverting, so I made another image where the inverted region doesn't cover the whole image to show that
Traneptora it takes advantage of 32-bit wraparound
2024-02-08 09:16:51
The multi-line images (american flag, BW arbitrary angle + repeat demo) use int overflow. The star doesn't go that high for any pixel to wrap around.
Traneptora
2024-02-08 09:17:37
oh, I must have miscounted digits then
2024-02-08 09:17:50
in either case it's still strictly speaking noncompliant because it goes above 16-bit buffer sizes
2024-02-08 09:17:55
which you can't do without level10
2024-02-08 09:18:01
but all the decoders work with it just fine
Qon
2024-02-08 09:19:57
I need larg~ish numbers to get rid of gradients at the borders. I want to go from 0 or less to hit at least 255 from one pixel to next