Re: Software that makes placemats
Posted: 23:08 Thu 30 May 2013
A place for those passionate about port, and for those new to it. We hold lots of Port tastings: please join us!
https://www.theportforum.com/
RAYC wrote:For smaller tastings, how about an A3 mat, guillotined lengthways (i.e 420 x 15mm), that can be placed near centre table (leaving uncluttered space for notes/meals etc.) and contain ports in an easy access row?
Might /BottomRow do the job?The manual wrote:There are also three simple designs, /TopRow, /MiddleRow, /BottomRow, each having everything in one row, with obvious vertical position. There is also /Sides, with the obvious meaning.
For more than a few glasses these are too cramped.
![]()
![]()
![]()
That would certainly leave the table uncluttered.RAYC wrote:(i.e 420 x 15mm)
 
Current winner is ‟/DiamondsPlus”, which allows a little generalisation to something like Packomania’s 29-glass best:djewesbury wrote:/DiamondsPlusTwo

It’s printed on A0. Each glass can hold most of a bottle. By the time you reach glass 16, it would indeed be difficult.djewesbury wrote:I wouldn't like to be reaching for glass 16 on that placemat...
I can think of nothing better.jdaw1 wrote:Current winner is ‟/DiamondsPlus”
Ditto. Some possible insect outlines came to mind, but ‟/DiamondsPlus” is probably simpler and clearer, and therefore preferred.Glenn E. wrote:I can think of nothing better.jdaw1 wrote:Current winner is ‟/DiamondsPlus”
I quickly discarded /BeetleCarapacePhilW wrote:Ditto. Some possible insect outlines came to mind, but ‟/DiamondsPlus” is probably simpler and clearer, and therefore preferred.Glenn E. wrote:I can think of nothing better.jdaw1 wrote:Current winner is ‟/DiamondsPlus”
Hmm... it does look a bit like a top down view of a Star Trek shuttlecraft... though /Galileo would probably be too esoteric of a reference.djewesbury wrote:I quickly discarded /BeetleCarapacePhilW wrote:Ditto. Some possible insect outlines came to mind, but ‟/DiamondsPlus” is probably simpler and clearer, and therefore preferred.Glenn E. wrote:I can think of nothing better.jdaw1 wrote:Current winner is ‟/DiamondsPlus”
Not sure to which of the many possible uses of /Galileo this refers, but, as you say, too esoteric.Glenn E. wrote:Hmm... it does look a bit like a top down view of a Star Trek shuttlecraft... though /Galileo would probably be too esoteric of a reference.

