You can subscribe to this list here.
2009 |
Jan
|
Feb
|
Mar
|
Apr
(85) |
May
(9) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Graham J. <gr...@ch...> - 2011-07-10 12:58:15
|
Although development of the Composition Library software has continued at a slow pace over the last two years, it is still progressing. All of the functions have been prototyped and refined and the concept has been fully proven. In fact, I already find it very useful. It now has the CC decisions on methods encoded which means that it can properly classify and entitle new methods, and derive all its properties including symmetry, method above and below, right place and hunt and working bell cycles. It now imports the CC collections (all methods and provisional methods) from the XML collections, and validates these in the process. A number of discrepancies in the CC collections have been identified in the process, and have been corrected in the CC collections. It also now displays the blue lines and/or grids for methods, by default drawing a line through hunt bells and each unique working bell (i.e. one of each cycle for differentials). Collections have been implemented, allowing compositions to be easily added to collections as references. This feature provides the means to create new collections for public or personal use, and to record composition references against existing publications, such as the Ringing World, or published books. Some statistics reports have been added, providing analysis of methods by leadhead code, class and stage, and numbers of compositions recorded by composer and stage. Library update and user registration functionality has been included, providing the means to keep your local database up to date with methods, compositions and collections, and to upload any additions or updates to the master Composition Library. For more details see the version 0.2 alpha: <http://www.changeringing.co.uk/complib/screenshots.php> Now work turns to taking the core composition functionality to the next level. At present, it only deals with compositions in single methods, and positional calling. A major enhancement will see a complete rework to introduce a composition editor with the flexibility to cope with (hopefully) any composition, be it Grandsire, Stedman, Spliced, unusual starts, or bizarre differentials. Following this enhancement and some testing, the intention is to issue a beta version to project members to trial. Graham John, July 2011 |
From: Graham J. <gr...@ch...> - 2009-10-09 19:35:39
|
Thanks for the update Don - I understand the demands! Since no-one reviewed the paper I submitted to this list in May I have not done any work on Complib since, and have recently been sidetracked into another small project in addition to Handbell Manager, which I thought was going to be a very short project - they never turn out that way, do they? I do intend to get back to Complib, but it is a big undertaking to do completely on my own. Not only that, but there are plenty of other projects lurking on my to-do list that I would like to start if I could find the time. So if anyone can find time to help design Complib to get it going again, please shout, or if you have any suggestions about how best to proceed from here, please say. Graham |
From: Don M. <df...@ri...> - 2009-10-01 15:15:57
|
You may recall that months ago I undertook to perform several tasks for this effort, including producing a bunch of example compositions and drafting some goals. If you do recall that, you will instantly deduce I've fallen down on those commitments. It's clear to me I will never get around to making the contributions to this effort I had hoped to. I'm sorry. Seeing how much my to-do list has grown since I added these items to it, and thus how much further down the list these items now are, I'm just going to scratch them off. I'm clearly not going to be much of a contributor here. I suspect none of this comes as much of a surprise to anyone, but my apologies none the less. It must be frustrating to others to see me express a lot of opinion but do no actual work. If this effort ever reaches the stage where it is desirable to pour the contents of ringing.org's database into it, I will, of course, still stand ready to help there. Based on my performance to date I don't know how much actual implementation you'll get out of me, but I'll certainly try to provide as much help as I can. -- Don Morrison <df...@ri...> "It's because their minds are so often involved with deep and problematic matters...that their mouths are allowed to wander around making a nuisance of themselves." -- Terry Pratchett, _Hogfather_ |
From: Don M. <df...@ri...> - 2009-05-22 19:40:46
|
On Fri, May 22, 2009 at 3:31 PM, Graham John <gr...@ch...> wrote: > Deathly silence. Is that a good, or a bad sign? In my case it is a sign that work has been hectic recently, and what spare time it and family obligations have left have gone to things higher up on my prioritised (implicit) list. Like so many other things, neglected, but not forgotten. -- Don Morrison <df...@ri...> "He was honest by temperament; the honest, in this world, give one another a hard time. He was an engineer." -- Hilary Mantel, _Giving Up the Ghost_ |
From: Graham J. <gr...@ch...> - 2009-05-22 19:31:43
|
Deathly silence. Is that a good, or a bad sign? Graham -----Original Message----- From: Graham John [mailto:gr...@ch...] Sent: 11 May 2009 5:57 PM To: 'Composition Library email list' Subject: Re: [complib-talk] Storing compositions on the database I have defined some tables and attributes, and produced a set of worked examples to demonstrate how the data can support the input and formatting of those compositions. It is unlikely to support every scenario as yet, and clearly some snags will not materialise until we try and develop it, but I think it will cope with a broad range of compositions including some tricky cases. Comments, suggestions and input welcome, especially from those who have not yet said anything. Graham |
From: Graham J. <gr...@ch...> - 2009-05-11 16:57:49
|
I have defined some tables and attributes, and produced a set of worked examples to demonstrate how the data can support the input and formatting of those compositions. It is unlikely to support every scenario as yet, and clearly some snags will not materialise until we try and develop it, but I think it will cope with a broad range of compositions including some tricky cases. Comments, suggestions and input welcome, especially from those who have not yet said anything. Graham |
From: Graham J. <gr...@ch...> - 2009-05-07 22:55:31
|
The demo can now be downloaded as a self-installing executable from the Complib home page on sourceforge without the need for a development environment. The only prerequisite is a PC with .NET Framework 3.5 SP1 installed. If you downloaded the demo over the last couple of days, you should redownload, as it was missing the installation for MS ReportViewer which I used for the statistics panel. Graham |
From: Richard S. <ri...@ex...> - 2009-05-05 17:04:41
|
Don Morrison wrote: >> p,s,s,b,b, repeat(p, {/23458967/: break}) > > While noting the course end is the conventional way, or at least the > old fashioned convention, for indicating how long a course is, the > more I think about it the more I think it is A Bad Idea. > > a) My experience with dealing with submissions of peal compositions > and so on is that the single most common error is to cite an incorrect > course end. If we depended upon a course end for the definition of a > composition this would make it exceedingly fragile. This is a fair point. However I'm not saying that as a matter of course we should write out the course heads in full like this; I'm merely wondering whether it would be a useful fallback position if we could do that so that we can handle the odd course that doesn't really fit the rules. Most of the time I expect a consistent course end rule like repeat(p, {/[234][234][234]*/: break}) would be sufficient. > b) It's not really unique. It is perfectly legal (in the sense of not > contravening any CC Decisions) to have, in an MEB, a chunk that goes > through the same change two or more times without an intervening call. GSiril permits several approaches to this. The simplest way is simply to repeat the rule that takes you to the course end: 3 repeat(p, {/*8/: break}) That will only stop after the third lead end with 8 at the back. There might be circumstances in which a more complicated approach is needed, and then GSiril allows you to write: n=0, repeat(p, {/*8/ && ++n==3 : break}) > Depending upon a particular course head in the face of this is > ambiguous. Granted, it's not something I'd personally want to do, and > is unlikely to come up often in practice, but it is a potential > problem. And I believe an extreme example of exactly such a > construction has been rung at least once. > > I continue to think the better solution is to specify, when necessary, > how many leads a course is. And that's also fine. If you want to do that then the right approach is probably: p,s,s,b,b,6p What I'm suggesting really is that the underlying framework should allow any of these approaches. (I'm not advocating support for all of the more complicated bits of GSiril; as I've said before, I'm just using GSiril as a means of experimenting with the fundamental building blocks and determining what they are.) >> W = repeat( { b, /*8?/: b, break; p } ) >> >> Repeat repeats its argument indefinitely until it is >> terminate. This can either be with a break (a controlled >> exit that'll continue proof from the thing following the >> repeat block), or an abort (which halts proof). The default >> rule for 'false' (which is implicitly invoked when the >> composition becomes false, for what ever definition of false >> is currently in force) calls this. > > I am troubled by this "repeat until false" business. OK. I've not done a good job of explaining this. I think we're getting confused between what GSiril does because it is a peal proving program intended to be compatible with Siril, and what we want from the compositions database. In GSiril a repeat block can be terminated in two ways: a break or an abort. The repeat-break mechanism is important as it is the only way of doing repetition without hard-coding the number of iterations required. I think the peals database will need something like that, however we choose to dress it up. By contrast, the repeat-abort mechanism is important to GSiril as a proving program because it allows you to abort a prove when it runs false. I completely agree that that we don't want an idea of truth in the peals database. The only actions that GSiril does that depend on its idea(s) of truth are governed by the true, notround, false and conflict symbols (which is the same as Siril); unset these, and GSiril never acts on truth. This is the behaviour we want from the peals database. And without the conflict symbol (I was mistaken when I said it was the false symbol that invoked abort), there's no obvious reason to support the repeat-abort mechanism. Unless we use it to handle the case of a composition that seems to be stuck in a infinite loop. (E.g. call a Wrong, and then repeated Homes until it comes round.) > 1) Viewing GSiril simply as a proving platform, it falls into a trap > that I think is unfortunate, though common. It causes the thing to > stop, or at least become useless, at the first false row. It can > really be helpful to the end user to have a broader presentation of > where a composition runs false. For example, if you see just a > handfull of rows, all with the treble in 6ths, are false against one > another it leads you to consider the root cause as different than if > you see 32 consecutive rows are false against exactly the same 32 rows > also appearing consecutively somewhere else! In my experience, most proving programs allow this behaviour to be configured. Certainly Microsiril, Sirilic and GSiril all do. In all three, by default, conflict is defined: conflict = "# rows ending in @", "Touch not completed due to false row$$" The $$ in a string aborts the search. However, if you change this to conflict = "False row: @" then any of these peal proving programs will print a list of false rows followed by 5040 rows ending in 13256478 Touch is false in 32 rows And I'm sure there's scope for doing more with the conflict symbol too. > 2) I don't think a particular notion of "true" has any place in our definition > of a composition for storage in the database. As discussed earlier, I > think a composition should be some sequence of changes, structured in > some appropriate way, but that how it stacks up against various > definitions of truth should be something determined externally > (though, perhaps cached in the database), on the same footing as how > many little bell rollups it contains, whether it contains back stroke > tenor reversals, whether or not it contains an equal number of plains, > bobs and singles, or whether or not it is all the work. I completely agree. RAS |
From: Don M. <df...@ri...> - 2009-05-02 00:50:32
|
2009/5/1 Richard Smith <ri...@ex...>: > It is to some extent a nuisance, but one I'd rather see > dealt with now rather than as an afterthought. I agree completely. Sorry if that wasn't clear. > However, just to be absolutely clear, I do *not* think that > we want a unique representation for a given composition. I agree wholeheartedly with this, too. If we wanted a unique representation, we'd just write down all the rows, after all! > p,s,s,b,b, repeat(p, {/23458967/: break}) While noting the course end is the conventional way, or at least the old fashioned convention, for indicating how long a course is, the more I think about it the more I think it is A Bad Idea. a) My experience with dealing with submissions of peal compositions and so on is that the single most common error is to cite an incorrect course end. If we depended upon a course end for the definition of a composition this would make it exceedingly fragile. b) It's not really unique. It is perfectly legal (in the sense of not contravening any CC Decisions) to have, in an MEB, a chunk that goes through the same change two or more times without an intervening call. Depending upon a particular course head in the face of this is ambiguous. Granted, it's not something I'd personally want to do, and is unlikely to come up often in practice, but it is a potential problem. And I believe an extreme example of exactly such a construction has been rung at least once. I continue to think the better solution is to specify, when necessary, how many leads a course is. > W = repeat( { b, /*8?/: b, break; p } ) > > Repeat repeats its argument indefinitely until it is > terminate. This can either be with a break (a controlled > exit that'll continue proof from the thing following the > repeat block), or an abort (which halts proof). The default > rule for 'false' (which is implicitly invoked when the > composition becomes false, for what ever definition of false > is currently in force) calls this. I am troubled by this "repeat until false" business. 1) Viewing GSiril simply as a proving platform, it falls into a trap that I think is unfortunate, though common. It causes the thing to stop, or at least become useless, at the first false row. It can really be helpful to the end user to have a broader presentation of where a composition runs false. For example, if you see just a handfull of rows, all with the treble in 6ths, are false against one another it leads you to consider the root cause as different than if you see 32 consecutive rows are false against exactly the same 32 rows also appearing consecutively somewhere else! 2) I don't think a particular notion of "true" has any place in our definition of a composition for storage in the database. As discussed earlier, I think a composition should be some sequence of changes, structured in some appropriate way, but that how it stacks up against various definitions of truth should be something determined externally (though, perhaps cached in the database), on the same footing as how many little bell rollups it contains, whether it contains back stroke tenor reversals, whether or not it contains an equal number of plains, bobs and singles, or whether or not it is all the work. -- Don Morrison <df...@ri...> "They were treated like royalty--not the sort who get dragged off to be beheaded or have something nasty done with a red-hot poker, but the other sort." -- Terry Pratchett, _A Hat Full of Sky_ |
From: Richard S. <ri...@ex...> - 2009-05-01 07:07:23
|
Don Morrison wrote: > 2009/4/15 Richard Smith <ri...@ex...>: >> But my suggestion here is that instead of hard-coding these, >> we instead equip the system with a way of defining these >> concepts ourselves. GSiril goes some way towards this: >> assuming b and p are already defined, we can define W on 8 >> bells as: >> >> W = repeat( { b, /*8?/: b, break; p } ) > > There's an interesting dichotomy when we're describing touches, that > from your description it would appear GSiril cuts both ways: > > In one way when describing touches we want to enumerate chunks > of the changes that generate rows. These are the things that typically > (though not always!) get repeated in multi-parts and repeated blocks > and so on. Siril operates exclusively at this level. > > In another way when describing touches we want to talk about the rows > produced. This is what we're doing when we use calling positions such > as M,W,H that refer to an observation bell. I believe Graham's > notation in the prototype operates exclusively at this level. > > But in real life we tend to drift back and forth between these two > views. Yes, I think that having the flexibility to move between the two systems is one of the key advantages to what I'm suggesting. The reason is that I would like to see compositions captured in the database in as close a form to their published form as possible. > I guess human beings find this sort of model munging natural, > but it's a nuisance when you're trying to come up with an unambiguous > notation a machine can understand. It is to some extent a nuisance, but one I'd rather see dealt with now rather than as an afterthought. However, just to be absolutely clear, I do *not* think that we want a unique representation for a given composition. Frequently it will be possible to represent a touch using M, W, H, or using numeric calling positions in a fixed length course, or just a sequence of p, b, s. And probably other ways too. It'll be up to the person entering the composition to choose the most natural format -- which hopefully will be an obvious decision most of the time. (For that matter, the client may well enforce particular choices in particular circumstances. But that's a client issue.) > Perhaps the most obvious example of such model munging is the way > Grandsire is conventionally laid out on higher numbers: > > 23456789 1 2 3 4 > ____________________ > 324765 s - - s > 23456987 s - - > 42356798 - - That's an interesting example. So we have courses with 4, 5 and 6 leads respectively. It would be easy to suggest that this comp is using the 6th as observation for the purpose of defining the course end. But that's not true in general. Perhaps the course length is dictated by the number of calls in it -- add one extra lead for each plain lead. Given how Grandsire works, that's close to being right. But not completely right. Consider the first composition of G9 on Don's site: 5,076 Grandsire Caters Richard I Allton 23456789 1 2 3 4 5 ----------------------- 23458967 s s - - 32498765 s - - 23476589 s s - 42356978 s - 24397568 s - - 42356879 s s - 24356987 - - s* 42356789 - - - ----------------------- 6-part, calling bob for s* in parts 3 and 6. Here the first course is odd because it has 11 leads in it. In many compositions (this one included) the course end has the 2,3,4 in some order in 2,3,4; but that's not exclusively the case. Maybe it's the wrong approach to look for too much logic in what the course end is and simply code the first course of RIA's comp as (using GSiril notation): p,s,s,b,b, repeat(p, {/23458967/: break}) i.e. a sequence of calls followed by as many plain leads is is required to bring up the specified course end. And list all of the course ends. > The calls at 1, 2, 3 and 4 are at the level of changes. They're "make > the relevant call at the first, second, ..." lead that comes up, > without regard to the position of any bells in the rows produced. If > this were part of a repeating block where subsequent block heads might > include 23165978 every bell would be in a different postion in that > subsequent repetition, so it's got to be a reference to changes, not > rows. Not necessarily. Consider the first course of RIA's peal. 23456789 1 2 3 4 5 ----------------------- 23458967 s s - - What this means is ring p,s,s,b,b and then plains until the course end is related to the part end as 23458967 is related to 23456789. I.e. in the second part this means ring plains until 42358967. In pseudo-mathematical notation if h is the part end and l is the current lead end, we want to ring plains until h . 23458967 = l [...] > I'm not entirely clear on how GSiril is spanning these two different > models, though apparently it is. That /*8?/: thingie > pattern matches against the rows generated, and is some kind of > conditional? Yeah. Let me pick apart my original example: W = repeat( { b, /*8?/: b, break; p } ) Repeat repeats its argument indefinitely until it is terminate. This can either be with a break (a controlled exit that'll continue proof from the thing following the repeat block), or an abort (which halts proof). The default rule for 'false' (which is implicitly invoked when the composition becomes false, for what ever definition of false is currently in force) calls this. The { ... } thing is a list of alternatives. The syntax is { condition1: expr1; condition2: expr2; ...; default } It tests condition1, and if that succeeds runs expr1; or if condition1 fails, it tries condition2, and so on. If no condition succeeds then default is executed. In this particular example, there is just one condition which is b, /*8?/. This means (more or less) try a bob and see if this puts bell 8 in position N-1. The clever bit is that everything done in the condition block is immediately thrown away irrespective of whether the condition passes or fails. It doesn't matter if the condition prints something, or aborts because it runs false, or whatever. The output is suppressed, and any other changes are undone. This is why there is also a 'b' at the start of the expression that we evalute if the conditional succeeds. > So I could define some block that includes these pattern > matching thingies and say "repeat it five times" and each of those six > instances of it might have a completely different length and different > composition of changes? Is there someway to have GSiril describe, say, > a seven part that uses calling positions against an observation bell, > with the observation bell changing in each part? You mean something like the composition of Smith's 23 2345678 W H ------------- 3578264 - 8375264 - 5873264 - 7358264 - - 5738264 - ------------- 7-part. Yes and no. In my development copy of GSiril, I've extended the pattern matching syntax. I've used Perl as a model where /pattern/ is shorthand for $_ =~ /pattern/. In GSiril /pattern/ is now shorthand for @ ~ /pattern/ where @ is a variable meaning the current row. (This fits naturally with @'s role in quoted strings in Siril which GSiril has adopted.) The second change is the addition of a whole bunch of arithmetic operators, some of which have been overloaded to work on rows too. At present there are + (addition), - (subtraction and unary minus), * (multiplication), / (division), \ (left division), ^ (exponentiation), % (modulus) and ! (factorial). Of these, *, / and \ have been overloaded to work with a pair of rows, and ^ also works with a row and an integer. What do I mean by left division? I've simply defined a\b as shorthand for a^-1*b; obviously for integers a\b == b/a. It'll be a little while before I've committed this change as there are still a few type-safety issues that I need to resolve. But I'm getting there. How does this help? Well, it means that instead of writing /*8?/ in the pattern test for W, I can now write W = repeat( { b, (parthead\@) ~ /*8?/: b, break; p } ) This way we can define the peal as: peal = partend = @*'15738264', H,3W,2H (Add paretheses to taste.) RAS |
From: Don M. <df...@ri...> - 2009-04-29 19:27:32
|
On Wed, Apr 29, 2009 at 2:29 PM, Richard Smith <ri...@ex...> wrote: > test it with a large range of test cases. And > to that end it would be good to start accumulating a set of > test compositions wreiten out in their natural form -- i.e. > how you would publish them on the web or in the RW. I will assemble an initial selection of such test cases and put them someplace where we can all get at them in the next few days. -- Don Morrison <df...@ri...> "When _Alice_ was published and won her [Queen Victoria's] heart, she graciously suggested that Mr. Dodgson dedicate his next book to her. Unfortunately for Her Majesty, his next book was a mathematical opus entitled _An Elementary Treatise on Determinants_." -- Alexander Woollcott, introduction to _The Complete Works of Lewis Carroll_ |
From: Don M. <df...@ri...> - 2009-04-29 19:24:30
|
On Mon, Apr 27, 2009 at 6:12 PM, Graham John <gr...@ch...> wrote: > In a printed composition, it seems that you have to work out was is intended > from the given coursehead. Is it necessary to enter every coursehead for > this type of composition to define it? This doesn't seem ideal. Is there a > better way? I think you either have to supply some indication of how to recognize a course head, or specify the course's length. The canonical example of the former is, of course, to write out the course head, though in principal you could often supply a simpler rule, such as "tenor comes home" or "back three bells come home in some arrangement". But, particularly given the modern fashion of more interesting back bell positions and even things like calling little bell runs in Stedman a course end, this gets harder, and the whole course end may really be required. The alternative of specifying the length of the course is, mercifully, becoming more common. Anyone that has tried to enter into proving software a composition with unusual courses and back bell positions understands how painful it can be having to work things out backwards from a desired course end. Yes, if you're calling it, the discipline of writing it all out by hand is probably a good one, but it works against trying to enter something quickly to prove or format it when you have no intention of calling it yourself. I think working from course lengths instead of course ends has a further advantage: it keeps you entirely in the realm of changes, rather than getting down into the rows they generate. This is where things like repeating blocks fall naturally, and it seems best to stay away from the actual rows when defining a composition to the extent one can. Sometimes, of course, you have no choice but to operate at the level of the actual rows; Dixon's, for example. This problem doesn't just arise in things with numbered calling positions. Consider something like Smith's 23, when it is notated as calls at W and H, with the observation bell changing each part. Or compositions on higher numbers with unusual back bell positions that are using M,W,H with respect to whatever bell was last in last place at a course end. Anyway, I think in most cases, at least for single methods, it is best to specify the length of every course when using numbered calling positions; or, rather, to specify a default course length, and then make explicit any deviations from it. -- Don Morrison <df...@ri...> "The ships hung in the air in exactly the same way that bricks don't." -- Douglas Adams, _The Hitchhiker's Guild to the Galaxy_ |
From: Richard S. <ri...@ex...> - 2009-04-29 18:29:26
|
(Catching up...) Don Morrison wrote: > Ripping up a piece of sofware and starting over isn't a big deal. I > think we all know that nearly every serious piece of software gets > written more than once before it's done. > > But populating a database and throwing that away and starting over > again is a different matter entirely. Yes and no. I don't object to throwing the database schema away as long as we can programatically convert all of the data from the old format to the new format. The bigger problem is retaining compatibility with the wire protocol between server and client. That's the one thing that I really don't think we can afford to break. >> So far as I recall, his [Ander's] idea was that we start >> with a minimum of hard-coded ideas. Basically, rows, >> changes, and the notion of truth. > > No, we don't need a notion of truth. That's simply an attribute that > gets considered when we think about whether or not a composition > should be added to the database, but doesn't need to be included in > the database. Yes, that's a good way of thinking about it. And that neatly side-steps any problems with differing levels of truth such as whole extents, MEBs, every row at hand and back, an 840 of spliced doubles and minor. Excellent. > The important thing to capture isnt' "what's good about this > composition" it's "what is this composition". It's higher level tools, > querying the database, that should be worrying about the various > attributes, good or bad, of the compositions it contains. Agreed. Though it *might* be worth having some facility for annotating the database with this information too. But if we do we can probably do it with opaque flags -- i.e. some external flag comes along later and sets some piece of metadata (a flag, a value, ...) on a composition. Anyway, I think we can defer discussion of that, at least for the moment. >> But my suggestion here is that instead of hard-coding these, >> we instead equip the system with a way of defining these >> concepts ourselves. GSiril goes some way towards this: > > To a lesser extent (no pun intended) this is also, sort of, what I do > in Duckworth. I think it is less flexible than GSiril sounds, though, > as it does hardwire some assumptions in: compositions are always > composed of leads (ok, divisions), or at least contiguous fragments of > leads; there are no more than 2 calls within a lead, and they replace > changes without altering length. Clearly having something even more > flexible than that would be an advantage for this database. > > The point in Duckworth, though, is that composition is really just a > sequence of chunks of changes, where the chunking obeys conventions > that may vary by method and composition style. And I think that's an > important observation. Any higher level way we find to describe a > composition that just as chunks of conveniently grouped bits of place > notation will fail to work for some possible compositions; and not > just outrageously pathological ones. Imagine someone undertaking this > effort 100 years ago: they probably would have considered something > like cyclic part heads as a ridiculous thing to support. Yeah, that's precisely the flexibility I'm keen to support. Perhaps a better way of describing what I envisage is a platform on which it is poossible to implement specialist systems for different styles of compositions, but without enforcing any specific style. And on top of that we produce a few stock systems (rulesets per my earlier terminology) for common types of composition. >> So instead of telling the system with various standard >> compositional devices, we provide it with a way of defining >> our own rules on top of the basic concepts. Here, instead >> of M, W, H, we have the idea of repition and pattern >> matching a row. > > As alluded to in my previous paragraph, I don't see how we can come up > with a rule language that will be sufficient to express every case one > might come up with in practice. I would love to be shown to be wrong > about this, though. I don't think it's necessary to try. We produce a basic definition for change ringing: no jump changes; no cylindrical; every bell rings once per row. That's probably sufficient. Then we provide a rule definition 'language' for defining higher-level concepts. It doesn't matter too much if definig rules is aomething of a dark art -- it's not something that ordinary users will ever do or probably even be aware of. >> If you're writing a client, perhaps you only care about >> touches in a single method on an even number of bells. If >> so, you might hard-code an assumptions about the relevant >> ruleset into client. Similarly, a client only interested in >> twin-bob compositions of Stedman Triples might hard-code >> assumptions about that ruleset. > > Yes, I think it's perfectly reasonable for particular clients to deal > with only a subset of what's in the database. But none of that should > float back into the database itself, which should be designed to > support as wide a variety of potential clients as possible. Agreed. >> Anyway, how does an approach like this sound? > > My principle worry is that we can't define a sufficiently flexible and > expressive rule language. Though clearly it's an improvement on the > status quo. That's largely why I'd like to prototype its semantics in GSsiril and test it with a large range of test cases. And to that end it would be good to start accumulating a set of test compositions wreiten out in their natural form -- i.e. how you would publish them on the web or in the RW. Richard |
From: Graham J. <gr...@ch...> - 2009-04-27 22:17:02
|
Visual C# 2008 Express cannot build the reports I added for the Statistics panels, so please use version 3 for the time being. If you have Visual Studio, it should build OK. When I get a some time, I will also see if I can create an install package so that people can try the demo without having a development environment. Graham |
From: Graham J. <gr...@ch...> - 2009-04-27 22:12:49
|
I am making some progress on this, but I have a question for you. In a composition that uses non-observation calling positions (i.e. one that counts the leads or divisions from the previous coursehead to define the column headings), how can complib work out where the next coursehead is e.g. how many leads/divisions are there to the next coursehead after the last call in the course? The course length may vary (e.g. Stedman turning courses, or compositions of Bristol Major that cycle the tenors), and the resulting coursehead may have no observation bell. In a printed composition, it seems that you have to work out was is intended from the given coursehead. Is it necessary to enter every coursehead for this type of composition to define it? This doesn't seem ideal. Is there a better way? Graham |
From: Graham J. <gr...@ch...> - 2009-04-24 17:47:05
|
We have discussed (under method categories) the topic of how do you store compositions on the database, and Richard was going to put his thinking cap on regarding it. If anyone on this list has any suggestions please say, as this is a tricky problem and I accept Don and Richard's view that we have to get this bit right from the start, as it is fundamental to the successful design of Composition Library. The question is:- How do we represent compositions on the database in a way that will encompass any composition that has been rung to date and also provide as much flexibility as possible to minimise change for future developments? I have been thinking about this further this week, and have come to the conclusion that we cannot separate the way a composition is stored entirely from either how it is entered or how it is formatted, because: 1. After a composition is input and saved, it needs to be represented in exactly the same way if a subsequent edit is required. 2. In spliced, Method mnemonics will need to be supplied at the time of input. 3. To format a composition in its normal compact form, information needs to be captured at the time of input, as it would be infeasible to reconstruct a multipart composition that has included, omitted or A/B blocks. It may also be better to allow the submitter to influence the column headings used (e.g. for Belfast do you have a columns headed I, O and V, or do you have a column headed B and use I/V and I/O/V/V in the lines? In split tenors compositions where the observation changes in each part, often course positions are used rather than MWH. To check whether a proposed approach works, we need to work examples through end-to-end i.e. how input, how stored, how formatted. Examples need to include: 1. Conventional BMWH compositions of regular even bell methods with several types of call. 2. Half lead calls 3. Unusual starts 4. Spliced compositions included spliced at the half lead or another position 5. Differential methods with multiple cycles 6. Multi-extent blocks 7. Stedman 8. Twin hunt methods 9. Other principles 10. Irregular methods 11. High numbers 12. Other oddities that we can think of Graham |
From: Don M. <df...@ri...> - 2009-04-20 11:31:29
|
2009/4/20 Don Morrison <df...@ri...>: > include 23165978 every bell would be in a different postion in that Ah, sorry, typo. That was supposed to be 34265978. As you can see, my fingers were shifted one space to the left from where I thought they were! -- Don Morrison <df...@ri...> "Human beings, who are almost unique in having the ability to learn from the experience of others, are also remarkable for their apparent disinclination to do so." -- Douglas Adams, _Last Chance to See_ |
From: Don M. <df...@ri...> - 2009-04-20 11:28:07
|
2009/4/15 Richard Smith <ri...@ex...>: > But my suggestion here is that instead of hard-coding these, > we instead equip the system with a way of defining these > concepts ourselves. GSiril goes some way towards this: > assuming b and p are already defined, we can define W on 8 > bells as: > > W = repeat( { b, /*8?/: b, break; p } ) There's an interesting dichotomy when we're describing touches, that from your description it would appear GSiril cuts both ways: In one way when describing touches we want to enumerate chunks of the changes that generate rows. These are the things that typically (though not always!) get repeated in multi-parts and repeated blocks and so on. Siril operates exclusively at this level. In another way when describing touches we want to talk about the rows produced. This is what we're doing when we use calling positions such as M,W,H that refer to an observation bell. I believe Graham's notation in the prototype operates exclusively at this level. But in real life we tend to drift back and forth between these two views. I guess human beings find this sort of model munging natural, but it's a nuisance when you're trying to come up with an unambiguous notation a machine can understand. Perhaps the most obvious example of such model munging is the way Grandsire is conventionally laid out on higher numbers: 23456789 1 2 3 4 ____________________ 324765 s - - s 23456987 s - - 42356798 - - The calls at 1, 2, 3 and 4 are at the level of changes. They're "make the relevant call at the first, second, ..." lead that comes up, without regard to the position of any bells in the rows produced. If this were part of a repeating block where subsequent block heads might include 23165978 every bell would be in a different postion in that subsequent repetition, so it's got to be a reference to changes, not rows. And yet to turn this into something meaningful we've got to look at the rows produced to know when the course ends. That is, to know how many plain leads to hang on the end of each of these courses, as the first is four leads, the second five leads, and the sixth six leads. Making matters even worse, the only evidence we have for this is the printed course heads, or perhaps our own implicit smarts as to the back bells probably coming together at a course end. And yet when we repeat this block, we're repeating the changes, not looking at the rows again, as we're not even being show most of the course heads for the repeats! That is, we want a sequence of changes, but we need the rows in the first use of those changes to help us define which changes we wanted, but then stick exlusively to a sequence of changes. I'm not entirely clear on how GSiril is spanning these two different models, though apparently it is. That /*8?/: thingie pattern matches against the rows generated, and is some kind of conditional? So I could define some block that includes these pattern matching thingies and say "repeat it five times" and each of those six instances of it might have a completely different length and different composition of changes? Is there someway to have GSiril describe, say, a seven part that uses calling positions against an observation bell, with the observation bell changing in each part? How about a calling on higher numbers that uses calls with respect to the tenor to describe shuffling the big bells around, but M,W,H with respect to just the little bells? -- Don Morrison <df...@ri...> "In many ways, the long-standing animus between the Red Sox and the New York Yankees is authentic, deep-rooted and wholly organic. In [other] ways, it’s a bit more like pro wrestling." -- Sean McAdam, _The Boston Herald_, 7 January 2009 |
From: Graham J. <gr...@ch...> - 2009-04-19 23:34:55
|
Richard wrote: > The System.Data.SQLite.SQLiteFoo classes seem to be > called Mono.Data.Sqlite.SqliteFoo in the version > I've got. I think I understand the Mono vs System > namespace prefix, but I'm puzzled about the > capitalisation difference. Are these class and > namespace names case-insensitive on Windows? That's strange, they are case sensitive in windows. > Also, in Complib/Properties/Resources.resx, the Resources/ > subdirectory is inconsistently capitalised. The directory > in SVN has a capital 'R', but some of the references in that > file have lower-case 'r's. That's easily fixed though. Again odd, although folder names are case insensitive in Windows. Graham |
From: Graham J. <gr...@ch...> - 2009-04-19 23:20:17
|
Composition Library - Developer installation instructions and program notes INSTALLATION 1. Download and install Visual C# 2008 Express Edition, free from http://www.microsoft.com/express/vcsharp/ 2. Download and install SQLite ADO.Net dotnet2 version, free from https://sourceforge.net/project/showfiles.php?group_id=132486 In the installation box, check Visual C# Express Edition, to add the SQLite designer components into Visual C#. 3. Download and install TortoiseSVN (win32 version), free from http://tortoisesvn.net/downloads 4. Create a folder called complib where you want it, right click The folder and select SVN Checkout. In the TortoiseSVN dialog, type the location of complib into the URL box as below and click OK https://complib.svn.sourceforge.net/svnroot/complib On any future occasion, right click and Update will keep Complib up to date. If you make any changes in the directory, you can also upload them to the repository using SVN commit. 5. Find and double-click the solution file (or open in Visual C#) complib/SVN/trunk/complib.sln 6. On the Visual C# menu, click on Project and Complib Properties, then Click on the Settings Tab. Find the Connection called ComplibLiteConnectionString. Edit the pathname in Value to point to the Test Complib database which is: your path...Complib\trunk\Complib\SQLite\ComplibLite 7. Click the green run arrow. The solution should build and run, and Complib should launch. NOTES This is partially developed unstable code, with little validation, and a number of features not yet implemented. If you stick to regular methods and valid composition input though, it should work sufficiently to give you an idea. I had to learn C# in the process of writing this, so please excuse any poor coding practices. In fact if you see anything that could be improved or spot a bug, please feel free to recode it and commit it back to subversion. Here is a list of what works and what doesn't:- Menu - View Two missing icons. - Tools/Options Advanced mode is not yet implemented - intention is when it is not selected to hide all features other than those required by a conductor. - Compositions are not yet downloaded on startup (there is no online composition database!) - User details are currently hardcoded Method - Find Method(s) Tab - should be OK. Title is the only field using "like". BTW - Clicking find with nothing selected shows the whole method database. Restrict searches for "Methods true to" by entering a leadhead code. There are currently problems caused by irregular methods, and by running out of memory, as currently none gets released until the whole set of compositions has been proved. You may get away with up to 700. - Method Results Tab - Should be OK, as should the navigation bar.X on the navigation bar removes from results, not the database. - Method Properties Tab - Should be OK, apart from "Little" and "Differential" flags not being shown or added the the Classes. Similarly these are not shown in the Title. Negative Method Ids are converted to an l to indicated local. Twin hunt methods need some attention to cope with the way they are held on the method database. - Blue Line - not yet implemented. Code offerings welcome. - New Method Tab - Some validation here, but not on Class, or null fields. PN will show in Red if invalid, or no Stage selected. PN will be reformatted in standard full form. New methods are held on the local database with negative Method ID's, (Unrung) is shown in the title. Composition - Find Composition(s) Tab - None of the check boxes do anything at present. Other fields apart from By Composed and Leadhead group(s) should work. - Composition Results - Sometimes this appears with wrongly sized columns. This is fixed by clicking on a column heading to sort. Parts is always 1. If "List false compositions" is checked in Tools Options, two columns are added to show False Rows and whether the composition comes round. - Properties Tab - Should be OK - Formatted - Still needs a lot more work, but should show something reasonable in most cases. If a composition is false, courseheads are not being shown correctly after it runs false. Edit and Delete are greyed out unless you are either the submitter, modifier, one of the composers, or a Composition Library administrator. This will give some security to protect vandalism of data. - Music - OK, but no subtotalling, or composition total shown here. - New/Edit Composition. PN is validated, but not much else. I'm not happy with the Composer dropdown box. If you select {new composer} a dialog box comes up to allow you to enter a new one. Date first rung is not stored at present, and start row offset is stored, but not used. Applicable leadheads is an unvalidated entry field, but I want Complib to calculate this once I have an algorithm. Calling needs to follow the format as described in the Composition Library Calling Notation document. It is not validated at entry time, so problems can occur when proofing. You may get a terse error, which is not handled properly. Collection - Not yet implemented Music Scoring - No validation. Only mask Types implemented are Row and Wrap. A mask can include x or ? as single character wildcards. A short mask e.g. 5678 in Major will count 5678s anywhere in the row. For Wraps I don't count it unless it actually wraps the row (i.e. Rounds itself doesn't count as a wrap of rounds). For the observant, this was incorrect in the demo presentation, as 87654321 was counted as a wrap at the previous handstroke row. - Intention is to calculate Possible. Min and Max I will probably drop as unnecessary. Score is the multiplier to use. - The autosort gives strange effects as you edit data Statistics - Method Tab and composition Tab now show a report. Nothing in Collection and Submission tabs. Upload - Not implemented. Intention is to provide a list of compositions which have been added or amended, and allow these to be individually or collectively selected for upload. Any additions of composers will also need uploading. Login and password will be needed to update the online database to give some security and auditing control. Once updated online, the details will be removed from the local database. Download - Not implemented for compositions. - Implemented for methods, but I want to add a test for new methods being found on the local database, so that they can be deleted, with advice to the user (in case a method they had stored locally has been rung by someone else). |
From: Richard S. <ri...@ex...> - 2009-04-19 20:50:33
|
Richard Smith wrote: >> I uploaded the demo code again - It now uses SQLite as the local database. > > Complib/LocalComplibDataSet.Designer.cs line 10030 and > following lines are still referencing > System.Data.SqlServerCe. Have you commited the wrong > vesrion of this file? A few other things I've noticed. The System.Data.SQLite.SQLiteFoo classes seem to be called Mono.Data.Sqlite.SqliteFoo in the version I've got. I think I understand the Mono vs System namespace prefix, but I'm puzzled about the capitalisation difference. Are these class and namespace names case-insensitive on Windows? Also, in Complib/Properties/Resources.resx, the Resources/ subdirectory is inconsistently capitalised. The directory in SVN has a capital 'R', but some of the references in that file have lower-case 'r's. That's easily fixed though. RAS |
From: Richard S. <ri...@ex...> - 2009-04-19 19:23:16
|
Graham John wrote: > I uploaded the demo code again - It now uses SQLite as the local database. Complib/LocalComplibDataSet.Designer.cs line 10030 and following lines are still referencing System.Data.SqlServerCe. Have you commited the wrong vesrion of this file? I notice that a lot files (including that one) contain a warning: // <auto-generated> // This code was generated by a tool. // Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> Where is the source for them, and what is the tool used to generate them? RAS |
From: Richard S. <ri...@ex...> - 2009-04-19 18:55:12
|
[Have just got back from a few days away and am catching up] Don Morrison wrote: > Others may think of other points, but I think the major consideration > here is > > If we stick with the GPL, folks that sell proving software and so > on will not be able to incorporate our stuff unless they make > their own sources freely available, which I presume they'd be > loath to do. The counter argument is: why I / we / Graham put a lot of effort into developing the application and give it away for free without getting anything back in return? By GPLing it, if someone creates a derivative program, we'll be able to use their work in future programs that we might write. I would certainly prefer to see anything clever that I contribute significantly to (whether client or server side) under a strong copyleft licence such as the GPL. If it ends up that the server and/or default client aren't all that clever, then I'm less concerned. (For example, the methods database server code isn't all that complicated, and, although we released it under the GPL, I wouldn't be concerned if we changed this to something more perrmissive. And the C++ client code is already under the more permissive LGPL.) So I'd be quite content to leave it as GPL at the moment and, if part of it turns out to be fairly trivial, we can relicense it later. And as Graham says, none of this stops us from documenting the wire protocol and allowing anyone to interface to this without restriction. RAS |
From: Graham J. <gr...@ch...> - 2009-04-19 18:51:17
|
Richard wrote: > There does seem to be an issue with the loading of > odd bell methods - look at Grandsire. Yes. This is because I didn't initially appreciate how twin hunt methods were held on the online method database. They are not held as lead notation and leadend notation, but as two blocks, both of which can be symmetrical. The first block holds 3, then the second block holds half of the rest of the notation. Suffice it to say - Complib doesn't deal with twin hunt methods at present. Graham |
From: Richard A. <rc...@al...> - 2009-04-19 18:34:10
|
Graham Thanks for all the info - I have got it working from this (although it does seem to think I am you when running in debug mode!) There does seem to be an issue with the loading of odd bell methods - look at Grandsire. Regards Richard -----Original Message----- From: Graham John [mailto:gr...@ch...] Sent: 19 April 2009 15:32 To: 'Composition Library email list' Subject: Re: [complib-talk] How do you run the prototype? One further step added to the list to fix the database connection string, and a few other tweaks to the instructions below should get anyone going with this. 1. Download and install Visual C# Express Edition, free from http://www.microsoft.com/express/vcsharp/ 2. Download and install SQLite ADO.Net dotnet2 version, free from https://sourceforge.net/project/showfiles.php?group_id=132486 In the installation box, check Visual C# Express Edition, to add the SQLite designer components into Visual C#. 3. Download and install TortoiseSVN (win32 version), free from http://tortoisesvn.net/downloads 4. Create a folder called complib where you want it, right click The folder and select SVN Checkout. In the TortoiseSVN dialog, type the location of complib into the URL box as below and click OK https://complib.svn.sourceforge.net/svnroot/complib On any future occasion, right click and Update will keep Complib up to date. If you make any changes in the directory, you can also upload them to the repository using SVN commit. 5. Find and double-click the solution file (or open in Visual C#) complib/SVN/trunk/complib.sln 6. On the Visual C# menu, click on Project and Complib Properties, then Click on the Settings Tab. Find the Connection called ComplibLiteConnectionString. Edit the pathname in Value to point to the Test Complib database which is ...Complib\trunk\Complib\SQLite\ComplibLite 7. Click the green run arrow. The solution should build and run, and Complib should launch. On the Complib menu click Tools Options and unselect "List false compositions", as I use this option to help testing. This is partially developed unstable code, with virtually no validation, and a number of features not yet implemented. If you stick to regular methods and valid composition input though, it should work sufficiently to give you an idea. I'll put together a list of what works and send out later. I'll add this to a Readme when I next update it. I'll also see if I can make the connection string a relative pathname to eliminate step 6. Graham ---------------------------------------------------------------------------- -- Stay on top of everything new and different, both inside and around Java (TM) technology - register by April 22, and save $200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco. 300 plus technical and hands-on sessions. Register today. Use priority code J9JMT32. http://p.sf.net/sfu/p _______________________________________________ complib-talk mailing list com...@li... https://lists.sourceforge.net/lists/listinfo/complib-talk |