next up previous contents
Next: An example Up: The External Representation of Previous: Bibliography   Contents

design.rnc

# $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:



Peter Dobcsanyi 2003-12-15