jdaw1 wrote:Glenn E. wrote:too esoteric of a reference.
Is this worth the effort?[url=http://www.theportforum.com/viewtopic.php?p=57931#p57931]Here[/url] jdaw1 wrote:Updated draft of the placemats.
- +BMHR and his Croft.
![]()
jdaw1 wrote:with each update of the placemats pictures have been posted in the thread.
!
Is this worth the effort?
Agreed.djewesbury wrote:yes
In the general case I'd say no; It's useful in the case you refer to because the first post is not currently being regularly updated, so the image posts are providing a useful update of current attendees and ports; if the first post were being regularly updated, I think the additional effort of pdf -> jpg -> image hosting -> post for each placemat iteration would be excessive.jdaw1 wrote:Different question. In the arrangement thread for the 1966 horizontal on 27th June, with each update of the placemats pictures have been posted in the thread.
Is this worth the effort?
Presumably this also depends on any assumptions regarding the nature of the quartic to be solved, i.e. all-real roots (or at least a real root between the specified starting points), no discontinuities (no matching pole-zero root pairs) etc. In which case whether bisection, interpolation or your alternate specified scheme would be quicker in the general case would presumably depend on the nature of the group of potential curves across which the technique would be used? An alternative to the factor changed used to avoid never reaching the root could be to add a small proportion of the step delta determined from interpolation (deliberate over-adjust), though potentially decreasing the over-step with time to avoid oscillation; similar to techniques used to avoid getting stuck in local minima.jdaw1 wrote:Step one: write code to solve a quartic equation. Worrying, I think that I have devised an algorithm as good as Brent’s Method, but simpler, and not needing a pre-chosen x-step.
Assume root bounded by LowerX and UpperX, with matching y values LowerY and UpperY. Interpolation would make the next x value be LowerX + (UpperX”“LowerX) × LowerY/(LowerY”“UpperY). This can fail for some shapes (e.g., y = x^4 ”“ c), as the interpolated value is always on the same side of the root, so only one side (say, LowerX) ever gets moved.
So instead make the next x value be LowerX + (UpperX”“LowerX) × Max[0.143, Min[0.857, LowerY/(LowerY”“UpperY) ]]
Repeat until UpperX”“LowerX ≤ Tolerance, that constant being pre-determined and small, at which time return the interpolated value (without the bounds).
When LowerX and UpperX are roughly even around the root, it interpolates. When one side is much closer, it brings in the other, moving it by a factor of 1÷0.143 ≈ 7.
FYI, the ‟0.143” constant came from a small experiment done in Excel. I do not know whether it should be precisely 1/7, or some other value. But a small non-exactitude in this would add only a tiny extra to the algorithm’s average time.
Indeed, this can be seen as a compromise between the slow robustness of interval bisection (‟! Max[0.5, Min[0.5, ! ]]”) and interpolation (‟! Max[0, Min[1, ! ]]”).
Assumptions: ∈ ℝ; continuous; starting points either side. No more. Desiderata include robustness, speed, and simplicity of code.PhilW wrote:Presumably this also depends on any assumptions regarding the nature of the quartic to be solved, i.e. all-real roots (or at least a real root between the specified starting points), no discontinuities (no matching pole-zero root pairs) etc. In which case whether bisection, interpolation or your alternate specified scheme would be quicker in the general case would presumably depend on the nature of the group of potential curves across which the technique would be used? An alternative to the factor changed used to avoid never reaching the root could be to add a small proportion of the step delta determined from interpolation (deliberate over-adjust), though potentially decreasing the over-step with time to avoid oscillation; similar to techniques used to avoid getting stuck in local minima.
Any possibility of multiple roots between initial bounds (excluding duplicate root)? (I.e. can we either exclude the possibility of multiple roots being present, and If not then do we care? i.e. are all roots required, or any root). Could there be any bounding of the relative ratio of xTolerance to initial delta between upper and lower bounds?jdaw1 wrote:Assumptions: ∈ ℝ; continuous; starting points either side. No more. Desiderata include robustness, speed, and simplicity of code.
Don’t need to reach the root, only for the bounds either side to be closer than xTolerance, when do a final unconstrained linear interpolation.
LowerX < UpperX; f(LowerX) × f(UpperX) ≤ 0. Any root that is between LowerX and UpperX, please.PhilW wrote:Any possibility of multiple roots between initial bounds (excluding duplicate root)? (I.e. can we either exclude the possibility of multiple roots being present, and If not then do we care? i.e. are all roots required, or any root). Could there be any bounding of the relative ratio of xTolerance to initial delta between upper and lower bounds?
n.b. I assume direct calculation would not be appropriate?
I thought about that, and decided that it would be too much grief.PhilW wrote:n.b. I assume direct calculation would not be appropriate?
(and if the implicit answer from your previous post is "no", then how is xTolerance defined/determined?)PhilW wrote:Could there be any bounding of the relative ratio of xTolerance to initial delta between upper and lower bounds?
I know that x is in points, so xTolerance is defined to be 0.01. An answer that accurate is good enough for me.PhilW wrote:how is xTolerance defined/determined?)
If a maximum paper size can also be assumed, perhaps no greater than 3.5m in one dimension should be more than sufficient, then this would presumably bound the upper limit to 10000 points, which with a tolerance of 0.01 gives a worst case ratio of tolerance to initial upper-lower of 1/1000000 or approx. 1/(2^20). To identify a 1 in 2^20 region, would then require 20 calculations of y using bisection, which then gives us an upper bound for the required computation.jdaw1 wrote:I know that x is in points, so xTolerance is defined to be 0.01. An answer that accurate is good enough for me.PhilW wrote:how is xTolerance defined/determined?)
Interpolation is only worthwhile compared with bisection if division is sufficiently computationally efficient compared with the saving in additional multiplication/addition operations to calculate the additional bisection steps. At some point this trade-off may change. On a system where division is not fully accelerated in hardware, a division could be as computationally intense as say five bisections, in which case only one or two interpolations may be worthwhile before switching to subsequent bisections, for example.jdaw1 wrote:Desiderata include robustness, speed, and simplicity of code
PostScript uses single precision, with a 23-bit mantissa.PhilW wrote:1/1000000 or approx. 1/(2^20).
(LowerX + UpperX) ÷ 2 still has s division. Maybe the hardware tests for and accelerates by-two division. Probably not.PhilW wrote:Seems like a good approach for this application provided division isn't too costly
Constant, 1/7, determined by crude experiment in Excel.PhilW wrote:Not sure where the optimum value would be, likely data dependent.
(LowerX + UpperX) * 0.5 does not have a division in floating point calculation and would be the expected implementation to reduce computation for that case;jdaw1 wrote:(LowerX + UpperX) ÷ 2 still has s division.PhilW wrote:Seems like a good approach for this application provided division isn't too costly
Alas, it is required. Damn.jdaw1 wrote:I thought about that, and decided that it would be too much grief.PhilW wrote:n.b. I assume direct calculation would not be appropriate?
No, sorry; I would use the formulae from there, and implement calculation of discriminant,p,q,S,Q,x (where c4..c0 are a..e and is only valid for non-zero a).jdaw1 wrote:Have you recommended (pseudo)code that will convert c0!c4 to four roots?

