Hi Vincent!

Except for one concept, I may agree with you: it's all about points of view, what you are interested in. Read inline comments.

Il giorno 27/ott/08, alle ore 18:01, Vincent Hennebert ha scritto:
I’ve finally had the time to look at your patch. IIUC your idea is to do
best-fit on the N but X lines, and total-fit on the final X lines.

That's what the patch I wrote actually do, but it's not what I was intending. I fixed this problem in the pruning code I wrote for trunk by choosing the first node that have the best leaf as child. This is nor best fit, neither total fit: it's a step forward than best fit and a step backward than total fit. If X is big enough there's an high probability that the first line layout won't lead to bad layout for the immediate following lines: again, this is not best fit. And the last X lines are laid out in total fit. Do you agree?


I’m not sure there’s a real-life use case for such an optimization:
people wanting speed will still be less happy than with plain best- fit,
people wanting quality are ready to pay the price for it anyway.

This is correct, but the total-total fit (document and paragraph) algorithm the prototype is actually implementing may be very hungry for resource; in the document you recently wrote you mention a paragraph that can be laid out in 4, 5 and 6 lines, but what if the document contains many paragraphs like those I used to test the pruning in trunk? With pruning (that can easily turned on/off) you may partially keep the advantages of total total fit.

A thing that might be interesting is to regularly cut down with the
number of active nodes, every x lines: once all of the layouts for
line x have been found, select the best active node and discard all the
other ones. Then do that again for line x + x, 3x, 4x, etc. While
similar, it has the advantage that every bunch of x lines will have been
determined by a local total-fit method. In fact the paragraph will be
made of a sum of local optimums, that may actually correspond to the
global optimum or not. But even in that case, I’m not sure this is worth
the additional complexity to a piece of code that’s already well
complicated enough.


Another option might be to set a limit to the amount of consumed memory
(the number of active nodes, which in turn will have an effect on the
processing time). Once the maximal number of active nodes is reached,
start discarding the nodes with highest demerits. But it remains to see if such a heuristic proves to be efficient, and what limit to set up. As we can see in your other message, figures may change radically from one
document to the other.

I think that pruning provide a good trade off output-quality/ performance without messing up so much the code (look at the patch for pruning in trunk, it's trivial). Anyway pruning isn't the best way to cut down the number of active layouts, the solutions you propose are more efficient, but I wrote the pruning for another reason (more later) and here we are talking about its (positive) side effect.

In the end, I would be more inclined to implement a gradation in the
layout quality (best fit, total fit over page sequence, total fit over
document, total fit over document + paragraph line numbers, etc.),
rather than one or several pruning method. I think it should be easier
to implement yet provide enough flexibility to satisfy all kinds of
users.

Sorry if that sounds a bit negative. Since this is all but a simple
topic, I may well have missed the interest of your approach. At any rate good ideas sometimes emerge from the oddest experiments, so feel free to
continue your investigations...

About my main goal (start imaging violins playing a moving song): I dream of a fo processor that can process document in "streaming" using a constant amount of memory regardless the size of the input document (stop imaging... :P). Probably some nice features needs to be dropped, or it's simply not possible, but I think that this is an interesting challenge. Anyway I'm far from reaching this goal.

Why a streaming memory-efficient processor? Because industry need it: XML and related are beautiful technologies but sometimes too much academics and not production oriented. My company need it (I hope they will allow me to continue working on this...). A prove of the market interest in this sense is XF Ultrascale, a commercial fo processor that is claiming very low memory footprint [1]. It managed to obtain impressing results in some test, but it fails rendering my company test going out of memory. So it seems that a streaming processor still doesn't exists, even in commercial products. Obviously, you (and the FOP team) may consider streaming processing not interesting or a very low priority goal. You probably have targets different from mine. Let's consider pruning from the two points of view.

Do you care about streaming processing?
Pruning is *necessary* (along with mixed line/page breaking) if you want to render pages before the end of the document is reached while keeping output quality better than best fit.

Don't you care about streaming processing?
Pruning is a way of improving performance, surely not the more efficient. Keeping the amount of active nodes (with pruning or other solutions) is not necessary and maybe its benefits in the real life use make it not so desirable.

I expect you and the FOP team don't care, at least ATM, about streaming processing. Anyway thank you for your feedback, you spent time for it.


Dario


[1] http://www.ecrion.com/Products/XFUltrascale/PerformanceComparisonGraph.aspx

Reply via email to