|
Re: Template recursion, StackOverflowError, saxon:while a nd variable assig: msg#00123text.xml.saxon.help
Hi Andre, > On the other hand, I am surprised that the information provided and the > problem description is not sufficient yet, that is more then I had when I > figured it out in the first place. The information provided is not at all convincing that a pure XSLT solution does not exist or that an XSLT solution will be significantly less efficient than one using saxon:assign. Be informed that there exist pure XSLT solutions to the problem of finding a path between two nodes of a multigraph -- I have my own solutions and wouldn't be surprised if other people have developed theirs. I would be glad to demonstrate such a solution on a sample graph, provided by anyone interested. > Re-designing and re-writing the code > will not be trivial and if you want to do it we could always try to workout > agreements, but there is no money. I am not interested in being hired to work on this or in getting money. What I just want is that people are not misinformed about the alleged impossibility (or inefficiency) of solving this problem in a pure functional (without modification of values of variables) way. Unfortunately, from this thread until now it seems that you cannot stand up to the challenge and provide a concrete example of the problem that would support your statements. Thanks, Dimitre On 6/18/05, Andre Cusson <ac-ncSKzJSyWVNl57MIdRCFDg@xxxxxxxxxxxxxxxx> wrote: > Hi Dimitre, > > Our application has over 25K lines of XSLT, apart from the Java code > working with it. There are about 15 man/years of development from > experienced developers with an average of over 20 years experience each, in > the field. By the way every one of them dislikes assign but all agree that > it is the best available solution. Re-designing and re-writing the code > will not be trivial and if you want to do it we could always try to workout > agreements, but there is no money. > > If our code and design are "wrong" because they are based on assign and if, > as I understand it, an assign-based design is what you are trying to avoid, > our code implementing our (faulty) design is probably not the best place to > start. > > On the other hand, I am surprised that the information provided and the > problem description is not sufficient yet, that is more then I had when I > figured it out in the first place. Also, if XSLT has the proper constructs > for this, it should be easy to work out an acceptable solution, shouldn't > it ? Isn't there a design pattern for avoiding circular references in a > circular net in a high-performance Web context ? > > My feeling is that, rather than trying to patch the current design, the > best thing to do is to start back from the specs and work out a design > approach that meets the requirements and does not use assign. > > I tried to provide the specs and requirements and I would be happy to > provide further support there, as well as to try to work out an alternate > solution with whoever is interested. > > If we come-up with a better solution, we will undertake retro-fitting it to > our application but if no one can provide a better solution, please allow > me to believe that XSLT would be lacking without assign. > > Thank you. > > Cheers, > Andre > > > > > > At 17:30 2005-06-17, you wrote: > >Andre, > > > > > For now at least, I maintain that assign is indispensable to the problem > > > solution and that since this problem should be relatively common and that > > > there is bound to be more like this, that XSLT would be lacking without > > > assign, implying that assign should be considered as a standard > > > "extension" > > > and complement to the language. > > > > > >This will remain an unconfirmed statement (therefore, most probably > >false) unless an example is provided -- a sample source xml document > >and the solution that uses saxon:assign. Then people may be able to > >provide a pure XSLT solution and compare the two solutions. > > > > > >Cheers, > >Dimitre Novatchev > > > > > >On 6/18/05, Andre Cusson <ac-ncSKzJSyWVNl57MIdRCFDg@xxxxxxxxxxxxxxxx> wrote: > > > Hi Ed and Dimitre, > > > > > > Each node in the network is really a tree, as each "database model" record > > > is itself a document. > > > The network is not usually a complete network but could be and two > > > adjacent > > > nodes can have multiple arcs between them. > > > > > > The "database" contents change constantly, based on update requests, > > > sometimes fast, sometime slow. > > > Not all requests are for update but in any case (ie. read or read/write), > > > the network analysis has to be performed as inside and outside conditions > > > can change. > > > > > > Triggered by a request passing it request parameter nodeset specifying the > > > required processing conditions, source, targets, etc., used throughout the > > > traversal, the analysis currently does a single pass forward traversal of > > > the required paths without any back axis access. Also, a node is never > > > processed twice. > > > > > > Currently, as the traversal progresses nothing is changed in the network > > > but some information is accumulated in a variable, using assign, and the > > > traversal process further refers to this variable as it > > > progresses. Currently the "analysis" model variable is a single string > > > and > > > referral to it uses regular expressions. > > > > > > Replacing the "analysis" string variable, with a dynamically evolving > > > key() > > > may work, It would probably be larger, more elaborate, and possibly > > > slower, > > > but the key() structure would also have to be assignable ... > > > > > > As for Dimitre's quoted solution, it is interesting, and granted, it does > > > not get tangled in a loop, but the sample graph used has no loops and it > > > only has a single arc between adjacent nodes. But the main issues here > > > are > > > related to performance and memory as the network has to be traversed > > > multiple times (ex: building the key structure) and the keys would have to > > > hold all the nodes in the "database" and many of them multiple > > > times. Then, the whole structure has to be processed recursively and > > > nodes > > > have to be copied again. My feeling is that we are orders of magnitude > > > slower than the current solution and memory is going to burst. Also, if > > > the request is read-only, and most requests are, we have copied most of > > > the > > > nodes for nothing. > > > > > > We need to improve performance, not slow it down, as it can never be fast > > > enough. Same with memory usage. And here, we are still talking of a > > > simplified problem. > > > > > > For now at least, I maintain that assign is indispensable to the problem > > > solution and that since this problem should be relatively common and that > > > there is bound to be more like this, that XSLT would be lacking without > > > assign, implying that assign should be considered as a standard > > > "extension" > > > and complement to the language. Yet, I think that assign should be > > > avoided > > > and used exclusively when it is by far the best approach to solving a > > problem. > > > > > > This reminds me a lot of the goto statement in a language like Pascal: > > > counter-architectural but indispensable for processing recursive > > > structures > > > without using recursion, for example, in cases where the level of > > > recursion > > > would burst the memory/stack > > > > > > We have been working on this for a while, about 3 decades for me, and I > > > would be very happy to find or learn a better solution, but it has to be > > > both: better and a solution, before we can drop the old. > > > > > > Thank you for your interest and consideration. > > > Regards, > > > Andre > > > > > > > > > > > > At 05:07 2005-06-17, you wrote: > > > >Hi Andre > > > > > > > >Am I right in saying your problem _could_ be equivalent to the following > > > > > > > >You have two input models. > > > > - your large database model > > > > - your problem goal > > > >You perform a side-effect free analysis to compute > > > > - a goal-specific change request model > > > >The change request model then controls an update of the database model? > > > > > > > >This is typical of many graph analysis problems, and it is often > > > >convenient for a non-side-effect free analysis to leave marks > > > >and other temporaries within the source database model. This avoids > > > >any allocation/location issues for the working memory. > > > > > > > >Analysis > > > >-------- > > > > > > > >A possible solution within XSLT is to maintain the marks in an > > > >analysis model that accompanies and references the database model. > > > >You are then dependent on efficient key() functionality to > > > >navigate randomly from database model to analysis model. > > > >Separating the read-only and read-write functionality will have > > > >considerable advantages in resolving re-entrancy issues. > > > > > > > >A possible extension to XSLT might be to support a form of > > > >node extension, so that each output document node could comprise > > > >the 'copied' input node plus the appended working extension. This > > > >could avoid the performance limitations of key(). > > > > > > > >Update > > > >------ > > > > > > > >The controlled update of the large model in response to a change > > > >request model is a straightforward challenge for Michael and other > > > >XSLT compiler implementers. The compiler should recognise that, > > > >subject to minimal constraints, an in-place update can be performed. > > > > > > > >Perhaps XSLT could have a keyword that indicates that this is the > > > >programmers intent, so that the compiler can explain why the intent > > > >is not fulfilled. > > > > > > > > Regards > > > > > > > > Ed Willink > > > > > > > > > -----Original Message----- > > > > > From: Andre Cusson [mailto:ac-ncSKzJSyWVNl57MIdRCFDg@xxxxxxxxxxxxxxxx] > > > > > Sent: 17 June 2005 06:40 > > > > > To: saxon-help-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@xxxxxxxxxxxxxxxx > > > > > Subject: Re: [saxon] Template recursion, StackOverflowError, > > > > > saxon:while > > > > > a nd variable assignability > > > > > > > > > > > > > > > Hi Dimitre, > > > > > > > > > > The graph is a (generic) capacity network (multi-digraph) and > > > > > one of the > > > > > tasks, for example, is to follow every path between node A > > > > > and node B, > > > > > weighting the arcs and processing, while not getting tangled > > > > > in a loop, > > > > > very quickly, very often, on possibly huge graphs, all in XSLT. No > > > > > (significant) heuristics are currently used, only plain > > > > > crunching, and > > > > > saxon:assign. Of course, as paths are traversed and > > > > > processed, some may be > > > > > found to be uninteresting at the time and further processing > > > > > of that path > > > > > is skipped, for now. > > > > > > > > > > How would you do it in XSLT, without using saxon:assign ? > > > > > > > > > > Thank you, > > > > > Andre > > > > > > > > > > > > > > > > > > > > It happens that I already have this done :o) -- more than an year ago > > > > > >I implemented in XSLT some generic graph (multigraph) operations like > > > > > >Eulerisation and the street sweeper / NY postman algorithm. > > > > > > > > > > > > > > > > > >Of course, full graph traversal is NP-complete (regardless if assign > > > > > >is used or not), so with deep graphs one would inevitably try some > > > > > >euristics. > > > > > > > > > > > > > > > > > >Cheers, > > > > > >Dimitre Novatchev. > > > > > > > > > > > > > > > > > > > > At 00:28 2005-06-17, you wrote: > > > > > On 6/17/05, Andre Cusson <ac-ncSKzJSyWVNl57MIdRCFDg@xxxxxxxxxxxxxxxx> > > > > > wrote: > > > > > > Hi, > > > > > > > > > > > > Simple? > > > > > > How would you avoid getting stuck in a circular loop while > > > > > processing a > > > > > > general directional graph with XSLT, without using assign ? > > > > > > > > > > > > Thank you > > > > > > Andre > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > At 23:31 2005-06-16, you wrote: > > > > > > > >So how about an (simple, please) example? > > > > > > > > > > > > > > > >Maybe someone will come up with comparable efficient > > > > > solution without > > > > > > > >using saxon:assign? > > > > > > > > > > > > > > > > > > > > > > > >Cheers, > > > > > > > >Dimitre Novatchev > > > > > > > > > > > > > > > >On 6/17/05, Andre Cusson > > > > > > > ><ac-ncSKzJSyWVNl57MIdRCFDg@xxxxxxxxxxxxxxxx> wrote: > > > > > > > > > Hi, > > > > > > > > > > > > > > > > > > Definitely a graph and one of the issues is dealing > > > > > with circular > > > > > > > > > references, in a strained performance environment. > > > > > > > > > It has been working fine for a few years already and > > > > > uses assign. > > > > > > > > > > > > > > > > > > Andre > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > At 11:40 2005-06-16, you wrote: > > > > > > > > > >Hi Andre > > > > > > > > > > > > > > > > > > > >... > > > > > > > > > > > by a graph processing > > > > > > > > > >... > > > > > > > > > > > > > > > > > > > >Do you really mean graph or tree? > > > > > > > > > > > > > > > > > > > >For a tree-structured problem one can envisage a very simple > > > > > > transform, > > > > > > > > > >that declaratively takes in the entire data-base > > > > > plus a change request > > > > > > > > > >and returns the updated database. If the change > > > > > request applies > > > > > > > > > >to some low level branches, then multiple changes > > > > > can be safely > > > > > > > > > >executed in parallel on multiple processors. The > > > > > XSLT compiler > > > > > > > > > >needs to recognise the tunneling down to the > > > > > branches idiom to > > > > > > > > > >identify that the transform has a very controlled > > > > > change domain > > > > > > > > > >within which an assign rather than copy can be performed. > > > > > > > > > > > > > > > > > > > >It then 'just' requires the XSLT compiler to manage > > > > > the on-demand > > > > > > > > > >re-distribution of data nodes to processors, so that > > > > > you run one > > > > > > > > > >massively parallel XSLT session rather than one per process. > > > > > > > > > > > > > > > > > > > >If your problem is really a graph, then there must > > > > > be significant > > > > > > > > > >issues with determining the extent of the change, and more > > > > > > significantly > > > > > > > > > >ensuring that the concurrent execution of 'assign'-optimised > > > > > > transforms > > > > > > > > > >is deterministic. I don't think that XSLT as it > > > > > stands, will allow > > > > > > for the > > > > > > > > > >real life indeterminism that you currently have. You > > > > > don't mind which > > > > > > > > > >record is updated first, just so long as the updates > > > > > are consistent. > > > > > > > > > >But achieving this consistency probably means that > > > > > you already have > > > > > > > > > >a policy that constrains the potential graph > > > > > anarchy, and this could > > > > > > > > > >be exploited by XSLT to do what you do manually. > > > > > > > > > > > > > > > > > > > > Regards > > > > > > > > > > > > > > > > > > > > Ed Willink > > > > > > > > > > > > > > ------------------------------------------------------- > SF.Net email is sponsored by: Discover Easy Linux Migration Strategies > from IBM. Find simple to follow Roadmaps, straightforward articles, > informative Webcasts and more! Get everything you need to get up to > speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click > _______________________________________________ > saxon-help mailing list > saxon-help-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@xxxxxxxxxxxxxxxx > https://lists.sourceforge.net/lists/listinfo/saxon-help > ------------------------------------------------------- SF.Net email is sponsored by: Discover Easy Linux Migration Strategies from IBM. Find simple to follow Roadmaps, straightforward articles, informative Webcasts and more! Get everything you need to get up to speed, fast. http://ads.osdn.com/?ad_idt77&alloc_id492&op=click |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | Re: [saxon - Help] RE: Setting ErrorListener has no effect: 00123, Roger Kovack |
|---|---|
| Next by Date: | Re: Template recursion, StackOverflowError, saxon:while a nd variable assignability: 00123, Roger Kovack |
| Previous by Thread: | Re: Template recursion, StackOverflowError, saxon:while a nd variable assignabilityi: 00123, Andre Cusson |
| Next by Thread: | Re: Template recursion, StackOverflowError, saxon:while a nd variable assignability: 00123, Roger Kovack |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |