- From: Roger L. Costello <costello@mitre.org>
- Date: Thu, 21 Jul 2005 12:06:10 -0400
- To: <xmlschema-dev@w3.org>, "'Roger L. Costello'" <costello@mitre.org>
Hi Xan, I like your algorithm! I wonder if checking for enumerations shouldn't be done first, and then patterns, and then the 7 steps you described? Algorithm for Computing the Cardinality of a byte simpleType (with Xan's suggestions) 1. If there are enumeration facets then cardinality = count the number of enumeration facets Done. 2. If there are pattern facets then cardinality = the maximum cardinality of all the pattern facets. Done. 3. Otherwise: 3.1. lo = -128, hi = 127 3.2. minInclusive present => lo = max(lo, minInclusive) 3.3. maxInclusive present => hi = min(hi, maxInclusive) 3.4. minExclusive present => lo = max(lo, minExclusive + 1) 3.5. maxExclusive present => hi = min(hi, maxExclusive - 1) 3.6. totalDigits present => lo = max(lo, -10^^totalDigits + 1); hi = min(hi, 10^^totalDigits - 1) 3.7. cardinality = hi - lo + 1 Note that I am assuming that the enumeration facet takes precedence over all other facets. I believe that this is true, isn't it? Does this algorithm seem correct? /Roger -----Original Message----- From: Xan Gregg [mailto:xan.gregg@jmp.com] Sent: Thursday, July 21, 2005 10:12 AM To: Roger L. Costello Cc: xmlschema-dev@w3.org Subject: Re: Algorithm for computing the cardinality of a simpleType? Roger, Computing cardinality of a pattern would be enough to scare me off. What is the cardinality of 0*1*0*2*0*3*0*4*0*5*0*6*0*7*0*8*0*9*8*7*6*5*? If it weren't for leading zeros you could just try every possible lexical value and see if it's valid. totalDigits is based on absolute values so it also applies to negative numbers. As a result totalDigits of 2 has cardinality 199, not 100. I think you need to worry more about combinations of facets, such as min=75 and totalDigits=2. In the example you give, > <simpleType name="foo"> > <restriction base="byte"> > <minInclusive value="0"/> > <maxInclusive value="3"/> > <enumeration value="1"/> > <enumeration value="2"/> > </restriction> > </simpleType> > > My algorithm checks for the combination of minInclusive and > maxInclusive > before it checks for enumerations. For this example my algorithm > returns a > cardinality of: 4 (which is correct). Wouldn't 2 be the correct answer because of the enumeration facet? Ignoring pattern (hard) and enumeration (easy), my approach would be to keep a running range while processing factes: 1. lo = -128, hi = 127 2. minInclusive present => lo = max(lo, minInclusive) 3. maxInclusive present => hi = min(hi, maxInclusive) 4. minExclusive present => lo = max(lo, minExclusive + 1) 5. maxExclusive present => hi = min(hi, maxExclusive - 1) 6. totalDigits present => lo = max(lo, -10^^totalDigits + 1); hi = min(hi, 10^^totalDigits - 1) 7. range cardinality = hi - lo + 1 Then apply pattern and enumeration info to compute actual cardinality. xan
Received on Thursday, 21 July 2005 16:06:21 UTC