To test if Precision is better than 2/1, or if multi-Landy is better than Lionel, one could
- specify the two systems to be compared, say BWS with ML and BWS with Lionel
- deal a bunch of random hands.
- bid the hands in a team match between two teams, one that plays system A at both tables and one that plays B at both tables
- DD solve those of the boards where the contract is different at the two tables
- score the match
The biggest challenge is to implement the bidding systems. I envision systems being build of components: a component defines the meaning of calls in a situation. A situation would be described by what information has already been provided by the four players, the last bid, whether it was undoubled/doubled/redoubled, our side or their side, and how many subsequent passes can take place before the auction dies out. Also: which calls are already defined by high-priority components, and what hands are ruled out because a higher-priority component caters to them.
class BiddingSystemComponent { biddingTree make Tree (Situation) }
For example:
class Stayman implements BiddingSystemComponent { biddingTree make Tree (Situation) { if(lastbid != NT | isdoubled | isTheirContract | level>2) return "componentDoesNotApply" return biddingTree ( strength in constructive_range: FALSE: hearts in 3:4 and spades in 3:4 and diamonds in 4:5: FALSE: return "doesNotCoverThisHand" TRUE: return (chepestBid(clubs),"Stayman") TRUE: hearts==4 | spades==4 TRUE: return "doesNotCoverThisHand" FALSE: return (chepestBid(clubs),"Stayman") ) } } class StaymanResponse implements BiddingSystemComponent { biddingTree make Tree (Situation) { if(lastbid.annotation != "Stayman != NT | isdoubled | isTheirContract) return "componentDoesNotApply" return biddingTree ( hearts >= 4: FALSE: spade >= 4: FALSE: return ( cheapestBid(diamonds), "StaymanRsp:NoMajor" ) TRUE: return ( cheapestBid(spades), "StaymanRsp:Spades" ) TRUE: return ( cheapestBid(hearts), "StaymanRsp:Hearts" ) ) } }
Does this sound like a reasonable approach? Or should it be done in a different way? Is it doable?