Is the mathematician's solution always the drinker's?jdaw1 wrote:/DiamondsPlus: done.
Best fittin of seven glasses on A4.
We once had two sets of seven, Warre and Fonseca, and a room with space constraints. /DiamondsPlus would have helped.djewesbury wrote:Is the mathematician's solution always the drinker's?
Oops! How did I manage that I wonder..jdaw1 wrote: I thought it a mite harsh of you to add a spelling error to the quote of my correctly spelt words.
These were my custom use of the feature "MakePathConnectingGlasses" within Julian's postscript.djewesbury wrote:How did the traced line connecting the glasses appear?
This is not a standard feature. I took a couple of photographs, converted them to postscript format using an imaging program, and then cut/pasted their use with function prototypes into Julian's program, using an online postscript manual as a reference.djewesbury wrote:And what is the correct way of including an external graphic (the makers' brands)?
Right... I can live without that for now then, given that I got a migraine trying to get the /Array packing style to work...PhilW wrote: This is not a standard feature. I took a couple of photographs, converted them to postscript format using an imaging program, and then cut/pasted their use with function prototypes into Julian's program, using an online postscript manual as a reference.
It has taken me a while to realise what this misses. The assumption is that computation of f[] is slow compared to the modest computation done by the calling routine. Calling f[] half as many times is assumed to be much much more important. So the extra division of interpolation is de minimus.PhilW wrote:Interpolation is only worthwhile compared with bisection if division is sufficiently computationally efficient compared with the saving in additional multiplication/addition operations to calculate the additional bisection steps. At some point this trade-off may change. On a system where division is not fully accelerated in hardware, a division could be as computationally intense as say five bisections, in which case only one or two interpolations may be worthwhile before switching to subsequent bisections, for example.jdaw1 wrote:Desiderata include robustness, speed, and simplicity of code
Very sorry. Damn. Will be fixed today.djewesbury wrote:The code appears to use /PositionsStart, the manual /Positions .
jdaw1 wrote:DJ: did the emails help? Please suggest words for the manual.
It's all working fantastically now. The manual only needs a clearer eg for the /Array syntax, perhaps a block of code with all parameters correctly expressed for the basic (x,y) function.jdaw1 wrote:Very sorry. Damn. Will be fixed today.djewesbury wrote:The code appears to use /PositionsStart, the manual /Positions .
jdaw1, in the thread entitled [i]The Port of Belfast, Tuesday 25th June, 6pm, The Galley[/i], wrote:And one bug fix in the code[url=http://www.theportforum.com/viewtopic.php?p=58189#p58189]Here[/url] djewesbury wrote:The placemats, which only required 14 major drafts and several ".1.1.1" updates... I'm learning..., and one new feature. No trouble at all.