# $Id: design.rnc,v 1.133 2003/12/12 14:16:43 peter Exp $
#
# External Representation of Designs
#
# Version: 1.1
#
# Copyright (c) 2003, Peter Cameron, Peter Dobcsanyi, JP Morgan,
# Leonard Soicher
#
# This document is the verbatim copy of the Appendix "DESIGN.RNC"
# of the article "The External Representation of Block Designs"
# by the copyright holders.
#
# It is provided here as a separate file for direct computer use.
#
# Permission is granted to copy, distribute and/or modify this document
# under the terms of the GNU Free Documentation License, Version 1.2 or
# any later version published by the Free Software Foundation; with the
# Invariant Section DESIGN.RNC, no Front-Cover Texts, and no Back-Cover
# Texts. A copy of the license is included in the Appendix entitled
# "GNU Free Documentation License".
#
# This document and the information contained herein is provided on an
# ``AS IS'' basis and the Authors DISCLAIM ALL WARRANTIES, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
# THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
# WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
#
# Please send comments, questions, bug reports to:
#
# extrep@designtheory.org
#
default namespace dtrs = "http://designtheory.org/xml-namespace"
datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
### list of designs ###
start = list_of_designs # root of every ext-rep document
list_of_designs = element list_of_designs {
attribute dtrs_protocol { "1.1" } ,
attribute design_type { "block_design" | "latin_square" } ,
attribute pairwise_nonisomorphic { "true" | "false" | "unknown" } ,
attribute no_designs { xsd:nonNegativeInteger | "unknown" } ? ,
attribute precision { xsd:positiveInteger } ? ,
list_definition ? ,
# no designs should be repeated.
( block_design | latin_square ) * ,
info ?
}
# query language components
# (place holder only, to be defined later)
list_definition = element list_definition {
list_invariants ,
no_pairwise_nonisomorphic
}
list_invariants = element list_invariants { empty }
no_pairwise_nonisomorphic = element no_pairwise_nonisomorphic { empty }
### common components for all type of designs
# elementary objects
unknown = element unknown { empty }
not_applicable = element not_applicable { empty }
z = element z { xsd:integer }
q = element q { text } # must be in the format a/b
d = element d { xsd:decimal }
# functions on indices
function_on_indices = element function_on_indices {
attribute domain { "points" | "blocks" } ,
attribute n { xsd:nonNegativeInteger } ,
attribute ordered { "true" | "unknown" } ,
attribute image_cardinality { xsd:positiveInteger } ? ,
attribute precision { xsd:positiveInteger } ? ,
attribute title { text } ? ,
( map + | blank )
}
function_on_ksubsets_of_indices = element function_on_ksubsets_of_indices {
attribute domain_base { "points" | "blocks" } ,
attribute n { xsd:nonNegativeInteger } ,
attribute k { xsd:nonNegativeInteger } ,
attribute ordered { "true" | "unknown" } ,
attribute image_cardinality { xsd:positiveInteger } ? ,
attribute precision { xsd:positiveInteger } ? ,
attribute title { text } ? ,
( map + | blank )
}
# if <blank> is given instead of <map>-s, 'image_cardinality' must be specified
map = element map {
( preimage | preimage_cardinality | blank )
,
element image { z | d | q | not_applicable }
}
preimage = element preimage {
z +
|
element ksubset { z+ } +
|
entire_domain
}
preimage_cardinality = element preimage_cardinality { z }
blank = element blank { empty }
entire_domain = element entire_domain { empty }
# permutation groups and their properties
permutation_group = element permutation_group {
attribute degree { xsd:positiveInteger } ,
attribute order { xsd:positiveInteger } ,
attribute domain { "points" },
generators ,
permutation_group_properties?
}
permutation_group_properties = element permutation_group_properties {
element primitive {
attribute flag { "true" | "false" }
} ?
,
element generously_transitive {
attribute flag { "true" | "false" }
} ?
,
element multiplicity_free {
attribute flag { "true" | "false" }
} ?
,
element stratifiable {
attribute flag { "true" | "false" }
} ?
,
element no_orbits {
attribute value { xsd:positiveInteger }
} ?
,
element degree_transitivity {
attribute value { xsd:nonNegativeInteger }
} ?
,
element rank {
attribute value { xsd:positiveInteger }
} ?
,
cycle_type_representatives ?
}
cycle_type_representatives = element cycle_type_representatives {
cycle_type_representative +
}
cycle_type_representative = element cycle_type_representative {
permutation ,
element cycle_type {
attribute ordered { "true" } ,
z+
} ,
element no_having_cycle_type { z } ?
}
generators = element generators {
permutation *
}
permutation = element permutation { z+ }
# matrix
matrix = element matrix {
attribute no_rows { xsd:positiveInteger } ,
attribute no_columns { xsd:positiveInteger } ,
attribute title { text } ? ,
row +
}
row = element row { ( z | q | d )+ }
# <info> commonly used for all type of designs
info = element info {
element creator {
element person { text } *
,
element software { text } *
} + ,
element reference { text } * ,
element note { text } *
}
### block design ###
block_design = element block_design {
attribute id { xsd:ID } ,
attribute v { xsd:positiveInteger } ,
attribute b { xsd:positiveInteger } ? ,
attribute precision { xsd:positiveInteger } ? ,
blocks ,
point_labels ? ,
indicators ? ,
combinatorial_properties ? ,
block_design_automorphism_group ? ,
resolutions ? ,
statistical_properties ? ,
alternative_representations ? ,
info ?
}
blocks = element blocks {
attribute ordered { "true" } ,
block+
}
block = element block { z+ }
point_labels = element point_labels {
z+
|
element label { text } +
}
indicators = element indicators {
element repeated_blocks {
attribute flag { "true" | "false" }
} ?
&
element resolvable {
attribute flag { "true" | "false" }
} ?
&
element affine_resolvable {
attribute flag { "true" | "false" },
attribute mu { xsd:positiveInteger } ?
} ?
&
element equireplicate {
attribute flag { "true" | "false" } ,
attribute r { xsd:positiveInteger } ?
} ?
&
element constant_blocksize {
attribute flag { "true" | "false" } ,
attribute k { xsd:positiveInteger } ?
} ?
&
element t_design {
attribute flag { "true" | "false" } ,
attribute maximum_t { xsd:positiveInteger } ?
} ?
&
element connected {
attribute flag { "true" | "false" } ,
attribute no_components { xsd:positiveInteger } ?
} ?
&
element pairwise_balanced {
attribute flag { "true" | "false" } ,
attribute lambda { xsd:positiveInteger } ?
} ?
&
element variance_balanced {
attribute flag { "true" | "false" }
} ?
&
element efficiency_balanced {
attribute flag { "true" | "false" }
} ?
&
element cyclic {
attribute flag { "true" | "false" }
} ?
&
element one_rotational {
attribute flag { "true" | "false" }
} ?
}
combinatorial_properties = element combinatorial_properties {
point_concurrences ? ,
block_concurrences ? ,
t_design_properties ? ,
alpha_resolvable ? ,
t_wise_balanced ?
}
block_concurrences = element block_concurrences {
function_on_ksubsets_of_indices + # with domain_base="blocks"
}
point_concurrences = element point_concurrences {
function_on_ksubsets_of_indices + # with domain_base="points"
}
t_design_properties = element t_design_properties {
element parameters {
attribute t { xsd:positiveInteger } ,
attribute v { xsd:positiveInteger } ,
attribute b { xsd:positiveInteger } ,
attribute r { xsd:positiveInteger } ,
attribute k { xsd:positiveInteger } ,
attribute lambda { xsd:positiveInteger }
} ?
&
element square {
attribute flag { "true" | "false" }
} ?
&
element projective_plane {
attribute flag { "true" | "false" }
} ?
&
element affine_plane {
attribute flag { "true" | "false" }
} ?
&
element steiner_system {
attribute flag { "true" | "false" } ,
attribute t { xsd:positiveInteger } ?
} ?
&
element steiner_triple_system {
attribute flag { "true" | "false" }
} ?
}
index_flag = element index_flag {
attribute index { xsd:nonNegativeInteger },
attribute flag { "true" | "false" | "unknown" }
}
alpha_resolvable = element alpha_resolvable {
index_flag +
}
t_wise_balanced = element t_wise_balanced {
index_flag +
}
block_design_automorphism_group = element automorphism_group {
permutation_group, # 'domain' must be "points"
block_design_automorphism_group_properties ?
}
block_design_automorphism_group_properties = element automorphism_group_properties {
element block_primitive {
attribute flag { "true" | "false" | "not_applicable" }
} ?
,
element no_block_orbits {
attribute value { xsd:positiveInteger | "not_applicable" }
} ?
,
element degree_block_transitivity {
attribute value { xsd:nonNegativeInteger | "not_applicable" }
} ?
}
resolutions = element resolutions {
attribute pairwise_nonisomorphic { "true" | "false" | "unknown" } ,
attribute all_classes_represented { "true" | "false" | "unknown" } ,
resolution +
}
resolution = element resolution {
function_on_indices, # with domain="blocks"
resolution_automorphism_group ?
}
resolution_automorphism_group = element automorphism_group {
permutation_group, # 'domain' must be "points"
resolution_automorphism_group_properties?
}
resolution_automorphism_group_properties =
element automorphism_group_properties { empty } # to be defined later
statistical_properties = element statistical_properties {
attribute precision { xsd:positiveInteger } ,
canonical_variances ? ,
pairwise_variances ? ,
optimality_criteria ? ,
other_ordering_criteria ? ,
canonical_efficiency_factors ? ,
functions_of_efficiency_factors ? ,
robustness_properties ?
# all optional elements omitted if number of treatments=1
}
canonical_variances = element canonical_variances {
attribute no_distinct { xsd:positiveInteger | "unknown" | "not_applicable" } ,
# no_distinct = "not_applicable" for disconnected designs
attribute ordered { "true" | "unknown" } ,
element value {
attribute multiplicity { xsd:positiveInteger | "not_applicable" } ,
( d | q | z | blank | not_applicable )
} +
# for a design with u connected components, there must be u-1 values
# of "not_applicable"
# if present as a value, "not_applicable" is largest if values ordered
}
pairwise_variances = element pairwise_variances {
function_on_ksubsets_of_indices # with domain_base="points" and k="2"
}
optimality_criteria = element optimality_criteria {
# These are functions either of
# (i) the canonical variances z_1>=z_2>=...>=z_{v-1}, which are the
# inverses of the v-1 largest eigenvalues of the information matrix C
# (the inverse of zero being defined as infinity) or
# (ii) the v(v-1)/2 pairwise variances v_{ij}=d_{ii}+d_{jj}-2d_{ij}
# for 1<=i<j<=v where d_{ij} is the general element of C^+ (the
# Moore-Penrose inverse of C)
# In the connected case, the canonical variances are exactly the
# nonzero eigenvalues of C^+; in the general case, they are the
# nonzero eigenvalues of C^+ in addition to u-1 values of infinity,
# where u is the number of connected components
# Smaller values correspond to "better" designs
# Efficiencies (see absolute_efficiency) are stored when an optimal
# design is known WITHIN THE BINARY CLASS, in which case the value
# is relative to the best binary design. It is thus possible that
# a nonbinary design could be "superefficient", ie have efficiency
# larger than 1.
#
# value = actual numerical value of the function for this design
# absolute_efficiency = (value for best in binary class)/value
# calculated_efficiency = (value for best in selected list of designs)/value
# all efficiencies for a disconnected design are zero
element phi_0 {
# sum of log(z_i)
element value { d | q | z | not_applicable} ,
element absolute_efficiency { d | q | z | unknown } ? ,
element calculated_efficiency { d | q | z | unknown } ?
} ?
,
element phi_1 {
# mean of the z_i
element value { d | q | z | not_applicable} ,
element absolute_efficiency { d | q | z | unknown } ? ,
element calculated_efficiency { d | q | z | unknown } ?
} ?
,
element phi_2 {
# mean of squared z_i
element value { d | q | z | not_applicable} ,
element absolute_efficiency { d | q | z | unknown } ? ,
element calculated_efficiency { d | q | z | unknown } ?
} ?
,
element maximum_pairwise_variances {
# largest of the v_{ij}
element value { d | q | z | not_applicable} ,
element absolute_efficiency { d | q | z | unknown } ? ,
element calculated_efficiency { d | q | z | unknown } ?
} ?
,
element E_criteria {
# cumulative sums of the z_i
# E_1=z_1 is often called "the" E-value
# E_2=z_1+z_2
# E_3=z_1+z_2+z_3
# etc
# E_{v-1}=(v-1)*phi_1
# Maximize all v-1 E-values <=> Schur-optimal
E_value +
} ?
}
E_value = element E_value {
attribute index { xsd:positiveInteger } ,
# index must be in {1,...,v-1}
element value { d | q | z | not_applicable} ,
element absolute_efficiency { d | q | z | unknown } ? ,
element calculated_efficiency { d | q | z | unknown } ?
}
other_ordering_criteria = element other_ordering_criteria {
# these are criteria that order designs within the reference
# universe but which do not meet our definition for
# an "optimality" criterion
# may be of interest in conjunction with formal optimality criteria
# in a multi-criterion screening of designs
# absolute_comparisons and calculated_comparisons are handled just
# as the corresponding efficiencies for optimality criteria (and in
# particular are zero for every disconnected design); because they do
# not measure relative size of a variance, we use a different terminology
# all disconnected designs are ordered "last"
element trace_of_square_of_C {
# sum of z_i^{-2} = trace of C^2
# this is sometimes called the "S" criterion and is the second
# stage of the "M-S" optimality search (first stage is to
# restrict to binarity, which maximizes trace)
element value { d | q | z | not_applicable} ,
element absolute_comparison { d | q | z | unknown } ? ,
element calculated_comparison { d | q | z | unknown } ?
} ?
,
element max_min_ratio_canonical_variances {
# z_1/z_{v-1}
element value { d | q | z | not_applicable} ,
element absolute_comparison { d | q | z | unknown } ? ,
element calculated_comparison { d | q | z | unknown } ?
} ?
,
element max_min_ratio_pairwise_variances {
# max(v_{ij})/min(v_{ij})
element value { d | q | z | not_applicable} ,
element absolute_comparison { d | q | z | unknown } ? ,
element calculated_comparison { d | q | z | unknown } ?
} ?
,
element no_distinct_canonical_variances {
# number of distinct values among the z_{i}
element value { z | unknown | not_applicable } ,
element absolute_comparison { d | q | z | unknown } ? ,
element calculated_comparison { d | q | z | unknown } ?
} ?
,
element no_distinct_pairwise_variances {
# number of distinct values among the v_{ij}
element value { z | unknown | not_applicable } ,
element absolute_comparison { d | q | z | unknown } ? ,
element calculated_comparison { d | q | z | unknown } ?
} ?
} ?
canonical_efficiency_factors = element canonical_efficiency_factors {
attribute no_distinct { xsd:positiveInteger | "unknown" | "not_applicable" } ,
# no_distinct = "not_applicable" for disconnected designs
attribute ordered { "true" | "unknown" } ,
element value {
attribute multiplicity { xsd:positiveInteger | "not_applicable" } ,
( d | q | z | blank )
} +
# for a design with u connected components, there must be u-1 values
# of 0
}
functions_of_efficiency_factors = element functions_of_efficiency_factors {
# These are functions of the canonical efficiency factors
# e_1 <= e_2 <= ... <= e_{v-1}
# that "good" designs will maximize over the class of all designs
# with the same blocksize distribution and fixed replication numbers
# NOTE WELL: The reference universe for these functions is restricted
# to designs with fixed v, block size distribution, AND replication
# numbers!
element harmonic_mean {
attribute alias { "A" } ,
element value { d | q | z }
} ?
,
element geometric_mean {
attribute alias {"D"} ,
element value { d | q | z }
} ?
,
element minimum {
attribute alias { "E" } ,
element value { d | q | z }
} ?
}
robustness_properties = element robustness_properties {
# for connected designs only
robust_connected_plots ? ,
robust_connected_blocks ? ,
robust_efficiencies_plots ? ,
robust_efficiencies_blocks ?
} ?
robust_connected_plots = element robust_connected_plots {
# This element makes the statement
# "The design is connected under all possible ways in which
# number_lost plots can be removed"
# If the reported value of number_lost is known to be the largest integer
# for which this statement is true then is_max takes the value "true"
# and otherwise takes the value "unknown."
attribute number_lost { xsd:nonNegativeInteger } ,
attribute is_max { "true" | "unknown" }
}
robust_connected_blocks = element robust_connected_blocks {
# This element makes the statement
# "The design is connected under all possible ways in which
# number_lost blocks can be removed"
# If the reported value of number_lost is known to be the largest integer
# for which this statement is true then is_max takes the value "true"
# and otherwise takes the value ""unknown"."
attribute number_lost { xsd:nonNegativeInteger } ,
attribute is_max { "true" | "unknown" }
}
robust_efficiencies_plots = element robust_efficiencies_plots {
attribute precision { xsd:positiveInteger } ,
robustness_efficiency_values +
}
robust_efficiencies_blocks = element robust_efficiencies_blocks {
attribute precision { xsd:positiveInteger } ,
robustness_efficiency_values +
}
robustness_efficiency_values = element robustness_efficiency_values {
# n=0 not allowed for number_lost
# self_efficiency = (value of the criterion for the full design)/
# (value for the reduced design)
# absolute_efficiency = (value for best in reduced binary class)/
# (value for the reduced design)
# calculated_efficiency = (value for best in selected list of designs)/
# (value for the reduced design)
attribute number_lost { xsd:positiveInteger } ,
attribute loss_measure { "average" | "worst" } ,
element phi_0 {
# sum of log(z_i)
element self_efficiency { d | q | z } ,
element absolute_efficiency { d | q | z | unknown } ? ,
element calculated_efficiency { d | q | z | unknown } ?
} ?
,
element phi_1 {
# mean of the z_i
element self_efficiency { d | q | z } ,
element absolute_efficiency { d | q | z | unknown } ? ,
element calculated_efficiency { d | q | z | unknown } ?
} ?
,
element maximum_pairwise_variances {
# largest of the v_{ij}
element self_efficiency { d | q | z } ,
element absolute_efficiency { d | q | z | unknown } ? ,
element calculated_efficiency { d | q | z | unknown } ?
} ?
,
element E_1 {
# E_1=z_1 is often called "the" E-value
element self_efficiency { d | q | z } ,
element absolute_efficiency { d | q | z | unknown } ? ,
element calculated_efficiency { d | q | z | unknown } ?
} ?
}
alternative_representations = element alternative_representations {
incidence_matrix
# ... to be extended as needed
}
incidence_matrix = element incidence_matrix {
attribute shape { "points_by_blocks" } ,
matrix
}
# latin square
# (place holder only, to be defined later)
latin_square = element latin_square { empty }
# vi: set syntax=rnc:
# vi: set expandtab: