# ./po1.py
# -*- coding: utf-8 -*-
# PyXB bindings for NM:0b7cd15560246d7d2d128cc81f6a9b47497ff9c8
# Generated 2014-11-17 14:43:30.620569 by PyXB version 1.2.3
# Namespace http://www.dmg.org/PMML-4_1

import pyxb
import pyxb.binding
import pyxb.binding.saxer
import io
import pyxb.utils.utility
import pyxb.utils.domutils
import sys

# Unique identifier for bindings created at the same time
_GenerationUID = pyxb.utils.utility.UniqueIdentifier('urn:uuid:26e4d414-6eab-11e4-9a9d-7831c1bcb06a')

# Version of PyXB used to generate the bindings
_PyXBVersion = '1.2.6'
# Generated bindings are not compatible across PyXB versions
if pyxb.__version__ != _PyXBVersion:
    raise pyxb.PyXBVersionError(_PyXBVersion)

# Import bindings for namespaces imported into schema
import pyxb.binding.datatypes

# NOTE: All namespace declarations are reserved within the binding
Namespace = pyxb.namespace.NamespaceForURI(u'http://www.dmg.org/PMML-4_1', create_if_missing=True)
Namespace.configureCategories(['typeBinding', 'elementBinding'])

def CreateFromDocument (xml_text, default_namespace=None, location_base=None):
    """Parse the given XML and use the document element to create a
    Python instance.

    @param xml_text An XML document.  This should be data (Python 2
    str or Python 3 bytes), or a text (Python 2 unicode or Python 3
    str) in the L{pyxb._InputEncoding} encoding.

    @keyword default_namespace The L{pyxb.Namespace} instance to use as the
    default namespace where there is no default namespace in scope.
    If unspecified or C{None}, the namespace of the module containing
    this function will be used.

    @keyword location_base: An object to be recorded as the base of all
    L{pyxb.utils.utility.Location} instances associated with events and
    objects handled by the parser.  You might pass the URI from which
    the document was obtained.
    """

    if pyxb.XMLStyle_saxer != pyxb._XMLStyle:
        dom = pyxb.utils.domutils.StringToDOM(xml_text)
        return CreateFromDOM(dom.documentElement)
    if default_namespace is None:
        default_namespace = Namespace.fallbackNamespace()
    saxer = pyxb.binding.saxer.make_parser(fallback_namespace=default_namespace, location_base=location_base)
    handler = saxer.getContentHandler()
    xmld = xml_text
    if isinstance(xmld, unicode):
        xmld = xmld.encode(pyxb._InputEncoding)
    saxer.parse(io.BytesIO(xmld))
    instance = handler.rootObject()
    return instance

def CreateFromDOM (node, default_namespace=None):
    """Create a Python instance from the given DOM node.
    The node tag must correspond to an element declaration in this module.

    @deprecated: Forcing use of DOM interface is unnecessary; use L{CreateFromDocument}."""
    if default_namespace is None:
        default_namespace = Namespace.fallbackNamespace()
    return pyxb.binding.basis.element.AnyCreateFromDOM(node, default_namespace)


# Atomic simple type: [anonymous]
class STD_ANON (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 22, 8)
    _Documentation = None
STD_ANON._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON, enum_prefix=None)
STD_ANON.centerBased = STD_ANON._CF_enumeration.addEnumeration(unicode_value=u'centerBased', tag=u'centerBased')
STD_ANON.distributionBased = STD_ANON._CF_enumeration.addEnumeration(unicode_value=u'distributionBased', tag=u'distributionBased')
STD_ANON._InitializeFacetMap(STD_ANON._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_ (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 81, 8)
    _Documentation = None
STD_ANON_._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_, enum_prefix=None)
STD_ANON_.true = STD_ANON_._CF_enumeration.addEnumeration(unicode_value=u'true', tag=u'true')
STD_ANON_.false = STD_ANON_._CF_enumeration.addEnumeration(unicode_value=u'false', tag=u'false')
STD_ANON_._InitializeFacetMap(STD_ANON_._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}COMPARE-FUNCTION
class COMPARE_FUNCTION (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'COMPARE-FUNCTION')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 101, 2)
    _Documentation = None
COMPARE_FUNCTION._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=COMPARE_FUNCTION, enum_prefix=None)
COMPARE_FUNCTION.absDiff = COMPARE_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'absDiff', tag=u'absDiff')
COMPARE_FUNCTION.gaussSim = COMPARE_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'gaussSim', tag=u'gaussSim')
COMPARE_FUNCTION.delta = COMPARE_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'delta', tag=u'delta')
COMPARE_FUNCTION.equal = COMPARE_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'equal', tag=u'equal')
COMPARE_FUNCTION.table = COMPARE_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'table', tag=u'table')
COMPARE_FUNCTION._InitializeFacetMap(COMPARE_FUNCTION._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'COMPARE-FUNCTION', COMPARE_FUNCTION)

# Atomic simple type: [anonymous]
class STD_ANON_2 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 127, 8)
    _Documentation = None
STD_ANON_2._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_2, enum_prefix=None)
STD_ANON_2.distance = STD_ANON_2._CF_enumeration.addEnumeration(unicode_value=u'distance', tag=u'distance')
STD_ANON_2.similarity = STD_ANON_2._CF_enumeration.addEnumeration(unicode_value=u'similarity', tag=u'similarity')
STD_ANON_2._InitializeFacetMap(STD_ANON_2._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}FIELD-USAGE-TYPE
class FIELD_USAGE_TYPE (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'FIELD-USAGE-TYPE')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 296, 2)
    _Documentation = None
FIELD_USAGE_TYPE._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=FIELD_USAGE_TYPE, enum_prefix=None)
FIELD_USAGE_TYPE.active = FIELD_USAGE_TYPE._CF_enumeration.addEnumeration(unicode_value=u'active', tag=u'active')
FIELD_USAGE_TYPE.predicted = FIELD_USAGE_TYPE._CF_enumeration.addEnumeration(unicode_value=u'predicted', tag=u'predicted')
FIELD_USAGE_TYPE.supplementary = FIELD_USAGE_TYPE._CF_enumeration.addEnumeration(unicode_value=u'supplementary', tag=u'supplementary')
FIELD_USAGE_TYPE.group = FIELD_USAGE_TYPE._CF_enumeration.addEnumeration(unicode_value=u'group', tag=u'group')
FIELD_USAGE_TYPE.order = FIELD_USAGE_TYPE._CF_enumeration.addEnumeration(unicode_value=u'order', tag=u'order')
FIELD_USAGE_TYPE.frequencyWeight = FIELD_USAGE_TYPE._CF_enumeration.addEnumeration(unicode_value=u'frequencyWeight', tag=u'frequencyWeight')
FIELD_USAGE_TYPE.analysisWeight = FIELD_USAGE_TYPE._CF_enumeration.addEnumeration(unicode_value=u'analysisWeight', tag=u'analysisWeight')
FIELD_USAGE_TYPE._InitializeFacetMap(FIELD_USAGE_TYPE._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'FIELD-USAGE-TYPE', FIELD_USAGE_TYPE)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}OUTLIER-TREATMENT-METHOD
class OUTLIER_TREATMENT_METHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'OUTLIER-TREATMENT-METHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 307, 2)
    _Documentation = None
OUTLIER_TREATMENT_METHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=OUTLIER_TREATMENT_METHOD, enum_prefix=None)
OUTLIER_TREATMENT_METHOD.asIs = OUTLIER_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asIs', tag=u'asIs')
OUTLIER_TREATMENT_METHOD.asMissingValues = OUTLIER_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asMissingValues', tag=u'asMissingValues')
OUTLIER_TREATMENT_METHOD.asExtremeValues = OUTLIER_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asExtremeValues', tag=u'asExtremeValues')
OUTLIER_TREATMENT_METHOD._InitializeFacetMap(OUTLIER_TREATMENT_METHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'OUTLIER-TREATMENT-METHOD', OUTLIER_TREATMENT_METHOD)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}MISSING-VALUE-TREATMENT-METHOD
class MISSING_VALUE_TREATMENT_METHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'MISSING-VALUE-TREATMENT-METHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 314, 2)
    _Documentation = None
MISSING_VALUE_TREATMENT_METHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=MISSING_VALUE_TREATMENT_METHOD, enum_prefix=None)
MISSING_VALUE_TREATMENT_METHOD.asIs = MISSING_VALUE_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asIs', tag=u'asIs')
MISSING_VALUE_TREATMENT_METHOD.asMean = MISSING_VALUE_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asMean', tag=u'asMean')
MISSING_VALUE_TREATMENT_METHOD.asMode = MISSING_VALUE_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asMode', tag=u'asMode')
MISSING_VALUE_TREATMENT_METHOD.asMedian = MISSING_VALUE_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asMedian', tag=u'asMedian')
MISSING_VALUE_TREATMENT_METHOD.asValue = MISSING_VALUE_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asValue', tag=u'asValue')
MISSING_VALUE_TREATMENT_METHOD._InitializeFacetMap(MISSING_VALUE_TREATMENT_METHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'MISSING-VALUE-TREATMENT-METHOD', MISSING_VALUE_TREATMENT_METHOD)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}INVALID-VALUE-TREATMENT-METHOD
class INVALID_VALUE_TREATMENT_METHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'INVALID-VALUE-TREATMENT-METHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 323, 2)
    _Documentation = None
INVALID_VALUE_TREATMENT_METHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=INVALID_VALUE_TREATMENT_METHOD, enum_prefix=None)
INVALID_VALUE_TREATMENT_METHOD.returnInvalid = INVALID_VALUE_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'returnInvalid', tag=u'returnInvalid')
INVALID_VALUE_TREATMENT_METHOD.asIs = INVALID_VALUE_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asIs', tag=u'asIs')
INVALID_VALUE_TREATMENT_METHOD.asMissing = INVALID_VALUE_TREATMENT_METHOD._CF_enumeration.addEnumeration(unicode_value=u'asMissing', tag=u'asMissing')
INVALID_VALUE_TREATMENT_METHOD._InitializeFacetMap(INVALID_VALUE_TREATMENT_METHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'INVALID-VALUE-TREATMENT-METHOD', INVALID_VALUE_TREATMENT_METHOD)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}ELEMENT-ID
class ELEMENT_ID (pyxb.binding.datatypes.string):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'ELEMENT-ID')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 379, 2)
    _Documentation = None
ELEMENT_ID._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'ELEMENT-ID', ELEMENT_ID)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}DELIMITER
class DELIMITER (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'DELIMITER')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 393, 2)
    _Documentation = None
DELIMITER._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=DELIMITER, enum_prefix=None)
DELIMITER.sameTimeWindow = DELIMITER._CF_enumeration.addEnumeration(unicode_value=u'sameTimeWindow', tag=u'sameTimeWindow')
DELIMITER.acrossTimeWindows = DELIMITER._CF_enumeration.addEnumeration(unicode_value=u'acrossTimeWindows', tag=u'acrossTimeWindows')
DELIMITER._InitializeFacetMap(DELIMITER._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'DELIMITER', DELIMITER)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}GAP
class GAP (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'GAP')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 399, 2)
    _Documentation = None
GAP._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=GAP, enum_prefix=None)
GAP.true = GAP._CF_enumeration.addEnumeration(unicode_value=u'true', tag=u'true')
GAP.false = GAP._CF_enumeration.addEnumeration(unicode_value=u'false', tag=u'false')
GAP.unknown = GAP._CF_enumeration.addEnumeration(unicode_value=u'unknown', tag=u'unknown')
GAP._InitializeFacetMap(GAP._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'GAP', GAP)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}MINING-FUNCTION
class MINING_FUNCTION (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'MINING-FUNCTION')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 549, 2)
    _Documentation = None
MINING_FUNCTION._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=MINING_FUNCTION, enum_prefix=None)
MINING_FUNCTION.associationRules = MINING_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'associationRules', tag=u'associationRules')
MINING_FUNCTION.sequences = MINING_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'sequences', tag=u'sequences')
MINING_FUNCTION.classification = MINING_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'classification', tag=u'classification')
MINING_FUNCTION.regression = MINING_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'regression', tag=u'regression')
MINING_FUNCTION.clustering = MINING_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'clustering', tag=u'clustering')
MINING_FUNCTION.timeSeries = MINING_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'timeSeries', tag=u'timeSeries')
MINING_FUNCTION.mixed = MINING_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'mixed', tag=u'mixed')
MINING_FUNCTION._InitializeFacetMap(MINING_FUNCTION._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'MINING-FUNCTION', MINING_FUNCTION)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}NUMBER
class NUMBER (pyxb.binding.datatypes.double):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'NUMBER')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 574, 2)
    _Documentation = None
NUMBER._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'NUMBER', NUMBER)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}INT-NUMBER
class INT_NUMBER (pyxb.binding.datatypes.integer):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'INT-NUMBER')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 577, 2)
    _Documentation = None
INT_NUMBER._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'INT-NUMBER', INT_NUMBER)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}REAL-NUMBER
class REAL_NUMBER (pyxb.binding.datatypes.double):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'REAL-NUMBER')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 580, 2)
    _Documentation = None
REAL_NUMBER._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'REAL-NUMBER', REAL_NUMBER)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}PROB-NUMBER
class PROB_NUMBER (pyxb.binding.datatypes.decimal):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'PROB-NUMBER')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 583, 2)
    _Documentation = None
PROB_NUMBER._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'PROB-NUMBER', PROB_NUMBER)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}PERCENTAGE-NUMBER
class PERCENTAGE_NUMBER (pyxb.binding.datatypes.decimal):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'PERCENTAGE-NUMBER')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 586, 2)
    _Documentation = None
PERCENTAGE_NUMBER._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'PERCENTAGE-NUMBER', PERCENTAGE_NUMBER)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}FIELD-NAME
class FIELD_NAME (pyxb.binding.datatypes.string):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'FIELD-NAME')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 589, 2)
    _Documentation = None
FIELD_NAME._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'FIELD-NAME', FIELD_NAME)

# Atomic simple type: [anonymous]
class STD_ANON_3 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 595, 6)
    _Documentation = None
STD_ANON_3._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_3, enum_prefix=None)
STD_ANON_3.int = STD_ANON_3._CF_enumeration.addEnumeration(unicode_value=u'int', tag=u'int')
STD_ANON_3.real = STD_ANON_3._CF_enumeration.addEnumeration(unicode_value=u'real', tag=u'real')
STD_ANON_3.string = STD_ANON_3._CF_enumeration.addEnumeration(unicode_value=u'string', tag=u'string')
STD_ANON_3._InitializeFacetMap(STD_ANON_3._CF_enumeration)

# List simple type: [anonymous]
# superclasses pyxb.binding.datatypes.anySimpleType
class STD_ANON_4 (pyxb.binding.basis.STD_list):

    """Simple type that is a list of pyxb.binding.datatypes.int."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 646, 4)
    _Documentation = None

    _ItemType = pyxb.binding.datatypes.int
STD_ANON_4._InitializeFacetMap()

# List simple type: [anonymous]
# superclasses pyxb.binding.datatypes.anySimpleType
class STD_ANON_5 (pyxb.binding.basis.STD_list):

    """Simple type that is a list of pyxb.binding.datatypes.int."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 651, 4)
    _Documentation = None

    _ItemType = pyxb.binding.datatypes.int
STD_ANON_5._InitializeFacetMap()

# List simple type: [anonymous]
# superclasses pyxb.binding.datatypes.anySimpleType
class STD_ANON_6 (pyxb.binding.basis.STD_list):

    """Simple type that is a list of pyxb.binding.datatypes.double."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 656, 4)
    _Documentation = None

    _ItemType = pyxb.binding.datatypes.double
STD_ANON_6._InitializeFacetMap()

# Atomic simple type: [anonymous]
class STD_ANON_7 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 667, 8)
    _Documentation = None
STD_ANON_7._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_7, enum_prefix=None)
STD_ANON_7.diagonal = STD_ANON_7._CF_enumeration.addEnumeration(unicode_value=u'diagonal', tag=u'diagonal')
STD_ANON_7.symmetric = STD_ANON_7._CF_enumeration.addEnumeration(unicode_value=u'symmetric', tag=u'symmetric')
STD_ANON_7.any = STD_ANON_7._CF_enumeration.addEnumeration(unicode_value=u'any', tag=u'any')
STD_ANON_7._InitializeFacetMap(STD_ANON_7._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}CONT-SCORING-METHOD
class CONT_SCORING_METHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'CONT-SCORING-METHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 877, 2)
    _Documentation = None
CONT_SCORING_METHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=CONT_SCORING_METHOD, enum_prefix=None)
CONT_SCORING_METHOD.median = CONT_SCORING_METHOD._CF_enumeration.addEnumeration(unicode_value=u'median', tag=u'median')
CONT_SCORING_METHOD.average = CONT_SCORING_METHOD._CF_enumeration.addEnumeration(unicode_value=u'average', tag=u'average')
CONT_SCORING_METHOD.weightedAverage = CONT_SCORING_METHOD._CF_enumeration.addEnumeration(unicode_value=u'weightedAverage', tag=u'weightedAverage')
CONT_SCORING_METHOD._InitializeFacetMap(CONT_SCORING_METHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'CONT-SCORING-METHOD', CONT_SCORING_METHOD)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}CAT-SCORING-METHOD
class CAT_SCORING_METHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'CAT-SCORING-METHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 884, 2)
    _Documentation = None
CAT_SCORING_METHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=CAT_SCORING_METHOD, enum_prefix=None)
CAT_SCORING_METHOD.majorityVote = CAT_SCORING_METHOD._CF_enumeration.addEnumeration(unicode_value=u'majorityVote', tag=u'majorityVote')
CAT_SCORING_METHOD.weightedMajorityVote = CAT_SCORING_METHOD._CF_enumeration.addEnumeration(unicode_value=u'weightedMajorityVote', tag=u'weightedMajorityVote')
CAT_SCORING_METHOD._InitializeFacetMap(CAT_SCORING_METHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'CAT-SCORING-METHOD', CAT_SCORING_METHOD)

# Atomic simple type: [anonymous]
class STD_ANON_8 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 908, 8)
    _Documentation = None
STD_ANON_8._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_8, enum_prefix=None)
STD_ANON_8.linearRegression = STD_ANON_8._CF_enumeration.addEnumeration(unicode_value=u'linearRegression', tag=u'linearRegression')
STD_ANON_8.stepwisePolynomialRegression = STD_ANON_8._CF_enumeration.addEnumeration(unicode_value=u'stepwisePolynomialRegression', tag=u'stepwisePolynomialRegression')
STD_ANON_8.logisticRegression = STD_ANON_8._CF_enumeration.addEnumeration(unicode_value=u'logisticRegression', tag=u'logisticRegression')
STD_ANON_8._InitializeFacetMap(STD_ANON_8._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}REGRESSIONNORMALIZATIONMETHOD
class REGRESSIONNORMALIZATIONMETHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'REGRESSIONNORMALIZATIONMETHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 921, 2)
    _Documentation = None
REGRESSIONNORMALIZATIONMETHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=REGRESSIONNORMALIZATIONMETHOD, enum_prefix=None)
REGRESSIONNORMALIZATIONMETHOD.none = REGRESSIONNORMALIZATIONMETHOD._CF_enumeration.addEnumeration(unicode_value=u'none', tag=u'none')
REGRESSIONNORMALIZATIONMETHOD.simplemax = REGRESSIONNORMALIZATIONMETHOD._CF_enumeration.addEnumeration(unicode_value=u'simplemax', tag=u'simplemax')
REGRESSIONNORMALIZATIONMETHOD.softmax = REGRESSIONNORMALIZATIONMETHOD._CF_enumeration.addEnumeration(unicode_value=u'softmax', tag=u'softmax')
REGRESSIONNORMALIZATIONMETHOD.logit = REGRESSIONNORMALIZATIONMETHOD._CF_enumeration.addEnumeration(unicode_value=u'logit', tag=u'logit')
REGRESSIONNORMALIZATIONMETHOD.probit = REGRESSIONNORMALIZATIONMETHOD._CF_enumeration.addEnumeration(unicode_value=u'probit', tag=u'probit')
REGRESSIONNORMALIZATIONMETHOD.cloglog = REGRESSIONNORMALIZATIONMETHOD._CF_enumeration.addEnumeration(unicode_value=u'cloglog', tag=u'cloglog')
REGRESSIONNORMALIZATIONMETHOD.exp = REGRESSIONNORMALIZATIONMETHOD._CF_enumeration.addEnumeration(unicode_value=u'exp', tag=u'exp')
REGRESSIONNORMALIZATIONMETHOD.loglog = REGRESSIONNORMALIZATIONMETHOD._CF_enumeration.addEnumeration(unicode_value=u'loglog', tag=u'loglog')
REGRESSIONNORMALIZATIONMETHOD.cauchit = REGRESSIONNORMALIZATIONMETHOD._CF_enumeration.addEnumeration(unicode_value=u'cauchit', tag=u'cauchit')
REGRESSIONNORMALIZATIONMETHOD._InitializeFacetMap(REGRESSIONNORMALIZATIONMETHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'REGRESSIONNORMALIZATIONMETHOD', REGRESSIONNORMALIZATIONMETHOD)

# Atomic simple type: [anonymous]
class STD_ANON_9 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1063, 8)
    _Documentation = None
STD_ANON_9._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_9, enum_prefix=None)
STD_ANON_9.indicator = STD_ANON_9._CF_enumeration.addEnumeration(unicode_value=u'indicator', tag=u'indicator')
STD_ANON_9._InitializeFacetMap(STD_ANON_9._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_10 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1126, 8)
    _Documentation = None
STD_ANON_10._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_10, enum_prefix=None)
STD_ANON_10.count = STD_ANON_10._CF_enumeration.addEnumeration(unicode_value=u'count', tag=u'count')
STD_ANON_10.sum = STD_ANON_10._CF_enumeration.addEnumeration(unicode_value=u'sum', tag=u'sum')
STD_ANON_10.average = STD_ANON_10._CF_enumeration.addEnumeration(unicode_value=u'average', tag=u'average')
STD_ANON_10.min = STD_ANON_10._CF_enumeration.addEnumeration(unicode_value=u'min', tag=u'min')
STD_ANON_10.max = STD_ANON_10._CF_enumeration.addEnumeration(unicode_value=u'max', tag=u'max')
STD_ANON_10.multiset = STD_ANON_10._CF_enumeration.addEnumeration(unicode_value=u'multiset', tag=u'multiset')
STD_ANON_10._InitializeFacetMap(STD_ANON_10._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}TIMESERIES-ALGORITHM
class TIMESERIES_ALGORITHM (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'TIMESERIES-ALGORITHM')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1165, 2)
    _Documentation = None
TIMESERIES_ALGORITHM._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=TIMESERIES_ALGORITHM, enum_prefix=None)
TIMESERIES_ALGORITHM.ARIMA = TIMESERIES_ALGORITHM._CF_enumeration.addEnumeration(unicode_value=u'ARIMA', tag=u'ARIMA')
TIMESERIES_ALGORITHM.ExponentialSmoothing = TIMESERIES_ALGORITHM._CF_enumeration.addEnumeration(unicode_value=u'ExponentialSmoothing', tag=u'ExponentialSmoothing')
TIMESERIES_ALGORITHM.SeasonalTrendDecomposition = TIMESERIES_ALGORITHM._CF_enumeration.addEnumeration(unicode_value=u'SeasonalTrendDecomposition', tag=u'SeasonalTrendDecomposition')
TIMESERIES_ALGORITHM.SpectralAnalysis = TIMESERIES_ALGORITHM._CF_enumeration.addEnumeration(unicode_value=u'SpectralAnalysis', tag=u'SpectralAnalysis')
TIMESERIES_ALGORITHM._InitializeFacetMap(TIMESERIES_ALGORITHM._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'TIMESERIES-ALGORITHM', TIMESERIES_ALGORITHM)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}TIMESERIES-USAGE
class TIMESERIES_USAGE (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'TIMESERIES-USAGE')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1185, 2)
    _Documentation = None
TIMESERIES_USAGE._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=TIMESERIES_USAGE, enum_prefix=None)
TIMESERIES_USAGE.original = TIMESERIES_USAGE._CF_enumeration.addEnumeration(unicode_value=u'original', tag=u'original')
TIMESERIES_USAGE.logical = TIMESERIES_USAGE._CF_enumeration.addEnumeration(unicode_value=u'logical', tag=u'logical')
TIMESERIES_USAGE.prediction = TIMESERIES_USAGE._CF_enumeration.addEnumeration(unicode_value=u'prediction', tag=u'prediction')
TIMESERIES_USAGE._InitializeFacetMap(TIMESERIES_USAGE._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'TIMESERIES-USAGE', TIMESERIES_USAGE)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}TIME-ANCHOR
class TIME_ANCHOR (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'TIME-ANCHOR')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1225, 2)
    _Documentation = None
TIME_ANCHOR._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=TIME_ANCHOR, enum_prefix=None)
TIME_ANCHOR.dateTimeMillisecondsSince0 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateTimeMillisecondsSince[0]', tag=u'dateTimeMillisecondsSince0')
TIME_ANCHOR.dateTimeMillisecondsSince1960 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateTimeMillisecondsSince[1960]', tag=u'dateTimeMillisecondsSince1960')
TIME_ANCHOR.dateTimeMillisecondsSince1970 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateTimeMillisecondsSince[1970]', tag=u'dateTimeMillisecondsSince1970')
TIME_ANCHOR.dateTimeMillisecondsSince1980 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateTimeMillisecondsSince[1980]', tag=u'dateTimeMillisecondsSince1980')
TIME_ANCHOR.dateTimeSecondsSince0 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateTimeSecondsSince[0]', tag=u'dateTimeSecondsSince0')
TIME_ANCHOR.dateTimeSecondsSince1960 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateTimeSecondsSince[1960]', tag=u'dateTimeSecondsSince1960')
TIME_ANCHOR.dateTimeSecondsSince1970 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateTimeSecondsSince[1970]', tag=u'dateTimeSecondsSince1970')
TIME_ANCHOR.dateTimeSecondsSince1980 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateTimeSecondsSince[1980]', tag=u'dateTimeSecondsSince1980')
TIME_ANCHOR.dateDaysSince0 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateDaysSince[0]', tag=u'dateDaysSince0')
TIME_ANCHOR.dateDaysSince1960 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateDaysSince[1960]', tag=u'dateDaysSince1960')
TIME_ANCHOR.dateDaysSince1970 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateDaysSince[1970]', tag=u'dateDaysSince1970')
TIME_ANCHOR.dateDaysSince1980 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateDaysSince[1980]', tag=u'dateDaysSince1980')
TIME_ANCHOR.dateMonthsSince0 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateMonthsSince[0]', tag=u'dateMonthsSince0')
TIME_ANCHOR.dateMonthsSince1960 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateMonthsSince[1960]', tag=u'dateMonthsSince1960')
TIME_ANCHOR.dateMonthsSince1970 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateMonthsSince[1970]', tag=u'dateMonthsSince1970')
TIME_ANCHOR.dateMonthsSince1980 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateMonthsSince[1980]', tag=u'dateMonthsSince1980')
TIME_ANCHOR.dateYearsSince0 = TIME_ANCHOR._CF_enumeration.addEnumeration(unicode_value=u'dateYearsSince[0]', tag=u'dateYearsSince0')
TIME_ANCHOR._InitializeFacetMap(TIME_ANCHOR._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'TIME-ANCHOR', TIME_ANCHOR)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}VALID-TIME-SPEC
class VALID_TIME_SPEC (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'VALID-TIME-SPEC')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1246, 2)
    _Documentation = None
VALID_TIME_SPEC._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=VALID_TIME_SPEC, enum_prefix=None)
VALID_TIME_SPEC.includeAll = VALID_TIME_SPEC._CF_enumeration.addEnumeration(unicode_value=u'includeAll', tag=u'includeAll')
VALID_TIME_SPEC.includeFromTo = VALID_TIME_SPEC._CF_enumeration.addEnumeration(unicode_value=u'includeFromTo', tag=u'includeFromTo')
VALID_TIME_SPEC.excludeFromTo = VALID_TIME_SPEC._CF_enumeration.addEnumeration(unicode_value=u'excludeFromTo', tag=u'excludeFromTo')
VALID_TIME_SPEC.includeSet = VALID_TIME_SPEC._CF_enumeration.addEnumeration(unicode_value=u'includeSet', tag=u'includeSet')
VALID_TIME_SPEC.excludeSet = VALID_TIME_SPEC._CF_enumeration.addEnumeration(unicode_value=u'excludeSet', tag=u'excludeSet')
VALID_TIME_SPEC._InitializeFacetMap(VALID_TIME_SPEC._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'VALID-TIME-SPEC', VALID_TIME_SPEC)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}TIME-EXCEPTION-TYPE
class TIME_EXCEPTION_TYPE (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'TIME-EXCEPTION-TYPE')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1264, 2)
    _Documentation = None
TIME_EXCEPTION_TYPE._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=TIME_EXCEPTION_TYPE, enum_prefix=None)
TIME_EXCEPTION_TYPE.exclude = TIME_EXCEPTION_TYPE._CF_enumeration.addEnumeration(unicode_value=u'exclude', tag=u'exclude')
TIME_EXCEPTION_TYPE.include = TIME_EXCEPTION_TYPE._CF_enumeration.addEnumeration(unicode_value=u'include', tag=u'include')
TIME_EXCEPTION_TYPE._InitializeFacetMap(TIME_EXCEPTION_TYPE._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'TIME-EXCEPTION-TYPE', TIME_EXCEPTION_TYPE)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}INTERPOLATION-METHOD
class INTERPOLATION_METHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'INTERPOLATION-METHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1270, 2)
    _Documentation = None
INTERPOLATION_METHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=INTERPOLATION_METHOD, enum_prefix=None)
INTERPOLATION_METHOD.none = INTERPOLATION_METHOD._CF_enumeration.addEnumeration(unicode_value=u'none', tag=u'none')
INTERPOLATION_METHOD.linear = INTERPOLATION_METHOD._CF_enumeration.addEnumeration(unicode_value=u'linear', tag=u'linear')
INTERPOLATION_METHOD.exponentialSpline = INTERPOLATION_METHOD._CF_enumeration.addEnumeration(unicode_value=u'exponentialSpline', tag=u'exponentialSpline')
INTERPOLATION_METHOD.cubicSpline = INTERPOLATION_METHOD._CF_enumeration.addEnumeration(unicode_value=u'cubicSpline', tag=u'cubicSpline')
INTERPOLATION_METHOD._InitializeFacetMap(INTERPOLATION_METHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'INTERPOLATION-METHOD', INTERPOLATION_METHOD)

# Atomic simple type: [anonymous]
class STD_ANON_11 (pyxb.binding.datatypes.NMTOKEN, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1288, 8)
    _Documentation = None
STD_ANON_11._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_11, enum_prefix=None)
STD_ANON_11.none = STD_ANON_11._CF_enumeration.addEnumeration(unicode_value=u'none', tag=u'none')
STD_ANON_11.logarithmic = STD_ANON_11._CF_enumeration.addEnumeration(unicode_value=u'logarithmic', tag=u'logarithmic')
STD_ANON_11.squareroot = STD_ANON_11._CF_enumeration.addEnumeration(unicode_value=u'squareroot', tag=u'squareroot')
STD_ANON_11._InitializeFacetMap(STD_ANON_11._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_12 (pyxb.binding.datatypes.NMTOKEN, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1310, 8)
    _Documentation = None
STD_ANON_12._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_12, enum_prefix=None)
STD_ANON_12.additive = STD_ANON_12._CF_enumeration.addEnumeration(unicode_value=u'additive', tag=u'additive')
STD_ANON_12.damped_additive = STD_ANON_12._CF_enumeration.addEnumeration(unicode_value=u'damped_additive', tag=u'damped_additive')
STD_ANON_12.multiplicative = STD_ANON_12._CF_enumeration.addEnumeration(unicode_value=u'multiplicative', tag=u'multiplicative')
STD_ANON_12.damped_multiplicative = STD_ANON_12._CF_enumeration.addEnumeration(unicode_value=u'damped_multiplicative', tag=u'damped_multiplicative')
STD_ANON_12.polynomial_exponential = STD_ANON_12._CF_enumeration.addEnumeration(unicode_value=u'polynomial_exponential', tag=u'polynomial_exponential')
STD_ANON_12._InitializeFacetMap(STD_ANON_12._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_13 (pyxb.binding.datatypes.NMTOKEN, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1331, 8)
    _Documentation = None
STD_ANON_13._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_13, enum_prefix=None)
STD_ANON_13.additive = STD_ANON_13._CF_enumeration.addEnumeration(unicode_value=u'additive', tag=u'additive')
STD_ANON_13.multiplicative = STD_ANON_13._CF_enumeration.addEnumeration(unicode_value=u'multiplicative', tag=u'multiplicative')
STD_ANON_13._InitializeFacetMap(STD_ANON_13._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}SVM-CLASSIFICATION-METHOD
class SVM_CLASSIFICATION_METHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'SVM-CLASSIFICATION-METHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1379, 2)
    _Documentation = None
SVM_CLASSIFICATION_METHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=SVM_CLASSIFICATION_METHOD, enum_prefix=None)
SVM_CLASSIFICATION_METHOD.OneAgainstAll = SVM_CLASSIFICATION_METHOD._CF_enumeration.addEnumeration(unicode_value=u'OneAgainstAll', tag=u'OneAgainstAll')
SVM_CLASSIFICATION_METHOD.OneAgainstOne = SVM_CLASSIFICATION_METHOD._CF_enumeration.addEnumeration(unicode_value=u'OneAgainstOne', tag=u'OneAgainstOne')
SVM_CLASSIFICATION_METHOD._InitializeFacetMap(SVM_CLASSIFICATION_METHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'SVM-CLASSIFICATION-METHOD', SVM_CLASSIFICATION_METHOD)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}SVM-REPRESENTATION
class SVM_REPRESENTATION (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'SVM-REPRESENTATION')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1385, 2)
    _Documentation = None
SVM_REPRESENTATION._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=SVM_REPRESENTATION, enum_prefix=None)
SVM_REPRESENTATION.SupportVectors = SVM_REPRESENTATION._CF_enumeration.addEnumeration(unicode_value=u'SupportVectors', tag=u'SupportVectors')
SVM_REPRESENTATION.Coefficients = SVM_REPRESENTATION._CF_enumeration.addEnumeration(unicode_value=u'Coefficients', tag=u'Coefficients')
SVM_REPRESENTATION._InitializeFacetMap(SVM_REPRESENTATION._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'SVM-REPRESENTATION', SVM_REPRESENTATION)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}VECTOR-ID
class VECTOR_ID (pyxb.binding.datatypes.string):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'VECTOR-ID')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1429, 2)
    _Documentation = None
VECTOR_ID._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'VECTOR-ID', VECTOR_ID)

# Atomic simple type: [anonymous]
class STD_ANON_14 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1579, 8)
    _Documentation = None
STD_ANON_14._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_14, enum_prefix=None)
STD_ANON_14.termFrequency = STD_ANON_14._CF_enumeration.addEnumeration(unicode_value=u'termFrequency', tag=u'termFrequency')
STD_ANON_14.binary = STD_ANON_14._CF_enumeration.addEnumeration(unicode_value=u'binary', tag=u'binary')
STD_ANON_14.logarithmic = STD_ANON_14._CF_enumeration.addEnumeration(unicode_value=u'logarithmic', tag=u'logarithmic')
STD_ANON_14.augmentedNormalizedTermFrequency = STD_ANON_14._CF_enumeration.addEnumeration(unicode_value=u'augmentedNormalizedTermFrequency', tag=u'augmentedNormalizedTermFrequency')
STD_ANON_14._InitializeFacetMap(STD_ANON_14._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_15 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1589, 8)
    _Documentation = None
STD_ANON_15._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_15, enum_prefix=None)
STD_ANON_15.inverseDocumentFrequency = STD_ANON_15._CF_enumeration.addEnumeration(unicode_value=u'inverseDocumentFrequency', tag=u'inverseDocumentFrequency')
STD_ANON_15.none = STD_ANON_15._CF_enumeration.addEnumeration(unicode_value=u'none', tag=u'none')
STD_ANON_15.GFIDF = STD_ANON_15._CF_enumeration.addEnumeration(unicode_value=u'GFIDF', tag=u'GFIDF')
STD_ANON_15.normal = STD_ANON_15._CF_enumeration.addEnumeration(unicode_value=u'normal', tag=u'normal')
STD_ANON_15.probabilisticInverse = STD_ANON_15._CF_enumeration.addEnumeration(unicode_value=u'probabilisticInverse', tag=u'probabilisticInverse')
STD_ANON_15._InitializeFacetMap(STD_ANON_15._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_16 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1600, 8)
    _Documentation = None
STD_ANON_16._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_16, enum_prefix=None)
STD_ANON_16.none = STD_ANON_16._CF_enumeration.addEnumeration(unicode_value=u'none', tag=u'none')
STD_ANON_16.cosine = STD_ANON_16._CF_enumeration.addEnumeration(unicode_value=u'cosine', tag=u'cosine')
STD_ANON_16._InitializeFacetMap(STD_ANON_16._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_17 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1615, 8)
    _Documentation = None
STD_ANON_17._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_17, enum_prefix=None)
STD_ANON_17.euclidean = STD_ANON_17._CF_enumeration.addEnumeration(unicode_value=u'euclidean', tag=u'euclidean')
STD_ANON_17.cosine = STD_ANON_17._CF_enumeration.addEnumeration(unicode_value=u'cosine', tag=u'cosine')
STD_ANON_17._InitializeFacetMap(STD_ANON_17._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_18 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1645, 8)
    _Documentation = None
STD_ANON_18._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_18, enum_prefix=None)
STD_ANON_18.binarySplit = STD_ANON_18._CF_enumeration.addEnumeration(unicode_value=u'binarySplit', tag=u'binarySplit')
STD_ANON_18.multiSplit = STD_ANON_18._CF_enumeration.addEnumeration(unicode_value=u'multiSplit', tag=u'multiSplit')
STD_ANON_18._InitializeFacetMap(STD_ANON_18._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_19 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1691, 8)
    _Documentation = None
STD_ANON_19._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_19, enum_prefix=None)
STD_ANON_19.equal = STD_ANON_19._CF_enumeration.addEnumeration(unicode_value=u'equal', tag=u'equal')
STD_ANON_19.notEqual = STD_ANON_19._CF_enumeration.addEnumeration(unicode_value=u'notEqual', tag=u'notEqual')
STD_ANON_19.lessThan = STD_ANON_19._CF_enumeration.addEnumeration(unicode_value=u'lessThan', tag=u'lessThan')
STD_ANON_19.lessOrEqual = STD_ANON_19._CF_enumeration.addEnumeration(unicode_value=u'lessOrEqual', tag=u'lessOrEqual')
STD_ANON_19.greaterThan = STD_ANON_19._CF_enumeration.addEnumeration(unicode_value=u'greaterThan', tag=u'greaterThan')
STD_ANON_19.greaterOrEqual = STD_ANON_19._CF_enumeration.addEnumeration(unicode_value=u'greaterOrEqual', tag=u'greaterOrEqual')
STD_ANON_19.isMissing = STD_ANON_19._CF_enumeration.addEnumeration(unicode_value=u'isMissing', tag=u'isMissing')
STD_ANON_19.isNotMissing = STD_ANON_19._CF_enumeration.addEnumeration(unicode_value=u'isNotMissing', tag=u'isNotMissing')
STD_ANON_19._InitializeFacetMap(STD_ANON_19._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_20 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1716, 8)
    _Documentation = None
STD_ANON_20._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_20, enum_prefix=None)
STD_ANON_20.or_ = STD_ANON_20._CF_enumeration.addEnumeration(unicode_value=u'or', tag=u'or_')
STD_ANON_20.and_ = STD_ANON_20._CF_enumeration.addEnumeration(unicode_value=u'and', tag=u'and_')
STD_ANON_20.xor = STD_ANON_20._CF_enumeration.addEnumeration(unicode_value=u'xor', tag=u'xor')
STD_ANON_20.surrogate = STD_ANON_20._CF_enumeration.addEnumeration(unicode_value=u'surrogate', tag=u'surrogate')
STD_ANON_20._InitializeFacetMap(STD_ANON_20._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_21 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1735, 8)
    _Documentation = None
STD_ANON_21._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_21, enum_prefix=None)
STD_ANON_21.isIn = STD_ANON_21._CF_enumeration.addEnumeration(unicode_value=u'isIn', tag=u'isIn')
STD_ANON_21.isNotIn = STD_ANON_21._CF_enumeration.addEnumeration(unicode_value=u'isNotIn', tag=u'isNotIn')
STD_ANON_21._InitializeFacetMap(STD_ANON_21._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}MISSING-VALUE-STRATEGY
class MISSING_VALUE_STRATEGY (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'MISSING-VALUE-STRATEGY')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1769, 2)
    _Documentation = None
MISSING_VALUE_STRATEGY._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=MISSING_VALUE_STRATEGY, enum_prefix=None)
MISSING_VALUE_STRATEGY.lastPrediction = MISSING_VALUE_STRATEGY._CF_enumeration.addEnumeration(unicode_value=u'lastPrediction', tag=u'lastPrediction')
MISSING_VALUE_STRATEGY.nullPrediction = MISSING_VALUE_STRATEGY._CF_enumeration.addEnumeration(unicode_value=u'nullPrediction', tag=u'nullPrediction')
MISSING_VALUE_STRATEGY.defaultChild = MISSING_VALUE_STRATEGY._CF_enumeration.addEnumeration(unicode_value=u'defaultChild', tag=u'defaultChild')
MISSING_VALUE_STRATEGY.weightedConfidence = MISSING_VALUE_STRATEGY._CF_enumeration.addEnumeration(unicode_value=u'weightedConfidence', tag=u'weightedConfidence')
MISSING_VALUE_STRATEGY.aggregateNodes = MISSING_VALUE_STRATEGY._CF_enumeration.addEnumeration(unicode_value=u'aggregateNodes', tag=u'aggregateNodes')
MISSING_VALUE_STRATEGY.none = MISSING_VALUE_STRATEGY._CF_enumeration.addEnumeration(unicode_value=u'none', tag=u'none')
MISSING_VALUE_STRATEGY._InitializeFacetMap(MISSING_VALUE_STRATEGY._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'MISSING-VALUE-STRATEGY', MISSING_VALUE_STRATEGY)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}NO-TRUE-CHILD-STRATEGY
class NO_TRUE_CHILD_STRATEGY (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'NO-TRUE-CHILD-STRATEGY')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1779, 2)
    _Documentation = None
NO_TRUE_CHILD_STRATEGY._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=NO_TRUE_CHILD_STRATEGY, enum_prefix=None)
NO_TRUE_CHILD_STRATEGY.returnNullPrediction = NO_TRUE_CHILD_STRATEGY._CF_enumeration.addEnumeration(unicode_value=u'returnNullPrediction', tag=u'returnNullPrediction')
NO_TRUE_CHILD_STRATEGY.returnLastPrediction = NO_TRUE_CHILD_STRATEGY._CF_enumeration.addEnumeration(unicode_value=u'returnLastPrediction', tag=u'returnLastPrediction')
NO_TRUE_CHILD_STRATEGY._InitializeFacetMap(NO_TRUE_CHILD_STRATEGY._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'NO-TRUE-CHILD-STRATEGY', NO_TRUE_CHILD_STRATEGY)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}MULTIPLE-MODEL-METHOD
class MULTIPLE_MODEL_METHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'MULTIPLE-MODEL-METHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1829, 2)
    _Documentation = None
MULTIPLE_MODEL_METHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=MULTIPLE_MODEL_METHOD, enum_prefix=None)
MULTIPLE_MODEL_METHOD.majorityVote = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'majorityVote', tag=u'majorityVote')
MULTIPLE_MODEL_METHOD.weightedMajorityVote = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'weightedMajorityVote', tag=u'weightedMajorityVote')
MULTIPLE_MODEL_METHOD.average = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'average', tag=u'average')
MULTIPLE_MODEL_METHOD.weightedAverage = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'weightedAverage', tag=u'weightedAverage')
MULTIPLE_MODEL_METHOD.median = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'median', tag=u'median')
MULTIPLE_MODEL_METHOD.max = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'max', tag=u'max')
MULTIPLE_MODEL_METHOD.sum = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'sum', tag=u'sum')
MULTIPLE_MODEL_METHOD.selectFirst = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'selectFirst', tag=u'selectFirst')
MULTIPLE_MODEL_METHOD.selectAll = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'selectAll', tag=u'selectAll')
MULTIPLE_MODEL_METHOD.modelChain = MULTIPLE_MODEL_METHOD._CF_enumeration.addEnumeration(unicode_value=u'modelChain', tag=u'modelChain')
MULTIPLE_MODEL_METHOD._InitializeFacetMap(MULTIPLE_MODEL_METHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'MULTIPLE-MODEL-METHOD', MULTIPLE_MODEL_METHOD)

# Atomic simple type: [anonymous]
class STD_ANON_22 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1900, 8)
    _Documentation = None
STD_ANON_22._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_22, enum_prefix=None)
STD_ANON_22.binarySplit = STD_ANON_22._CF_enumeration.addEnumeration(unicode_value=u'binarySplit', tag=u'binarySplit')
STD_ANON_22.multiSplit = STD_ANON_22._CF_enumeration.addEnumeration(unicode_value=u'multiSplit', tag=u'multiSplit')
STD_ANON_22._InitializeFacetMap(STD_ANON_22._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_23 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2007, 8)
    _Documentation = None
STD_ANON_23._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_23, enum_prefix=None)
STD_ANON_23.training = STD_ANON_23._CF_enumeration.addEnumeration(unicode_value=u'training', tag=u'training')
STD_ANON_23.test = STD_ANON_23._CF_enumeration.addEnumeration(unicode_value=u'test', tag=u'test')
STD_ANON_23.validation = STD_ANON_23._CF_enumeration.addEnumeration(unicode_value=u'validation', tag=u'validation')
STD_ANON_23._InitializeFacetMap(STD_ANON_23._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_24 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2233, 8)
    _Documentation = None
STD_ANON_24._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_24, enum_prefix=None)
STD_ANON_24.weightedSum = STD_ANON_24._CF_enumeration.addEnumeration(unicode_value=u'weightedSum', tag=u'weightedSum')
STD_ANON_24.weightedMax = STD_ANON_24._CF_enumeration.addEnumeration(unicode_value=u'weightedMax', tag=u'weightedMax')
STD_ANON_24.firstHit = STD_ANON_24._CF_enumeration.addEnumeration(unicode_value=u'firstHit', tag=u'firstHit')
STD_ANON_24._InitializeFacetMap(STD_ANON_24._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_25 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2294, 8)
    _Documentation = None
STD_ANON_25._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_25, enum_prefix=None)
STD_ANON_25.n0 = STD_ANON_25._CF_enumeration.addEnumeration(unicode_value=u'0', tag=u'n0')
STD_ANON_25.n1 = STD_ANON_25._CF_enumeration.addEnumeration(unicode_value=u'1', tag=u'n1')
STD_ANON_25._InitializeFacetMap(STD_ANON_25._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_26 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2409, 8)
    _Documentation = None
STD_ANON_26._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_26, enum_prefix=None)
STD_ANON_26.Model = STD_ANON_26._CF_enumeration.addEnumeration(unicode_value=u'Model', tag=u'Model')
STD_ANON_26.Error = STD_ANON_26._CF_enumeration.addEnumeration(unicode_value=u'Error', tag=u'Error')
STD_ANON_26.Total = STD_ANON_26._CF_enumeration.addEnumeration(unicode_value=u'Total', tag=u'Total')
STD_ANON_26._InitializeFacetMap(STD_ANON_26._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_27 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2444, 8)
    _Documentation = None
STD_ANON_27._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_27, enum_prefix=None)
STD_ANON_27.n0 = STD_ANON_27._CF_enumeration.addEnumeration(unicode_value=u'0', tag=u'n0')
STD_ANON_27.n1 = STD_ANON_27._CF_enumeration.addEnumeration(unicode_value=u'1', tag=u'n1')
STD_ANON_27._InitializeFacetMap(STD_ANON_27._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_28 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2470, 8)
    _Documentation = None
STD_ANON_28._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_28, enum_prefix=None)
STD_ANON_28.round = STD_ANON_28._CF_enumeration.addEnumeration(unicode_value=u'round', tag=u'round')
STD_ANON_28.ceiling = STD_ANON_28._CF_enumeration.addEnumeration(unicode_value=u'ceiling', tag=u'ceiling')
STD_ANON_28.floor = STD_ANON_28._CF_enumeration.addEnumeration(unicode_value=u'floor', tag=u'floor')
STD_ANON_28._InitializeFacetMap(STD_ANON_28._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_29 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2519, 8)
    _Documentation = None
STD_ANON_29._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_29, enum_prefix=None)
STD_ANON_29.regression = STD_ANON_29._CF_enumeration.addEnumeration(unicode_value=u'regression', tag=u'regression')
STD_ANON_29.generalLinear = STD_ANON_29._CF_enumeration.addEnumeration(unicode_value=u'generalLinear', tag=u'generalLinear')
STD_ANON_29.multinomialLogistic = STD_ANON_29._CF_enumeration.addEnumeration(unicode_value=u'multinomialLogistic', tag=u'multinomialLogistic')
STD_ANON_29.ordinalMultinomial = STD_ANON_29._CF_enumeration.addEnumeration(unicode_value=u'ordinalMultinomial', tag=u'ordinalMultinomial')
STD_ANON_29.generalizedLinear = STD_ANON_29._CF_enumeration.addEnumeration(unicode_value=u'generalizedLinear', tag=u'generalizedLinear')
STD_ANON_29.CoxRegression = STD_ANON_29._CF_enumeration.addEnumeration(unicode_value=u'CoxRegression', tag=u'CoxRegression')
STD_ANON_29._InitializeFacetMap(STD_ANON_29._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_30 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2540, 8)
    _Documentation = None
STD_ANON_30._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_30, enum_prefix=None)
STD_ANON_30.binomial = STD_ANON_30._CF_enumeration.addEnumeration(unicode_value=u'binomial', tag=u'binomial')
STD_ANON_30.gamma = STD_ANON_30._CF_enumeration.addEnumeration(unicode_value=u'gamma', tag=u'gamma')
STD_ANON_30.igauss = STD_ANON_30._CF_enumeration.addEnumeration(unicode_value=u'igauss', tag=u'igauss')
STD_ANON_30.negbin = STD_ANON_30._CF_enumeration.addEnumeration(unicode_value=u'negbin', tag=u'negbin')
STD_ANON_30.normal = STD_ANON_30._CF_enumeration.addEnumeration(unicode_value=u'normal', tag=u'normal')
STD_ANON_30.poisson = STD_ANON_30._CF_enumeration.addEnumeration(unicode_value=u'poisson', tag=u'poisson')
STD_ANON_30.tweedie = STD_ANON_30._CF_enumeration.addEnumeration(unicode_value=u'tweedie', tag=u'tweedie')
STD_ANON_30._InitializeFacetMap(STD_ANON_30._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_31 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2651, 8)
    _Documentation = None
STD_ANON_31._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_31, enum_prefix=None)
STD_ANON_31.model = STD_ANON_31._CF_enumeration.addEnumeration(unicode_value=u'model', tag=u'model')
STD_ANON_31.robust = STD_ANON_31._CF_enumeration.addEnumeration(unicode_value=u'robust', tag=u'robust')
STD_ANON_31._InitializeFacetMap(STD_ANON_31._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}CUMULATIVE-LINK-FUNCTION
class CUMULATIVE_LINK_FUNCTION (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'CUMULATIVE-LINK-FUNCTION')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2733, 2)
    _Documentation = None
CUMULATIVE_LINK_FUNCTION._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=CUMULATIVE_LINK_FUNCTION, enum_prefix=None)
CUMULATIVE_LINK_FUNCTION.logit = CUMULATIVE_LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'logit', tag=u'logit')
CUMULATIVE_LINK_FUNCTION.probit = CUMULATIVE_LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'probit', tag=u'probit')
CUMULATIVE_LINK_FUNCTION.cloglog = CUMULATIVE_LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'cloglog', tag=u'cloglog')
CUMULATIVE_LINK_FUNCTION.loglog = CUMULATIVE_LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'loglog', tag=u'loglog')
CUMULATIVE_LINK_FUNCTION.cauchit = CUMULATIVE_LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'cauchit', tag=u'cauchit')
CUMULATIVE_LINK_FUNCTION._InitializeFacetMap(CUMULATIVE_LINK_FUNCTION._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'CUMULATIVE-LINK-FUNCTION', CUMULATIVE_LINK_FUNCTION)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}LINK-FUNCTION
class LINK_FUNCTION (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'LINK-FUNCTION')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2742, 2)
    _Documentation = None
LINK_FUNCTION._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=LINK_FUNCTION, enum_prefix=None)
LINK_FUNCTION.cloglog = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'cloglog', tag=u'cloglog')
LINK_FUNCTION.identity = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'identity', tag=u'identity')
LINK_FUNCTION.log = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'log', tag=u'log')
LINK_FUNCTION.logc = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'logc', tag=u'logc')
LINK_FUNCTION.logit = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'logit', tag=u'logit')
LINK_FUNCTION.loglog = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'loglog', tag=u'loglog')
LINK_FUNCTION.negbin = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'negbin', tag=u'negbin')
LINK_FUNCTION.oddspower = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'oddspower', tag=u'oddspower')
LINK_FUNCTION.power = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'power', tag=u'power')
LINK_FUNCTION.probit = LINK_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'probit', tag=u'probit')
LINK_FUNCTION._InitializeFacetMap(LINK_FUNCTION._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'LINK-FUNCTION', LINK_FUNCTION)

# Atomic simple type: [anonymous]
class STD_ANON_32 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2781, 8)
    _Documentation = None
STD_ANON_32._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_32, enum_prefix=None)
STD_ANON_32.n0 = STD_ANON_32._CF_enumeration.addEnumeration(unicode_value=u'0', tag=u'n0')
STD_ANON_32.n1 = STD_ANON_32._CF_enumeration.addEnumeration(unicode_value=u'1', tag=u'n1')
STD_ANON_32._InitializeFacetMap(STD_ANON_32._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}OPTYPE
class OPTYPE (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'OPTYPE')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2790, 2)
    _Documentation = None
OPTYPE._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=OPTYPE, enum_prefix=None)
OPTYPE.categorical = OPTYPE._CF_enumeration.addEnumeration(unicode_value=u'categorical', tag=u'categorical')
OPTYPE.ordinal = OPTYPE._CF_enumeration.addEnumeration(unicode_value=u'ordinal', tag=u'ordinal')
OPTYPE.continuous = OPTYPE._CF_enumeration.addEnumeration(unicode_value=u'continuous', tag=u'continuous')
OPTYPE._InitializeFacetMap(OPTYPE._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'OPTYPE', OPTYPE)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}DATATYPE
class DATATYPE (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'DATATYPE')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2797, 2)
    _Documentation = None
DATATYPE._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=DATATYPE, enum_prefix=None)
DATATYPE.string = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'string', tag=u'string')
DATATYPE.integer = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'integer', tag=u'integer')
DATATYPE.float = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'float', tag=u'float')
DATATYPE.double = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'double', tag=u'double')
DATATYPE.boolean = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'boolean', tag=u'boolean')
DATATYPE.date = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'date', tag=u'date')
DATATYPE.time = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'time', tag=u'time')
DATATYPE.dateTime = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'dateTime', tag=u'dateTime')
DATATYPE.dateDaysSince0 = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'dateDaysSince[0]', tag=u'dateDaysSince0')
DATATYPE.dateDaysSince1960 = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'dateDaysSince[1960]', tag=u'dateDaysSince1960')
DATATYPE.dateDaysSince1970 = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'dateDaysSince[1970]', tag=u'dateDaysSince1970')
DATATYPE.dateDaysSince1980 = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'dateDaysSince[1980]', tag=u'dateDaysSince1980')
DATATYPE.timeSeconds = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'timeSeconds', tag=u'timeSeconds')
DATATYPE.dateTimeSecondsSince0 = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'dateTimeSecondsSince[0]', tag=u'dateTimeSecondsSince0')
DATATYPE.dateTimeSecondsSince1960 = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'dateTimeSecondsSince[1960]', tag=u'dateTimeSecondsSince1960')
DATATYPE.dateTimeSecondsSince1970 = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'dateTimeSecondsSince[1970]', tag=u'dateTimeSecondsSince1970')
DATATYPE.dateTimeSecondsSince1980 = DATATYPE._CF_enumeration.addEnumeration(unicode_value=u'dateTimeSecondsSince[1980]', tag=u'dateTimeSecondsSince1980')
DATATYPE._InitializeFacetMap(DATATYPE._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'DATATYPE', DATATYPE)

# Atomic simple type: [anonymous]
class STD_ANON_33 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2826, 8)
    _Documentation = None
STD_ANON_33._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_33, enum_prefix=None)
STD_ANON_33.valid = STD_ANON_33._CF_enumeration.addEnumeration(unicode_value=u'valid', tag=u'valid')
STD_ANON_33.invalid = STD_ANON_33._CF_enumeration.addEnumeration(unicode_value=u'invalid', tag=u'invalid')
STD_ANON_33.missing = STD_ANON_33._CF_enumeration.addEnumeration(unicode_value=u'missing', tag=u'missing')
STD_ANON_33._InitializeFacetMap(STD_ANON_33._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_34 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2842, 8)
    _Documentation = None
STD_ANON_34._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_34, enum_prefix=None)
STD_ANON_34.openClosed = STD_ANON_34._CF_enumeration.addEnumeration(unicode_value=u'openClosed', tag=u'openClosed')
STD_ANON_34.openOpen = STD_ANON_34._CF_enumeration.addEnumeration(unicode_value=u'openOpen', tag=u'openOpen')
STD_ANON_34.closedOpen = STD_ANON_34._CF_enumeration.addEnumeration(unicode_value=u'closedOpen', tag=u'closedOpen')
STD_ANON_34.closedClosed = STD_ANON_34._CF_enumeration.addEnumeration(unicode_value=u'closedClosed', tag=u'closedClosed')
STD_ANON_34._InitializeFacetMap(STD_ANON_34._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_35 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2881, 8)
    _Documentation = None
STD_ANON_35._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_35, enum_prefix=None)
STD_ANON_35.recommendation = STD_ANON_35._CF_enumeration.addEnumeration(unicode_value=u'recommendation', tag=u'recommendation')
STD_ANON_35.exclusiveRecommendation = STD_ANON_35._CF_enumeration.addEnumeration(unicode_value=u'exclusiveRecommendation', tag=u'exclusiveRecommendation')
STD_ANON_35.ruleAssociation = STD_ANON_35._CF_enumeration.addEnumeration(unicode_value=u'ruleAssociation', tag=u'ruleAssociation')
STD_ANON_35._InitializeFacetMap(STD_ANON_35._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_36 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2891, 8)
    _Documentation = None
STD_ANON_36._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_36, enum_prefix=None)
STD_ANON_36.confidence = STD_ANON_36._CF_enumeration.addEnumeration(unicode_value=u'confidence', tag=u'confidence')
STD_ANON_36.support = STD_ANON_36._CF_enumeration.addEnumeration(unicode_value=u'support', tag=u'support')
STD_ANON_36.lift = STD_ANON_36._CF_enumeration.addEnumeration(unicode_value=u'lift', tag=u'lift')
STD_ANON_36.leverage = STD_ANON_36._CF_enumeration.addEnumeration(unicode_value=u'leverage', tag=u'leverage')
STD_ANON_36.affinity = STD_ANON_36._CF_enumeration.addEnumeration(unicode_value=u'affinity', tag=u'affinity')
STD_ANON_36._InitializeFacetMap(STD_ANON_36._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_37 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2902, 8)
    _Documentation = None
STD_ANON_37._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_37, enum_prefix=None)
STD_ANON_37.descending = STD_ANON_37._CF_enumeration.addEnumeration(unicode_value=u'descending', tag=u'descending')
STD_ANON_37.ascending = STD_ANON_37._CF_enumeration.addEnumeration(unicode_value=u'ascending', tag=u'ascending')
STD_ANON_37._InitializeFacetMap(STD_ANON_37._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}RESULT-FEATURE
class RESULT_FEATURE (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'RESULT-FEATURE')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2913, 2)
    _Documentation = None
RESULT_FEATURE._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=RESULT_FEATURE, enum_prefix=None)
RESULT_FEATURE.predictedValue = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'predictedValue', tag=u'predictedValue')
RESULT_FEATURE.predictedDisplayValue = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'predictedDisplayValue', tag=u'predictedDisplayValue')
RESULT_FEATURE.transformedValue = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'transformedValue', tag=u'transformedValue')
RESULT_FEATURE.decision = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'decision', tag=u'decision')
RESULT_FEATURE.probability = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'probability', tag=u'probability')
RESULT_FEATURE.affinity = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'affinity', tag=u'affinity')
RESULT_FEATURE.residual = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'residual', tag=u'residual')
RESULT_FEATURE.standardError = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'standardError', tag=u'standardError')
RESULT_FEATURE.clusterId = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'clusterId', tag=u'clusterId')
RESULT_FEATURE.clusterAffinity = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'clusterAffinity', tag=u'clusterAffinity')
RESULT_FEATURE.entityId = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'entityId', tag=u'entityId')
RESULT_FEATURE.entityAffinity = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'entityAffinity', tag=u'entityAffinity')
RESULT_FEATURE.warning = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'warning', tag=u'warning')
RESULT_FEATURE.ruleValue = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'ruleValue', tag=u'ruleValue')
RESULT_FEATURE.reasonCode = RESULT_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'reasonCode', tag=u'reasonCode')
RESULT_FEATURE._InitializeFacetMap(RESULT_FEATURE._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'RESULT-FEATURE', RESULT_FEATURE)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}RULE-FEATURE
class RULE_FEATURE (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'RULE-FEATURE')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2952, 2)
    _Documentation = None
RULE_FEATURE._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=RULE_FEATURE, enum_prefix=None)
RULE_FEATURE.antecedent = RULE_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'antecedent', tag=u'antecedent')
RULE_FEATURE.consequent = RULE_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'consequent', tag=u'consequent')
RULE_FEATURE.rule = RULE_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'rule', tag=u'rule')
RULE_FEATURE.ruleId = RULE_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'ruleId', tag=u'ruleId')
RULE_FEATURE.confidence = RULE_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'confidence', tag=u'confidence')
RULE_FEATURE.support = RULE_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'support', tag=u'support')
RULE_FEATURE.lift = RULE_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'lift', tag=u'lift')
RULE_FEATURE.leverage = RULE_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'leverage', tag=u'leverage')
RULE_FEATURE.affinity = RULE_FEATURE._CF_enumeration.addEnumeration(unicode_value=u'affinity', tag=u'affinity')
RULE_FEATURE._InitializeFacetMap(RULE_FEATURE._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'RULE-FEATURE', RULE_FEATURE)

# Atomic simple type: [anonymous]
class STD_ANON_38 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2987, 8)
    _Documentation = None
STD_ANON_38._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_38, enum_prefix=None)
STD_ANON_38.no = STD_ANON_38._CF_enumeration.addEnumeration(unicode_value=u'no', tag=u'no')
STD_ANON_38.yes = STD_ANON_38._CF_enumeration.addEnumeration(unicode_value=u'yes', tag=u'yes')
STD_ANON_38._InitializeFacetMap(STD_ANON_38._CF_enumeration)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}BASELINE-TEST-STATISTIC
class BASELINE_TEST_STATISTIC (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'BASELINE-TEST-STATISTIC')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3057, 2)
    _Documentation = None
BASELINE_TEST_STATISTIC._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=BASELINE_TEST_STATISTIC, enum_prefix=None)
BASELINE_TEST_STATISTIC.zValue = BASELINE_TEST_STATISTIC._CF_enumeration.addEnumeration(unicode_value=u'zValue', tag=u'zValue')
BASELINE_TEST_STATISTIC.chiSquareIndependence = BASELINE_TEST_STATISTIC._CF_enumeration.addEnumeration(unicode_value=u'chiSquareIndependence', tag=u'chiSquareIndependence')
BASELINE_TEST_STATISTIC.chiSquareDistribution = BASELINE_TEST_STATISTIC._CF_enumeration.addEnumeration(unicode_value=u'chiSquareDistribution', tag=u'chiSquareDistribution')
BASELINE_TEST_STATISTIC.CUSUM = BASELINE_TEST_STATISTIC._CF_enumeration.addEnumeration(unicode_value=u'CUSUM', tag=u'CUSUM')
BASELINE_TEST_STATISTIC.scalarProduct = BASELINE_TEST_STATISTIC._CF_enumeration.addEnumeration(unicode_value=u'scalarProduct', tag=u'scalarProduct')
BASELINE_TEST_STATISTIC._InitializeFacetMap(BASELINE_TEST_STATISTIC._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'BASELINE-TEST-STATISTIC', BASELINE_TEST_STATISTIC)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}ACTIVATION-FUNCTION
class ACTIVATION_FUNCTION (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'ACTIVATION-FUNCTION')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3229, 2)
    _Documentation = None
ACTIVATION_FUNCTION._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=ACTIVATION_FUNCTION, enum_prefix=None)
ACTIVATION_FUNCTION.threshold = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'threshold', tag=u'threshold')
ACTIVATION_FUNCTION.logistic = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'logistic', tag=u'logistic')
ACTIVATION_FUNCTION.tanh = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'tanh', tag=u'tanh')
ACTIVATION_FUNCTION.identity = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'identity', tag=u'identity')
ACTIVATION_FUNCTION.exponential = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'exponential', tag=u'exponential')
ACTIVATION_FUNCTION.reciprocal = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'reciprocal', tag=u'reciprocal')
ACTIVATION_FUNCTION.square = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'square', tag=u'square')
ACTIVATION_FUNCTION.Gauss = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'Gauss', tag=u'Gauss')
ACTIVATION_FUNCTION.sine = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'sine', tag=u'sine')
ACTIVATION_FUNCTION.cosine = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'cosine', tag=u'cosine')
ACTIVATION_FUNCTION.Elliott = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'Elliott', tag=u'Elliott')
ACTIVATION_FUNCTION.arctan = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'arctan', tag=u'arctan')
ACTIVATION_FUNCTION.radialBasis = ACTIVATION_FUNCTION._CF_enumeration.addEnumeration(unicode_value=u'radialBasis', tag=u'radialBasis')
ACTIVATION_FUNCTION._InitializeFacetMap(ACTIVATION_FUNCTION._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'ACTIVATION-FUNCTION', ACTIVATION_FUNCTION)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}NN-NORMALIZATION-METHOD
class NN_NORMALIZATION_METHOD (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'NN-NORMALIZATION-METHOD')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3246, 2)
    _Documentation = None
NN_NORMALIZATION_METHOD._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=NN_NORMALIZATION_METHOD, enum_prefix=None)
NN_NORMALIZATION_METHOD.none = NN_NORMALIZATION_METHOD._CF_enumeration.addEnumeration(unicode_value=u'none', tag=u'none')
NN_NORMALIZATION_METHOD.simplemax = NN_NORMALIZATION_METHOD._CF_enumeration.addEnumeration(unicode_value=u'simplemax', tag=u'simplemax')
NN_NORMALIZATION_METHOD.softmax = NN_NORMALIZATION_METHOD._CF_enumeration.addEnumeration(unicode_value=u'softmax', tag=u'softmax')
NN_NORMALIZATION_METHOD._InitializeFacetMap(NN_NORMALIZATION_METHOD._CF_enumeration)
Namespace.addCategoryObject('typeBinding', u'NN-NORMALIZATION-METHOD', NN_NORMALIZATION_METHOD)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}NN-NEURON-ID
class NN_NEURON_ID (pyxb.binding.datatypes.string):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'NN-NEURON-ID')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3253, 2)
    _Documentation = None
NN_NEURON_ID._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'NN-NEURON-ID', NN_NEURON_ID)

# Atomic simple type: {http://www.dmg.org/PMML-4_1}NN-NEURON-IDREF
class NN_NEURON_IDREF (pyxb.binding.datatypes.string):

    """An atomic simple type."""

    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'NN-NEURON-IDREF')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3256, 2)
    _Documentation = None
NN_NEURON_IDREF._InitializeFacetMap()
Namespace.addCategoryObject('typeBinding', u'NN-NEURON-IDREF', NN_NEURON_IDREF)

# Atomic simple type: [anonymous]
class STD_ANON_39 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3318, 8)
    _Documentation = None
STD_ANON_39._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_39, enum_prefix=None)
STD_ANON_39.pointsAbove = STD_ANON_39._CF_enumeration.addEnumeration(unicode_value=u'pointsAbove', tag=u'pointsAbove')
STD_ANON_39.pointsBelow = STD_ANON_39._CF_enumeration.addEnumeration(unicode_value=u'pointsBelow', tag=u'pointsBelow')
STD_ANON_39._InitializeFacetMap(STD_ANON_39._CF_enumeration)

# Atomic simple type: [anonymous]
class STD_ANON_40 (pyxb.binding.datatypes.string, pyxb.binding.basis.enumeration_mixin):

    """An atomic simple type."""

    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3327, 8)
    _Documentation = None
STD_ANON_40._CF_enumeration = pyxb.binding.facets.CF_enumeration(value_datatype=STD_ANON_40, enum_prefix=None)
STD_ANON_40.max = STD_ANON_40._CF_enumeration.addEnumeration(unicode_value=u'max', tag=u'max')
STD_ANON_40.min = STD_ANON_40._CF_enumeration.addEnumeration(unicode_value=u'min', tag=u'min')
STD_ANON_40.mean = STD_ANON_40._CF_enumeration.addEnumeration(unicode_value=u'mean', tag=u'mean')
STD_ANON_40.neutral = STD_ANON_40._CF_enumeration.addEnumeration(unicode_value=u'neutral', tag=u'neutral')
STD_ANON_40.other = STD_ANON_40._CF_enumeration.addEnumeration(unicode_value=u'other', tag=u'other')
STD_ANON_40._InitializeFacetMap(STD_ANON_40._CF_enumeration)

# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 34, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_ (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 42, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}KohonenMap uses Python identifier KohonenMap
    __KohonenMap = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'KohonenMap'), 'KohonenMap', '__httpwww_dmg_orgPMML_4_1_CTD_ANON__httpwww_dmg_orgPMML_4_1KohonenMap', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 55, 2), )

    
    KohonenMap = property(__KohonenMap.value, __KohonenMap.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Covariances uses Python identifier Covariances
    __Covariances = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Covariances'), 'Covariances', '__httpwww_dmg_orgPMML_4_1_CTD_ANON__httpwww_dmg_orgPMML_4_1Covariances', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 65, 2), )

    
    Covariances = property(__Covariances.value, __Covariances.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON__httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON__httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Partition uses Python identifier Partition
    __Partition = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Partition'), 'Partition', '__httpwww_dmg_orgPMML_4_1_CTD_ANON__httpwww_dmg_orgPMML_4_1Partition', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2424, 2), )

    
    Partition = property(__Partition.value, __Partition.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON__id', pyxb.binding.datatypes.string)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 50, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 50, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON__name', pyxb.binding.datatypes.string)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 51, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 51, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute size uses Python identifier size
    __size = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'size'), 'size', '__httpwww_dmg_orgPMML_4_1_CTD_ANON__size', pyxb.binding.datatypes.nonNegativeInteger)
    __size._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 52, 6)
    __size._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 52, 6)
    
    size = property(__size.value, __size.set, None, None)

    _ElementMap.update({
        __KohonenMap.name() : __KohonenMap,
        __Covariances.name() : __Covariances,
        __Extension.name() : __Extension,
        __Array.name() : __Array,
        __Partition.name() : __Partition
    })
    _AttributeMap.update({
        __id.name() : __id,
        __name.name() : __name,
        __size.name() : __size
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_2 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 56, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_2_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute coord1 uses Python identifier coord1
    __coord1 = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'coord1'), 'coord1', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_2_coord1', pyxb.binding.datatypes.float)
    __coord1._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 60, 6)
    __coord1._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 60, 6)
    
    coord1 = property(__coord1.value, __coord1.set, None, None)

    
    # Attribute coord2 uses Python identifier coord2
    __coord2 = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'coord2'), 'coord2', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_2_coord2', pyxb.binding.datatypes.float)
    __coord2._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 61, 6)
    __coord2._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 61, 6)
    
    coord2 = property(__coord2.value, __coord2.set, None, None)

    
    # Attribute coord3 uses Python identifier coord3
    __coord3 = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'coord3'), 'coord3', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_2_coord3', pyxb.binding.datatypes.float)
    __coord3._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 62, 6)
    __coord3._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 62, 6)
    
    coord3 = property(__coord3.value, __coord3.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __coord1.name() : __coord1,
        __coord2.name() : __coord2,
        __coord3.name() : __coord3
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_3 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 66, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_3_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Matrix uses Python identifier Matrix
    __Matrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), 'Matrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_3_httpwww_dmg_orgPMML_4_1Matrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2), )

    
    Matrix = property(__Matrix.value, __Matrix.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Matrix.name() : __Matrix
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_4 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 94, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_4_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Matrix uses Python identifier Matrix
    __Matrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), 'Matrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_4_httpwww_dmg_orgPMML_4_1Matrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2), )

    
    Matrix = property(__Matrix.value, __Matrix.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Matrix.name() : __Matrix
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_5 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 140, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_5_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_6 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 147, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_6_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_7 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 154, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_7_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_8 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 161, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_8_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_9 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 176, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_9_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_10 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 183, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_10_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_11 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 190, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_11_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_12 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 223, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}VerificationField uses Python identifier VerificationField
    __VerificationField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'VerificationField'), 'VerificationField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_12_httpwww_dmg_orgPMML_4_1VerificationField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 230, 2), )

    
    VerificationField = property(__VerificationField.value, __VerificationField.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_12_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __VerificationField.name() : __VerificationField,
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_13 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 231, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_13_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_13_field', pyxb.binding.datatypes.string, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 235, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 235, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute column uses Python identifier column
    __column = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'column'), 'column', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_13_column', pyxb.binding.datatypes.string)
    __column._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 236, 6)
    __column._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 236, 6)
    
    column = property(__column.value, __column.set, None, None)

    
    # Attribute precision uses Python identifier precision
    __precision = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'precision'), 'precision', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_13_precision', pyxb.binding.datatypes.double, unicode_default=u'1E-6')
    __precision._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 237, 6)
    __precision._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 237, 6)
    
    precision = property(__precision.value, __precision.set, None, None)

    
    # Attribute zeroThreshold uses Python identifier zeroThreshold
    __zeroThreshold = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'zeroThreshold'), 'zeroThreshold', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_13_zeroThreshold', pyxb.binding.datatypes.double, unicode_default=u'1E-16')
    __zeroThreshold._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 238, 6)
    __zeroThreshold._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 238, 6)
    
    zeroThreshold = property(__zeroThreshold.value, __zeroThreshold.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __column.name() : __column,
        __precision.name() : __precision,
        __zeroThreshold.name() : __zeroThreshold
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_14 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 272, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}MiningField uses Python identifier MiningField
    __MiningField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningField'), 'MiningField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_14_httpwww_dmg_orgPMML_4_1MiningField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 279, 2), )

    
    MiningField = property(__MiningField.value, __MiningField.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_14_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __MiningField.name() : __MiningField,
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_15 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 494, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Time uses Python identifier Time
    __Time = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Time'), 'Time', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_15_httpwww_dmg_orgPMML_4_1Time', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 415, 2), )

    
    Time = property(__Time.value, __Time.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SequenceReference uses Python identifier SequenceReference
    __SequenceReference = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SequenceReference'), 'SequenceReference', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_15_httpwww_dmg_orgPMML_4_1SequenceReference', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 485, 2), )

    
    SequenceReference = property(__SequenceReference.value, __SequenceReference.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_15_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Time.name() : __Time,
        __SequenceReference.name() : __SequenceReference,
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_16 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 501, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Time uses Python identifier Time
    __Time = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Time'), 'Time', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_16_httpwww_dmg_orgPMML_4_1Time', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 415, 2), )

    
    Time = property(__Time.value, __Time.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SequenceReference uses Python identifier SequenceReference
    __SequenceReference = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SequenceReference'), 'SequenceReference', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_16_httpwww_dmg_orgPMML_4_1SequenceReference', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 485, 2), )

    
    SequenceReference = property(__SequenceReference.value, __SequenceReference.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_16_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Time.name() : __Time,
        __SequenceReference.name() : __SequenceReference,
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_17 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 508, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ClusteringModel uses Python identifier ClusteringModel
    __ClusteringModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModel'), 'ClusteringModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1ClusteringModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2, 2), )

    
    ClusteringModel = property(__ClusteringModel.value, __ClusteringModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SequenceModel uses Python identifier SequenceModel
    __SequenceModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SequenceModel'), 'SequenceModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1SequenceModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 330, 2), )

    
    SequenceModel = property(__SequenceModel.value, __SequenceModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningBuildTask uses Python identifier MiningBuildTask
    __MiningBuildTask = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningBuildTask'), 'MiningBuildTask', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1MiningBuildTask', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 542, 2), )

    
    MiningBuildTask = property(__MiningBuildTask.value, __MiningBuildTask.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}AssociationModel uses Python identifier AssociationModel
    __AssociationModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'AssociationModel'), 'AssociationModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1AssociationModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 691, 2), )

    
    AssociationModel = property(__AssociationModel.value, __AssociationModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Header uses Python identifier Header
    __Header = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Header'), 'Header', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1Header', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 765, 2), )

    
    Header = property(__Header.value, __Header.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NearestNeighborModel uses Python identifier NearestNeighborModel
    __NearestNeighborModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NearestNeighborModel'), 'NearestNeighborModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1NearestNeighborModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 800, 2), )

    
    NearestNeighborModel = property(__NearestNeighborModel.value, __NearestNeighborModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RegressionModel uses Python identifier RegressionModel
    __RegressionModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RegressionModel'), 'RegressionModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1RegressionModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 890, 2), )

    
    RegressionModel = property(__RegressionModel.value, __RegressionModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TransformationDictionary uses Python identifier TransformationDictionary
    __TransformationDictionary = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TransformationDictionary'), 'TransformationDictionary', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1TransformationDictionary', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 988, 2), )

    
    TransformationDictionary = property(__TransformationDictionary.value, __TransformationDictionary.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TimeSeriesModel uses Python identifier TimeSeriesModel
    __TimeSeriesModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TimeSeriesModel'), 'TimeSeriesModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1TimeSeriesModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1141, 2), )

    
    TimeSeriesModel = property(__TimeSeriesModel.value, __TimeSeriesModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SupportVectorMachineModel uses Python identifier SupportVectorMachineModel
    __SupportVectorMachineModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachineModel'), 'SupportVectorMachineModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1SupportVectorMachineModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1347, 2), )

    
    SupportVectorMachineModel = property(__SupportVectorMachineModel.value, __SupportVectorMachineModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TextModel uses Python identifier TextModel
    __TextModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TextModel'), 'TextModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1TextModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1511, 2), )

    
    TextModel = property(__TextModel.value, __TextModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TreeModel uses Python identifier TreeModel
    __TreeModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TreeModel'), 'TreeModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1TreeModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1624, 2), )

    
    TreeModel = property(__TreeModel.value, __TreeModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningModel uses Python identifier MiningModel
    __MiningModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningModel'), 'MiningModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1MiningModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1785, 2), )

    
    MiningModel = property(__MiningModel.value, __MiningModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NaiveBayesModel uses Python identifier NaiveBayesModel
    __NaiveBayesModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NaiveBayesModel'), 'NaiveBayesModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1NaiveBayesModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1909, 2), )

    
    NaiveBayesModel = property(__NaiveBayesModel.value, __NaiveBayesModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RuleSetModel uses Python identifier RuleSetModel
    __RuleSetModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RuleSetModel'), 'RuleSetModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1RuleSetModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2193, 2), )

    
    RuleSetModel = property(__RuleSetModel.value, __RuleSetModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}GeneralRegressionModel uses Python identifier GeneralRegressionModel
    __GeneralRegressionModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'GeneralRegressionModel'), 'GeneralRegressionModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1GeneralRegressionModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2496, 2), )

    
    GeneralRegressionModel = property(__GeneralRegressionModel.value, __GeneralRegressionModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DataDictionary uses Python identifier DataDictionary
    __DataDictionary = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DataDictionary'), 'DataDictionary', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1DataDictionary', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2756, 2), )

    
    DataDictionary = property(__DataDictionary.value, __DataDictionary.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BaselineModel uses Python identifier BaselineModel
    __BaselineModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BaselineModel'), 'BaselineModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1BaselineModel', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3022, 2), )

    
    BaselineModel = property(__BaselineModel.value, __BaselineModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NeuralNetwork uses Python identifier NeuralNetwork
    __NeuralNetwork = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NeuralNetwork'), 'NeuralNetwork', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1NeuralNetwork', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3169, 2), )

    
    NeuralNetwork = property(__NeuralNetwork.value, __NeuralNetwork.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Scorecard uses Python identifier Scorecard
    __Scorecard = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Scorecard'), 'Scorecard', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_httpwww_dmg_orgPMML_4_1Scorecard', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3298, 2), )

    
    Scorecard = property(__Scorecard.value, __Scorecard.set, None, None)

    
    # Attribute version uses Python identifier version
    __version = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'version'), 'version', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_17_version', pyxb.binding.datatypes.string, required=True)
    __version._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 519, 6)
    __version._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 519, 6)
    
    version = property(__version.value, __version.set, None, None)

    _ElementMap.update({
        __ClusteringModel.name() : __ClusteringModel,
        __SequenceModel.name() : __SequenceModel,
        __MiningBuildTask.name() : __MiningBuildTask,
        __Extension.name() : __Extension,
        __AssociationModel.name() : __AssociationModel,
        __Header.name() : __Header,
        __NearestNeighborModel.name() : __NearestNeighborModel,
        __RegressionModel.name() : __RegressionModel,
        __TransformationDictionary.name() : __TransformationDictionary,
        __TimeSeriesModel.name() : __TimeSeriesModel,
        __SupportVectorMachineModel.name() : __SupportVectorMachineModel,
        __TextModel.name() : __TextModel,
        __TreeModel.name() : __TreeModel,
        __MiningModel.name() : __MiningModel,
        __NaiveBayesModel.name() : __NaiveBayesModel,
        __RuleSetModel.name() : __RuleSetModel,
        __GeneralRegressionModel.name() : __GeneralRegressionModel,
        __DataDictionary.name() : __DataDictionary,
        __BaselineModel.name() : __BaselineModel,
        __NeuralNetwork.name() : __NeuralNetwork,
        __Scorecard.name() : __Scorecard
    })
    _AttributeMap.update({
        __version.name() : __version
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_18 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 543, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_18_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type MIXED
class CTD_ANON_19 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type MIXED"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_MIXED
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 561, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Attribute extender uses Python identifier extender
    __extender = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'extender'), 'extender', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_19_extender', pyxb.binding.datatypes.string)
    __extender._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 567, 10)
    __extender._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 567, 10)
    
    extender = property(__extender.value, __extender.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_19_name', pyxb.binding.datatypes.string)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 568, 10)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 568, 10)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_19_value', pyxb.binding.datatypes.string)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 569, 10)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 569, 10)
    
    value_ = property(__value.value, __value.set, None, None)

    _HasWildcardElement = True
    _ElementMap.update({
        
    })
    _AttributeMap.update({
        __extender.name() : __extender,
        __name.name() : __name,
        __value.name() : __value
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_20 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 743, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_20_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute itemRef uses Python identifier itemRef
    __itemRef = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'itemRef'), 'itemRef', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_20_itemRef', pyxb.binding.datatypes.string, required=True)
    __itemRef._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 747, 6)
    __itemRef._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 747, 6)
    
    itemRef = property(__itemRef.value, __itemRef.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __itemRef.name() : __itemRef
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_21 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 766, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_21_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Application uses Python identifier Application
    __Application = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Application'), 'Application', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_21_httpwww_dmg_orgPMML_4_1Application', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 777, 2), )

    
    Application = property(__Application.value, __Application.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Annotation uses Python identifier Annotation
    __Annotation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Annotation'), 'Annotation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_21_httpwww_dmg_orgPMML_4_1Annotation', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 786, 2), )

    
    Annotation = property(__Annotation.value, __Annotation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Timestamp uses Python identifier Timestamp
    __Timestamp = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Timestamp'), 'Timestamp', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_21_httpwww_dmg_orgPMML_4_1Timestamp', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 793, 2), )

    
    Timestamp = property(__Timestamp.value, __Timestamp.set, None, None)

    
    # Attribute copyright uses Python identifier copyright
    __copyright = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'copyright'), 'copyright', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_21_copyright', pyxb.binding.datatypes.string)
    __copyright._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 773, 6)
    __copyright._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 773, 6)
    
    copyright = property(__copyright.value, __copyright.set, None, None)

    
    # Attribute description uses Python identifier description
    __description = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'description'), 'description', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_21_description', pyxb.binding.datatypes.string)
    __description._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 774, 6)
    __description._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 774, 6)
    
    description = property(__description.value, __description.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Application.name() : __Application,
        __Annotation.name() : __Annotation,
        __Timestamp.name() : __Timestamp
    })
    _AttributeMap.update({
        __copyright.name() : __copyright,
        __description.name() : __description
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_22 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 778, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_22_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_22_name', pyxb.binding.datatypes.string, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 782, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 782, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute version uses Python identifier version
    __version = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'version'), 'version', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_22_version', pyxb.binding.datatypes.string)
    __version._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 783, 6)
    __version._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 783, 6)
    
    version = property(__version.value, __version.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __name.name() : __name,
        __version.name() : __version
    })



# Complex type [anonymous] with content type MIXED
class CTD_ANON_23 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type MIXED"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_MIXED
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 787, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_23_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type MIXED
class CTD_ANON_24 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type MIXED"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_MIXED
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 794, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_24_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_25 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 843, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_25_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}InstanceField uses Python identifier InstanceField
    __InstanceField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'InstanceField'), 'InstanceField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_25_httpwww_dmg_orgPMML_4_1InstanceField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 850, 2), )

    
    InstanceField = property(__InstanceField.value, __InstanceField.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __InstanceField.name() : __InstanceField
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_26 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 851, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_26_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_26_field', pyxb.binding.datatypes.string, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 855, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 855, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute column uses Python identifier column
    __column = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'column'), 'column', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_26_column', pyxb.binding.datatypes.string)
    __column._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 856, 6)
    __column._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 856, 6)
    
    column = property(__column.value, __column.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __column.name() : __column
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_27 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 860, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_27_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}KNNInput uses Python identifier KNNInput
    __KNNInput = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'KNNInput'), 'KNNInput', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_27_httpwww_dmg_orgPMML_4_1KNNInput', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 867, 2), )

    
    KNNInput = property(__KNNInput.value, __KNNInput.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __KNNInput.name() : __KNNInput
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_28 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 989, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}DefineFunction uses Python identifier DefineFunction
    __DefineFunction = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DefineFunction'), 'DefineFunction', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_28_httpwww_dmg_orgPMML_4_1DefineFunction', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 241, 2), )

    
    DefineFunction = property(__DefineFunction.value, __DefineFunction.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_28_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DerivedField uses Python identifier DerivedField
    __DerivedField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), 'DerivedField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_28_httpwww_dmg_orgPMML_4_1DerivedField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2), )

    
    DerivedField = property(__DerivedField.value, __DerivedField.set, None, None)

    _ElementMap.update({
        __DefineFunction.name() : __DefineFunction,
        __Extension.name() : __Extension,
        __DerivedField.name() : __DerivedField
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_29 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 998, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_29_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DerivedField uses Python identifier DerivedField
    __DerivedField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), 'DerivedField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_29_httpwww_dmg_orgPMML_4_1DerivedField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2), )

    
    DerivedField = property(__DerivedField.value, __DerivedField.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __DerivedField.name() : __DerivedField
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_30 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1086, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_30_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Interval uses Python identifier Interval
    __Interval = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Interval'), 'Interval', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_30_httpwww_dmg_orgPMML_4_1Interval', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2836, 2), )

    
    Interval = property(__Interval.value, __Interval.set, None, None)

    
    # Attribute binValue uses Python identifier binValue
    __binValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'binValue'), 'binValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_30_binValue', pyxb.binding.datatypes.string, required=True)
    __binValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1091, 6)
    __binValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1091, 6)
    
    binValue = property(__binValue.value, __binValue.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Interval.name() : __Interval
    })
    _AttributeMap.update({
        __binValue.name() : __binValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_31 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1392, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_31_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute description uses Python identifier description
    __description = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'description'), 'description', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_31_description', pyxb.binding.datatypes.string)
    __description._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1396, 6)
    __description._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1396, 6)
    
    description = property(__description.value, __description.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __description.name() : __description
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_32 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1538, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_32_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_32_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Taxonomy uses Python identifier Taxonomy
    __Taxonomy = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Taxonomy'), 'Taxonomy', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_32_httpwww_dmg_orgPMML_4_1Taxonomy', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2965, 2), )

    
    Taxonomy = property(__Taxonomy.value, __Taxonomy.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array,
        __Taxonomy.name() : __Taxonomy
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_33 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1547, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_33_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TextDocument uses Python identifier TextDocument
    __TextDocument = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TextDocument'), 'TextDocument', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_33_httpwww_dmg_orgPMML_4_1TextDocument', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1554, 2), )

    
    TextDocument = property(__TextDocument.value, __TextDocument.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __TextDocument.name() : __TextDocument
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_34 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1566, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_34_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Matrix uses Python identifier Matrix
    __Matrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), 'Matrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_34_httpwww_dmg_orgPMML_4_1Matrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2), )

    
    Matrix = property(__Matrix.value, __Matrix.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Matrix.name() : __Matrix
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_35 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1745, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_35_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_36 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1752, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_36_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_37 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1932, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_37_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BayesInput uses Python identifier BayesInput
    __BayesInput = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BayesInput'), 'BayesInput', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_37_httpwww_dmg_orgPMML_4_1BayesInput', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1939, 2), )

    
    BayesInput = property(__BayesInput.value, __BayesInput.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __BayesInput.name() : __BayesInput
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_38 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1940, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_38_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DerivedField uses Python identifier DerivedField
    __DerivedField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), 'DerivedField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_38_httpwww_dmg_orgPMML_4_1DerivedField', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2), )

    
    DerivedField = property(__DerivedField.value, __DerivedField.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PairCounts uses Python identifier PairCounts
    __PairCounts = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PairCounts'), 'PairCounts', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_38_httpwww_dmg_orgPMML_4_1PairCounts', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1958, 2), )

    
    PairCounts = property(__PairCounts.value, __PairCounts.set, None, None)

    
    # Attribute fieldName uses Python identifier fieldName
    __fieldName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'fieldName'), 'fieldName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_38_fieldName', pyxb.binding.datatypes.string, required=True)
    __fieldName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1946, 6)
    __fieldName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1946, 6)
    
    fieldName = property(__fieldName.value, __fieldName.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __DerivedField.name() : __DerivedField,
        __PairCounts.name() : __PairCounts
    })
    _AttributeMap.update({
        __fieldName.name() : __fieldName
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_39 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1950, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_39_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TargetValueCounts uses Python identifier TargetValueCounts
    __TargetValueCounts = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCounts'), 'TargetValueCounts', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_39_httpwww_dmg_orgPMML_4_1TargetValueCounts', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1967, 2), )

    
    TargetValueCounts = property(__TargetValueCounts.value, __TargetValueCounts.set, None, None)

    
    # Attribute fieldName uses Python identifier fieldName
    __fieldName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'fieldName'), 'fieldName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_39_fieldName', pyxb.binding.datatypes.string, required=True)
    __fieldName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1955, 6)
    __fieldName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1955, 6)
    
    fieldName = property(__fieldName.value, __fieldName.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __TargetValueCounts.name() : __TargetValueCounts
    })
    _AttributeMap.update({
        __fieldName.name() : __fieldName
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_40 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1959, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_40_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TargetValueCounts uses Python identifier TargetValueCounts
    __TargetValueCounts = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCounts'), 'TargetValueCounts', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_40_httpwww_dmg_orgPMML_4_1TargetValueCounts', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1967, 2), )

    
    TargetValueCounts = property(__TargetValueCounts.value, __TargetValueCounts.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_40_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1964, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1964, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __TargetValueCounts.name() : __TargetValueCounts
    })
    _AttributeMap.update({
        __value.name() : __value
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_41 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1968, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_41_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TargetValueCount uses Python identifier TargetValueCount
    __TargetValueCount = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCount'), 'TargetValueCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_41_httpwww_dmg_orgPMML_4_1TargetValueCount', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1975, 2), )

    
    TargetValueCount = property(__TargetValueCount.value, __TargetValueCount.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __TargetValueCount.name() : __TargetValueCount
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_42 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1985, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_42_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PredictiveModelQuality uses Python identifier PredictiveModelQuality
    __PredictiveModelQuality = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PredictiveModelQuality'), 'PredictiveModelQuality', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_42_httpwww_dmg_orgPMML_4_1PredictiveModelQuality', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1996, 2), )

    
    PredictiveModelQuality = property(__PredictiveModelQuality.value, __PredictiveModelQuality.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ClusteringModelQuality uses Python identifier ClusteringModelQuality
    __ClusteringModelQuality = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModelQuality'), 'ClusteringModelQuality', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_42_httpwww_dmg_orgPMML_4_1ClusteringModelQuality', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2033, 2), )

    
    ClusteringModelQuality = property(__ClusteringModelQuality.value, __ClusteringModelQuality.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Correlations uses Python identifier Correlations
    __Correlations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Correlations'), 'Correlations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_42_httpwww_dmg_orgPMML_4_1Correlations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2159, 2), )

    
    Correlations = property(__Correlations.value, __Correlations.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __PredictiveModelQuality.name() : __PredictiveModelQuality,
        __ClusteringModelQuality.name() : __ClusteringModelQuality,
        __Correlations.name() : __Correlations
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_43 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2054, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_43_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LiftGraph uses Python identifier LiftGraph
    __LiftGraph = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph'), 'LiftGraph', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_43_httpwww_dmg_orgPMML_4_1LiftGraph', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2077, 2), )

    
    LiftGraph = property(__LiftGraph.value, __LiftGraph.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __LiftGraph.name() : __LiftGraph
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_44 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2062, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_44_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LiftGraph uses Python identifier LiftGraph
    __LiftGraph = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph'), 'LiftGraph', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_44_httpwww_dmg_orgPMML_4_1LiftGraph', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2077, 2), )

    
    LiftGraph = property(__LiftGraph.value, __LiftGraph.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __LiftGraph.name() : __LiftGraph
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_45 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2070, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_45_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LiftGraph uses Python identifier LiftGraph
    __LiftGraph = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph'), 'LiftGraph', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_45_httpwww_dmg_orgPMML_4_1LiftGraph', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2077, 2), )

    
    LiftGraph = property(__LiftGraph.value, __LiftGraph.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __LiftGraph.name() : __LiftGraph
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_46 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2078, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_46_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}XCoordinates uses Python identifier XCoordinates
    __XCoordinates = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'XCoordinates'), 'XCoordinates', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_46_httpwww_dmg_orgPMML_4_1XCoordinates', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2088, 2), )

    
    XCoordinates = property(__XCoordinates.value, __XCoordinates.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}YCoordinates uses Python identifier YCoordinates
    __YCoordinates = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'YCoordinates'), 'YCoordinates', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_46_httpwww_dmg_orgPMML_4_1YCoordinates', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2096, 2), )

    
    YCoordinates = property(__YCoordinates.value, __YCoordinates.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BoundaryValues uses Python identifier BoundaryValues
    __BoundaryValues = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValues'), 'BoundaryValues', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_46_httpwww_dmg_orgPMML_4_1BoundaryValues', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2104, 2), )

    
    BoundaryValues = property(__BoundaryValues.value, __BoundaryValues.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BoundaryValueMeans uses Python identifier BoundaryValueMeans
    __BoundaryValueMeans = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValueMeans'), 'BoundaryValueMeans', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_46_httpwww_dmg_orgPMML_4_1BoundaryValueMeans', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2112, 2), )

    
    BoundaryValueMeans = property(__BoundaryValueMeans.value, __BoundaryValueMeans.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __XCoordinates.name() : __XCoordinates,
        __YCoordinates.name() : __YCoordinates,
        __BoundaryValues.name() : __BoundaryValues,
        __BoundaryValueMeans.name() : __BoundaryValueMeans
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_47 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2089, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_47_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_47_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_48 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2097, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_48_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_48_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_49 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2105, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_49_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_49_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_50 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2113, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_50_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_50_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_51 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2121, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_51_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ROCGraph uses Python identifier ROCGraph
    __ROCGraph = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ROCGraph'), 'ROCGraph', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_51_httpwww_dmg_orgPMML_4_1ROCGraph', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2132, 2), )

    
    ROCGraph = property(__ROCGraph.value, __ROCGraph.set, None, None)

    
    # Attribute positiveTargetFieldValue uses Python identifier positiveTargetFieldValue
    __positiveTargetFieldValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'positiveTargetFieldValue'), 'positiveTargetFieldValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_51_positiveTargetFieldValue', pyxb.binding.datatypes.string, required=True)
    __positiveTargetFieldValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2126, 6)
    __positiveTargetFieldValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2126, 6)
    
    positiveTargetFieldValue = property(__positiveTargetFieldValue.value, __positiveTargetFieldValue.set, None, None)

    
    # Attribute positiveTargetFieldDisplayValue uses Python identifier positiveTargetFieldDisplayValue
    __positiveTargetFieldDisplayValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'positiveTargetFieldDisplayValue'), 'positiveTargetFieldDisplayValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_51_positiveTargetFieldDisplayValue', pyxb.binding.datatypes.string)
    __positiveTargetFieldDisplayValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2127, 6)
    __positiveTargetFieldDisplayValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2127, 6)
    
    positiveTargetFieldDisplayValue = property(__positiveTargetFieldDisplayValue.value, __positiveTargetFieldDisplayValue.set, None, None)

    
    # Attribute negativeTargetFieldValue uses Python identifier negativeTargetFieldValue
    __negativeTargetFieldValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'negativeTargetFieldValue'), 'negativeTargetFieldValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_51_negativeTargetFieldValue', pyxb.binding.datatypes.string)
    __negativeTargetFieldValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2128, 6)
    __negativeTargetFieldValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2128, 6)
    
    negativeTargetFieldValue = property(__negativeTargetFieldValue.value, __negativeTargetFieldValue.set, None, None)

    
    # Attribute negativeTargetFieldDisplayValue uses Python identifier negativeTargetFieldDisplayValue
    __negativeTargetFieldDisplayValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'negativeTargetFieldDisplayValue'), 'negativeTargetFieldDisplayValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_51_negativeTargetFieldDisplayValue', pyxb.binding.datatypes.string)
    __negativeTargetFieldDisplayValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2129, 6)
    __negativeTargetFieldDisplayValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2129, 6)
    
    negativeTargetFieldDisplayValue = property(__negativeTargetFieldDisplayValue.value, __negativeTargetFieldDisplayValue.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __ROCGraph.name() : __ROCGraph
    })
    _AttributeMap.update({
        __positiveTargetFieldValue.name() : __positiveTargetFieldValue,
        __positiveTargetFieldDisplayValue.name() : __positiveTargetFieldDisplayValue,
        __negativeTargetFieldValue.name() : __negativeTargetFieldValue,
        __negativeTargetFieldDisplayValue.name() : __negativeTargetFieldDisplayValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_52 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2133, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_52_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}XCoordinates uses Python identifier XCoordinates
    __XCoordinates = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'XCoordinates'), 'XCoordinates', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_52_httpwww_dmg_orgPMML_4_1XCoordinates', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2088, 2), )

    
    XCoordinates = property(__XCoordinates.value, __XCoordinates.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}YCoordinates uses Python identifier YCoordinates
    __YCoordinates = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'YCoordinates'), 'YCoordinates', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_52_httpwww_dmg_orgPMML_4_1YCoordinates', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2096, 2), )

    
    YCoordinates = property(__YCoordinates.value, __YCoordinates.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BoundaryValues uses Python identifier BoundaryValues
    __BoundaryValues = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValues'), 'BoundaryValues', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_52_httpwww_dmg_orgPMML_4_1BoundaryValues', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2104, 2), )

    
    BoundaryValues = property(__BoundaryValues.value, __BoundaryValues.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __XCoordinates.name() : __XCoordinates,
        __YCoordinates.name() : __YCoordinates,
        __BoundaryValues.name() : __BoundaryValues
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_53 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2143, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_53_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Matrix uses Python identifier Matrix
    __Matrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), 'Matrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_53_httpwww_dmg_orgPMML_4_1Matrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2), )

    
    Matrix = property(__Matrix.value, __Matrix.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ClassLabels uses Python identifier ClassLabels
    __ClassLabels = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ClassLabels'), 'ClassLabels', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_53_httpwww_dmg_orgPMML_4_1ClassLabels', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2151, 2), )

    
    ClassLabels = property(__ClassLabels.value, __ClassLabels.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Matrix.name() : __Matrix,
        __ClassLabels.name() : __ClassLabels
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_54 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2152, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_54_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_54_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_55 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2160, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_55_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CorrelationFields uses Python identifier CorrelationFields
    __CorrelationFields = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CorrelationFields'), 'CorrelationFields', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_55_httpwww_dmg_orgPMML_4_1CorrelationFields', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2169, 2), )

    
    CorrelationFields = property(__CorrelationFields.value, __CorrelationFields.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CorrelationValues uses Python identifier CorrelationValues
    __CorrelationValues = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CorrelationValues'), 'CorrelationValues', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_55_httpwww_dmg_orgPMML_4_1CorrelationValues', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2177, 2), )

    
    CorrelationValues = property(__CorrelationValues.value, __CorrelationValues.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CorrelationMethods uses Python identifier CorrelationMethods
    __CorrelationMethods = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CorrelationMethods'), 'CorrelationMethods', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_55_httpwww_dmg_orgPMML_4_1CorrelationMethods', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2185, 2), )

    
    CorrelationMethods = property(__CorrelationMethods.value, __CorrelationMethods.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __CorrelationFields.name() : __CorrelationFields,
        __CorrelationValues.name() : __CorrelationValues,
        __CorrelationMethods.name() : __CorrelationMethods
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_56 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2170, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_56_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_56_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_57 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2178, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_57_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Matrix uses Python identifier Matrix
    __Matrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), 'Matrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_57_httpwww_dmg_orgPMML_4_1Matrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2), )

    
    Matrix = property(__Matrix.value, __Matrix.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Matrix.name() : __Matrix
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_58 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2186, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_58_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Matrix uses Python identifier Matrix
    __Matrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), 'Matrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_58_httpwww_dmg_orgPMML_4_1Matrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2), )

    
    Matrix = property(__Matrix.value, __Matrix.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Matrix.name() : __Matrix
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_59 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2265, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_59_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimplePredicate uses Python identifier SimplePredicate
    __SimplePredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), 'SimplePredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_59_httpwww_dmg_orgPMML_4_1SimplePredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2), )

    
    SimplePredicate = property(__SimplePredicate.value, __SimplePredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CompoundPredicate uses Python identifier CompoundPredicate
    __CompoundPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), 'CompoundPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_59_httpwww_dmg_orgPMML_4_1CompoundPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2), )

    
    CompoundPredicate = property(__CompoundPredicate.value, __CompoundPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimpleSetPredicate uses Python identifier SimpleSetPredicate
    __SimpleSetPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), 'SimpleSetPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_59_httpwww_dmg_orgPMML_4_1SimpleSetPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2), )

    
    SimpleSetPredicate = property(__SimpleSetPredicate.value, __SimpleSetPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}True uses Python identifier True_
    __True = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'True'), 'True_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_59_httpwww_dmg_orgPMML_4_1True', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2), )

    
    True_ = property(__True.value, __True.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}False uses Python identifier False_
    __False = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'False'), 'False_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_59_httpwww_dmg_orgPMML_4_1False', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2), )

    
    False_ = property(__False.value, __False.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimpleRule uses Python identifier SimpleRule
    __SimpleRule = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimpleRule'), 'SimpleRule', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_59_httpwww_dmg_orgPMML_4_1SimpleRule', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2249, 2), )

    
    SimpleRule = property(__SimpleRule.value, __SimpleRule.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CompoundRule uses Python identifier CompoundRule
    __CompoundRule = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CompoundRule'), 'CompoundRule', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_59_httpwww_dmg_orgPMML_4_1CompoundRule', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2264, 2), )

    
    CompoundRule = property(__CompoundRule.value, __CompoundRule.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __SimplePredicate.name() : __SimplePredicate,
        __CompoundPredicate.name() : __CompoundPredicate,
        __SimpleSetPredicate.name() : __SimpleSetPredicate,
        __True.name() : __True,
        __False.name() : __False,
        __SimpleRule.name() : __SimpleRule,
        __CompoundRule.name() : __CompoundRule
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_60 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2274, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_60_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}UnivariateStats uses Python identifier UnivariateStats
    __UnivariateStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'UnivariateStats'), 'UnivariateStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_60_httpwww_dmg_orgPMML_4_1UnivariateStats', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2282, 2), )

    
    UnivariateStats = property(__UnivariateStats.value, __UnivariateStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MultivariateStats uses Python identifier MultivariateStats
    __MultivariateStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MultivariateStats'), 'MultivariateStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_60_httpwww_dmg_orgPMML_4_1MultivariateStats', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2362, 2), )

    
    MultivariateStats = property(__MultivariateStats.value, __MultivariateStats.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __UnivariateStats.name() : __UnivariateStats,
        __MultivariateStats.name() : __MultivariateStats
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_61 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2338, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_61_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_61_httpwww_dmg_orgPMML_4_1Array', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Attribute modalValue uses Python identifier modalValue
    __modalValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modalValue'), 'modalValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_61_modalValue', pyxb.binding.datatypes.string)
    __modalValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2343, 6)
    __modalValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2343, 6)
    
    modalValue = property(__modalValue.value, __modalValue.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        __modalValue.name() : __modalValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_62 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2363, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_62_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MultivariateStat uses Python identifier MultivariateStat
    __MultivariateStat = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MultivariateStat'), 'MultivariateStat', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_62_httpwww_dmg_orgPMML_4_1MultivariateStat', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2371, 2), )

    
    MultivariateStat = property(__MultivariateStat.value, __MultivariateStat.set, None, None)

    
    # Attribute targetCategory uses Python identifier targetCategory
    __targetCategory = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetCategory'), 'targetCategory', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_62_targetCategory', pyxb.binding.datatypes.string)
    __targetCategory._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2368, 6)
    __targetCategory._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2368, 6)
    
    targetCategory = property(__targetCategory.value, __targetCategory.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __MultivariateStat.name() : __MultivariateStat
    })
    _AttributeMap.update({
        __targetCategory.name() : __targetCategory
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_63 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2454, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_63_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Target uses Python identifier Target
    __Target = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Target'), 'Target', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_63_httpwww_dmg_orgPMML_4_1Target', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2461, 2), )

    
    Target = property(__Target.value, __Target.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Target.name() : __Target
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_64 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2565, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_64_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Parameter uses Python identifier Parameter
    __Parameter = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Parameter'), 'Parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_64_httpwww_dmg_orgPMML_4_1Parameter', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2572, 2), )

    
    Parameter = property(__Parameter.value, __Parameter.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Parameter.name() : __Parameter
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_65 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2583, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_65_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Predictor uses Python identifier Predictor
    __Predictor = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Predictor'), 'Predictor', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_65_httpwww_dmg_orgPMML_4_1Predictor', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2598, 2), )

    
    Predictor = property(__Predictor.value, __Predictor.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Predictor.name() : __Predictor
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_66 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2591, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_66_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Predictor uses Python identifier Predictor
    __Predictor = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Predictor'), 'Predictor', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_66_httpwww_dmg_orgPMML_4_1Predictor', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2598, 2), )

    
    Predictor = property(__Predictor.value, __Predictor.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Predictor.name() : __Predictor
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_67 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2610, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_67_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Category uses Python identifier Category
    __Category = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Category'), 'Category', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_67_httpwww_dmg_orgPMML_4_1Category', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2617, 2), )

    
    Category = property(__Category.value, __Category.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Category.name() : __Category
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_68 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2618, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_68_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_68_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2622, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2622, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __value.name() : __value
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_69 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2626, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_69_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PPCell uses Python identifier PPCell
    __PPCell = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PPCell'), 'PPCell', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_69_httpwww_dmg_orgPMML_4_1PPCell', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2633, 2), )

    
    PPCell = property(__PPCell.value, __PPCell.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __PPCell.name() : __PPCell
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_70 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2674, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_70_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PCell uses Python identifier PCell
    __PCell = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PCell'), 'PCell', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_70_httpwww_dmg_orgPMML_4_1PCell', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2681, 2), )

    
    PCell = property(__PCell.value, __PCell.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __PCell.name() : __PCell
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_71 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2725, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_71_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Value uses Python identifier Value
    __Value = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Value'), 'Value', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_71_httpwww_dmg_orgPMML_4_1Value', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2818, 2), )

    
    Value = property(__Value.value, __Value.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Interval uses Python identifier Interval
    __Interval = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Interval'), 'Interval', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_71_httpwww_dmg_orgPMML_4_1Interval', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2836, 2), )

    
    Interval = property(__Interval.value, __Interval.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Value.name() : __Value,
        __Interval.name() : __Interval
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_72 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2757, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_72_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DataField uses Python identifier DataField
    __DataField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DataField'), 'DataField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_72_httpwww_dmg_orgPMML_4_1DataField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2766, 2), )

    
    DataField = property(__DataField.value, __DataField.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Taxonomy uses Python identifier Taxonomy
    __Taxonomy = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Taxonomy'), 'Taxonomy', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_72_httpwww_dmg_orgPMML_4_1Taxonomy', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2965, 2), )

    
    Taxonomy = property(__Taxonomy.value, __Taxonomy.set, None, None)

    
    # Attribute numberOfFields uses Python identifier numberOfFields
    __numberOfFields = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfFields'), 'numberOfFields', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_72_numberOfFields', pyxb.binding.datatypes.nonNegativeInteger)
    __numberOfFields._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2763, 6)
    __numberOfFields._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2763, 6)
    
    numberOfFields = property(__numberOfFields.value, __numberOfFields.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __DataField.name() : __DataField,
        __Taxonomy.name() : __Taxonomy
    })
    _AttributeMap.update({
        __numberOfFields.name() : __numberOfFields
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_73 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2856, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_73_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}OutputField uses Python identifier OutputField
    __OutputField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'OutputField'), 'OutputField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_73_httpwww_dmg_orgPMML_4_1OutputField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2863, 2), )

    
    OutputField = property(__OutputField.value, __OutputField.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __OutputField.name() : __OutputField
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_74 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2933, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_74_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Decision uses Python identifier Decision
    __Decision = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Decision'), 'Decision', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_74_httpwww_dmg_orgPMML_4_1Decision', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2942, 2), )

    
    Decision = property(__Decision.value, __Decision.set, None, None)

    
    # Attribute businessProblem uses Python identifier businessProblem
    __businessProblem = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'businessProblem'), 'businessProblem', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_74_businessProblem', pyxb.binding.datatypes.string)
    __businessProblem._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2938, 6)
    __businessProblem._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2938, 6)
    
    businessProblem = property(__businessProblem.value, __businessProblem.set, None, None)

    
    # Attribute description uses Python identifier description
    __description = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'description'), 'description', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_74_description', pyxb.binding.datatypes.string)
    __description._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2939, 6)
    __description._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2939, 6)
    
    description = property(__description.value, __description.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Decision.name() : __Decision
    })
    _AttributeMap.update({
        __businessProblem.name() : __businessProblem,
        __description.name() : __description
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_75 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2943, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_75_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_75_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2947, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2947, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute displayValue uses Python identifier displayValue
    __displayValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'displayValue'), 'displayValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_75_displayValue', pyxb.binding.datatypes.string)
    __displayValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2948, 6)
    __displayValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2948, 6)
    
    displayValue = property(__displayValue.value, __displayValue.set, None, None)

    
    # Attribute description uses Python identifier description
    __description = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'description'), 'description', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_75_description', pyxb.binding.datatypes.string)
    __description._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2949, 6)
    __description._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2949, 6)
    
    description = property(__description.value, __description.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __value.name() : __value,
        __displayValue.name() : __displayValue,
        __description.name() : __description
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_76 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2966, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_76_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ChildParent uses Python identifier ChildParent
    __ChildParent = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ChildParent'), 'ChildParent', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_76_httpwww_dmg_orgPMML_4_1ChildParent', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2974, 2), )

    
    ChildParent = property(__ChildParent.value, __ChildParent.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_76_name', pyxb.binding.datatypes.string, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2971, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2971, 6)
    
    name = property(__name.value, __name.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __ChildParent.name() : __ChildParent
    })
    _AttributeMap.update({
        __name.name() : __name
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_77 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2997, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_77_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_78 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3004, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_78_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}row uses Python identifier row
    __row = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'row'), 'row', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_78_httpwww_dmg_orgPMML_4_1row', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3011, 2), )

    
    row = property(__row.value, __row.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __row.name() : __row
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type MIXED
class CTD_ANON_79 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type MIXED"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_MIXED
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3012, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    _HasWildcardElement = True
    _ElementMap.update({
        
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_80 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3067, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_80_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldRef uses Python identifier FieldRef
    __FieldRef = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), 'FieldRef', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_80_httpwww_dmg_orgPMML_4_1FieldRef', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2), )

    
    FieldRef = property(__FieldRef.value, __FieldRef.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}AnyDistribution uses Python identifier AnyDistribution
    __AnyDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'AnyDistribution'), 'AnyDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_80_httpwww_dmg_orgPMML_4_1AnyDistribution', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3092, 2), )

    
    AnyDistribution = property(__AnyDistribution.value, __AnyDistribution.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}GaussianDistribution uses Python identifier GaussianDistribution
    __GaussianDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'GaussianDistribution'), 'GaussianDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_80_httpwww_dmg_orgPMML_4_1GaussianDistribution', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3101, 2), )

    
    GaussianDistribution = property(__GaussianDistribution.value, __GaussianDistribution.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PoissonDistribution uses Python identifier PoissonDistribution
    __PoissonDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PoissonDistribution'), 'PoissonDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_80_httpwww_dmg_orgPMML_4_1PoissonDistribution', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3110, 2), )

    
    PoissonDistribution = property(__PoissonDistribution.value, __PoissonDistribution.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}UniformDistribution uses Python identifier UniformDistribution
    __UniformDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'UniformDistribution'), 'UniformDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_80_httpwww_dmg_orgPMML_4_1UniformDistribution', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3118, 2), )

    
    UniformDistribution = property(__UniformDistribution.value, __UniformDistribution.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CountTable uses Python identifier CountTable
    __CountTable = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CountTable'), 'CountTable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_80_httpwww_dmg_orgPMML_4_1CountTable', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3134, 2), )

    
    CountTable = property(__CountTable.value, __CountTable.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NormalizedCountTable uses Python identifier NormalizedCountTable
    __NormalizedCountTable = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NormalizedCountTable'), 'NormalizedCountTable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_80_httpwww_dmg_orgPMML_4_1NormalizedCountTable', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3135, 2), )

    
    NormalizedCountTable = property(__NormalizedCountTable.value, __NormalizedCountTable.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __FieldRef.name() : __FieldRef,
        __AnyDistribution.name() : __AnyDistribution,
        __GaussianDistribution.name() : __GaussianDistribution,
        __PoissonDistribution.name() : __PoissonDistribution,
        __UniformDistribution.name() : __UniformDistribution,
        __CountTable.name() : __CountTable,
        __NormalizedCountTable.name() : __NormalizedCountTable
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_81 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3075, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_81_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}AnyDistribution uses Python identifier AnyDistribution
    __AnyDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'AnyDistribution'), 'AnyDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_81_httpwww_dmg_orgPMML_4_1AnyDistribution', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3092, 2), )

    
    AnyDistribution = property(__AnyDistribution.value, __AnyDistribution.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}GaussianDistribution uses Python identifier GaussianDistribution
    __GaussianDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'GaussianDistribution'), 'GaussianDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_81_httpwww_dmg_orgPMML_4_1GaussianDistribution', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3101, 2), )

    
    GaussianDistribution = property(__GaussianDistribution.value, __GaussianDistribution.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PoissonDistribution uses Python identifier PoissonDistribution
    __PoissonDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PoissonDistribution'), 'PoissonDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_81_httpwww_dmg_orgPMML_4_1PoissonDistribution', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3110, 2), )

    
    PoissonDistribution = property(__PoissonDistribution.value, __PoissonDistribution.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}UniformDistribution uses Python identifier UniformDistribution
    __UniformDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'UniformDistribution'), 'UniformDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_81_httpwww_dmg_orgPMML_4_1UniformDistribution', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3118, 2), )

    
    UniformDistribution = property(__UniformDistribution.value, __UniformDistribution.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __AnyDistribution.name() : __AnyDistribution,
        __GaussianDistribution.name() : __GaussianDistribution,
        __PoissonDistribution.name() : __PoissonDistribution,
        __UniformDistribution.name() : __UniformDistribution
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_82 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3198, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_82_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NeuralInput uses Python identifier NeuralInput
    __NeuralInput = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NeuralInput'), 'NeuralInput', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_82_httpwww_dmg_orgPMML_4_1NeuralInput', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3259, 2), )

    
    NeuralInput = property(__NeuralInput.value, __NeuralInput.set, None, None)

    
    # Attribute numberOfInputs uses Python identifier numberOfInputs
    __numberOfInputs = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfInputs'), 'numberOfInputs', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_82_numberOfInputs', pyxb.binding.datatypes.nonNegativeInteger)
    __numberOfInputs._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3203, 6)
    __numberOfInputs._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3203, 6)
    
    numberOfInputs = property(__numberOfInputs.value, __numberOfInputs.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __NeuralInput.name() : __NeuralInput
    })
    _AttributeMap.update({
        __numberOfInputs.name() : __numberOfInputs
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_83 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3221, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_83_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NeuralOutput uses Python identifier NeuralOutput
    __NeuralOutput = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NeuralOutput'), 'NeuralOutput', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_83_httpwww_dmg_orgPMML_4_1NeuralOutput', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3289, 2), )

    
    NeuralOutput = property(__NeuralOutput.value, __NeuralOutput.set, None, None)

    
    # Attribute numberOfOutputs uses Python identifier numberOfOutputs
    __numberOfOutputs = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfOutputs'), 'numberOfOutputs', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_83_numberOfOutputs', pyxb.binding.datatypes.nonNegativeInteger)
    __numberOfOutputs._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3226, 6)
    __numberOfOutputs._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3226, 6)
    
    numberOfOutputs = property(__numberOfOutputs.value, __numberOfOutputs.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __NeuralOutput.name() : __NeuralOutput
    })
    _AttributeMap.update({
        __numberOfOutputs.name() : __numberOfOutputs
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_84 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3341, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_84_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Characteristic uses Python identifier Characteristic
    __Characteristic = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Characteristic'), 'Characteristic', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_84_httpwww_dmg_orgPMML_4_1Characteristic', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3348, 2), )

    
    Characteristic = property(__Characteristic.value, __Characteristic.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Characteristic.name() : __Characteristic
    })
    _AttributeMap.update({
        
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_85 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}MissingValueWeights uses Python identifier MissingValueWeights
    __MissingValueWeights = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MissingValueWeights'), 'MissingValueWeights', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1MissingValueWeights', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 33, 2), )

    
    MissingValueWeights = property(__MissingValueWeights.value, __MissingValueWeights.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Cluster uses Python identifier Cluster
    __Cluster = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Cluster'), 'Cluster', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1Cluster', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 41, 2), )

    
    Cluster = property(__Cluster.value, __Cluster.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ClusteringField uses Python identifier ClusteringField
    __ClusteringField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ClusteringField'), 'ClusteringField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1ClusteringField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 73, 2), )

    
    ClusteringField = property(__ClusteringField.value, __ClusteringField.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ComparisonMeasure uses Python identifier ComparisonMeasure
    __ComparisonMeasure = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ComparisonMeasure'), 'ComparisonMeasure', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1ComparisonMeasure', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 110, 2), )

    
    ComparisonMeasure = property(__ComparisonMeasure.value, __ComparisonMeasure.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 18, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 18, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 19, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 19, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 20, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 20, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute modelClass uses Python identifier modelClass
    __modelClass = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelClass'), 'modelClass', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_modelClass', STD_ANON, required=True)
    __modelClass._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 21, 6)
    __modelClass._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 21, 6)
    
    modelClass = property(__modelClass.value, __modelClass.set, None, None)

    
    # Attribute numberOfClusters uses Python identifier numberOfClusters
    __numberOfClusters = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfClusters'), 'numberOfClusters', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_numberOfClusters', INT_NUMBER, required=True)
    __numberOfClusters._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 29, 6)
    __numberOfClusters._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 29, 6)
    
    numberOfClusters = property(__numberOfClusters.value, __numberOfClusters.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_85_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 30, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 30, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __MissingValueWeights.name() : __MissingValueWeights,
        __Cluster.name() : __Cluster,
        __ClusteringField.name() : __ClusteringField,
        __ComparisonMeasure.name() : __ComparisonMeasure,
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __modelClass.name() : __modelClass,
        __numberOfClusters.name() : __numberOfClusters,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_86 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 74, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Comparisons uses Python identifier Comparisons
    __Comparisons = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Comparisons'), 'Comparisons', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_86_httpwww_dmg_orgPMML_4_1Comparisons', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 93, 2), )

    
    Comparisons = property(__Comparisons.value, __Comparisons.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_86_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_86_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 79, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 79, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute isCenterField uses Python identifier isCenterField
    __isCenterField = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isCenterField'), 'isCenterField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_86_isCenterField', STD_ANON_, unicode_default=u'true')
    __isCenterField._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 80, 6)
    __isCenterField._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 80, 6)
    
    isCenterField = property(__isCenterField.value, __isCenterField.set, None, None)

    
    # Attribute fieldWeight uses Python identifier fieldWeight
    __fieldWeight = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'fieldWeight'), 'fieldWeight', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_86_fieldWeight', REAL_NUMBER, unicode_default=u'1')
    __fieldWeight._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 88, 6)
    __fieldWeight._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 88, 6)
    
    fieldWeight = property(__fieldWeight.value, __fieldWeight.set, None, None)

    
    # Attribute similarityScale uses Python identifier similarityScale
    __similarityScale = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'similarityScale'), 'similarityScale', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_86_similarityScale', REAL_NUMBER)
    __similarityScale._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 89, 6)
    __similarityScale._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 89, 6)
    
    similarityScale = property(__similarityScale.value, __similarityScale.set, None, None)

    
    # Attribute compareFunction uses Python identifier compareFunction
    __compareFunction = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'compareFunction'), 'compareFunction', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_86_compareFunction', COMPARE_FUNCTION)
    __compareFunction._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 90, 6)
    __compareFunction._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 90, 6)
    
    compareFunction = property(__compareFunction.value, __compareFunction.set, None, None)

    _ElementMap.update({
        __Comparisons.name() : __Comparisons,
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __isCenterField.name() : __isCenterField,
        __fieldWeight.name() : __fieldWeight,
        __similarityScale.name() : __similarityScale,
        __compareFunction.name() : __compareFunction
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_87 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 111, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}euclidean uses Python identifier euclidean
    __euclidean = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'euclidean'), 'euclidean', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1euclidean', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 139, 2), )

    
    euclidean = property(__euclidean.value, __euclidean.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}squaredEuclidean uses Python identifier squaredEuclidean
    __squaredEuclidean = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'squaredEuclidean'), 'squaredEuclidean', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1squaredEuclidean', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 146, 2), )

    
    squaredEuclidean = property(__squaredEuclidean.value, __squaredEuclidean.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}cityBlock uses Python identifier cityBlock
    __cityBlock = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'cityBlock'), 'cityBlock', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1cityBlock', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 153, 2), )

    
    cityBlock = property(__cityBlock.value, __cityBlock.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}chebychev uses Python identifier chebychev
    __chebychev = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'chebychev'), 'chebychev', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1chebychev', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 160, 2), )

    
    chebychev = property(__chebychev.value, __chebychev.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}minkowski uses Python identifier minkowski
    __minkowski = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'minkowski'), 'minkowski', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1minkowski', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 167, 2), )

    
    minkowski = property(__minkowski.value, __minkowski.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}simpleMatching uses Python identifier simpleMatching
    __simpleMatching = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'simpleMatching'), 'simpleMatching', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1simpleMatching', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 175, 2), )

    
    simpleMatching = property(__simpleMatching.value, __simpleMatching.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}jaccard uses Python identifier jaccard
    __jaccard = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'jaccard'), 'jaccard', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1jaccard', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 182, 2), )

    
    jaccard = property(__jaccard.value, __jaccard.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}tanimoto uses Python identifier tanimoto
    __tanimoto = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'tanimoto'), 'tanimoto', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1tanimoto', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 189, 2), )

    
    tanimoto = property(__tanimoto.value, __tanimoto.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}binarySimilarity uses Python identifier binarySimilarity
    __binarySimilarity = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'binarySimilarity'), 'binarySimilarity', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1binarySimilarity', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 196, 2), )

    
    binarySimilarity = property(__binarySimilarity.value, __binarySimilarity.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute kind uses Python identifier kind
    __kind = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'kind'), 'kind', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_kind', STD_ANON_2, required=True)
    __kind._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 126, 6)
    __kind._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 126, 6)
    
    kind = property(__kind.value, __kind.set, None, None)

    
    # Attribute compareFunction uses Python identifier compareFunction
    __compareFunction = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'compareFunction'), 'compareFunction', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_compareFunction', COMPARE_FUNCTION, unicode_default=u'absDiff')
    __compareFunction._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 134, 6)
    __compareFunction._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 134, 6)
    
    compareFunction = property(__compareFunction.value, __compareFunction.set, None, None)

    
    # Attribute minimum uses Python identifier minimum
    __minimum = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimum'), 'minimum', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_minimum', NUMBER)
    __minimum._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 135, 6)
    __minimum._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 135, 6)
    
    minimum = property(__minimum.value, __minimum.set, None, None)

    
    # Attribute maximum uses Python identifier maximum
    __maximum = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maximum'), 'maximum', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_87_maximum', NUMBER)
    __maximum._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 136, 6)
    __maximum._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 136, 6)
    
    maximum = property(__maximum.value, __maximum.set, None, None)

    _ElementMap.update({
        __euclidean.name() : __euclidean,
        __squaredEuclidean.name() : __squaredEuclidean,
        __cityBlock.name() : __cityBlock,
        __chebychev.name() : __chebychev,
        __minkowski.name() : __minkowski,
        __simpleMatching.name() : __simpleMatching,
        __jaccard.name() : __jaccard,
        __tanimoto.name() : __tanimoto,
        __binarySimilarity.name() : __binarySimilarity,
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __kind.name() : __kind,
        __compareFunction.name() : __compareFunction,
        __minimum.name() : __minimum,
        __maximum.name() : __maximum
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_88 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 168, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_88_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute p-parameter uses Python identifier p_parameter
    __p_parameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'p-parameter'), 'p_parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_88_p_parameter', NUMBER, required=True)
    __p_parameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 172, 6)
    __p_parameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 172, 6)
    
    p_parameter = property(__p_parameter.value, __p_parameter.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __p_parameter.name() : __p_parameter
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_89 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 197, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_89_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute c00-parameter uses Python identifier c00_parameter
    __c00_parameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'c00-parameter'), 'c00_parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_89_c00_parameter', NUMBER, required=True)
    __c00_parameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 201, 6)
    __c00_parameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 201, 6)
    
    c00_parameter = property(__c00_parameter.value, __c00_parameter.set, None, None)

    
    # Attribute c01-parameter uses Python identifier c01_parameter
    __c01_parameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'c01-parameter'), 'c01_parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_89_c01_parameter', NUMBER, required=True)
    __c01_parameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 202, 6)
    __c01_parameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 202, 6)
    
    c01_parameter = property(__c01_parameter.value, __c01_parameter.set, None, None)

    
    # Attribute c10-parameter uses Python identifier c10_parameter
    __c10_parameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'c10-parameter'), 'c10_parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_89_c10_parameter', NUMBER, required=True)
    __c10_parameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 203, 6)
    __c10_parameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 203, 6)
    
    c10_parameter = property(__c10_parameter.value, __c10_parameter.set, None, None)

    
    # Attribute c11-parameter uses Python identifier c11_parameter
    __c11_parameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'c11-parameter'), 'c11_parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_89_c11_parameter', NUMBER, required=True)
    __c11_parameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 204, 6)
    __c11_parameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 204, 6)
    
    c11_parameter = property(__c11_parameter.value, __c11_parameter.set, None, None)

    
    # Attribute d00-parameter uses Python identifier d00_parameter
    __d00_parameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'd00-parameter'), 'd00_parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_89_d00_parameter', NUMBER, required=True)
    __d00_parameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 205, 6)
    __d00_parameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 205, 6)
    
    d00_parameter = property(__d00_parameter.value, __d00_parameter.set, None, None)

    
    # Attribute d01-parameter uses Python identifier d01_parameter
    __d01_parameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'd01-parameter'), 'd01_parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_89_d01_parameter', NUMBER, required=True)
    __d01_parameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 206, 6)
    __d01_parameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 206, 6)
    
    d01_parameter = property(__d01_parameter.value, __d01_parameter.set, None, None)

    
    # Attribute d10-parameter uses Python identifier d10_parameter
    __d10_parameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'd10-parameter'), 'd10_parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_89_d10_parameter', NUMBER, required=True)
    __d10_parameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 207, 6)
    __d10_parameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 207, 6)
    
    d10_parameter = property(__d10_parameter.value, __d10_parameter.set, None, None)

    
    # Attribute d11-parameter uses Python identifier d11_parameter
    __d11_parameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'd11-parameter'), 'd11_parameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_89_d11_parameter', NUMBER, required=True)
    __d11_parameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 208, 6)
    __d11_parameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 208, 6)
    
    d11_parameter = property(__d11_parameter.value, __d11_parameter.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __c00_parameter.name() : __c00_parameter,
        __c01_parameter.name() : __c01_parameter,
        __c10_parameter.name() : __c10_parameter,
        __c11_parameter.name() : __c11_parameter,
        __d00_parameter.name() : __d00_parameter,
        __d01_parameter.name() : __d01_parameter,
        __d10_parameter.name() : __d10_parameter,
        __d11_parameter.name() : __d11_parameter
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_90 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 212, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}VerificationFields uses Python identifier VerificationFields
    __VerificationFields = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'VerificationFields'), 'VerificationFields', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_90_httpwww_dmg_orgPMML_4_1VerificationFields', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 222, 2), )

    
    VerificationFields = property(__VerificationFields.value, __VerificationFields.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_90_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}InlineTable uses Python identifier InlineTable
    __InlineTable = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'InlineTable'), 'InlineTable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_90_httpwww_dmg_orgPMML_4_1InlineTable', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3003, 2), )

    
    InlineTable = property(__InlineTable.value, __InlineTable.set, None, None)

    
    # Attribute recordCount uses Python identifier recordCount
    __recordCount = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'recordCount'), 'recordCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_90_recordCount', INT_NUMBER)
    __recordCount._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 218, 6)
    __recordCount._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 218, 6)
    
    recordCount = property(__recordCount.value, __recordCount.set, None, None)

    
    # Attribute fieldCount uses Python identifier fieldCount
    __fieldCount = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'fieldCount'), 'fieldCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_90_fieldCount', INT_NUMBER)
    __fieldCount._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 219, 6)
    __fieldCount._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 219, 6)
    
    fieldCount = property(__fieldCount.value, __fieldCount.set, None, None)

    _ElementMap.update({
        __VerificationFields.name() : __VerificationFields,
        __Extension.name() : __Extension,
        __InlineTable.name() : __InlineTable
    })
    _AttributeMap.update({
        __recordCount.name() : __recordCount,
        __fieldCount.name() : __fieldCount
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_91 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 242, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ParameterField uses Python identifier ParameterField
    __ParameterField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ParameterField'), 'ParameterField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1ParameterField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 253, 2), )

    
    ParameterField = property(__ParameterField.value, __ParameterField.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Apply uses Python identifier Apply
    __Apply = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Apply'), 'Apply', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1Apply', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 260, 2), )

    
    Apply = property(__Apply.value, __Apply.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Constant uses Python identifier Constant
    __Constant = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Constant'), 'Constant', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1Constant', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1018, 2), )

    
    Constant = property(__Constant.value, __Constant.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldRef uses Python identifier FieldRef
    __FieldRef = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), 'FieldRef', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1FieldRef', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2), )

    
    FieldRef = property(__FieldRef.value, __FieldRef.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NormContinuous uses Python identifier NormContinuous
    __NormContinuous = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous'), 'NormContinuous', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1NormContinuous', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1036, 2), )

    
    NormContinuous = property(__NormContinuous.value, __NormContinuous.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NormDiscrete uses Python identifier NormDiscrete
    __NormDiscrete = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete'), 'NormDiscrete', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1NormDiscrete', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1056, 2), )

    
    NormDiscrete = property(__NormDiscrete.value, __NormDiscrete.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Discretize uses Python identifier Discretize
    __Discretize = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Discretize'), 'Discretize', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1Discretize', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1073, 2), )

    
    Discretize = property(__Discretize.value, __Discretize.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MapValues uses Python identifier MapValues
    __MapValues = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MapValues'), 'MapValues', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1MapValues', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1094, 2), )

    
    MapValues = property(__MapValues.value, __MapValues.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Aggregate uses Python identifier Aggregate
    __Aggregate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Aggregate'), 'Aggregate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_httpwww_dmg_orgPMML_4_1Aggregate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1119, 2), )

    
    Aggregate = property(__Aggregate.value, __Aggregate.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_name', pyxb.binding.datatypes.string, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 248, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 248, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute optype uses Python identifier optype
    __optype = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'optype'), 'optype', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_optype', OPTYPE, required=True)
    __optype._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 249, 6)
    __optype._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 249, 6)
    
    optype = property(__optype.value, __optype.set, None, None)

    
    # Attribute dataType uses Python identifier dataType
    __dataType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataType'), 'dataType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_91_dataType', DATATYPE)
    __dataType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 250, 6)
    __dataType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 250, 6)
    
    dataType = property(__dataType.value, __dataType.set, None, None)

    _ElementMap.update({
        __ParameterField.name() : __ParameterField,
        __Apply.name() : __Apply,
        __Extension.name() : __Extension,
        __Constant.name() : __Constant,
        __FieldRef.name() : __FieldRef,
        __NormContinuous.name() : __NormContinuous,
        __NormDiscrete.name() : __NormDiscrete,
        __Discretize.name() : __Discretize,
        __MapValues.name() : __MapValues,
        __Aggregate.name() : __Aggregate
    })
    _AttributeMap.update({
        __name.name() : __name,
        __optype.name() : __optype,
        __dataType.name() : __dataType
    })



# Complex type [anonymous] with content type EMPTY
class CTD_ANON_92 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type EMPTY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_EMPTY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 254, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_92_name', pyxb.binding.datatypes.string, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 255, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 255, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute optype uses Python identifier optype
    __optype = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'optype'), 'optype', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_92_optype', OPTYPE)
    __optype._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 256, 6)
    __optype._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 256, 6)
    
    optype = property(__optype.value, __optype.set, None, None)

    
    # Attribute dataType uses Python identifier dataType
    __dataType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataType'), 'dataType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_92_dataType', DATATYPE)
    __dataType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 257, 6)
    __dataType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 257, 6)
    
    dataType = property(__dataType.value, __dataType.set, None, None)

    _ElementMap.update({
        
    })
    _AttributeMap.update({
        __name.name() : __name,
        __optype.name() : __optype,
        __dataType.name() : __dataType
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_93 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 261, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Apply uses Python identifier Apply
    __Apply = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Apply'), 'Apply', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_httpwww_dmg_orgPMML_4_1Apply', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 260, 2), )

    
    Apply = property(__Apply.value, __Apply.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Constant uses Python identifier Constant
    __Constant = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Constant'), 'Constant', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_httpwww_dmg_orgPMML_4_1Constant', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1018, 2), )

    
    Constant = property(__Constant.value, __Constant.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldRef uses Python identifier FieldRef
    __FieldRef = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), 'FieldRef', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_httpwww_dmg_orgPMML_4_1FieldRef', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2), )

    
    FieldRef = property(__FieldRef.value, __FieldRef.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NormContinuous uses Python identifier NormContinuous
    __NormContinuous = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous'), 'NormContinuous', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_httpwww_dmg_orgPMML_4_1NormContinuous', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1036, 2), )

    
    NormContinuous = property(__NormContinuous.value, __NormContinuous.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NormDiscrete uses Python identifier NormDiscrete
    __NormDiscrete = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete'), 'NormDiscrete', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_httpwww_dmg_orgPMML_4_1NormDiscrete', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1056, 2), )

    
    NormDiscrete = property(__NormDiscrete.value, __NormDiscrete.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Discretize uses Python identifier Discretize
    __Discretize = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Discretize'), 'Discretize', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_httpwww_dmg_orgPMML_4_1Discretize', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1073, 2), )

    
    Discretize = property(__Discretize.value, __Discretize.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MapValues uses Python identifier MapValues
    __MapValues = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MapValues'), 'MapValues', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_httpwww_dmg_orgPMML_4_1MapValues', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1094, 2), )

    
    MapValues = property(__MapValues.value, __MapValues.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Aggregate uses Python identifier Aggregate
    __Aggregate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Aggregate'), 'Aggregate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_httpwww_dmg_orgPMML_4_1Aggregate', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1119, 2), )

    
    Aggregate = property(__Aggregate.value, __Aggregate.set, None, None)

    
    # Attribute function uses Python identifier function
    __function = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'function'), 'function', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_function', pyxb.binding.datatypes.string, required=True)
    __function._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 266, 6)
    __function._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 266, 6)
    
    function = property(__function.value, __function.set, None, None)

    
    # Attribute mapMissingTo uses Python identifier mapMissingTo
    __mapMissingTo = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mapMissingTo'), 'mapMissingTo', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_mapMissingTo', pyxb.binding.datatypes.string)
    __mapMissingTo._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 267, 6)
    __mapMissingTo._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 267, 6)
    
    mapMissingTo = property(__mapMissingTo.value, __mapMissingTo.set, None, None)

    
    # Attribute invalidValueTreatment uses Python identifier invalidValueTreatment
    __invalidValueTreatment = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'invalidValueTreatment'), 'invalidValueTreatment', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_93_invalidValueTreatment', INVALID_VALUE_TREATMENT_METHOD, unicode_default=u'returnInvalid')
    __invalidValueTreatment._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 268, 6)
    __invalidValueTreatment._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 268, 6)
    
    invalidValueTreatment = property(__invalidValueTreatment.value, __invalidValueTreatment.set, None, None)

    _ElementMap.update({
        __Apply.name() : __Apply,
        __Extension.name() : __Extension,
        __Constant.name() : __Constant,
        __FieldRef.name() : __FieldRef,
        __NormContinuous.name() : __NormContinuous,
        __NormDiscrete.name() : __NormDiscrete,
        __Discretize.name() : __Discretize,
        __MapValues.name() : __MapValues,
        __Aggregate.name() : __Aggregate
    })
    _AttributeMap.update({
        __function.name() : __function,
        __mapMissingTo.name() : __mapMissingTo,
        __invalidValueTreatment.name() : __invalidValueTreatment
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_94 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 280, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_name', FIELD_NAME, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 284, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 284, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute usageType uses Python identifier usageType
    __usageType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'usageType'), 'usageType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_usageType', FIELD_USAGE_TYPE, unicode_default=u'active')
    __usageType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 285, 6)
    __usageType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 285, 6)
    
    usageType = property(__usageType.value, __usageType.set, None, None)

    
    # Attribute optype uses Python identifier optype
    __optype = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'optype'), 'optype', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_optype', OPTYPE)
    __optype._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 286, 6)
    __optype._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 286, 6)
    
    optype = property(__optype.value, __optype.set, None, None)

    
    # Attribute importance uses Python identifier importance
    __importance = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'importance'), 'importance', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_importance', PROB_NUMBER)
    __importance._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 287, 6)
    __importance._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 287, 6)
    
    importance = property(__importance.value, __importance.set, None, None)

    
    # Attribute outliers uses Python identifier outliers
    __outliers = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'outliers'), 'outliers', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_outliers', OUTLIER_TREATMENT_METHOD, unicode_default=u'asIs')
    __outliers._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 288, 6)
    __outliers._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 288, 6)
    
    outliers = property(__outliers.value, __outliers.set, None, None)

    
    # Attribute lowValue uses Python identifier lowValue
    __lowValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'lowValue'), 'lowValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_lowValue', NUMBER)
    __lowValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 289, 6)
    __lowValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 289, 6)
    
    lowValue = property(__lowValue.value, __lowValue.set, None, None)

    
    # Attribute highValue uses Python identifier highValue
    __highValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'highValue'), 'highValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_highValue', NUMBER)
    __highValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 290, 6)
    __highValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 290, 6)
    
    highValue = property(__highValue.value, __highValue.set, None, None)

    
    # Attribute missingValueReplacement uses Python identifier missingValueReplacement
    __missingValueReplacement = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'missingValueReplacement'), 'missingValueReplacement', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_missingValueReplacement', pyxb.binding.datatypes.string)
    __missingValueReplacement._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 291, 6)
    __missingValueReplacement._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 291, 6)
    
    missingValueReplacement = property(__missingValueReplacement.value, __missingValueReplacement.set, None, None)

    
    # Attribute missingValueTreatment uses Python identifier missingValueTreatment
    __missingValueTreatment = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'missingValueTreatment'), 'missingValueTreatment', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_missingValueTreatment', MISSING_VALUE_TREATMENT_METHOD)
    __missingValueTreatment._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 292, 6)
    __missingValueTreatment._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 292, 6)
    
    missingValueTreatment = property(__missingValueTreatment.value, __missingValueTreatment.set, None, None)

    
    # Attribute invalidValueTreatment uses Python identifier invalidValueTreatment
    __invalidValueTreatment = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'invalidValueTreatment'), 'invalidValueTreatment', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_94_invalidValueTreatment', INVALID_VALUE_TREATMENT_METHOD, unicode_default=u'returnInvalid')
    __invalidValueTreatment._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 293, 6)
    __invalidValueTreatment._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 293, 6)
    
    invalidValueTreatment = property(__invalidValueTreatment.value, __invalidValueTreatment.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __name.name() : __name,
        __usageType.name() : __usageType,
        __optype.name() : __optype,
        __importance.name() : __importance,
        __outliers.name() : __outliers,
        __lowValue.name() : __lowValue,
        __highValue.name() : __highValue,
        __missingValueReplacement.name() : __missingValueReplacement,
        __missingValueTreatment.name() : __missingValueTreatment,
        __invalidValueTreatment.name() : __invalidValueTreatment
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_95 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 331, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Constraints uses Python identifier Constraints
    __Constraints = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Constraints'), 'Constraints', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1Constraints', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 357, 2), )

    
    Constraints = property(__Constraints.value, __Constraints.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SetPredicate uses Python identifier SetPredicate
    __SetPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SetPredicate'), 'SetPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1SetPredicate', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 382, 2), )

    
    SetPredicate = property(__SetPredicate.value, __SetPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Sequence uses Python identifier Sequence
    __Sequence = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Sequence'), 'Sequence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1Sequence', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 434, 2), )

    
    Sequence = property(__Sequence.value, __Sequence.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SequenceRule uses Python identifier SequenceRule
    __SequenceRule = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SequenceRule'), 'SequenceRule', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1SequenceRule', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 458, 2), )

    
    SequenceRule = property(__SequenceRule.value, __SequenceRule.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Item uses Python identifier Item
    __Item = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Item'), 'Item', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1Item', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 720, 2), )

    
    Item = property(__Item.value, __Item.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Itemset uses Python identifier Itemset
    __Itemset = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Itemset'), 'Itemset', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1Itemset', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 731, 2), )

    
    Itemset = property(__Itemset.value, __Itemset.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 345, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 345, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 346, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 346, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 347, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 347, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute numberOfTransactions uses Python identifier numberOfTransactions
    __numberOfTransactions = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfTransactions'), 'numberOfTransactions', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_numberOfTransactions', INT_NUMBER)
    __numberOfTransactions._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 348, 6)
    __numberOfTransactions._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 348, 6)
    
    numberOfTransactions = property(__numberOfTransactions.value, __numberOfTransactions.set, None, None)

    
    # Attribute maxNumberOfItemsPerTransaction uses Python identifier maxNumberOfItemsPerTransaction
    __maxNumberOfItemsPerTransaction = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maxNumberOfItemsPerTransaction'), 'maxNumberOfItemsPerTransaction', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_maxNumberOfItemsPerTransaction', INT_NUMBER)
    __maxNumberOfItemsPerTransaction._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 349, 6)
    __maxNumberOfItemsPerTransaction._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 349, 6)
    
    maxNumberOfItemsPerTransaction = property(__maxNumberOfItemsPerTransaction.value, __maxNumberOfItemsPerTransaction.set, None, None)

    
    # Attribute avgNumberOfItemsPerTransaction uses Python identifier avgNumberOfItemsPerTransaction
    __avgNumberOfItemsPerTransaction = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'avgNumberOfItemsPerTransaction'), 'avgNumberOfItemsPerTransaction', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_avgNumberOfItemsPerTransaction', REAL_NUMBER)
    __avgNumberOfItemsPerTransaction._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 350, 6)
    __avgNumberOfItemsPerTransaction._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 350, 6)
    
    avgNumberOfItemsPerTransaction = property(__avgNumberOfItemsPerTransaction.value, __avgNumberOfItemsPerTransaction.set, None, None)

    
    # Attribute numberOfTransactionGroups uses Python identifier numberOfTransactionGroups
    __numberOfTransactionGroups = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfTransactionGroups'), 'numberOfTransactionGroups', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_numberOfTransactionGroups', INT_NUMBER)
    __numberOfTransactionGroups._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 351, 6)
    __numberOfTransactionGroups._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 351, 6)
    
    numberOfTransactionGroups = property(__numberOfTransactionGroups.value, __numberOfTransactionGroups.set, None, None)

    
    # Attribute maxNumberOfTAsPerTAGroup uses Python identifier maxNumberOfTAsPerTAGroup
    __maxNumberOfTAsPerTAGroup = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maxNumberOfTAsPerTAGroup'), 'maxNumberOfTAsPerTAGroup', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_maxNumberOfTAsPerTAGroup', INT_NUMBER)
    __maxNumberOfTAsPerTAGroup._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 352, 6)
    __maxNumberOfTAsPerTAGroup._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 352, 6)
    
    maxNumberOfTAsPerTAGroup = property(__maxNumberOfTAsPerTAGroup.value, __maxNumberOfTAsPerTAGroup.set, None, None)

    
    # Attribute avgNumberOfTAsPerTAGroup uses Python identifier avgNumberOfTAsPerTAGroup
    __avgNumberOfTAsPerTAGroup = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'avgNumberOfTAsPerTAGroup'), 'avgNumberOfTAsPerTAGroup', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_avgNumberOfTAsPerTAGroup', REAL_NUMBER)
    __avgNumberOfTAsPerTAGroup._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 353, 6)
    __avgNumberOfTAsPerTAGroup._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 353, 6)
    
    avgNumberOfTAsPerTAGroup = property(__avgNumberOfTAsPerTAGroup.value, __avgNumberOfTAsPerTAGroup.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_95_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 354, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 354, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __MiningSchema.name() : __MiningSchema,
        __Constraints.name() : __Constraints,
        __SetPredicate.name() : __SetPredicate,
        __Sequence.name() : __Sequence,
        __SequenceRule.name() : __SequenceRule,
        __Extension.name() : __Extension,
        __Item.name() : __Item,
        __Itemset.name() : __Itemset,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelStats.name() : __ModelStats
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __numberOfTransactions.name() : __numberOfTransactions,
        __maxNumberOfItemsPerTransaction.name() : __maxNumberOfItemsPerTransaction,
        __avgNumberOfItemsPerTransaction.name() : __avgNumberOfItemsPerTransaction,
        __numberOfTransactionGroups.name() : __numberOfTransactionGroups,
        __maxNumberOfTAsPerTAGroup.name() : __maxNumberOfTAsPerTAGroup,
        __avgNumberOfTAsPerTAGroup.name() : __avgNumberOfTAsPerTAGroup,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_96 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 358, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute minimumNumberOfItems uses Python identifier minimumNumberOfItems
    __minimumNumberOfItems = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumNumberOfItems'), 'minimumNumberOfItems', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_minimumNumberOfItems', INT_NUMBER, unicode_default=u'1')
    __minimumNumberOfItems._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 362, 6)
    __minimumNumberOfItems._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 362, 6)
    
    minimumNumberOfItems = property(__minimumNumberOfItems.value, __minimumNumberOfItems.set, None, None)

    
    # Attribute maximumNumberOfItems uses Python identifier maximumNumberOfItems
    __maximumNumberOfItems = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maximumNumberOfItems'), 'maximumNumberOfItems', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_maximumNumberOfItems', INT_NUMBER)
    __maximumNumberOfItems._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 363, 6)
    __maximumNumberOfItems._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 363, 6)
    
    maximumNumberOfItems = property(__maximumNumberOfItems.value, __maximumNumberOfItems.set, None, None)

    
    # Attribute minimumNumberOfAntecedentItems uses Python identifier minimumNumberOfAntecedentItems
    __minimumNumberOfAntecedentItems = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumNumberOfAntecedentItems'), 'minimumNumberOfAntecedentItems', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_minimumNumberOfAntecedentItems', INT_NUMBER, unicode_default=u'1')
    __minimumNumberOfAntecedentItems._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 364, 6)
    __minimumNumberOfAntecedentItems._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 364, 6)
    
    minimumNumberOfAntecedentItems = property(__minimumNumberOfAntecedentItems.value, __minimumNumberOfAntecedentItems.set, None, None)

    
    # Attribute maximumNumberOfAntecedentItems uses Python identifier maximumNumberOfAntecedentItems
    __maximumNumberOfAntecedentItems = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maximumNumberOfAntecedentItems'), 'maximumNumberOfAntecedentItems', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_maximumNumberOfAntecedentItems', INT_NUMBER)
    __maximumNumberOfAntecedentItems._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 365, 6)
    __maximumNumberOfAntecedentItems._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 365, 6)
    
    maximumNumberOfAntecedentItems = property(__maximumNumberOfAntecedentItems.value, __maximumNumberOfAntecedentItems.set, None, None)

    
    # Attribute minimumNumberOfConsequentItems uses Python identifier minimumNumberOfConsequentItems
    __minimumNumberOfConsequentItems = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumNumberOfConsequentItems'), 'minimumNumberOfConsequentItems', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_minimumNumberOfConsequentItems', INT_NUMBER, unicode_default=u'1')
    __minimumNumberOfConsequentItems._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 366, 6)
    __minimumNumberOfConsequentItems._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 366, 6)
    
    minimumNumberOfConsequentItems = property(__minimumNumberOfConsequentItems.value, __minimumNumberOfConsequentItems.set, None, None)

    
    # Attribute maximumNumberOfConsequentItems uses Python identifier maximumNumberOfConsequentItems
    __maximumNumberOfConsequentItems = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maximumNumberOfConsequentItems'), 'maximumNumberOfConsequentItems', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_maximumNumberOfConsequentItems', INT_NUMBER)
    __maximumNumberOfConsequentItems._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 367, 6)
    __maximumNumberOfConsequentItems._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 367, 6)
    
    maximumNumberOfConsequentItems = property(__maximumNumberOfConsequentItems.value, __maximumNumberOfConsequentItems.set, None, None)

    
    # Attribute minimumSupport uses Python identifier minimumSupport
    __minimumSupport = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumSupport'), 'minimumSupport', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_minimumSupport', REAL_NUMBER, unicode_default=u'0')
    __minimumSupport._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 368, 6)
    __minimumSupport._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 368, 6)
    
    minimumSupport = property(__minimumSupport.value, __minimumSupport.set, None, None)

    
    # Attribute minimumConfidence uses Python identifier minimumConfidence
    __minimumConfidence = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumConfidence'), 'minimumConfidence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_minimumConfidence', REAL_NUMBER, unicode_default=u'0')
    __minimumConfidence._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 369, 6)
    __minimumConfidence._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 369, 6)
    
    minimumConfidence = property(__minimumConfidence.value, __minimumConfidence.set, None, None)

    
    # Attribute minimumLift uses Python identifier minimumLift
    __minimumLift = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumLift'), 'minimumLift', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_minimumLift', REAL_NUMBER, unicode_default=u'0')
    __minimumLift._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 370, 6)
    __minimumLift._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 370, 6)
    
    minimumLift = property(__minimumLift.value, __minimumLift.set, None, None)

    
    # Attribute minimumTotalSequenceTime uses Python identifier minimumTotalSequenceTime
    __minimumTotalSequenceTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumTotalSequenceTime'), 'minimumTotalSequenceTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_minimumTotalSequenceTime', REAL_NUMBER, unicode_default=u'0')
    __minimumTotalSequenceTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 371, 6)
    __minimumTotalSequenceTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 371, 6)
    
    minimumTotalSequenceTime = property(__minimumTotalSequenceTime.value, __minimumTotalSequenceTime.set, None, None)

    
    # Attribute maximumTotalSequenceTime uses Python identifier maximumTotalSequenceTime
    __maximumTotalSequenceTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maximumTotalSequenceTime'), 'maximumTotalSequenceTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_maximumTotalSequenceTime', REAL_NUMBER)
    __maximumTotalSequenceTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 372, 6)
    __maximumTotalSequenceTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 372, 6)
    
    maximumTotalSequenceTime = property(__maximumTotalSequenceTime.value, __maximumTotalSequenceTime.set, None, None)

    
    # Attribute minimumItemsetSeparationTime uses Python identifier minimumItemsetSeparationTime
    __minimumItemsetSeparationTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumItemsetSeparationTime'), 'minimumItemsetSeparationTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_minimumItemsetSeparationTime', REAL_NUMBER, unicode_default=u'0')
    __minimumItemsetSeparationTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 373, 6)
    __minimumItemsetSeparationTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 373, 6)
    
    minimumItemsetSeparationTime = property(__minimumItemsetSeparationTime.value, __minimumItemsetSeparationTime.set, None, None)

    
    # Attribute maximumItemsetSeparationTime uses Python identifier maximumItemsetSeparationTime
    __maximumItemsetSeparationTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maximumItemsetSeparationTime'), 'maximumItemsetSeparationTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_maximumItemsetSeparationTime', REAL_NUMBER)
    __maximumItemsetSeparationTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 374, 6)
    __maximumItemsetSeparationTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 374, 6)
    
    maximumItemsetSeparationTime = property(__maximumItemsetSeparationTime.value, __maximumItemsetSeparationTime.set, None, None)

    
    # Attribute minimumAntConsSeparationTime uses Python identifier minimumAntConsSeparationTime
    __minimumAntConsSeparationTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumAntConsSeparationTime'), 'minimumAntConsSeparationTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_minimumAntConsSeparationTime', REAL_NUMBER, unicode_default=u'0')
    __minimumAntConsSeparationTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 375, 6)
    __minimumAntConsSeparationTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 375, 6)
    
    minimumAntConsSeparationTime = property(__minimumAntConsSeparationTime.value, __minimumAntConsSeparationTime.set, None, None)

    
    # Attribute maximumAntConsSeparationTime uses Python identifier maximumAntConsSeparationTime
    __maximumAntConsSeparationTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maximumAntConsSeparationTime'), 'maximumAntConsSeparationTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_96_maximumAntConsSeparationTime', REAL_NUMBER)
    __maximumAntConsSeparationTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 376, 6)
    __maximumAntConsSeparationTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 376, 6)
    
    maximumAntConsSeparationTime = property(__maximumAntConsSeparationTime.value, __maximumAntConsSeparationTime.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __minimumNumberOfItems.name() : __minimumNumberOfItems,
        __maximumNumberOfItems.name() : __maximumNumberOfItems,
        __minimumNumberOfAntecedentItems.name() : __minimumNumberOfAntecedentItems,
        __maximumNumberOfAntecedentItems.name() : __maximumNumberOfAntecedentItems,
        __minimumNumberOfConsequentItems.name() : __minimumNumberOfConsequentItems,
        __maximumNumberOfConsequentItems.name() : __maximumNumberOfConsequentItems,
        __minimumSupport.name() : __minimumSupport,
        __minimumConfidence.name() : __minimumConfidence,
        __minimumLift.name() : __minimumLift,
        __minimumTotalSequenceTime.name() : __minimumTotalSequenceTime,
        __maximumTotalSequenceTime.name() : __maximumTotalSequenceTime,
        __minimumItemsetSeparationTime.name() : __minimumItemsetSeparationTime,
        __maximumItemsetSeparationTime.name() : __maximumItemsetSeparationTime,
        __minimumAntConsSeparationTime.name() : __minimumAntConsSeparationTime,
        __maximumAntConsSeparationTime.name() : __maximumAntConsSeparationTime
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_97 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 383, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_97_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_97_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_97_id', ELEMENT_ID, required=True)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 388, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 388, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_97_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 389, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 389, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute operator uses Python identifier operator
    __operator = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'operator'), 'operator', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_97_operator', pyxb.binding.datatypes.string, fixed=True, unicode_default=u'supersetOf')
    __operator._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 390, 6)
    __operator._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 390, 6)
    
    operator = property(__operator.value, __operator.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        __id.name() : __id,
        __field.name() : __field,
        __operator.name() : __operator
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_98 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 407, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_98_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute delimiter uses Python identifier delimiter
    __delimiter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'delimiter'), 'delimiter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_98_delimiter', DELIMITER, required=True)
    __delimiter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 411, 6)
    __delimiter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 411, 6)
    
    delimiter = property(__delimiter.value, __delimiter.set, None, None)

    
    # Attribute gap uses Python identifier gap
    __gap = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'gap'), 'gap', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_98_gap', GAP, required=True)
    __gap._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 412, 6)
    __gap._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 412, 6)
    
    gap = property(__gap.value, __gap.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __delimiter.name() : __delimiter,
        __gap.name() : __gap
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_99 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 416, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_99_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute min uses Python identifier min
    __min = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'min'), 'min', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_99_min', NUMBER)
    __min._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 420, 6)
    __min._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 420, 6)
    
    min = property(__min.value, __min.set, None, None)

    
    # Attribute max uses Python identifier max
    __max = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'max'), 'max', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_99_max', NUMBER)
    __max._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 421, 6)
    __max._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 421, 6)
    
    max = property(__max.value, __max.set, None, None)

    
    # Attribute mean uses Python identifier mean
    __mean = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mean'), 'mean', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_99_mean', NUMBER)
    __mean._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 422, 6)
    __mean._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 422, 6)
    
    mean = property(__mean.value, __mean.set, None, None)

    
    # Attribute standardDeviation uses Python identifier standardDeviation
    __standardDeviation = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'standardDeviation'), 'standardDeviation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_99_standardDeviation', NUMBER)
    __standardDeviation._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 423, 6)
    __standardDeviation._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 423, 6)
    
    standardDeviation = property(__standardDeviation.value, __standardDeviation.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __min.name() : __min,
        __max.name() : __max,
        __mean.name() : __mean,
        __standardDeviation.name() : __standardDeviation
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_100 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 435, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Delimiter uses Python identifier Delimiter
    __Delimiter = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Delimiter'), 'Delimiter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_100_httpwww_dmg_orgPMML_4_1Delimiter', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 406, 2), )

    
    Delimiter = property(__Delimiter.value, __Delimiter.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Time uses Python identifier Time
    __Time = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Time'), 'Time', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_100_httpwww_dmg_orgPMML_4_1Time', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 415, 2), )

    
    Time = property(__Time.value, __Time.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SetReference uses Python identifier SetReference
    __SetReference = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SetReference'), 'SetReference', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_100_httpwww_dmg_orgPMML_4_1SetReference', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 450, 2), )

    
    SetReference = property(__SetReference.value, __SetReference.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_100_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_100_id', ELEMENT_ID, required=True)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 444, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 444, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute numberOfSets uses Python identifier numberOfSets
    __numberOfSets = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfSets'), 'numberOfSets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_100_numberOfSets', INT_NUMBER)
    __numberOfSets._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 445, 6)
    __numberOfSets._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 445, 6)
    
    numberOfSets = property(__numberOfSets.value, __numberOfSets.set, None, None)

    
    # Attribute occurrence uses Python identifier occurrence
    __occurrence = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'occurrence'), 'occurrence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_100_occurrence', INT_NUMBER)
    __occurrence._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 446, 6)
    __occurrence._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 446, 6)
    
    occurrence = property(__occurrence.value, __occurrence.set, None, None)

    
    # Attribute support uses Python identifier support
    __support = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'support'), 'support', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_100_support', REAL_NUMBER)
    __support._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 447, 6)
    __support._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 447, 6)
    
    support = property(__support.value, __support.set, None, None)

    _ElementMap.update({
        __Delimiter.name() : __Delimiter,
        __Time.name() : __Time,
        __SetReference.name() : __SetReference,
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __id.name() : __id,
        __numberOfSets.name() : __numberOfSets,
        __occurrence.name() : __occurrence,
        __support.name() : __support
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_101 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 451, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_101_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute setId uses Python identifier setId
    __setId = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'setId'), 'setId', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_101_setId', ELEMENT_ID, required=True)
    __setId._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 455, 6)
    __setId._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 455, 6)
    
    setId = property(__setId.value, __setId.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __setId.name() : __setId
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_102 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 459, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Delimiter uses Python identifier Delimiter
    __Delimiter = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Delimiter'), 'Delimiter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_httpwww_dmg_orgPMML_4_1Delimiter', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 406, 2), )

    
    Delimiter = property(__Delimiter.value, __Delimiter.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Time uses Python identifier Time
    __Time = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Time'), 'Time', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_httpwww_dmg_orgPMML_4_1Time', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 415, 2), )

    
    Time = property(__Time.value, __Time.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}AntecedentSequence uses Python identifier AntecedentSequence
    __AntecedentSequence = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'AntecedentSequence'), 'AntecedentSequence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_httpwww_dmg_orgPMML_4_1AntecedentSequence', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 493, 2), )

    
    AntecedentSequence = property(__AntecedentSequence.value, __AntecedentSequence.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ConsequentSequence uses Python identifier ConsequentSequence
    __ConsequentSequence = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ConsequentSequence'), 'ConsequentSequence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_httpwww_dmg_orgPMML_4_1ConsequentSequence', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 500, 2), )

    
    ConsequentSequence = property(__ConsequentSequence.value, __ConsequentSequence.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_id', ELEMENT_ID, required=True)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 468, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 468, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute numberOfSets uses Python identifier numberOfSets
    __numberOfSets = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfSets'), 'numberOfSets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_numberOfSets', INT_NUMBER, required=True)
    __numberOfSets._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 469, 6)
    __numberOfSets._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 469, 6)
    
    numberOfSets = property(__numberOfSets.value, __numberOfSets.set, None, None)

    
    # Attribute occurrence uses Python identifier occurrence
    __occurrence = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'occurrence'), 'occurrence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_occurrence', INT_NUMBER, required=True)
    __occurrence._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 470, 6)
    __occurrence._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 470, 6)
    
    occurrence = property(__occurrence.value, __occurrence.set, None, None)

    
    # Attribute support uses Python identifier support
    __support = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'support'), 'support', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_support', REAL_NUMBER, required=True)
    __support._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 471, 6)
    __support._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 471, 6)
    
    support = property(__support.value, __support.set, None, None)

    
    # Attribute confidence uses Python identifier confidence
    __confidence = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'confidence'), 'confidence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_confidence', REAL_NUMBER, required=True)
    __confidence._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 472, 6)
    __confidence._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 472, 6)
    
    confidence = property(__confidence.value, __confidence.set, None, None)

    
    # Attribute lift uses Python identifier lift
    __lift = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'lift'), 'lift', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_102_lift', REAL_NUMBER)
    __lift._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 473, 6)
    __lift._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 473, 6)
    
    lift = property(__lift.value, __lift.set, None, None)

    _ElementMap.update({
        __Delimiter.name() : __Delimiter,
        __Time.name() : __Time,
        __AntecedentSequence.name() : __AntecedentSequence,
        __ConsequentSequence.name() : __ConsequentSequence,
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __id.name() : __id,
        __numberOfSets.name() : __numberOfSets,
        __occurrence.name() : __occurrence,
        __support.name() : __support,
        __confidence.name() : __confidence,
        __lift.name() : __lift
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_103 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 486, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_103_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute seqId uses Python identifier seqId
    __seqId = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'seqId'), 'seqId', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_103_seqId', ELEMENT_ID, required=True)
    __seqId._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 490, 6)
    __seqId._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 490, 6)
    
    seqId = property(__seqId.value, __seqId.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __seqId.name() : __seqId
    })



# Complex type {http://www.dmg.org/PMML-4_1}ArrayType with content type MIXED
class ArrayType (pyxb.binding.basis.complexTypeDefinition):
    """Complex type {http://www.dmg.org/PMML-4_1}ArrayType with content type MIXED"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_MIXED
    _Abstract = False
    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'ArrayType')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 592, 2)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Attribute n uses Python identifier n
    __n = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'n'), 'n', '__httpwww_dmg_orgPMML_4_1_ArrayType_n', INT_NUMBER)
    __n._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 593, 4)
    __n._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 593, 4)
    
    n = property(__n.value, __n.set, None, None)

    
    # Attribute type uses Python identifier type
    __type = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'type'), 'type', '__httpwww_dmg_orgPMML_4_1_ArrayType_type', STD_ANON_3, required=True)
    __type._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 594, 4)
    __type._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 594, 4)
    
    type = property(__type.value, __type.set, None, None)

    _ElementMap.update({
        
    })
    _AttributeMap.update({
        __n.name() : __n,
        __type.name() : __type
    })
Namespace.addCategoryObject('typeBinding', u'ArrayType', ArrayType)


# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_104 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 626, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Indices uses Python identifier Indices
    __Indices = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Indices'), 'Indices', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_104_httpwww_dmg_orgPMML_4_1Indices', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 645, 2), )

    
    Indices = property(__Indices.value, __Indices.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}INT-Entries uses Python identifier INT_Entries
    __INT_Entries = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'INT-Entries'), 'INT_Entries', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_104_httpwww_dmg_orgPMML_4_1INT_Entries', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 650, 2), )

    
    INT_Entries = property(__INT_Entries.value, __INT_Entries.set, None, None)

    
    # Attribute n uses Python identifier n
    __n = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'n'), 'n', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_104_n', INT_NUMBER)
    __n._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 631, 6)
    __n._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 631, 6)
    
    n = property(__n.value, __n.set, None, None)

    
    # Attribute defaultValue uses Python identifier defaultValue
    __defaultValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'defaultValue'), 'defaultValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_104_defaultValue', INT_NUMBER, unicode_default=u'0')
    __defaultValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 632, 6)
    __defaultValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 632, 6)
    
    defaultValue = property(__defaultValue.value, __defaultValue.set, None, None)

    _ElementMap.update({
        __Indices.name() : __Indices,
        __INT_Entries.name() : __INT_Entries
    })
    _AttributeMap.update({
        __n.name() : __n,
        __defaultValue.name() : __defaultValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_105 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 636, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Indices uses Python identifier Indices
    __Indices = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Indices'), 'Indices', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_105_httpwww_dmg_orgPMML_4_1Indices', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 645, 2), )

    
    Indices = property(__Indices.value, __Indices.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}REAL-Entries uses Python identifier REAL_Entries
    __REAL_Entries = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'REAL-Entries'), 'REAL_Entries', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_105_httpwww_dmg_orgPMML_4_1REAL_Entries', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 655, 2), )

    
    REAL_Entries = property(__REAL_Entries.value, __REAL_Entries.set, None, None)

    
    # Attribute n uses Python identifier n
    __n = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'n'), 'n', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_105_n', INT_NUMBER)
    __n._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 641, 6)
    __n._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 641, 6)
    
    n = property(__n.value, __n.set, None, None)

    
    # Attribute defaultValue uses Python identifier defaultValue
    __defaultValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'defaultValue'), 'defaultValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_105_defaultValue', REAL_NUMBER, unicode_default=u'0')
    __defaultValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 642, 6)
    __defaultValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 642, 6)
    
    defaultValue = property(__defaultValue.value, __defaultValue.set, None, None)

    _ElementMap.update({
        __Indices.name() : __Indices,
        __REAL_Entries.name() : __REAL_Entries
    })
    _AttributeMap.update({
        __n.name() : __n,
        __defaultValue.name() : __defaultValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_106 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 661, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_106_httpwww_dmg_orgPMML_4_1Array', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MatCell uses Python identifier MatCell
    __MatCell = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MatCell'), 'MatCell', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_106_httpwww_dmg_orgPMML_4_1MatCell', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 681, 2), )

    
    MatCell = property(__MatCell.value, __MatCell.set, None, None)

    
    # Attribute kind uses Python identifier kind
    __kind = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'kind'), 'kind', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_106_kind', STD_ANON_7, unicode_default=u'any')
    __kind._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 666, 6)
    __kind._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 666, 6)
    
    kind = property(__kind.value, __kind.set, None, None)

    
    # Attribute nbRows uses Python identifier nbRows
    __nbRows = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'nbRows'), 'nbRows', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_106_nbRows', INT_NUMBER)
    __nbRows._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 675, 6)
    __nbRows._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 675, 6)
    
    nbRows = property(__nbRows.value, __nbRows.set, None, None)

    
    # Attribute nbCols uses Python identifier nbCols
    __nbCols = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'nbCols'), 'nbCols', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_106_nbCols', INT_NUMBER)
    __nbCols._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 676, 6)
    __nbCols._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 676, 6)
    
    nbCols = property(__nbCols.value, __nbCols.set, None, None)

    
    # Attribute diagDefault uses Python identifier diagDefault
    __diagDefault = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'diagDefault'), 'diagDefault', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_106_diagDefault', REAL_NUMBER)
    __diagDefault._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 677, 6)
    __diagDefault._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 677, 6)
    
    diagDefault = property(__diagDefault.value, __diagDefault.set, None, None)

    
    # Attribute offDiagDefault uses Python identifier offDiagDefault
    __offDiagDefault = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'offDiagDefault'), 'offDiagDefault', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_106_offDiagDefault', REAL_NUMBER)
    __offDiagDefault._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 678, 6)
    __offDiagDefault._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 678, 6)
    
    offDiagDefault = property(__offDiagDefault.value, __offDiagDefault.set, None, None)

    _ElementMap.update({
        __Array.name() : __Array,
        __MatCell.name() : __MatCell
    })
    _AttributeMap.update({
        __kind.name() : __kind,
        __nbRows.name() : __nbRows,
        __nbCols.name() : __nbCols,
        __diagDefault.name() : __diagDefault,
        __offDiagDefault.name() : __offDiagDefault
    })



# Complex type [anonymous] with content type SIMPLE
class CTD_ANON_107 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type SIMPLE"""
    _TypeDefinition = pyxb.binding.datatypes.string
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_SIMPLE
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 682, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.string
    
    # Attribute row uses Python identifier row
    __row = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'row'), 'row', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_107_row', INT_NUMBER, required=True)
    __row._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 685, 10)
    __row._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 685, 10)
    
    row = property(__row.value, __row.set, None, None)

    
    # Attribute col uses Python identifier col
    __col = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'col'), 'col', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_107_col', INT_NUMBER, required=True)
    __col._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 686, 10)
    __col._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 686, 10)
    
    col = property(__col.value, __col.set, None, None)

    _ElementMap.update({
        
    })
    _AttributeMap.update({
        __row.name() : __row,
        __col.name() : __col
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_108 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 692, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Item uses Python identifier Item
    __Item = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Item'), 'Item', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_httpwww_dmg_orgPMML_4_1Item', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 720, 2), )

    
    Item = property(__Item.value, __Item.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Itemset uses Python identifier Itemset
    __Itemset = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Itemset'), 'Itemset', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_httpwww_dmg_orgPMML_4_1Itemset', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 731, 2), )

    
    Itemset = property(__Itemset.value, __Itemset.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}AssociationRule uses Python identifier AssociationRule
    __AssociationRule = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'AssociationRule'), 'AssociationRule', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_httpwww_dmg_orgPMML_4_1AssociationRule', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 750, 2), )

    
    AssociationRule = property(__AssociationRule.value, __AssociationRule.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 705, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 705, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 706, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 706, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 707, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 707, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute numberOfTransactions uses Python identifier numberOfTransactions
    __numberOfTransactions = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfTransactions'), 'numberOfTransactions', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_numberOfTransactions', INT_NUMBER, required=True)
    __numberOfTransactions._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 708, 6)
    __numberOfTransactions._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 708, 6)
    
    numberOfTransactions = property(__numberOfTransactions.value, __numberOfTransactions.set, None, None)

    
    # Attribute maxNumberOfItemsPerTA uses Python identifier maxNumberOfItemsPerTA
    __maxNumberOfItemsPerTA = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maxNumberOfItemsPerTA'), 'maxNumberOfItemsPerTA', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_maxNumberOfItemsPerTA', INT_NUMBER)
    __maxNumberOfItemsPerTA._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 709, 6)
    __maxNumberOfItemsPerTA._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 709, 6)
    
    maxNumberOfItemsPerTA = property(__maxNumberOfItemsPerTA.value, __maxNumberOfItemsPerTA.set, None, None)

    
    # Attribute avgNumberOfItemsPerTA uses Python identifier avgNumberOfItemsPerTA
    __avgNumberOfItemsPerTA = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'avgNumberOfItemsPerTA'), 'avgNumberOfItemsPerTA', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_avgNumberOfItemsPerTA', REAL_NUMBER)
    __avgNumberOfItemsPerTA._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 710, 6)
    __avgNumberOfItemsPerTA._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 710, 6)
    
    avgNumberOfItemsPerTA = property(__avgNumberOfItemsPerTA.value, __avgNumberOfItemsPerTA.set, None, None)

    
    # Attribute minimumSupport uses Python identifier minimumSupport
    __minimumSupport = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumSupport'), 'minimumSupport', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_minimumSupport', PROB_NUMBER, required=True)
    __minimumSupport._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 711, 6)
    __minimumSupport._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 711, 6)
    
    minimumSupport = property(__minimumSupport.value, __minimumSupport.set, None, None)

    
    # Attribute minimumConfidence uses Python identifier minimumConfidence
    __minimumConfidence = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimumConfidence'), 'minimumConfidence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_minimumConfidence', PROB_NUMBER, required=True)
    __minimumConfidence._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 712, 6)
    __minimumConfidence._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 712, 6)
    
    minimumConfidence = property(__minimumConfidence.value, __minimumConfidence.set, None, None)

    
    # Attribute lengthLimit uses Python identifier lengthLimit
    __lengthLimit = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'lengthLimit'), 'lengthLimit', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_lengthLimit', INT_NUMBER)
    __lengthLimit._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 713, 6)
    __lengthLimit._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 713, 6)
    
    lengthLimit = property(__lengthLimit.value, __lengthLimit.set, None, None)

    
    # Attribute numberOfItems uses Python identifier numberOfItems
    __numberOfItems = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfItems'), 'numberOfItems', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_numberOfItems', INT_NUMBER, required=True)
    __numberOfItems._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 714, 6)
    __numberOfItems._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 714, 6)
    
    numberOfItems = property(__numberOfItems.value, __numberOfItems.set, None, None)

    
    # Attribute numberOfItemsets uses Python identifier numberOfItemsets
    __numberOfItemsets = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfItemsets'), 'numberOfItemsets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_numberOfItemsets', INT_NUMBER, required=True)
    __numberOfItemsets._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 715, 6)
    __numberOfItemsets._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 715, 6)
    
    numberOfItemsets = property(__numberOfItemsets.value, __numberOfItemsets.set, None, None)

    
    # Attribute numberOfRules uses Python identifier numberOfRules
    __numberOfRules = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfRules'), 'numberOfRules', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_numberOfRules', INT_NUMBER, required=True)
    __numberOfRules._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 716, 6)
    __numberOfRules._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 716, 6)
    
    numberOfRules = property(__numberOfRules.value, __numberOfRules.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_108_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 717, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 717, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __Item.name() : __Item,
        __Itemset.name() : __Itemset,
        __AssociationRule.name() : __AssociationRule,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelStats.name() : __ModelStats,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __numberOfTransactions.name() : __numberOfTransactions,
        __maxNumberOfItemsPerTA.name() : __maxNumberOfItemsPerTA,
        __avgNumberOfItemsPerTA.name() : __avgNumberOfItemsPerTA,
        __minimumSupport.name() : __minimumSupport,
        __minimumConfidence.name() : __minimumConfidence,
        __lengthLimit.name() : __lengthLimit,
        __numberOfItems.name() : __numberOfItems,
        __numberOfItemsets.name() : __numberOfItemsets,
        __numberOfRules.name() : __numberOfRules,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_109 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 721, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_109_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_109_id', pyxb.binding.datatypes.string, required=True)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 725, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 725, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_109_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 726, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 726, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute mappedValue uses Python identifier mappedValue
    __mappedValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mappedValue'), 'mappedValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_109_mappedValue', pyxb.binding.datatypes.string)
    __mappedValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 727, 6)
    __mappedValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 727, 6)
    
    mappedValue = property(__mappedValue.value, __mappedValue.set, None, None)

    
    # Attribute weight uses Python identifier weight
    __weight = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'weight'), 'weight', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_109_weight', REAL_NUMBER)
    __weight._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 728, 6)
    __weight._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 728, 6)
    
    weight = property(__weight.value, __weight.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __id.name() : __id,
        __value.name() : __value,
        __mappedValue.name() : __mappedValue,
        __weight.name() : __weight
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_110 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 732, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_110_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ItemRef uses Python identifier ItemRef
    __ItemRef = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ItemRef'), 'ItemRef', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_110_httpwww_dmg_orgPMML_4_1ItemRef', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 742, 2), )

    
    ItemRef = property(__ItemRef.value, __ItemRef.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_110_id', pyxb.binding.datatypes.string, required=True)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 737, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 737, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute support uses Python identifier support
    __support = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'support'), 'support', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_110_support', PROB_NUMBER)
    __support._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 738, 6)
    __support._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 738, 6)
    
    support = property(__support.value, __support.set, None, None)

    
    # Attribute numberOfItems uses Python identifier numberOfItems
    __numberOfItems = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfItems'), 'numberOfItems', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_110_numberOfItems', pyxb.binding.datatypes.nonNegativeInteger)
    __numberOfItems._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 739, 6)
    __numberOfItems._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 739, 6)
    
    numberOfItems = property(__numberOfItems.value, __numberOfItems.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __ItemRef.name() : __ItemRef
    })
    _AttributeMap.update({
        __id.name() : __id,
        __support.name() : __support,
        __numberOfItems.name() : __numberOfItems
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_111 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 751, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_111_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute antecedent uses Python identifier antecedent
    __antecedent = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'antecedent'), 'antecedent', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_111_antecedent', pyxb.binding.datatypes.string, required=True)
    __antecedent._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 755, 6)
    __antecedent._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 755, 6)
    
    antecedent = property(__antecedent.value, __antecedent.set, None, None)

    
    # Attribute consequent uses Python identifier consequent
    __consequent = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'consequent'), 'consequent', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_111_consequent', pyxb.binding.datatypes.string, required=True)
    __consequent._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 756, 6)
    __consequent._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 756, 6)
    
    consequent = property(__consequent.value, __consequent.set, None, None)

    
    # Attribute support uses Python identifier support
    __support = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'support'), 'support', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_111_support', PROB_NUMBER, required=True)
    __support._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 757, 6)
    __support._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 757, 6)
    
    support = property(__support.value, __support.set, None, None)

    
    # Attribute confidence uses Python identifier confidence
    __confidence = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'confidence'), 'confidence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_111_confidence', PROB_NUMBER, required=True)
    __confidence._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 758, 6)
    __confidence._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 758, 6)
    
    confidence = property(__confidence.value, __confidence.set, None, None)

    
    # Attribute lift uses Python identifier lift
    __lift = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'lift'), 'lift', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_111_lift', pyxb.binding.datatypes.float)
    __lift._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 759, 6)
    __lift._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 759, 6)
    
    lift = property(__lift.value, __lift.set, None, None)

    
    # Attribute leverage uses Python identifier leverage
    __leverage = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'leverage'), 'leverage', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_111_leverage', pyxb.binding.datatypes.float)
    __leverage._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 760, 6)
    __leverage._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 760, 6)
    
    leverage = property(__leverage.value, __leverage.set, None, None)

    
    # Attribute affinity uses Python identifier affinity
    __affinity = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'affinity'), 'affinity', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_111_affinity', PROB_NUMBER)
    __affinity._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 761, 6)
    __affinity._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 761, 6)
    
    affinity = property(__affinity.value, __affinity.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_111_id', pyxb.binding.datatypes.string)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 762, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 762, 6)
    
    id = property(__id.value, __id.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __antecedent.name() : __antecedent,
        __consequent.name() : __consequent,
        __support.name() : __support,
        __confidence.name() : __confidence,
        __lift.name() : __lift,
        __leverage.name() : __leverage,
        __affinity.name() : __affinity,
        __id.name() : __id
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_112 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 801, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ComparisonMeasure uses Python identifier ComparisonMeasure
    __ComparisonMeasure = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ComparisonMeasure'), 'ComparisonMeasure', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1ComparisonMeasure', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 110, 2), )

    
    ComparisonMeasure = property(__ComparisonMeasure.value, __ComparisonMeasure.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TrainingInstances uses Python identifier TrainingInstances
    __TrainingInstances = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TrainingInstances'), 'TrainingInstances', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1TrainingInstances', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 827, 2), )

    
    TrainingInstances = property(__TrainingInstances.value, __TrainingInstances.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}KNNInputs uses Python identifier KNNInputs
    __KNNInputs = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'KNNInputs'), 'KNNInputs', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1KNNInputs', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 859, 2), )

    
    KNNInputs = property(__KNNInputs.value, __KNNInputs.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 816, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 816, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 817, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 817, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 818, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 818, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute numberOfNeighbors uses Python identifier numberOfNeighbors
    __numberOfNeighbors = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfNeighbors'), 'numberOfNeighbors', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_numberOfNeighbors', INT_NUMBER, required=True)
    __numberOfNeighbors._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 819, 6)
    __numberOfNeighbors._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 819, 6)
    
    numberOfNeighbors = property(__numberOfNeighbors.value, __numberOfNeighbors.set, None, None)

    
    # Attribute continuousScoringMethod uses Python identifier continuousScoringMethod
    __continuousScoringMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'continuousScoringMethod'), 'continuousScoringMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_continuousScoringMethod', CONT_SCORING_METHOD, unicode_default=u'average')
    __continuousScoringMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 820, 6)
    __continuousScoringMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 820, 6)
    
    continuousScoringMethod = property(__continuousScoringMethod.value, __continuousScoringMethod.set, None, None)

    
    # Attribute categoricalScoringMethod uses Python identifier categoricalScoringMethod
    __categoricalScoringMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'categoricalScoringMethod'), 'categoricalScoringMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_categoricalScoringMethod', CAT_SCORING_METHOD, unicode_default=u'majorityVote')
    __categoricalScoringMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 821, 6)
    __categoricalScoringMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 821, 6)
    
    categoricalScoringMethod = property(__categoricalScoringMethod.value, __categoricalScoringMethod.set, None, None)

    
    # Attribute instanceIdVariable uses Python identifier instanceIdVariable
    __instanceIdVariable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'instanceIdVariable'), 'instanceIdVariable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_instanceIdVariable', pyxb.binding.datatypes.string)
    __instanceIdVariable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 822, 6)
    __instanceIdVariable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 822, 6)
    
    instanceIdVariable = property(__instanceIdVariable.value, __instanceIdVariable.set, None, None)

    
    # Attribute threshold uses Python identifier threshold
    __threshold = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'threshold'), 'threshold', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_threshold', REAL_NUMBER, unicode_default=u'0.001')
    __threshold._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 823, 6)
    __threshold._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 823, 6)
    
    threshold = property(__threshold.value, __threshold.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_112_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 824, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 824, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ComparisonMeasure.name() : __ComparisonMeasure,
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __TrainingInstances.name() : __TrainingInstances,
        __KNNInputs.name() : __KNNInputs,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __numberOfNeighbors.name() : __numberOfNeighbors,
        __continuousScoringMethod.name() : __continuousScoringMethod,
        __categoricalScoringMethod.name() : __categoricalScoringMethod,
        __instanceIdVariable.name() : __instanceIdVariable,
        __threshold.name() : __threshold,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_113 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 828, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_113_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}InstanceFields uses Python identifier InstanceFields
    __InstanceFields = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'InstanceFields'), 'InstanceFields', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_113_httpwww_dmg_orgPMML_4_1InstanceFields', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 842, 2), )

    
    InstanceFields = property(__InstanceFields.value, __InstanceFields.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TableLocator uses Python identifier TableLocator
    __TableLocator = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TableLocator'), 'TableLocator', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_113_httpwww_dmg_orgPMML_4_1TableLocator', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2996, 2), )

    
    TableLocator = property(__TableLocator.value, __TableLocator.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}InlineTable uses Python identifier InlineTable
    __InlineTable = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'InlineTable'), 'InlineTable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_113_httpwww_dmg_orgPMML_4_1InlineTable', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3003, 2), )

    
    InlineTable = property(__InlineTable.value, __InlineTable.set, None, None)

    
    # Attribute isTransformed uses Python identifier isTransformed
    __isTransformed = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isTransformed'), 'isTransformed', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_113_isTransformed', pyxb.binding.datatypes.boolean, unicode_default=u'false')
    __isTransformed._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 837, 6)
    __isTransformed._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 837, 6)
    
    isTransformed = property(__isTransformed.value, __isTransformed.set, None, None)

    
    # Attribute recordCount uses Python identifier recordCount
    __recordCount = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'recordCount'), 'recordCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_113_recordCount', INT_NUMBER)
    __recordCount._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 838, 6)
    __recordCount._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 838, 6)
    
    recordCount = property(__recordCount.value, __recordCount.set, None, None)

    
    # Attribute fieldCount uses Python identifier fieldCount
    __fieldCount = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'fieldCount'), 'fieldCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_113_fieldCount', INT_NUMBER)
    __fieldCount._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 839, 6)
    __fieldCount._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 839, 6)
    
    fieldCount = property(__fieldCount.value, __fieldCount.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __InstanceFields.name() : __InstanceFields,
        __TableLocator.name() : __TableLocator,
        __InlineTable.name() : __InlineTable
    })
    _AttributeMap.update({
        __isTransformed.name() : __isTransformed,
        __recordCount.name() : __recordCount,
        __fieldCount.name() : __fieldCount
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_114 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 868, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_114_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_114_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 872, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 872, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute fieldWeight uses Python identifier fieldWeight
    __fieldWeight = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'fieldWeight'), 'fieldWeight', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_114_fieldWeight', REAL_NUMBER, unicode_default=u'1')
    __fieldWeight._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 873, 6)
    __fieldWeight._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 873, 6)
    
    fieldWeight = property(__fieldWeight.value, __fieldWeight.set, None, None)

    
    # Attribute compareFunction uses Python identifier compareFunction
    __compareFunction = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'compareFunction'), 'compareFunction', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_114_compareFunction', COMPARE_FUNCTION)
    __compareFunction._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 874, 6)
    __compareFunction._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 874, 6)
    
    compareFunction = property(__compareFunction.value, __compareFunction.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __fieldWeight.name() : __fieldWeight,
        __compareFunction.name() : __compareFunction
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_115 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 891, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RegressionTable uses Python identifier RegressionTable
    __RegressionTable = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RegressionTable'), 'RegressionTable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_httpwww_dmg_orgPMML_4_1RegressionTable', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 934, 2), )

    
    RegressionTable = property(__RegressionTable.value, __RegressionTable.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 904, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 904, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 905, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 905, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 906, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 906, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute modelType uses Python identifier modelType
    __modelType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelType'), 'modelType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_modelType', STD_ANON_8)
    __modelType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 907, 6)
    __modelType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 907, 6)
    
    modelType = property(__modelType.value, __modelType.set, None, None)

    
    # Attribute targetFieldName uses Python identifier targetFieldName
    __targetFieldName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetFieldName'), 'targetFieldName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_targetFieldName', FIELD_NAME)
    __targetFieldName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 916, 6)
    __targetFieldName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 916, 6)
    
    targetFieldName = property(__targetFieldName.value, __targetFieldName.set, None, None)

    
    # Attribute normalizationMethod uses Python identifier normalizationMethod
    __normalizationMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'normalizationMethod'), 'normalizationMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_normalizationMethod', REGRESSIONNORMALIZATIONMETHOD, unicode_default=u'none')
    __normalizationMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 917, 6)
    __normalizationMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 917, 6)
    
    normalizationMethod = property(__normalizationMethod.value, __normalizationMethod.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_115_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 918, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 918, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __RegressionTable.name() : __RegressionTable,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __modelType.name() : __modelType,
        __targetFieldName.name() : __targetFieldName,
        __normalizationMethod.name() : __normalizationMethod,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_116 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 935, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_116_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NumericPredictor uses Python identifier NumericPredictor
    __NumericPredictor = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NumericPredictor'), 'NumericPredictor', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_116_httpwww_dmg_orgPMML_4_1NumericPredictor', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 946, 2), )

    
    NumericPredictor = property(__NumericPredictor.value, __NumericPredictor.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CategoricalPredictor uses Python identifier CategoricalPredictor
    __CategoricalPredictor = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CategoricalPredictor'), 'CategoricalPredictor', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_116_httpwww_dmg_orgPMML_4_1CategoricalPredictor', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 956, 2), )

    
    CategoricalPredictor = property(__CategoricalPredictor.value, __CategoricalPredictor.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PredictorTerm uses Python identifier PredictorTerm
    __PredictorTerm = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PredictorTerm'), 'PredictorTerm', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_116_httpwww_dmg_orgPMML_4_1PredictorTerm', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 966, 2), )

    
    PredictorTerm = property(__PredictorTerm.value, __PredictorTerm.set, None, None)

    
    # Attribute intercept uses Python identifier intercept
    __intercept = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'intercept'), 'intercept', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_116_intercept', REAL_NUMBER, required=True)
    __intercept._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 942, 6)
    __intercept._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 942, 6)
    
    intercept = property(__intercept.value, __intercept.set, None, None)

    
    # Attribute targetCategory uses Python identifier targetCategory
    __targetCategory = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetCategory'), 'targetCategory', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_116_targetCategory', pyxb.binding.datatypes.string)
    __targetCategory._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 943, 6)
    __targetCategory._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 943, 6)
    
    targetCategory = property(__targetCategory.value, __targetCategory.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __NumericPredictor.name() : __NumericPredictor,
        __CategoricalPredictor.name() : __CategoricalPredictor,
        __PredictorTerm.name() : __PredictorTerm
    })
    _AttributeMap.update({
        __intercept.name() : __intercept,
        __targetCategory.name() : __targetCategory
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_117 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 947, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_117_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_117_name', FIELD_NAME, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 951, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 951, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute exponent uses Python identifier exponent
    __exponent = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'exponent'), 'exponent', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_117_exponent', INT_NUMBER, unicode_default=u'1')
    __exponent._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 952, 6)
    __exponent._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 952, 6)
    
    exponent = property(__exponent.value, __exponent.set, None, None)

    
    # Attribute coefficient uses Python identifier coefficient
    __coefficient = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'coefficient'), 'coefficient', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_117_coefficient', REAL_NUMBER, required=True)
    __coefficient._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 953, 6)
    __coefficient._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 953, 6)
    
    coefficient = property(__coefficient.value, __coefficient.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __name.name() : __name,
        __exponent.name() : __exponent,
        __coefficient.name() : __coefficient
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_118 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 957, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_118_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_118_name', FIELD_NAME, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 961, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 961, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_118_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 962, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 962, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute coefficient uses Python identifier coefficient
    __coefficient = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'coefficient'), 'coefficient', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_118_coefficient', REAL_NUMBER, required=True)
    __coefficient._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 963, 6)
    __coefficient._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 963, 6)
    
    coefficient = property(__coefficient.value, __coefficient.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __name.name() : __name,
        __value.name() : __value,
        __coefficient.name() : __coefficient
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_119 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 967, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_119_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldRef uses Python identifier FieldRef
    __FieldRef = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), 'FieldRef', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_119_httpwww_dmg_orgPMML_4_1FieldRef', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2), )

    
    FieldRef = property(__FieldRef.value, __FieldRef.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_119_name', FIELD_NAME)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 972, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 972, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute coefficient uses Python identifier coefficient
    __coefficient = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'coefficient'), 'coefficient', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_119_coefficient', REAL_NUMBER, required=True)
    __coefficient._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 973, 6)
    __coefficient._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 973, 6)
    
    coefficient = property(__coefficient.value, __coefficient.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __FieldRef.name() : __FieldRef
    })
    _AttributeMap.update({
        __name.name() : __name,
        __coefficient.name() : __coefficient
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_120 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1006, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Apply uses Python identifier Apply
    __Apply = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Apply'), 'Apply', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1Apply', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 260, 2), )

    
    Apply = property(__Apply.value, __Apply.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Constant uses Python identifier Constant
    __Constant = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Constant'), 'Constant', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1Constant', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1018, 2), )

    
    Constant = property(__Constant.value, __Constant.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldRef uses Python identifier FieldRef
    __FieldRef = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), 'FieldRef', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1FieldRef', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2), )

    
    FieldRef = property(__FieldRef.value, __FieldRef.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NormContinuous uses Python identifier NormContinuous
    __NormContinuous = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous'), 'NormContinuous', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1NormContinuous', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1036, 2), )

    
    NormContinuous = property(__NormContinuous.value, __NormContinuous.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NormDiscrete uses Python identifier NormDiscrete
    __NormDiscrete = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete'), 'NormDiscrete', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1NormDiscrete', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1056, 2), )

    
    NormDiscrete = property(__NormDiscrete.value, __NormDiscrete.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Discretize uses Python identifier Discretize
    __Discretize = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Discretize'), 'Discretize', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1Discretize', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1073, 2), )

    
    Discretize = property(__Discretize.value, __Discretize.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MapValues uses Python identifier MapValues
    __MapValues = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MapValues'), 'MapValues', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1MapValues', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1094, 2), )

    
    MapValues = property(__MapValues.value, __MapValues.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Aggregate uses Python identifier Aggregate
    __Aggregate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Aggregate'), 'Aggregate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1Aggregate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1119, 2), )

    
    Aggregate = property(__Aggregate.value, __Aggregate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Value uses Python identifier Value
    __Value = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Value'), 'Value', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_httpwww_dmg_orgPMML_4_1Value', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2818, 2), )

    
    Value = property(__Value.value, __Value.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_name', FIELD_NAME)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1012, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1012, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute displayName uses Python identifier displayName
    __displayName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'displayName'), 'displayName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_displayName', pyxb.binding.datatypes.string)
    __displayName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1013, 6)
    __displayName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1013, 6)
    
    displayName = property(__displayName.value, __displayName.set, None, None)

    
    # Attribute optype uses Python identifier optype
    __optype = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'optype'), 'optype', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_optype', OPTYPE, required=True)
    __optype._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1014, 6)
    __optype._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1014, 6)
    
    optype = property(__optype.value, __optype.set, None, None)

    
    # Attribute dataType uses Python identifier dataType
    __dataType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataType'), 'dataType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_120_dataType', DATATYPE, required=True)
    __dataType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1015, 6)
    __dataType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1015, 6)
    
    dataType = property(__dataType.value, __dataType.set, None, None)

    _ElementMap.update({
        __Apply.name() : __Apply,
        __Extension.name() : __Extension,
        __Constant.name() : __Constant,
        __FieldRef.name() : __FieldRef,
        __NormContinuous.name() : __NormContinuous,
        __NormDiscrete.name() : __NormDiscrete,
        __Discretize.name() : __Discretize,
        __MapValues.name() : __MapValues,
        __Aggregate.name() : __Aggregate,
        __Value.name() : __Value
    })
    _AttributeMap.update({
        __name.name() : __name,
        __displayName.name() : __displayName,
        __optype.name() : __optype,
        __dataType.name() : __dataType
    })



# Complex type [anonymous] with content type SIMPLE
class CTD_ANON_121 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type SIMPLE"""
    _TypeDefinition = pyxb.binding.datatypes.string
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_SIMPLE
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1019, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.string
    
    # Attribute dataType uses Python identifier dataType
    __dataType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataType'), 'dataType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_121_dataType', DATATYPE)
    __dataType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1022, 10)
    __dataType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1022, 10)
    
    dataType = property(__dataType.value, __dataType.set, None, None)

    _ElementMap.update({
        
    })
    _AttributeMap.update({
        __dataType.name() : __dataType
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_122 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1028, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_122_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_122_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1032, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1032, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute mapMissingTo uses Python identifier mapMissingTo
    __mapMissingTo = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mapMissingTo'), 'mapMissingTo', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_122_mapMissingTo', pyxb.binding.datatypes.string)
    __mapMissingTo._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1033, 6)
    __mapMissingTo._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1033, 6)
    
    mapMissingTo = property(__mapMissingTo.value, __mapMissingTo.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __mapMissingTo.name() : __mapMissingTo
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_123 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1037, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_123_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LinearNorm uses Python identifier LinearNorm
    __LinearNorm = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LinearNorm'), 'LinearNorm', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_123_httpwww_dmg_orgPMML_4_1LinearNorm', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1047, 2), )

    
    LinearNorm = property(__LinearNorm.value, __LinearNorm.set, None, None)

    
    # Attribute mapMissingTo uses Python identifier mapMissingTo
    __mapMissingTo = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mapMissingTo'), 'mapMissingTo', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_123_mapMissingTo', NUMBER)
    __mapMissingTo._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1042, 6)
    __mapMissingTo._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1042, 6)
    
    mapMissingTo = property(__mapMissingTo.value, __mapMissingTo.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_123_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1043, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1043, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute outliers uses Python identifier outliers
    __outliers = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'outliers'), 'outliers', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_123_outliers', OUTLIER_TREATMENT_METHOD, unicode_default=u'asIs')
    __outliers._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1044, 6)
    __outliers._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1044, 6)
    
    outliers = property(__outliers.value, __outliers.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __LinearNorm.name() : __LinearNorm
    })
    _AttributeMap.update({
        __mapMissingTo.name() : __mapMissingTo,
        __field.name() : __field,
        __outliers.name() : __outliers
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_124 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1048, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_124_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute orig uses Python identifier orig
    __orig = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'orig'), 'orig', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_124_orig', NUMBER, required=True)
    __orig._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1052, 6)
    __orig._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1052, 6)
    
    orig = property(__orig.value, __orig.set, None, None)

    
    # Attribute norm uses Python identifier norm
    __norm = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'norm'), 'norm', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_124_norm', NUMBER, required=True)
    __norm._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1053, 6)
    __norm._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1053, 6)
    
    norm = property(__norm.value, __norm.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __orig.name() : __orig,
        __norm.name() : __norm
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_125 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1057, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_125_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_125_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1061, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1061, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute method uses Python identifier method
    __method = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'method'), 'method', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_125_method', STD_ANON_9, fixed=True, unicode_default=u'indicator')
    __method._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1062, 6)
    __method._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1062, 6)
    
    method = property(__method.value, __method.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_125_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1069, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1069, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute mapMissingTo uses Python identifier mapMissingTo
    __mapMissingTo = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mapMissingTo'), 'mapMissingTo', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_125_mapMissingTo', NUMBER)
    __mapMissingTo._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1070, 6)
    __mapMissingTo._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1070, 6)
    
    mapMissingTo = property(__mapMissingTo.value, __mapMissingTo.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __method.name() : __method,
        __value.name() : __value,
        __mapMissingTo.name() : __mapMissingTo
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_126 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1074, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_126_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DiscretizeBin uses Python identifier DiscretizeBin
    __DiscretizeBin = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DiscretizeBin'), 'DiscretizeBin', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_126_httpwww_dmg_orgPMML_4_1DiscretizeBin', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1085, 2), )

    
    DiscretizeBin = property(__DiscretizeBin.value, __DiscretizeBin.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_126_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1079, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1079, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute mapMissingTo uses Python identifier mapMissingTo
    __mapMissingTo = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mapMissingTo'), 'mapMissingTo', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_126_mapMissingTo', pyxb.binding.datatypes.string)
    __mapMissingTo._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1080, 6)
    __mapMissingTo._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1080, 6)
    
    mapMissingTo = property(__mapMissingTo.value, __mapMissingTo.set, None, None)

    
    # Attribute defaultValue uses Python identifier defaultValue
    __defaultValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'defaultValue'), 'defaultValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_126_defaultValue', pyxb.binding.datatypes.string)
    __defaultValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1081, 6)
    __defaultValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1081, 6)
    
    defaultValue = property(__defaultValue.value, __defaultValue.set, None, None)

    
    # Attribute dataType uses Python identifier dataType
    __dataType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataType'), 'dataType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_126_dataType', DATATYPE)
    __dataType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1082, 6)
    __dataType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1082, 6)
    
    dataType = property(__dataType.value, __dataType.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __DiscretizeBin.name() : __DiscretizeBin
    })
    _AttributeMap.update({
        __field.name() : __field,
        __mapMissingTo.name() : __mapMissingTo,
        __defaultValue.name() : __defaultValue,
        __dataType.name() : __dataType
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_127 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1095, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_127_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldColumnPair uses Python identifier FieldColumnPair
    __FieldColumnPair = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldColumnPair'), 'FieldColumnPair', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_127_httpwww_dmg_orgPMML_4_1FieldColumnPair', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1110, 2), )

    
    FieldColumnPair = property(__FieldColumnPair.value, __FieldColumnPair.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TableLocator uses Python identifier TableLocator
    __TableLocator = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TableLocator'), 'TableLocator', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_127_httpwww_dmg_orgPMML_4_1TableLocator', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2996, 2), )

    
    TableLocator = property(__TableLocator.value, __TableLocator.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}InlineTable uses Python identifier InlineTable
    __InlineTable = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'InlineTable'), 'InlineTable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_127_httpwww_dmg_orgPMML_4_1InlineTable', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3003, 2), )

    
    InlineTable = property(__InlineTable.value, __InlineTable.set, None, None)

    
    # Attribute mapMissingTo uses Python identifier mapMissingTo
    __mapMissingTo = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mapMissingTo'), 'mapMissingTo', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_127_mapMissingTo', pyxb.binding.datatypes.string)
    __mapMissingTo._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1104, 6)
    __mapMissingTo._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1104, 6)
    
    mapMissingTo = property(__mapMissingTo.value, __mapMissingTo.set, None, None)

    
    # Attribute defaultValue uses Python identifier defaultValue
    __defaultValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'defaultValue'), 'defaultValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_127_defaultValue', pyxb.binding.datatypes.string)
    __defaultValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1105, 6)
    __defaultValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1105, 6)
    
    defaultValue = property(__defaultValue.value, __defaultValue.set, None, None)

    
    # Attribute outputColumn uses Python identifier outputColumn
    __outputColumn = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'outputColumn'), 'outputColumn', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_127_outputColumn', pyxb.binding.datatypes.string, required=True)
    __outputColumn._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1106, 6)
    __outputColumn._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1106, 6)
    
    outputColumn = property(__outputColumn.value, __outputColumn.set, None, None)

    
    # Attribute dataType uses Python identifier dataType
    __dataType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataType'), 'dataType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_127_dataType', DATATYPE)
    __dataType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1107, 6)
    __dataType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1107, 6)
    
    dataType = property(__dataType.value, __dataType.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __FieldColumnPair.name() : __FieldColumnPair,
        __TableLocator.name() : __TableLocator,
        __InlineTable.name() : __InlineTable
    })
    _AttributeMap.update({
        __mapMissingTo.name() : __mapMissingTo,
        __defaultValue.name() : __defaultValue,
        __outputColumn.name() : __outputColumn,
        __dataType.name() : __dataType
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_128 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1111, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_128_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_128_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1115, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1115, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute column uses Python identifier column
    __column = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'column'), 'column', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_128_column', pyxb.binding.datatypes.string, required=True)
    __column._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1116, 6)
    __column._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1116, 6)
    
    column = property(__column.value, __column.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __column.name() : __column
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_129 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1120, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_129_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_129_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1124, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1124, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute function uses Python identifier function
    __function = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'function'), 'function', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_129_function', STD_ANON_10, required=True)
    __function._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1125, 6)
    __function._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1125, 6)
    
    function = property(__function.value, __function.set, None, None)

    
    # Attribute groupField uses Python identifier groupField
    __groupField = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'groupField'), 'groupField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_129_groupField', FIELD_NAME)
    __groupField._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1137, 6)
    __groupField._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1137, 6)
    
    groupField = property(__groupField.value, __groupField.set, None, None)

    
    # Attribute sqlWhere uses Python identifier sqlWhere
    __sqlWhere = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'sqlWhere'), 'sqlWhere', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_129_sqlWhere', pyxb.binding.datatypes.string)
    __sqlWhere._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1138, 6)
    __sqlWhere._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1138, 6)
    
    sqlWhere = property(__sqlWhere.value, __sqlWhere.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __function.name() : __function,
        __groupField.name() : __groupField,
        __sqlWhere.name() : __sqlWhere
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_130 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1142, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TimeSeries uses Python identifier TimeSeries
    __TimeSeries = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TimeSeries'), 'TimeSeries', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1TimeSeries', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1173, 2), )

    
    TimeSeries = property(__TimeSeries.value, __TimeSeries.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ExponentialSmoothing uses Python identifier ExponentialSmoothing
    __ExponentialSmoothing = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ExponentialSmoothing'), 'ExponentialSmoothing', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1ExponentialSmoothing', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1278, 2), )

    
    ExponentialSmoothing = property(__ExponentialSmoothing.value, __ExponentialSmoothing.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SpectralAnalysis uses Python identifier SpectralAnalysis
    __SpectralAnalysis = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SpectralAnalysis'), 'SpectralAnalysis', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1SpectralAnalysis', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1344, 2), )

    
    SpectralAnalysis = property(__SpectralAnalysis.value, __SpectralAnalysis.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ARIMA uses Python identifier ARIMA
    __ARIMA = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ARIMA'), 'ARIMA', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1ARIMA', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1345, 2), )

    
    ARIMA = property(__ARIMA.value, __ARIMA.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SeasonalTrendDecomposition uses Python identifier SeasonalTrendDecomposition
    __SeasonalTrendDecomposition = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SeasonalTrendDecomposition'), 'SeasonalTrendDecomposition', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1SeasonalTrendDecomposition', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1346, 2), )

    
    SeasonalTrendDecomposition = property(__SeasonalTrendDecomposition.value, __SeasonalTrendDecomposition.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1158, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1158, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1159, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1159, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1160, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1160, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute bestFit uses Python identifier bestFit
    __bestFit = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'bestFit'), 'bestFit', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_bestFit', TIMESERIES_ALGORITHM, required=True)
    __bestFit._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1161, 6)
    __bestFit._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1161, 6)
    
    bestFit = property(__bestFit.value, __bestFit.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_130_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1162, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1162, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __TimeSeries.name() : __TimeSeries,
        __ExponentialSmoothing.name() : __ExponentialSmoothing,
        __SpectralAnalysis.name() : __SpectralAnalysis,
        __ARIMA.name() : __ARIMA,
        __SeasonalTrendDecomposition.name() : __SeasonalTrendDecomposition,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __bestFit.name() : __bestFit,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_131 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1174, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}TimeValue uses Python identifier TimeValue
    __TimeValue = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TimeValue'), 'TimeValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_131_httpwww_dmg_orgPMML_4_1TimeValue', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1192, 2), )

    
    TimeValue = property(__TimeValue.value, __TimeValue.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TimeAnchor uses Python identifier TimeAnchor
    __TimeAnchor = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TimeAnchor'), 'TimeAnchor', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_131_httpwww_dmg_orgPMML_4_1TimeAnchor', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1203, 2), )

    
    TimeAnchor = property(__TimeAnchor.value, __TimeAnchor.set, None, None)

    
    # Attribute usage uses Python identifier usage
    __usage = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'usage'), 'usage', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_131_usage', TIMESERIES_USAGE, unicode_default=u'original')
    __usage._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1179, 6)
    __usage._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1179, 6)
    
    usage = property(__usage.value, __usage.set, None, None)

    
    # Attribute startTime uses Python identifier startTime
    __startTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'startTime'), 'startTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_131_startTime', REAL_NUMBER)
    __startTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1180, 6)
    __startTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1180, 6)
    
    startTime = property(__startTime.value, __startTime.set, None, None)

    
    # Attribute endTime uses Python identifier endTime
    __endTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'endTime'), 'endTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_131_endTime', REAL_NUMBER)
    __endTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1181, 6)
    __endTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1181, 6)
    
    endTime = property(__endTime.value, __endTime.set, None, None)

    
    # Attribute interpolationMethod uses Python identifier interpolationMethod
    __interpolationMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'interpolationMethod'), 'interpolationMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_131_interpolationMethod', INTERPOLATION_METHOD, unicode_default=u'none')
    __interpolationMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1182, 6)
    __interpolationMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1182, 6)
    
    interpolationMethod = property(__interpolationMethod.value, __interpolationMethod.set, None, None)

    _ElementMap.update({
        __TimeValue.name() : __TimeValue,
        __TimeAnchor.name() : __TimeAnchor
    })
    _AttributeMap.update({
        __usage.name() : __usage,
        __startTime.name() : __startTime,
        __endTime.name() : __endTime,
        __interpolationMethod.name() : __interpolationMethod
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_132 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1193, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Timestamp uses Python identifier Timestamp
    __Timestamp = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Timestamp'), 'Timestamp', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_132_httpwww_dmg_orgPMML_4_1Timestamp', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 793, 2), )

    
    Timestamp = property(__Timestamp.value, __Timestamp.set, None, None)

    
    # Attribute index uses Python identifier index
    __index = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'index'), 'index', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_132_index', INT_NUMBER)
    __index._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1197, 6)
    __index._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1197, 6)
    
    index = property(__index.value, __index.set, None, None)

    
    # Attribute time uses Python identifier time
    __time = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'time'), 'time', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_132_time', NUMBER)
    __time._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1198, 6)
    __time._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1198, 6)
    
    time = property(__time.value, __time.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_132_value', REAL_NUMBER, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1199, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1199, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute standardError uses Python identifier standardError
    __standardError = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'standardError'), 'standardError', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_132_standardError', REAL_NUMBER)
    __standardError._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1200, 6)
    __standardError._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1200, 6)
    
    standardError = property(__standardError.value, __standardError.set, None, None)

    _ElementMap.update({
        __Timestamp.name() : __Timestamp
    })
    _AttributeMap.update({
        __index.name() : __index,
        __time.name() : __time,
        __value.name() : __value,
        __standardError.name() : __standardError
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_133 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1204, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}TimeCycle uses Python identifier TimeCycle
    __TimeCycle = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TimeCycle'), 'TimeCycle', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_133_httpwww_dmg_orgPMML_4_1TimeCycle', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1215, 2), )

    
    TimeCycle = property(__TimeCycle.value, __TimeCycle.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TimeException uses Python identifier TimeException
    __TimeException = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TimeException'), 'TimeException', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_133_httpwww_dmg_orgPMML_4_1TimeException', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1255, 2), )

    
    TimeException = property(__TimeException.value, __TimeException.set, None, None)

    
    # Attribute type uses Python identifier type
    __type = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'type'), 'type', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_133_type', TIME_ANCHOR)
    __type._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1209, 6)
    __type._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1209, 6)
    
    type = property(__type.value, __type.set, None, None)

    
    # Attribute offset uses Python identifier offset
    __offset = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'offset'), 'offset', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_133_offset', INT_NUMBER)
    __offset._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1210, 6)
    __offset._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1210, 6)
    
    offset = property(__offset.value, __offset.set, None, None)

    
    # Attribute stepsize uses Python identifier stepsize
    __stepsize = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'stepsize'), 'stepsize', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_133_stepsize', INT_NUMBER)
    __stepsize._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1211, 6)
    __stepsize._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1211, 6)
    
    stepsize = property(__stepsize.value, __stepsize.set, None, None)

    
    # Attribute displayName uses Python identifier displayName
    __displayName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'displayName'), 'displayName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_133_displayName', pyxb.binding.datatypes.anySimpleType)
    __displayName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1212, 6)
    __displayName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1212, 6)
    
    displayName = property(__displayName.value, __displayName.set, None, None)

    _ElementMap.update({
        __TimeCycle.name() : __TimeCycle,
        __TimeException.name() : __TimeException
    })
    _AttributeMap.update({
        __type.name() : __type,
        __offset.name() : __offset,
        __stepsize.name() : __stepsize,
        __displayName.name() : __displayName
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_134 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1216, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_134_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Attribute length uses Python identifier length
    __length = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'length'), 'length', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_134_length', INT_NUMBER)
    __length._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1220, 6)
    __length._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1220, 6)
    
    length = property(__length.value, __length.set, None, None)

    
    # Attribute type uses Python identifier type
    __type = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'type'), 'type', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_134_type', VALID_TIME_SPEC)
    __type._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1221, 6)
    __type._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1221, 6)
    
    type = property(__type.value, __type.set, None, None)

    
    # Attribute displayName uses Python identifier displayName
    __displayName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'displayName'), 'displayName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_134_displayName', pyxb.binding.datatypes.anySimpleType)
    __displayName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1222, 6)
    __displayName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1222, 6)
    
    displayName = property(__displayName.value, __displayName.set, None, None)

    _ElementMap.update({
        __Array.name() : __Array
    })
    _AttributeMap.update({
        __length.name() : __length,
        __type.name() : __type,
        __displayName.name() : __displayName
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_135 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1256, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_135_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Attribute type uses Python identifier type
    __type = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'type'), 'type', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_135_type', TIME_EXCEPTION_TYPE)
    __type._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1260, 6)
    __type._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1260, 6)
    
    type = property(__type.value, __type.set, None, None)

    
    # Attribute count uses Python identifier count
    __count = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'count'), 'count', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_135_count', INT_NUMBER)
    __count._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1261, 6)
    __count._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1261, 6)
    
    count = property(__count.value, __count.set, None, None)

    _ElementMap.update({
        __Array.name() : __Array
    })
    _AttributeMap.update({
        __type.name() : __type,
        __count.name() : __count
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_136 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1279, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}TimeValue uses Python identifier TimeValue
    __TimeValue = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TimeValue'), 'TimeValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_136_httpwww_dmg_orgPMML_4_1TimeValue', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1192, 2), )

    
    TimeValue = property(__TimeValue.value, __TimeValue.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Level uses Python identifier Level
    __Level = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Level'), 'Level', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_136_httpwww_dmg_orgPMML_4_1Level', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1298, 2), )

    
    Level = property(__Level.value, __Level.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Trend_ExpoSmooth uses Python identifier Trend_ExpoSmooth
    __Trend_ExpoSmooth = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Trend_ExpoSmooth'), 'Trend_ExpoSmooth', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_136_httpwww_dmg_orgPMML_4_1Trend_ExpoSmooth', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1304, 2), )

    
    Trend_ExpoSmooth = property(__Trend_ExpoSmooth.value, __Trend_ExpoSmooth.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Seasonality_ExpoSmooth uses Python identifier Seasonality_ExpoSmooth
    __Seasonality_ExpoSmooth = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Seasonality_ExpoSmooth'), 'Seasonality_ExpoSmooth', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_136_httpwww_dmg_orgPMML_4_1Seasonality_ExpoSmooth', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1325, 2), )

    
    Seasonality_ExpoSmooth = property(__Seasonality_ExpoSmooth.value, __Seasonality_ExpoSmooth.set, None, None)

    
    # Attribute RMSE uses Python identifier RMSE
    __RMSE = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'RMSE'), 'RMSE', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_136_RMSE', REAL_NUMBER)
    __RMSE._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1286, 6)
    __RMSE._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1286, 6)
    
    RMSE = property(__RMSE.value, __RMSE.set, None, None)

    
    # Attribute transformation uses Python identifier transformation
    __transformation = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'transformation'), 'transformation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_136_transformation', STD_ANON_11, unicode_default=u'none')
    __transformation._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1287, 6)
    __transformation._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1287, 6)
    
    transformation = property(__transformation.value, __transformation.set, None, None)

    _ElementMap.update({
        __TimeValue.name() : __TimeValue,
        __Level.name() : __Level,
        __Trend_ExpoSmooth.name() : __Trend_ExpoSmooth,
        __Seasonality_ExpoSmooth.name() : __Seasonality_ExpoSmooth
    })
    _AttributeMap.update({
        __RMSE.name() : __RMSE,
        __transformation.name() : __transformation
    })



# Complex type [anonymous] with content type EMPTY
class CTD_ANON_137 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type EMPTY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_EMPTY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1299, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Attribute alpha uses Python identifier alpha
    __alpha = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'alpha'), 'alpha', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_137_alpha', REAL_NUMBER)
    __alpha._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1300, 6)
    __alpha._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1300, 6)
    
    alpha = property(__alpha.value, __alpha.set, None, None)

    
    # Attribute smoothedValue uses Python identifier smoothedValue
    __smoothedValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'smoothedValue'), 'smoothedValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_137_smoothedValue', REAL_NUMBER)
    __smoothedValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1301, 6)
    __smoothedValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1301, 6)
    
    smoothedValue = property(__smoothedValue.value, __smoothedValue.set, None, None)

    _ElementMap.update({
        
    })
    _AttributeMap.update({
        __alpha.name() : __alpha,
        __smoothedValue.name() : __smoothedValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_138 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1305, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_138_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Attribute trend uses Python identifier trend
    __trend = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'trend'), 'trend', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_138_trend', STD_ANON_12, unicode_default=u'additive')
    __trend._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1309, 6)
    __trend._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1309, 6)
    
    trend = property(__trend.value, __trend.set, None, None)

    
    # Attribute gamma uses Python identifier gamma
    __gamma = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'gamma'), 'gamma', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_138_gamma', REAL_NUMBER)
    __gamma._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1320, 6)
    __gamma._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1320, 6)
    
    gamma = property(__gamma.value, __gamma.set, None, None)

    
    # Attribute phi uses Python identifier phi
    __phi = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'phi'), 'phi', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_138_phi', REAL_NUMBER, unicode_default=u'1')
    __phi._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1321, 6)
    __phi._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1321, 6)
    
    phi = property(__phi.value, __phi.set, None, None)

    
    # Attribute smoothedValue uses Python identifier smoothedValue
    __smoothedValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'smoothedValue'), 'smoothedValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_138_smoothedValue', REAL_NUMBER)
    __smoothedValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1322, 6)
    __smoothedValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1322, 6)
    
    smoothedValue = property(__smoothedValue.value, __smoothedValue.set, None, None)

    _ElementMap.update({
        __Array.name() : __Array
    })
    _AttributeMap.update({
        __trend.name() : __trend,
        __gamma.name() : __gamma,
        __phi.name() : __phi,
        __smoothedValue.name() : __smoothedValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_139 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1326, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_139_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Attribute type uses Python identifier type
    __type = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'type'), 'type', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_139_type', STD_ANON_13, required=True)
    __type._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1330, 6)
    __type._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1330, 6)
    
    type = property(__type.value, __type.set, None, None)

    
    # Attribute period uses Python identifier period
    __period = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'period'), 'period', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_139_period', INT_NUMBER, required=True)
    __period._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1338, 6)
    __period._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1338, 6)
    
    period = property(__period.value, __period.set, None, None)

    
    # Attribute unit uses Python identifier unit
    __unit = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'unit'), 'unit', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_139_unit', pyxb.binding.datatypes.string)
    __unit._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1339, 6)
    __unit._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1339, 6)
    
    unit = property(__unit.value, __unit.set, None, None)

    
    # Attribute phase uses Python identifier phase
    __phase = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'phase'), 'phase', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_139_phase', INT_NUMBER)
    __phase._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1340, 6)
    __phase._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1340, 6)
    
    phase = property(__phase.value, __phase.set, None, None)

    
    # Attribute delta uses Python identifier delta
    __delta = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'delta'), 'delta', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_139_delta', REAL_NUMBER)
    __delta._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1341, 6)
    __delta._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1341, 6)
    
    delta = property(__delta.value, __delta.set, None, None)

    _ElementMap.update({
        __Array.name() : __Array
    })
    _AttributeMap.update({
        __type.name() : __type,
        __period.name() : __period,
        __unit.name() : __unit,
        __phase.name() : __phase,
        __delta.name() : __delta
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_140 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1348, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LinearKernelType uses Python identifier LinearKernelType
    __LinearKernelType = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LinearKernelType'), 'LinearKernelType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1LinearKernelType', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1391, 2), )

    
    LinearKernelType = property(__LinearKernelType.value, __LinearKernelType.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PolynomialKernelType uses Python identifier PolynomialKernelType
    __PolynomialKernelType = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PolynomialKernelType'), 'PolynomialKernelType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1PolynomialKernelType', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1399, 2), )

    
    PolynomialKernelType = property(__PolynomialKernelType.value, __PolynomialKernelType.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RadialBasisKernelType uses Python identifier RadialBasisKernelType
    __RadialBasisKernelType = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RadialBasisKernelType'), 'RadialBasisKernelType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1RadialBasisKernelType', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1410, 2), )

    
    RadialBasisKernelType = property(__RadialBasisKernelType.value, __RadialBasisKernelType.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SigmoidKernelType uses Python identifier SigmoidKernelType
    __SigmoidKernelType = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SigmoidKernelType'), 'SigmoidKernelType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1SigmoidKernelType', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1419, 2), )

    
    SigmoidKernelType = property(__SigmoidKernelType.value, __SigmoidKernelType.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}VectorDictionary uses Python identifier VectorDictionary
    __VectorDictionary = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'VectorDictionary'), 'VectorDictionary', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1VectorDictionary', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1432, 2), )

    
    VectorDictionary = property(__VectorDictionary.value, __VectorDictionary.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SupportVectorMachine uses Python identifier SupportVectorMachine
    __SupportVectorMachine = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachine'), 'SupportVectorMachine', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1SupportVectorMachine', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1463, 2), )

    
    SupportVectorMachine = property(__SupportVectorMachine.value, __SupportVectorMachine.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1370, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1370, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1371, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1371, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1372, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1372, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute threshold uses Python identifier threshold
    __threshold = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'threshold'), 'threshold', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_threshold', REAL_NUMBER, unicode_default=u'0')
    __threshold._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1373, 6)
    __threshold._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1373, 6)
    
    threshold = property(__threshold.value, __threshold.set, None, None)

    
    # Attribute svmRepresentation uses Python identifier svmRepresentation
    __svmRepresentation = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'svmRepresentation'), 'svmRepresentation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_svmRepresentation', SVM_REPRESENTATION, unicode_default=u'SupportVectors')
    __svmRepresentation._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1374, 6)
    __svmRepresentation._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1374, 6)
    
    svmRepresentation = property(__svmRepresentation.value, __svmRepresentation.set, None, None)

    
    # Attribute classificationMethod uses Python identifier classificationMethod
    __classificationMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'classificationMethod'), 'classificationMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_classificationMethod', SVM_CLASSIFICATION_METHOD, unicode_default=u'OneAgainstAll')
    __classificationMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1375, 6)
    __classificationMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1375, 6)
    
    classificationMethod = property(__classificationMethod.value, __classificationMethod.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_140_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1376, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1376, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __LinearKernelType.name() : __LinearKernelType,
        __PolynomialKernelType.name() : __PolynomialKernelType,
        __RadialBasisKernelType.name() : __RadialBasisKernelType,
        __SigmoidKernelType.name() : __SigmoidKernelType,
        __VectorDictionary.name() : __VectorDictionary,
        __SupportVectorMachine.name() : __SupportVectorMachine,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __threshold.name() : __threshold,
        __svmRepresentation.name() : __svmRepresentation,
        __classificationMethod.name() : __classificationMethod,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_141 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1400, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_141_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute description uses Python identifier description
    __description = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'description'), 'description', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_141_description', pyxb.binding.datatypes.string)
    __description._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1404, 6)
    __description._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1404, 6)
    
    description = property(__description.value, __description.set, None, None)

    
    # Attribute gamma uses Python identifier gamma
    __gamma = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'gamma'), 'gamma', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_141_gamma', REAL_NUMBER, unicode_default=u'1')
    __gamma._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1405, 6)
    __gamma._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1405, 6)
    
    gamma = property(__gamma.value, __gamma.set, None, None)

    
    # Attribute coef0 uses Python identifier coef0
    __coef0 = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'coef0'), 'coef0', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_141_coef0', REAL_NUMBER, unicode_default=u'1')
    __coef0._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1406, 6)
    __coef0._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1406, 6)
    
    coef0 = property(__coef0.value, __coef0.set, None, None)

    
    # Attribute degree uses Python identifier degree
    __degree = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'degree'), 'degree', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_141_degree', REAL_NUMBER, unicode_default=u'1')
    __degree._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1407, 6)
    __degree._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1407, 6)
    
    degree = property(__degree.value, __degree.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __description.name() : __description,
        __gamma.name() : __gamma,
        __coef0.name() : __coef0,
        __degree.name() : __degree
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_142 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1411, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_142_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute description uses Python identifier description
    __description = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'description'), 'description', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_142_description', pyxb.binding.datatypes.string)
    __description._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1415, 6)
    __description._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1415, 6)
    
    description = property(__description.value, __description.set, None, None)

    
    # Attribute gamma uses Python identifier gamma
    __gamma = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'gamma'), 'gamma', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_142_gamma', REAL_NUMBER, unicode_default=u'1')
    __gamma._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1416, 6)
    __gamma._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1416, 6)
    
    gamma = property(__gamma.value, __gamma.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __description.name() : __description,
        __gamma.name() : __gamma
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_143 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1420, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_143_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute description uses Python identifier description
    __description = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'description'), 'description', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_143_description', pyxb.binding.datatypes.string)
    __description._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1424, 6)
    __description._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1424, 6)
    
    description = property(__description.value, __description.set, None, None)

    
    # Attribute gamma uses Python identifier gamma
    __gamma = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'gamma'), 'gamma', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_143_gamma', REAL_NUMBER, unicode_default=u'1')
    __gamma._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1425, 6)
    __gamma._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1425, 6)
    
    gamma = property(__gamma.value, __gamma.set, None, None)

    
    # Attribute coef0 uses Python identifier coef0
    __coef0 = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'coef0'), 'coef0', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_143_coef0', REAL_NUMBER, unicode_default=u'1')
    __coef0._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1426, 6)
    __coef0._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1426, 6)
    
    coef0 = property(__coef0.value, __coef0.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __description.name() : __description,
        __gamma.name() : __gamma,
        __coef0.name() : __coef0
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_144 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1433, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_144_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}VectorFields uses Python identifier VectorFields
    __VectorFields = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'VectorFields'), 'VectorFields', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_144_httpwww_dmg_orgPMML_4_1VectorFields', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1442, 2), )

    
    VectorFields = property(__VectorFields.value, __VectorFields.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}VectorInstance uses Python identifier VectorInstance
    __VectorInstance = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'VectorInstance'), 'VectorInstance', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_144_httpwww_dmg_orgPMML_4_1VectorInstance', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1451, 2), )

    
    VectorInstance = property(__VectorInstance.value, __VectorInstance.set, None, None)

    
    # Attribute numberOfVectors uses Python identifier numberOfVectors
    __numberOfVectors = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfVectors'), 'numberOfVectors', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_144_numberOfVectors', INT_NUMBER)
    __numberOfVectors._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1439, 6)
    __numberOfVectors._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1439, 6)
    
    numberOfVectors = property(__numberOfVectors.value, __numberOfVectors.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __VectorFields.name() : __VectorFields,
        __VectorInstance.name() : __VectorInstance
    })
    _AttributeMap.update({
        __numberOfVectors.name() : __numberOfVectors
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_145 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1443, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_145_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldRef uses Python identifier FieldRef
    __FieldRef = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), 'FieldRef', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_145_httpwww_dmg_orgPMML_4_1FieldRef', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2), )

    
    FieldRef = property(__FieldRef.value, __FieldRef.set, None, None)

    
    # Attribute numberOfFields uses Python identifier numberOfFields
    __numberOfFields = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfFields'), 'numberOfFields', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_145_numberOfFields', INT_NUMBER)
    __numberOfFields._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1448, 6)
    __numberOfFields._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1448, 6)
    
    numberOfFields = property(__numberOfFields.value, __numberOfFields.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __FieldRef.name() : __FieldRef
    })
    _AttributeMap.update({
        __numberOfFields.name() : __numberOfFields
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_146 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1452, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_146_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_146_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}REAL-SparseArray uses Python identifier REAL_SparseArray
    __REAL_SparseArray = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'REAL-SparseArray'), 'REAL_SparseArray', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_146_httpwww_dmg_orgPMML_4_1REAL_SparseArray', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 635, 2), )

    
    REAL_SparseArray = property(__REAL_SparseArray.value, __REAL_SparseArray.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_146_id', VECTOR_ID, required=True)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1460, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1460, 6)
    
    id = property(__id.value, __id.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array,
        __REAL_SparseArray.name() : __REAL_SparseArray
    })
    _AttributeMap.update({
        __id.name() : __id
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_147 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1464, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_147_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SupportVectors uses Python identifier SupportVectors
    __SupportVectors = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SupportVectors'), 'SupportVectors', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_147_httpwww_dmg_orgPMML_4_1SupportVectors', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1475, 2), )

    
    SupportVectors = property(__SupportVectors.value, __SupportVectors.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Coefficients uses Python identifier Coefficients
    __Coefficients = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Coefficients'), 'Coefficients', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_147_httpwww_dmg_orgPMML_4_1Coefficients', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1493, 2), )

    
    Coefficients = property(__Coefficients.value, __Coefficients.set, None, None)

    
    # Attribute targetCategory uses Python identifier targetCategory
    __targetCategory = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetCategory'), 'targetCategory', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_147_targetCategory', pyxb.binding.datatypes.string)
    __targetCategory._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1470, 6)
    __targetCategory._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1470, 6)
    
    targetCategory = property(__targetCategory.value, __targetCategory.set, None, None)

    
    # Attribute alternateTargetCategory uses Python identifier alternateTargetCategory
    __alternateTargetCategory = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'alternateTargetCategory'), 'alternateTargetCategory', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_147_alternateTargetCategory', pyxb.binding.datatypes.string)
    __alternateTargetCategory._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1471, 6)
    __alternateTargetCategory._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1471, 6)
    
    alternateTargetCategory = property(__alternateTargetCategory.value, __alternateTargetCategory.set, None, None)

    
    # Attribute threshold uses Python identifier threshold
    __threshold = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'threshold'), 'threshold', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_147_threshold', REAL_NUMBER)
    __threshold._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1472, 6)
    __threshold._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1472, 6)
    
    threshold = property(__threshold.value, __threshold.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __SupportVectors.name() : __SupportVectors,
        __Coefficients.name() : __Coefficients
    })
    _AttributeMap.update({
        __targetCategory.name() : __targetCategory,
        __alternateTargetCategory.name() : __alternateTargetCategory,
        __threshold.name() : __threshold
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_148 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1476, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_148_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SupportVector uses Python identifier SupportVector
    __SupportVector = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SupportVector'), 'SupportVector', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_148_httpwww_dmg_orgPMML_4_1SupportVector', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1485, 2), )

    
    SupportVector = property(__SupportVector.value, __SupportVector.set, None, None)

    
    # Attribute numberOfSupportVectors uses Python identifier numberOfSupportVectors
    __numberOfSupportVectors = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfSupportVectors'), 'numberOfSupportVectors', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_148_numberOfSupportVectors', INT_NUMBER)
    __numberOfSupportVectors._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1481, 6)
    __numberOfSupportVectors._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1481, 6)
    
    numberOfSupportVectors = property(__numberOfSupportVectors.value, __numberOfSupportVectors.set, None, None)

    
    # Attribute numberOfAttributes uses Python identifier numberOfAttributes
    __numberOfAttributes = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfAttributes'), 'numberOfAttributes', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_148_numberOfAttributes', INT_NUMBER)
    __numberOfAttributes._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1482, 6)
    __numberOfAttributes._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1482, 6)
    
    numberOfAttributes = property(__numberOfAttributes.value, __numberOfAttributes.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __SupportVector.name() : __SupportVector
    })
    _AttributeMap.update({
        __numberOfSupportVectors.name() : __numberOfSupportVectors,
        __numberOfAttributes.name() : __numberOfAttributes
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_149 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1486, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_149_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute vectorId uses Python identifier vectorId
    __vectorId = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'vectorId'), 'vectorId', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_149_vectorId', VECTOR_ID, required=True)
    __vectorId._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1490, 6)
    __vectorId._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1490, 6)
    
    vectorId = property(__vectorId.value, __vectorId.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __vectorId.name() : __vectorId
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_150 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1494, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_150_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Coefficient uses Python identifier Coefficient
    __Coefficient = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Coefficient'), 'Coefficient', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_150_httpwww_dmg_orgPMML_4_1Coefficient', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1503, 2), )

    
    Coefficient = property(__Coefficient.value, __Coefficient.set, None, None)

    
    # Attribute numberOfCoefficients uses Python identifier numberOfCoefficients
    __numberOfCoefficients = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfCoefficients'), 'numberOfCoefficients', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_150_numberOfCoefficients', INT_NUMBER)
    __numberOfCoefficients._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1499, 6)
    __numberOfCoefficients._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1499, 6)
    
    numberOfCoefficients = property(__numberOfCoefficients.value, __numberOfCoefficients.set, None, None)

    
    # Attribute absoluteValue uses Python identifier absoluteValue
    __absoluteValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'absoluteValue'), 'absoluteValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_150_absoluteValue', REAL_NUMBER, unicode_default=u'0')
    __absoluteValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1500, 6)
    __absoluteValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1500, 6)
    
    absoluteValue = property(__absoluteValue.value, __absoluteValue.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Coefficient.name() : __Coefficient
    })
    _AttributeMap.update({
        __numberOfCoefficients.name() : __numberOfCoefficients,
        __absoluteValue.name() : __absoluteValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_151 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1504, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_151_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_151_value', REAL_NUMBER, unicode_default=u'0')
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1508, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1508, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __value.name() : __value
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_152 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1512, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TextDictionary uses Python identifier TextDictionary
    __TextDictionary = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TextDictionary'), 'TextDictionary', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1TextDictionary', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1537, 2), )

    
    TextDictionary = property(__TextDictionary.value, __TextDictionary.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TextCorpus uses Python identifier TextCorpus
    __TextCorpus = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TextCorpus'), 'TextCorpus', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1TextCorpus', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1546, 2), )

    
    TextCorpus = property(__TextCorpus.value, __TextCorpus.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DocumentTermMatrix uses Python identifier DocumentTermMatrix
    __DocumentTermMatrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DocumentTermMatrix'), 'DocumentTermMatrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1DocumentTermMatrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1565, 2), )

    
    DocumentTermMatrix = property(__DocumentTermMatrix.value, __DocumentTermMatrix.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TextModelNormalization uses Python identifier TextModelNormalization
    __TextModelNormalization = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TextModelNormalization'), 'TextModelNormalization', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1TextModelNormalization', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1573, 2), )

    
    TextModelNormalization = property(__TextModelNormalization.value, __TextModelNormalization.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TextModelSimiliarity uses Python identifier TextModelSimiliarity
    __TextModelSimiliarity = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TextModelSimiliarity'), 'TextModelSimiliarity', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1TextModelSimiliarity', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1609, 2), )

    
    TextModelSimiliarity = property(__TextModelSimiliarity.value, __TextModelSimiliarity.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1529, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1529, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1530, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1530, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1531, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1531, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute numberOfTerms uses Python identifier numberOfTerms
    __numberOfTerms = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfTerms'), 'numberOfTerms', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_numberOfTerms', pyxb.binding.datatypes.integer, required=True)
    __numberOfTerms._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1532, 6)
    __numberOfTerms._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1532, 6)
    
    numberOfTerms = property(__numberOfTerms.value, __numberOfTerms.set, None, None)

    
    # Attribute numberOfDocuments uses Python identifier numberOfDocuments
    __numberOfDocuments = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfDocuments'), 'numberOfDocuments', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_numberOfDocuments', pyxb.binding.datatypes.integer, required=True)
    __numberOfDocuments._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1533, 6)
    __numberOfDocuments._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1533, 6)
    
    numberOfDocuments = property(__numberOfDocuments.value, __numberOfDocuments.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_152_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1534, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1534, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __TextDictionary.name() : __TextDictionary,
        __TextCorpus.name() : __TextCorpus,
        __DocumentTermMatrix.name() : __DocumentTermMatrix,
        __TextModelNormalization.name() : __TextModelNormalization,
        __TextModelSimiliarity.name() : __TextModelSimiliarity,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __numberOfTerms.name() : __numberOfTerms,
        __numberOfDocuments.name() : __numberOfDocuments,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_153 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1555, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_153_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_153_id', pyxb.binding.datatypes.string, required=True)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1559, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1559, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_153_name', pyxb.binding.datatypes.string)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1560, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1560, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute length uses Python identifier length
    __length = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'length'), 'length', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_153_length', INT_NUMBER)
    __length._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1561, 6)
    __length._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1561, 6)
    
    length = property(__length.value, __length.set, None, None)

    
    # Attribute file uses Python identifier file
    __file = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'file'), 'file', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_153_file', pyxb.binding.datatypes.string)
    __file._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1562, 6)
    __file._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1562, 6)
    
    file = property(__file.value, __file.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __id.name() : __id,
        __name.name() : __name,
        __length.name() : __length,
        __file.name() : __file
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_154 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1574, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_154_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute localTermWeights uses Python identifier localTermWeights
    __localTermWeights = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'localTermWeights'), 'localTermWeights', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_154_localTermWeights', STD_ANON_14, unicode_default=u'termFrequency')
    __localTermWeights._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1578, 6)
    __localTermWeights._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1578, 6)
    
    localTermWeights = property(__localTermWeights.value, __localTermWeights.set, None, None)

    
    # Attribute globalTermWeights uses Python identifier globalTermWeights
    __globalTermWeights = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'globalTermWeights'), 'globalTermWeights', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_154_globalTermWeights', STD_ANON_15, unicode_default=u'inverseDocumentFrequency')
    __globalTermWeights._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1588, 6)
    __globalTermWeights._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1588, 6)
    
    globalTermWeights = property(__globalTermWeights.value, __globalTermWeights.set, None, None)

    
    # Attribute documentNormalization uses Python identifier documentNormalization
    __documentNormalization = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'documentNormalization'), 'documentNormalization', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_154_documentNormalization', STD_ANON_16, unicode_default=u'none')
    __documentNormalization._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1599, 6)
    __documentNormalization._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1599, 6)
    
    documentNormalization = property(__documentNormalization.value, __documentNormalization.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __localTermWeights.name() : __localTermWeights,
        __globalTermWeights.name() : __globalTermWeights,
        __documentNormalization.name() : __documentNormalization
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_155 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1610, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_155_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute similarityType uses Python identifier similarityType
    __similarityType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'similarityType'), 'similarityType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_155_similarityType', STD_ANON_17)
    __similarityType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1614, 6)
    __similarityType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1614, 6)
    
    similarityType = property(__similarityType.value, __similarityType.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __similarityType.name() : __similarityType
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_156 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1625, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Node uses Python identifier Node
    __Node = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Node'), 'Node', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_httpwww_dmg_orgPMML_4_1Node', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1655, 2), )

    
    Node = property(__Node.value, __Node.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1638, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1638, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1639, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1639, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1640, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1640, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute missingValueStrategy uses Python identifier missingValueStrategy
    __missingValueStrategy = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'missingValueStrategy'), 'missingValueStrategy', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_missingValueStrategy', MISSING_VALUE_STRATEGY, unicode_default=u'none')
    __missingValueStrategy._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1641, 6)
    __missingValueStrategy._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1641, 6)
    
    missingValueStrategy = property(__missingValueStrategy.value, __missingValueStrategy.set, None, None)

    
    # Attribute missingValuePenalty uses Python identifier missingValuePenalty
    __missingValuePenalty = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'missingValuePenalty'), 'missingValuePenalty', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_missingValuePenalty', PROB_NUMBER, unicode_default=u'1.0')
    __missingValuePenalty._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1642, 6)
    __missingValuePenalty._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1642, 6)
    
    missingValuePenalty = property(__missingValuePenalty.value, __missingValuePenalty.set, None, None)

    
    # Attribute noTrueChildStrategy uses Python identifier noTrueChildStrategy
    __noTrueChildStrategy = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'noTrueChildStrategy'), 'noTrueChildStrategy', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_noTrueChildStrategy', NO_TRUE_CHILD_STRATEGY, unicode_default=u'returnNullPrediction')
    __noTrueChildStrategy._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1643, 6)
    __noTrueChildStrategy._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1643, 6)
    
    noTrueChildStrategy = property(__noTrueChildStrategy.value, __noTrueChildStrategy.set, None, None)

    
    # Attribute splitCharacteristic uses Python identifier splitCharacteristic
    __splitCharacteristic = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'splitCharacteristic'), 'splitCharacteristic', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_splitCharacteristic', STD_ANON_18, unicode_default=u'multiSplit')
    __splitCharacteristic._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1644, 6)
    __splitCharacteristic._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1644, 6)
    
    splitCharacteristic = property(__splitCharacteristic.value, __splitCharacteristic.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_156_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1652, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1652, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __Node.name() : __Node,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __missingValueStrategy.name() : __missingValueStrategy,
        __missingValuePenalty.name() : __missingValuePenalty,
        __noTrueChildStrategy.name() : __noTrueChildStrategy,
        __splitCharacteristic.name() : __splitCharacteristic,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_157 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1656, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Node uses Python identifier Node
    __Node = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Node'), 'Node', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1Node', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1655, 2), )

    
    Node = property(__Node.value, __Node.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimplePredicate uses Python identifier SimplePredicate
    __SimplePredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), 'SimplePredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1SimplePredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2), )

    
    SimplePredicate = property(__SimplePredicate.value, __SimplePredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CompoundPredicate uses Python identifier CompoundPredicate
    __CompoundPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), 'CompoundPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1CompoundPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2), )

    
    CompoundPredicate = property(__CompoundPredicate.value, __CompoundPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimpleSetPredicate uses Python identifier SimpleSetPredicate
    __SimpleSetPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), 'SimpleSetPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1SimpleSetPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2), )

    
    SimpleSetPredicate = property(__SimpleSetPredicate.value, __SimpleSetPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}True uses Python identifier True_
    __True = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'True'), 'True_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1True', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2), )

    
    True_ = property(__True.value, __True.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}False uses Python identifier False_
    __False = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'False'), 'False_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1False', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2), )

    
    False_ = property(__False.value, __False.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ScoreDistribution uses Python identifier ScoreDistribution
    __ScoreDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution'), 'ScoreDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1ScoreDistribution', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1758, 2), )

    
    ScoreDistribution = property(__ScoreDistribution.value, __ScoreDistribution.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Regression uses Python identifier Regression
    __Regression = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Regression'), 'Regression', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1Regression', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1865, 2), )

    
    Regression = property(__Regression.value, __Regression.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DecisionTree uses Python identifier DecisionTree
    __DecisionTree = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DecisionTree'), 'DecisionTree', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1DecisionTree', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1882, 2), )

    
    DecisionTree = property(__DecisionTree.value, __DecisionTree.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Partition uses Python identifier Partition
    __Partition = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Partition'), 'Partition', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_httpwww_dmg_orgPMML_4_1Partition', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2424, 2), )

    
    Partition = property(__Partition.value, __Partition.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_id', pyxb.binding.datatypes.string)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1669, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1669, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute score uses Python identifier score
    __score = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'score'), 'score', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_score', pyxb.binding.datatypes.string)
    __score._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1670, 6)
    __score._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1670, 6)
    
    score = property(__score.value, __score.set, None, None)

    
    # Attribute recordCount uses Python identifier recordCount
    __recordCount = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'recordCount'), 'recordCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_recordCount', NUMBER)
    __recordCount._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1671, 6)
    __recordCount._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1671, 6)
    
    recordCount = property(__recordCount.value, __recordCount.set, None, None)

    
    # Attribute defaultChild uses Python identifier defaultChild
    __defaultChild = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'defaultChild'), 'defaultChild', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_157_defaultChild', pyxb.binding.datatypes.string)
    __defaultChild._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1672, 6)
    __defaultChild._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1672, 6)
    
    defaultChild = property(__defaultChild.value, __defaultChild.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Node.name() : __Node,
        __SimplePredicate.name() : __SimplePredicate,
        __CompoundPredicate.name() : __CompoundPredicate,
        __SimpleSetPredicate.name() : __SimpleSetPredicate,
        __True.name() : __True,
        __False.name() : __False,
        __ScoreDistribution.name() : __ScoreDistribution,
        __Regression.name() : __Regression,
        __DecisionTree.name() : __DecisionTree,
        __Partition.name() : __Partition
    })
    _AttributeMap.update({
        __id.name() : __id,
        __score.name() : __score,
        __recordCount.name() : __recordCount,
        __defaultChild.name() : __defaultChild
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_158 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1685, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_158_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_158_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1689, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1689, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute operator uses Python identifier operator
    __operator = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'operator'), 'operator', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_158_operator', STD_ANON_19, required=True)
    __operator._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1690, 6)
    __operator._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1690, 6)
    
    operator = property(__operator.value, __operator.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_158_value', pyxb.binding.datatypes.string)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1704, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1704, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __operator.name() : __operator,
        __value.name() : __value
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_159 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1708, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_159_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimplePredicate uses Python identifier SimplePredicate
    __SimplePredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), 'SimplePredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_159_httpwww_dmg_orgPMML_4_1SimplePredicate', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2), )

    
    SimplePredicate = property(__SimplePredicate.value, __SimplePredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CompoundPredicate uses Python identifier CompoundPredicate
    __CompoundPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), 'CompoundPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_159_httpwww_dmg_orgPMML_4_1CompoundPredicate', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2), )

    
    CompoundPredicate = property(__CompoundPredicate.value, __CompoundPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimpleSetPredicate uses Python identifier SimpleSetPredicate
    __SimpleSetPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), 'SimpleSetPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_159_httpwww_dmg_orgPMML_4_1SimpleSetPredicate', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2), )

    
    SimpleSetPredicate = property(__SimpleSetPredicate.value, __SimpleSetPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}True uses Python identifier True_
    __True = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'True'), 'True_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_159_httpwww_dmg_orgPMML_4_1True', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2), )

    
    True_ = property(__True.value, __True.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}False uses Python identifier False_
    __False = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'False'), 'False_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_159_httpwww_dmg_orgPMML_4_1False', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2), )

    
    False_ = property(__False.value, __False.set, None, None)

    
    # Attribute booleanOperator uses Python identifier booleanOperator
    __booleanOperator = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'booleanOperator'), 'booleanOperator', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_159_booleanOperator', STD_ANON_20, required=True)
    __booleanOperator._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1715, 6)
    __booleanOperator._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1715, 6)
    
    booleanOperator = property(__booleanOperator.value, __booleanOperator.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __SimplePredicate.name() : __SimplePredicate,
        __CompoundPredicate.name() : __CompoundPredicate,
        __SimpleSetPredicate.name() : __SimpleSetPredicate,
        __True.name() : __True,
        __False.name() : __False
    })
    _AttributeMap.update({
        __booleanOperator.name() : __booleanOperator
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_160 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1728, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_160_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_160_httpwww_dmg_orgPMML_4_1Array', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_160_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1733, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1733, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute booleanOperator uses Python identifier booleanOperator
    __booleanOperator = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'booleanOperator'), 'booleanOperator', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_160_booleanOperator', STD_ANON_21, required=True)
    __booleanOperator._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1734, 6)
    __booleanOperator._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1734, 6)
    
    booleanOperator = property(__booleanOperator.value, __booleanOperator.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array
    })
    _AttributeMap.update({
        __field.name() : __field,
        __booleanOperator.name() : __booleanOperator
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_161 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1759, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_161_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_161_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1763, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1763, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute recordCount uses Python identifier recordCount
    __recordCount = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'recordCount'), 'recordCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_161_recordCount', NUMBER, required=True)
    __recordCount._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1764, 6)
    __recordCount._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1764, 6)
    
    recordCount = property(__recordCount.value, __recordCount.set, None, None)

    
    # Attribute confidence uses Python identifier confidence
    __confidence = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'confidence'), 'confidence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_161_confidence', PROB_NUMBER)
    __confidence._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1765, 6)
    __confidence._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1765, 6)
    
    confidence = property(__confidence.value, __confidence.set, None, None)

    
    # Attribute probability uses Python identifier probability
    __probability = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'probability'), 'probability', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_161_probability', PROB_NUMBER)
    __probability._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1766, 6)
    __probability._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1766, 6)
    
    probability = property(__probability.value, __probability.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __value.name() : __value,
        __recordCount.name() : __recordCount,
        __confidence.name() : __confidence,
        __probability.name() : __probability
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_162 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1786, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Segmentation uses Python identifier Segmentation
    __Segmentation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Segmentation'), 'Segmentation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1Segmentation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1809, 2), )

    
    Segmentation = property(__Segmentation.value, __Segmentation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Regression uses Python identifier Regression
    __Regression = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Regression'), 'Regression', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1Regression', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1865, 2), )

    
    Regression = property(__Regression.value, __Regression.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DecisionTree uses Python identifier DecisionTree
    __DecisionTree = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DecisionTree'), 'DecisionTree', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1DecisionTree', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1882, 2), )

    
    DecisionTree = property(__DecisionTree.value, __DecisionTree.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1803, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1803, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1804, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1804, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1805, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1805, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_162_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1806, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1806, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __Segmentation.name() : __Segmentation,
        __Regression.name() : __Regression,
        __DecisionTree.name() : __DecisionTree,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_163 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1810, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_163_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Segment uses Python identifier Segment
    __Segment = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Segment'), 'Segment', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_163_httpwww_dmg_orgPMML_4_1Segment', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1818, 2), )

    
    Segment = property(__Segment.value, __Segment.set, None, None)

    
    # Attribute multipleModelMethod uses Python identifier multipleModelMethod
    __multipleModelMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'multipleModelMethod'), 'multipleModelMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_163_multipleModelMethod', MULTIPLE_MODEL_METHOD, required=True)
    __multipleModelMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1815, 6)
    __multipleModelMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1815, 6)
    
    multipleModelMethod = property(__multipleModelMethod.value, __multipleModelMethod.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Segment.name() : __Segment
    })
    _AttributeMap.update({
        __multipleModelMethod.name() : __multipleModelMethod
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_164 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1819, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ClusteringModel uses Python identifier ClusteringModel
    __ClusteringModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModel'), 'ClusteringModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1ClusteringModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2, 2), )

    
    ClusteringModel = property(__ClusteringModel.value, __ClusteringModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SequenceModel uses Python identifier SequenceModel
    __SequenceModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SequenceModel'), 'SequenceModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1SequenceModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 330, 2), )

    
    SequenceModel = property(__SequenceModel.value, __SequenceModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}AssociationModel uses Python identifier AssociationModel
    __AssociationModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'AssociationModel'), 'AssociationModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1AssociationModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 691, 2), )

    
    AssociationModel = property(__AssociationModel.value, __AssociationModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NearestNeighborModel uses Python identifier NearestNeighborModel
    __NearestNeighborModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NearestNeighborModel'), 'NearestNeighborModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1NearestNeighborModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 800, 2), )

    
    NearestNeighborModel = property(__NearestNeighborModel.value, __NearestNeighborModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RegressionModel uses Python identifier RegressionModel
    __RegressionModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RegressionModel'), 'RegressionModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1RegressionModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 890, 2), )

    
    RegressionModel = property(__RegressionModel.value, __RegressionModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TimeSeriesModel uses Python identifier TimeSeriesModel
    __TimeSeriesModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TimeSeriesModel'), 'TimeSeriesModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1TimeSeriesModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1141, 2), )

    
    TimeSeriesModel = property(__TimeSeriesModel.value, __TimeSeriesModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SupportVectorMachineModel uses Python identifier SupportVectorMachineModel
    __SupportVectorMachineModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachineModel'), 'SupportVectorMachineModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1SupportVectorMachineModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1347, 2), )

    
    SupportVectorMachineModel = property(__SupportVectorMachineModel.value, __SupportVectorMachineModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TextModel uses Python identifier TextModel
    __TextModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TextModel'), 'TextModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1TextModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1511, 2), )

    
    TextModel = property(__TextModel.value, __TextModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TreeModel uses Python identifier TreeModel
    __TreeModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TreeModel'), 'TreeModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1TreeModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1624, 2), )

    
    TreeModel = property(__TreeModel.value, __TreeModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimplePredicate uses Python identifier SimplePredicate
    __SimplePredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), 'SimplePredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1SimplePredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2), )

    
    SimplePredicate = property(__SimplePredicate.value, __SimplePredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CompoundPredicate uses Python identifier CompoundPredicate
    __CompoundPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), 'CompoundPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1CompoundPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2), )

    
    CompoundPredicate = property(__CompoundPredicate.value, __CompoundPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimpleSetPredicate uses Python identifier SimpleSetPredicate
    __SimpleSetPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), 'SimpleSetPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1SimpleSetPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2), )

    
    SimpleSetPredicate = property(__SimpleSetPredicate.value, __SimpleSetPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}True uses Python identifier True_
    __True = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'True'), 'True_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1True', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2), )

    
    True_ = property(__True.value, __True.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}False uses Python identifier False_
    __False = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'False'), 'False_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1False', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2), )

    
    False_ = property(__False.value, __False.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningModel uses Python identifier MiningModel
    __MiningModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningModel'), 'MiningModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1MiningModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1785, 2), )

    
    MiningModel = property(__MiningModel.value, __MiningModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NaiveBayesModel uses Python identifier NaiveBayesModel
    __NaiveBayesModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NaiveBayesModel'), 'NaiveBayesModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1NaiveBayesModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1909, 2), )

    
    NaiveBayesModel = property(__NaiveBayesModel.value, __NaiveBayesModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RuleSetModel uses Python identifier RuleSetModel
    __RuleSetModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RuleSetModel'), 'RuleSetModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1RuleSetModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2193, 2), )

    
    RuleSetModel = property(__RuleSetModel.value, __RuleSetModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}GeneralRegressionModel uses Python identifier GeneralRegressionModel
    __GeneralRegressionModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'GeneralRegressionModel'), 'GeneralRegressionModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1GeneralRegressionModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2496, 2), )

    
    GeneralRegressionModel = property(__GeneralRegressionModel.value, __GeneralRegressionModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BaselineModel uses Python identifier BaselineModel
    __BaselineModel = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BaselineModel'), 'BaselineModel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1BaselineModel', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3022, 2), )

    
    BaselineModel = property(__BaselineModel.value, __BaselineModel.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NeuralNetwork uses Python identifier NeuralNetwork
    __NeuralNetwork = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NeuralNetwork'), 'NeuralNetwork', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1NeuralNetwork', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3169, 2), )

    
    NeuralNetwork = property(__NeuralNetwork.value, __NeuralNetwork.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Scorecard uses Python identifier Scorecard
    __Scorecard = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Scorecard'), 'Scorecard', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_httpwww_dmg_orgPMML_4_1Scorecard', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3298, 2), )

    
    Scorecard = property(__Scorecard.value, __Scorecard.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_id', pyxb.binding.datatypes.string)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1825, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1825, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute weight uses Python identifier weight
    __weight = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'weight'), 'weight', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_164_weight', NUMBER, unicode_default=u'1')
    __weight._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1826, 6)
    __weight._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1826, 6)
    
    weight = property(__weight.value, __weight.set, None, None)

    _ElementMap.update({
        __ClusteringModel.name() : __ClusteringModel,
        __SequenceModel.name() : __SequenceModel,
        __Extension.name() : __Extension,
        __AssociationModel.name() : __AssociationModel,
        __NearestNeighborModel.name() : __NearestNeighborModel,
        __RegressionModel.name() : __RegressionModel,
        __TimeSeriesModel.name() : __TimeSeriesModel,
        __SupportVectorMachineModel.name() : __SupportVectorMachineModel,
        __TextModel.name() : __TextModel,
        __TreeModel.name() : __TreeModel,
        __SimplePredicate.name() : __SimplePredicate,
        __CompoundPredicate.name() : __CompoundPredicate,
        __SimpleSetPredicate.name() : __SimpleSetPredicate,
        __True.name() : __True,
        __False.name() : __False,
        __MiningModel.name() : __MiningModel,
        __NaiveBayesModel.name() : __NaiveBayesModel,
        __RuleSetModel.name() : __RuleSetModel,
        __GeneralRegressionModel.name() : __GeneralRegressionModel,
        __BaselineModel.name() : __BaselineModel,
        __NeuralNetwork.name() : __NeuralNetwork,
        __Scorecard.name() : __Scorecard
    })
    _AttributeMap.update({
        __id.name() : __id,
        __weight.name() : __weight
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_165 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1853, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_165_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_165_name', FIELD_NAME, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1857, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1857, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute displayName uses Python identifier displayName
    __displayName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'displayName'), 'displayName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_165_displayName', pyxb.binding.datatypes.string)
    __displayName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1858, 6)
    __displayName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1858, 6)
    
    displayName = property(__displayName.value, __displayName.set, None, None)

    
    # Attribute optype uses Python identifier optype
    __optype = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'optype'), 'optype', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_165_optype', OPTYPE)
    __optype._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1859, 6)
    __optype._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1859, 6)
    
    optype = property(__optype.value, __optype.set, None, None)

    
    # Attribute dataType uses Python identifier dataType
    __dataType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataType'), 'dataType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_165_dataType', DATATYPE)
    __dataType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1860, 6)
    __dataType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1860, 6)
    
    dataType = property(__dataType.value, __dataType.set, None, None)

    
    # Attribute feature uses Python identifier feature
    __feature = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'feature'), 'feature', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_165_feature', RESULT_FEATURE)
    __feature._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1861, 6)
    __feature._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1861, 6)
    
    feature = property(__feature.value, __feature.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_165_value', pyxb.binding.datatypes.string)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1862, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1862, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __name.name() : __name,
        __displayName.name() : __displayName,
        __optype.name() : __optype,
        __dataType.name() : __dataType,
        __feature.name() : __feature,
        __value.name() : __value
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_166 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1866, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RegressionTable uses Python identifier RegressionTable
    __RegressionTable = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RegressionTable'), 'RegressionTable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_httpwww_dmg_orgPMML_4_1RegressionTable', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 934, 2), )

    
    RegressionTable = property(__RegressionTable.value, __RegressionTable.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ResultField uses Python identifier ResultField
    __ResultField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ResultField'), 'ResultField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_httpwww_dmg_orgPMML_4_1ResultField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1852, 2), )

    
    ResultField = property(__ResultField.value, __ResultField.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1876, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1876, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1877, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1877, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1878, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1878, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute normalizationMethod uses Python identifier normalizationMethod
    __normalizationMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'normalizationMethod'), 'normalizationMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_166_normalizationMethod', REGRESSIONNORMALIZATIONMETHOD, unicode_default=u'none')
    __normalizationMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1879, 6)
    __normalizationMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1879, 6)
    
    normalizationMethod = property(__normalizationMethod.value, __normalizationMethod.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __RegressionTable.name() : __RegressionTable,
        __LocalTransformations.name() : __LocalTransformations,
        __ResultField.name() : __ResultField,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __normalizationMethod.name() : __normalizationMethod
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_167 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1883, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Node uses Python identifier Node
    __Node = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Node'), 'Node', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_httpwww_dmg_orgPMML_4_1Node', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1655, 2), )

    
    Node = property(__Node.value, __Node.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ResultField uses Python identifier ResultField
    __ResultField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ResultField'), 'ResultField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_httpwww_dmg_orgPMML_4_1ResultField', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1852, 2), )

    
    ResultField = property(__ResultField.value, __ResultField.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1893, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1893, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1894, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1894, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1895, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1895, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute missingValueStrategy uses Python identifier missingValueStrategy
    __missingValueStrategy = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'missingValueStrategy'), 'missingValueStrategy', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_missingValueStrategy', MISSING_VALUE_STRATEGY, unicode_default=u'none')
    __missingValueStrategy._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1896, 6)
    __missingValueStrategy._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1896, 6)
    
    missingValueStrategy = property(__missingValueStrategy.value, __missingValueStrategy.set, None, None)

    
    # Attribute missingValuePenalty uses Python identifier missingValuePenalty
    __missingValuePenalty = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'missingValuePenalty'), 'missingValuePenalty', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_missingValuePenalty', PROB_NUMBER, unicode_default=u'1.0')
    __missingValuePenalty._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1897, 6)
    __missingValuePenalty._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1897, 6)
    
    missingValuePenalty = property(__missingValuePenalty.value, __missingValuePenalty.set, None, None)

    
    # Attribute noTrueChildStrategy uses Python identifier noTrueChildStrategy
    __noTrueChildStrategy = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'noTrueChildStrategy'), 'noTrueChildStrategy', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_noTrueChildStrategy', NO_TRUE_CHILD_STRATEGY, unicode_default=u'returnNullPrediction')
    __noTrueChildStrategy._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1898, 6)
    __noTrueChildStrategy._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1898, 6)
    
    noTrueChildStrategy = property(__noTrueChildStrategy.value, __noTrueChildStrategy.set, None, None)

    
    # Attribute splitCharacteristic uses Python identifier splitCharacteristic
    __splitCharacteristic = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'splitCharacteristic'), 'splitCharacteristic', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_167_splitCharacteristic', STD_ANON_22, unicode_default=u'multiSplit')
    __splitCharacteristic._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1899, 6)
    __splitCharacteristic._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1899, 6)
    
    splitCharacteristic = property(__splitCharacteristic.value, __splitCharacteristic.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __Node.name() : __Node,
        __ResultField.name() : __ResultField,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __missingValueStrategy.name() : __missingValueStrategy,
        __missingValuePenalty.name() : __missingValuePenalty,
        __noTrueChildStrategy.name() : __noTrueChildStrategy,
        __splitCharacteristic.name() : __splitCharacteristic
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_168 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1910, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BayesInputs uses Python identifier BayesInputs
    __BayesInputs = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BayesInputs'), 'BayesInputs', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1BayesInputs', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1931, 2), )

    
    BayesInputs = property(__BayesInputs.value, __BayesInputs.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BayesOutput uses Python identifier BayesOutput
    __BayesOutput = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BayesOutput'), 'BayesOutput', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1BayesOutput', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1949, 2), )

    
    BayesOutput = property(__BayesOutput.value, __BayesOutput.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1924, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1924, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute threshold uses Python identifier threshold
    __threshold = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'threshold'), 'threshold', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_threshold', REAL_NUMBER, required=True)
    __threshold._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1925, 6)
    __threshold._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1925, 6)
    
    threshold = property(__threshold.value, __threshold.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1926, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1926, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1927, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1927, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_168_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1928, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1928, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __BayesInputs.name() : __BayesInputs,
        __BayesOutput.name() : __BayesOutput,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __threshold.name() : __threshold,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_169 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1976, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_169_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_169_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1980, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1980, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute count uses Python identifier count
    __count = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'count'), 'count', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_169_count', REAL_NUMBER, required=True)
    __count._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1981, 6)
    __count._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1981, 6)
    
    count = property(__count.value, __count.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __value.name() : __value,
        __count.name() : __count
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_170 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1997, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LiftData uses Python identifier LiftData
    __LiftData = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LiftData'), 'LiftData', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_httpwww_dmg_orgPMML_4_1LiftData', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2040, 2), )

    
    LiftData = property(__LiftData.value, __LiftData.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ROC uses Python identifier ROC
    __ROC = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ROC'), 'ROC', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_httpwww_dmg_orgPMML_4_1ROC', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2120, 2), )

    
    ROC = property(__ROC.value, __ROC.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ConfusionMatrix uses Python identifier ConfusionMatrix
    __ConfusionMatrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ConfusionMatrix'), 'ConfusionMatrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_httpwww_dmg_orgPMML_4_1ConfusionMatrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2142, 2), )

    
    ConfusionMatrix = property(__ConfusionMatrix.value, __ConfusionMatrix.set, None, None)

    
    # Attribute targetField uses Python identifier targetField
    __targetField = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetField'), 'targetField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_targetField', pyxb.binding.datatypes.string, required=True)
    __targetField._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2004, 6)
    __targetField._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2004, 6)
    
    targetField = property(__targetField.value, __targetField.set, None, None)

    
    # Attribute dataName uses Python identifier dataName
    __dataName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataName'), 'dataName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_dataName', pyxb.binding.datatypes.string)
    __dataName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2005, 6)
    __dataName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2005, 6)
    
    dataName = property(__dataName.value, __dataName.set, None, None)

    
    # Attribute dataUsage uses Python identifier dataUsage
    __dataUsage = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataUsage'), 'dataUsage', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_dataUsage', STD_ANON_23, unicode_default=u'training')
    __dataUsage._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2006, 6)
    __dataUsage._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2006, 6)
    
    dataUsage = property(__dataUsage.value, __dataUsage.set, None, None)

    
    # Attribute meanError uses Python identifier meanError
    __meanError = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'meanError'), 'meanError', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_meanError', NUMBER)
    __meanError._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2015, 6)
    __meanError._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2015, 6)
    
    meanError = property(__meanError.value, __meanError.set, None, None)

    
    # Attribute meanAbsoluteError uses Python identifier meanAbsoluteError
    __meanAbsoluteError = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'meanAbsoluteError'), 'meanAbsoluteError', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_meanAbsoluteError', NUMBER)
    __meanAbsoluteError._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2016, 6)
    __meanAbsoluteError._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2016, 6)
    
    meanAbsoluteError = property(__meanAbsoluteError.value, __meanAbsoluteError.set, None, None)

    
    # Attribute meanSquaredError uses Python identifier meanSquaredError
    __meanSquaredError = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'meanSquaredError'), 'meanSquaredError', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_meanSquaredError', NUMBER)
    __meanSquaredError._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2017, 6)
    __meanSquaredError._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2017, 6)
    
    meanSquaredError = property(__meanSquaredError.value, __meanSquaredError.set, None, None)

    
    # Attribute rootMeanSquaredError uses Python identifier rootMeanSquaredError
    __rootMeanSquaredError = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'rootMeanSquaredError'), 'rootMeanSquaredError', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_rootMeanSquaredError', NUMBER)
    __rootMeanSquaredError._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2018, 6)
    __rootMeanSquaredError._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2018, 6)
    
    rootMeanSquaredError = property(__rootMeanSquaredError.value, __rootMeanSquaredError.set, None, None)

    
    # Attribute r-squared uses Python identifier r_squared
    __r_squared = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'r-squared'), 'r_squared', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_r_squared', NUMBER)
    __r_squared._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2019, 6)
    __r_squared._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2019, 6)
    
    r_squared = property(__r_squared.value, __r_squared.set, None, None)

    
    # Attribute adj-r-squared uses Python identifier adj_r_squared
    __adj_r_squared = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'adj-r-squared'), 'adj_r_squared', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_adj_r_squared', NUMBER)
    __adj_r_squared._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2020, 6)
    __adj_r_squared._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2020, 6)
    
    adj_r_squared = property(__adj_r_squared.value, __adj_r_squared.set, None, None)

    
    # Attribute sumSquaredError uses Python identifier sumSquaredError
    __sumSquaredError = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'sumSquaredError'), 'sumSquaredError', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_sumSquaredError', NUMBER)
    __sumSquaredError._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2021, 6)
    __sumSquaredError._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2021, 6)
    
    sumSquaredError = property(__sumSquaredError.value, __sumSquaredError.set, None, None)

    
    # Attribute sumSquaredRegression uses Python identifier sumSquaredRegression
    __sumSquaredRegression = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'sumSquaredRegression'), 'sumSquaredRegression', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_sumSquaredRegression', NUMBER)
    __sumSquaredRegression._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2022, 6)
    __sumSquaredRegression._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2022, 6)
    
    sumSquaredRegression = property(__sumSquaredRegression.value, __sumSquaredRegression.set, None, None)

    
    # Attribute numOfRecords uses Python identifier numOfRecords
    __numOfRecords = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numOfRecords'), 'numOfRecords', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_numOfRecords', NUMBER)
    __numOfRecords._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2023, 6)
    __numOfRecords._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2023, 6)
    
    numOfRecords = property(__numOfRecords.value, __numOfRecords.set, None, None)

    
    # Attribute numOfRecordsWeighted uses Python identifier numOfRecordsWeighted
    __numOfRecordsWeighted = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numOfRecordsWeighted'), 'numOfRecordsWeighted', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_numOfRecordsWeighted', NUMBER)
    __numOfRecordsWeighted._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2024, 6)
    __numOfRecordsWeighted._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2024, 6)
    
    numOfRecordsWeighted = property(__numOfRecordsWeighted.value, __numOfRecordsWeighted.set, None, None)

    
    # Attribute numOfPredictors uses Python identifier numOfPredictors
    __numOfPredictors = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numOfPredictors'), 'numOfPredictors', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_numOfPredictors', NUMBER)
    __numOfPredictors._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2025, 6)
    __numOfPredictors._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2025, 6)
    
    numOfPredictors = property(__numOfPredictors.value, __numOfPredictors.set, None, None)

    
    # Attribute degreesOfFreedom uses Python identifier degreesOfFreedom
    __degreesOfFreedom = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'degreesOfFreedom'), 'degreesOfFreedom', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_degreesOfFreedom', NUMBER)
    __degreesOfFreedom._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2026, 6)
    __degreesOfFreedom._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2026, 6)
    
    degreesOfFreedom = property(__degreesOfFreedom.value, __degreesOfFreedom.set, None, None)

    
    # Attribute fStatistic uses Python identifier fStatistic
    __fStatistic = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'fStatistic'), 'fStatistic', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_fStatistic', NUMBER)
    __fStatistic._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2027, 6)
    __fStatistic._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2027, 6)
    
    fStatistic = property(__fStatistic.value, __fStatistic.set, None, None)

    
    # Attribute AIC uses Python identifier AIC
    __AIC = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'AIC'), 'AIC', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_AIC', NUMBER)
    __AIC._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2028, 6)
    __AIC._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2028, 6)
    
    AIC = property(__AIC.value, __AIC.set, None, None)

    
    # Attribute BIC uses Python identifier BIC
    __BIC = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'BIC'), 'BIC', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_BIC', NUMBER)
    __BIC._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2029, 6)
    __BIC._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2029, 6)
    
    BIC = property(__BIC.value, __BIC.set, None, None)

    
    # Attribute AICc uses Python identifier AICc
    __AICc = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'AICc'), 'AICc', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_170_AICc', NUMBER)
    __AICc._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2030, 6)
    __AICc._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2030, 6)
    
    AICc = property(__AICc.value, __AICc.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __LiftData.name() : __LiftData,
        __ROC.name() : __ROC,
        __ConfusionMatrix.name() : __ConfusionMatrix
    })
    _AttributeMap.update({
        __targetField.name() : __targetField,
        __dataName.name() : __dataName,
        __dataUsage.name() : __dataUsage,
        __meanError.name() : __meanError,
        __meanAbsoluteError.name() : __meanAbsoluteError,
        __meanSquaredError.name() : __meanSquaredError,
        __rootMeanSquaredError.name() : __rootMeanSquaredError,
        __r_squared.name() : __r_squared,
        __adj_r_squared.name() : __adj_r_squared,
        __sumSquaredError.name() : __sumSquaredError,
        __sumSquaredRegression.name() : __sumSquaredRegression,
        __numOfRecords.name() : __numOfRecords,
        __numOfRecordsWeighted.name() : __numOfRecordsWeighted,
        __numOfPredictors.name() : __numOfPredictors,
        __degreesOfFreedom.name() : __degreesOfFreedom,
        __fStatistic.name() : __fStatistic,
        __AIC.name() : __AIC,
        __BIC.name() : __BIC,
        __AICc.name() : __AICc
    })



# Complex type [anonymous] with content type EMPTY
class CTD_ANON_171 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type EMPTY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_EMPTY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2034, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Attribute dataName uses Python identifier dataName
    __dataName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataName'), 'dataName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_171_dataName', pyxb.binding.datatypes.string)
    __dataName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2035, 6)
    __dataName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2035, 6)
    
    dataName = property(__dataName.value, __dataName.set, None, None)

    
    # Attribute SSE uses Python identifier SSE
    __SSE = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'SSE'), 'SSE', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_171_SSE', NUMBER)
    __SSE._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2036, 6)
    __SSE._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2036, 6)
    
    SSE = property(__SSE.value, __SSE.set, None, None)

    
    # Attribute SSB uses Python identifier SSB
    __SSB = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'SSB'), 'SSB', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_171_SSB', NUMBER)
    __SSB._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2037, 6)
    __SSB._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2037, 6)
    
    SSB = property(__SSB.value, __SSB.set, None, None)

    _ElementMap.update({
        
    })
    _AttributeMap.update({
        __dataName.name() : __dataName,
        __SSE.name() : __SSE,
        __SSB.name() : __SSB
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_172 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2041, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_172_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelLiftGraph uses Python identifier ModelLiftGraph
    __ModelLiftGraph = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelLiftGraph'), 'ModelLiftGraph', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_172_httpwww_dmg_orgPMML_4_1ModelLiftGraph', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2053, 2), )

    
    ModelLiftGraph = property(__ModelLiftGraph.value, __ModelLiftGraph.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}OptimumLiftGraph uses Python identifier OptimumLiftGraph
    __OptimumLiftGraph = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'OptimumLiftGraph'), 'OptimumLiftGraph', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_172_httpwww_dmg_orgPMML_4_1OptimumLiftGraph', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2061, 2), )

    
    OptimumLiftGraph = property(__OptimumLiftGraph.value, __OptimumLiftGraph.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RandomLiftGraph uses Python identifier RandomLiftGraph
    __RandomLiftGraph = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RandomLiftGraph'), 'RandomLiftGraph', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_172_httpwww_dmg_orgPMML_4_1RandomLiftGraph', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2069, 2), )

    
    RandomLiftGraph = property(__RandomLiftGraph.value, __RandomLiftGraph.set, None, None)

    
    # Attribute targetFieldValue uses Python identifier targetFieldValue
    __targetFieldValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetFieldValue'), 'targetFieldValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_172_targetFieldValue', pyxb.binding.datatypes.string)
    __targetFieldValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2048, 6)
    __targetFieldValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2048, 6)
    
    targetFieldValue = property(__targetFieldValue.value, __targetFieldValue.set, None, None)

    
    # Attribute targetFieldDisplayValue uses Python identifier targetFieldDisplayValue
    __targetFieldDisplayValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetFieldDisplayValue'), 'targetFieldDisplayValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_172_targetFieldDisplayValue', pyxb.binding.datatypes.string)
    __targetFieldDisplayValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2049, 6)
    __targetFieldDisplayValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2049, 6)
    
    targetFieldDisplayValue = property(__targetFieldDisplayValue.value, __targetFieldDisplayValue.set, None, None)

    
    # Attribute rankingQuality uses Python identifier rankingQuality
    __rankingQuality = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'rankingQuality'), 'rankingQuality', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_172_rankingQuality', NUMBER)
    __rankingQuality._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2050, 6)
    __rankingQuality._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2050, 6)
    
    rankingQuality = property(__rankingQuality.value, __rankingQuality.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __ModelLiftGraph.name() : __ModelLiftGraph,
        __OptimumLiftGraph.name() : __OptimumLiftGraph,
        __RandomLiftGraph.name() : __RandomLiftGraph
    })
    _AttributeMap.update({
        __targetFieldValue.name() : __targetFieldValue,
        __targetFieldDisplayValue.name() : __targetFieldDisplayValue,
        __rankingQuality.name() : __rankingQuality
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_173 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2194, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RuleSet uses Python identifier RuleSet
    __RuleSet = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RuleSet'), 'RuleSet', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_httpwww_dmg_orgPMML_4_1RuleSet', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2213, 2), )

    
    RuleSet = property(__RuleSet.value, __RuleSet.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2207, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2207, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2208, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2208, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2209, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2209, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_173_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2210, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2210, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelExplanation.name() : __ModelExplanation,
        __RuleSet.name() : __RuleSet,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_174 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2214, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_174_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ScoreDistribution uses Python identifier ScoreDistribution
    __ScoreDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution'), 'ScoreDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_174_httpwww_dmg_orgPMML_4_1ScoreDistribution', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1758, 2), )

    
    ScoreDistribution = property(__ScoreDistribution.value, __ScoreDistribution.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}RuleSelectionMethod uses Python identifier RuleSelectionMethod
    __RuleSelectionMethod = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'RuleSelectionMethod'), 'RuleSelectionMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_174_httpwww_dmg_orgPMML_4_1RuleSelectionMethod', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2227, 2), )

    
    RuleSelectionMethod = property(__RuleSelectionMethod.value, __RuleSelectionMethod.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimpleRule uses Python identifier SimpleRule
    __SimpleRule = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimpleRule'), 'SimpleRule', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_174_httpwww_dmg_orgPMML_4_1SimpleRule', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2249, 2), )

    
    SimpleRule = property(__SimpleRule.value, __SimpleRule.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CompoundRule uses Python identifier CompoundRule
    __CompoundRule = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CompoundRule'), 'CompoundRule', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_174_httpwww_dmg_orgPMML_4_1CompoundRule', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2264, 2), )

    
    CompoundRule = property(__CompoundRule.value, __CompoundRule.set, None, None)

    
    # Attribute recordCount uses Python identifier recordCount
    __recordCount = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'recordCount'), 'recordCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_174_recordCount', NUMBER)
    __recordCount._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2221, 6)
    __recordCount._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2221, 6)
    
    recordCount = property(__recordCount.value, __recordCount.set, None, None)

    
    # Attribute nbCorrect uses Python identifier nbCorrect
    __nbCorrect = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'nbCorrect'), 'nbCorrect', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_174_nbCorrect', NUMBER)
    __nbCorrect._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2222, 6)
    __nbCorrect._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2222, 6)
    
    nbCorrect = property(__nbCorrect.value, __nbCorrect.set, None, None)

    
    # Attribute defaultScore uses Python identifier defaultScore
    __defaultScore = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'defaultScore'), 'defaultScore', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_174_defaultScore', pyxb.binding.datatypes.string)
    __defaultScore._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2223, 6)
    __defaultScore._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2223, 6)
    
    defaultScore = property(__defaultScore.value, __defaultScore.set, None, None)

    
    # Attribute defaultConfidence uses Python identifier defaultConfidence
    __defaultConfidence = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'defaultConfidence'), 'defaultConfidence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_174_defaultConfidence', NUMBER)
    __defaultConfidence._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2224, 6)
    __defaultConfidence._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2224, 6)
    
    defaultConfidence = property(__defaultConfidence.value, __defaultConfidence.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __ScoreDistribution.name() : __ScoreDistribution,
        __RuleSelectionMethod.name() : __RuleSelectionMethod,
        __SimpleRule.name() : __SimpleRule,
        __CompoundRule.name() : __CompoundRule
    })
    _AttributeMap.update({
        __recordCount.name() : __recordCount,
        __nbCorrect.name() : __nbCorrect,
        __defaultScore.name() : __defaultScore,
        __defaultConfidence.name() : __defaultConfidence
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_175 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2228, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_175_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute criterion uses Python identifier criterion
    __criterion = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'criterion'), 'criterion', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_175_criterion', STD_ANON_24, required=True)
    __criterion._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2232, 6)
    __criterion._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2232, 6)
    
    criterion = property(__criterion.value, __criterion.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __criterion.name() : __criterion
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_176 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2250, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimplePredicate uses Python identifier SimplePredicate
    __SimplePredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), 'SimplePredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_httpwww_dmg_orgPMML_4_1SimplePredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2), )

    
    SimplePredicate = property(__SimplePredicate.value, __SimplePredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CompoundPredicate uses Python identifier CompoundPredicate
    __CompoundPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), 'CompoundPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_httpwww_dmg_orgPMML_4_1CompoundPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2), )

    
    CompoundPredicate = property(__CompoundPredicate.value, __CompoundPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimpleSetPredicate uses Python identifier SimpleSetPredicate
    __SimpleSetPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), 'SimpleSetPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_httpwww_dmg_orgPMML_4_1SimpleSetPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2), )

    
    SimpleSetPredicate = property(__SimpleSetPredicate.value, __SimpleSetPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}True uses Python identifier True_
    __True = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'True'), 'True_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_httpwww_dmg_orgPMML_4_1True', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2), )

    
    True_ = property(__True.value, __True.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}False uses Python identifier False_
    __False = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'False'), 'False_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_httpwww_dmg_orgPMML_4_1False', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2), )

    
    False_ = property(__False.value, __False.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ScoreDistribution uses Python identifier ScoreDistribution
    __ScoreDistribution = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution'), 'ScoreDistribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_httpwww_dmg_orgPMML_4_1ScoreDistribution', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1758, 2), )

    
    ScoreDistribution = property(__ScoreDistribution.value, __ScoreDistribution.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_id', pyxb.binding.datatypes.string)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2256, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2256, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute score uses Python identifier score
    __score = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'score'), 'score', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_score', pyxb.binding.datatypes.string, required=True)
    __score._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2257, 6)
    __score._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2257, 6)
    
    score = property(__score.value, __score.set, None, None)

    
    # Attribute recordCount uses Python identifier recordCount
    __recordCount = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'recordCount'), 'recordCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_recordCount', NUMBER)
    __recordCount._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2258, 6)
    __recordCount._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2258, 6)
    
    recordCount = property(__recordCount.value, __recordCount.set, None, None)

    
    # Attribute nbCorrect uses Python identifier nbCorrect
    __nbCorrect = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'nbCorrect'), 'nbCorrect', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_nbCorrect', NUMBER)
    __nbCorrect._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2259, 6)
    __nbCorrect._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2259, 6)
    
    nbCorrect = property(__nbCorrect.value, __nbCorrect.set, None, None)

    
    # Attribute confidence uses Python identifier confidence
    __confidence = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'confidence'), 'confidence', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_confidence', NUMBER)
    __confidence._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2260, 6)
    __confidence._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2260, 6)
    
    confidence = property(__confidence.value, __confidence.set, None, None)

    
    # Attribute weight uses Python identifier weight
    __weight = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'weight'), 'weight', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_176_weight', NUMBER)
    __weight._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2261, 6)
    __weight._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2261, 6)
    
    weight = property(__weight.value, __weight.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __SimplePredicate.name() : __SimplePredicate,
        __CompoundPredicate.name() : __CompoundPredicate,
        __SimpleSetPredicate.name() : __SimpleSetPredicate,
        __True.name() : __True,
        __False.name() : __False,
        __ScoreDistribution.name() : __ScoreDistribution
    })
    _AttributeMap.update({
        __id.name() : __id,
        __score.name() : __score,
        __recordCount.name() : __recordCount,
        __nbCorrect.name() : __nbCorrect,
        __confidence.name() : __confidence,
        __weight.name() : __weight
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_177 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2283, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_177_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Counts uses Python identifier Counts
    __Counts = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Counts'), 'Counts', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_177_httpwww_dmg_orgPMML_4_1Counts', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2303, 2), )

    
    Counts = property(__Counts.value, __Counts.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NumericInfo uses Python identifier NumericInfo
    __NumericInfo = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NumericInfo'), 'NumericInfo', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_177_httpwww_dmg_orgPMML_4_1NumericInfo', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2314, 2), )

    
    NumericInfo = property(__NumericInfo.value, __NumericInfo.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DiscrStats uses Python identifier DiscrStats
    __DiscrStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DiscrStats'), 'DiscrStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_177_httpwww_dmg_orgPMML_4_1DiscrStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2337, 2), )

    
    DiscrStats = property(__DiscrStats.value, __DiscrStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ContStats uses Python identifier ContStats
    __ContStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ContStats'), 'ContStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_177_httpwww_dmg_orgPMML_4_1ContStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2346, 2), )

    
    ContStats = property(__ContStats.value, __ContStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Anova uses Python identifier Anova
    __Anova = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Anova'), 'Anova', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_177_httpwww_dmg_orgPMML_4_1Anova', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2394, 2), )

    
    Anova = property(__Anova.value, __Anova.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_177_field', FIELD_NAME)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2292, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2292, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute weighted uses Python identifier weighted
    __weighted = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'weighted'), 'weighted', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_177_weighted', STD_ANON_25, unicode_default=u'0')
    __weighted._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2293, 6)
    __weighted._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2293, 6)
    
    weighted = property(__weighted.value, __weighted.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Counts.name() : __Counts,
        __NumericInfo.name() : __NumericInfo,
        __DiscrStats.name() : __DiscrStats,
        __ContStats.name() : __ContStats,
        __Anova.name() : __Anova
    })
    _AttributeMap.update({
        __field.name() : __field,
        __weighted.name() : __weighted
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_178 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2304, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_178_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute totalFreq uses Python identifier totalFreq
    __totalFreq = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'totalFreq'), 'totalFreq', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_178_totalFreq', NUMBER, required=True)
    __totalFreq._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2308, 6)
    __totalFreq._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2308, 6)
    
    totalFreq = property(__totalFreq.value, __totalFreq.set, None, None)

    
    # Attribute missingFreq uses Python identifier missingFreq
    __missingFreq = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'missingFreq'), 'missingFreq', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_178_missingFreq', NUMBER)
    __missingFreq._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2309, 6)
    __missingFreq._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2309, 6)
    
    missingFreq = property(__missingFreq.value, __missingFreq.set, None, None)

    
    # Attribute invalidFreq uses Python identifier invalidFreq
    __invalidFreq = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'invalidFreq'), 'invalidFreq', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_178_invalidFreq', NUMBER)
    __invalidFreq._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2310, 6)
    __invalidFreq._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2310, 6)
    
    invalidFreq = property(__invalidFreq.value, __invalidFreq.set, None, None)

    
    # Attribute cardinality uses Python identifier cardinality
    __cardinality = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'cardinality'), 'cardinality', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_178_cardinality', pyxb.binding.datatypes.nonNegativeInteger)
    __cardinality._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2311, 6)
    __cardinality._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2311, 6)
    
    cardinality = property(__cardinality.value, __cardinality.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __totalFreq.name() : __totalFreq,
        __missingFreq.name() : __missingFreq,
        __invalidFreq.name() : __invalidFreq,
        __cardinality.name() : __cardinality
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_179 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2315, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_179_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Quantile uses Python identifier Quantile
    __Quantile = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Quantile'), 'Quantile', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_179_httpwww_dmg_orgPMML_4_1Quantile', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2328, 2), )

    
    Quantile = property(__Quantile.value, __Quantile.set, None, None)

    
    # Attribute minimum uses Python identifier minimum
    __minimum = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'minimum'), 'minimum', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_179_minimum', NUMBER)
    __minimum._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2320, 6)
    __minimum._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2320, 6)
    
    minimum = property(__minimum.value, __minimum.set, None, None)

    
    # Attribute maximum uses Python identifier maximum
    __maximum = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maximum'), 'maximum', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_179_maximum', NUMBER)
    __maximum._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2321, 6)
    __maximum._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2321, 6)
    
    maximum = property(__maximum.value, __maximum.set, None, None)

    
    # Attribute mean uses Python identifier mean
    __mean = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mean'), 'mean', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_179_mean', NUMBER)
    __mean._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2322, 6)
    __mean._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2322, 6)
    
    mean = property(__mean.value, __mean.set, None, None)

    
    # Attribute standardDeviation uses Python identifier standardDeviation
    __standardDeviation = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'standardDeviation'), 'standardDeviation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_179_standardDeviation', NUMBER)
    __standardDeviation._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2323, 6)
    __standardDeviation._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2323, 6)
    
    standardDeviation = property(__standardDeviation.value, __standardDeviation.set, None, None)

    
    # Attribute median uses Python identifier median
    __median = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'median'), 'median', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_179_median', NUMBER)
    __median._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2324, 6)
    __median._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2324, 6)
    
    median = property(__median.value, __median.set, None, None)

    
    # Attribute interQuartileRange uses Python identifier interQuartileRange
    __interQuartileRange = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'interQuartileRange'), 'interQuartileRange', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_179_interQuartileRange', NUMBER)
    __interQuartileRange._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2325, 6)
    __interQuartileRange._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2325, 6)
    
    interQuartileRange = property(__interQuartileRange.value, __interQuartileRange.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Quantile.name() : __Quantile
    })
    _AttributeMap.update({
        __minimum.name() : __minimum,
        __maximum.name() : __maximum,
        __mean.name() : __mean,
        __standardDeviation.name() : __standardDeviation,
        __median.name() : __median,
        __interQuartileRange.name() : __interQuartileRange
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_180 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2329, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_180_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute quantileLimit uses Python identifier quantileLimit
    __quantileLimit = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'quantileLimit'), 'quantileLimit', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_180_quantileLimit', PERCENTAGE_NUMBER, required=True)
    __quantileLimit._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2333, 6)
    __quantileLimit._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2333, 6)
    
    quantileLimit = property(__quantileLimit.value, __quantileLimit.set, None, None)

    
    # Attribute quantileValue uses Python identifier quantileValue
    __quantileValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'quantileValue'), 'quantileValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_180_quantileValue', NUMBER, required=True)
    __quantileValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2334, 6)
    __quantileValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2334, 6)
    
    quantileValue = property(__quantileValue.value, __quantileValue.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __quantileLimit.name() : __quantileLimit,
        __quantileValue.name() : __quantileValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_181 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2347, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_181_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_181_httpwww_dmg_orgPMML_4_1Array', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Interval uses Python identifier Interval
    __Interval = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Interval'), 'Interval', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_181_httpwww_dmg_orgPMML_4_1Interval', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2836, 2), )

    
    Interval = property(__Interval.value, __Interval.set, None, None)

    
    # Attribute totalValuesSum uses Python identifier totalValuesSum
    __totalValuesSum = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'totalValuesSum'), 'totalValuesSum', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_181_totalValuesSum', NUMBER)
    __totalValuesSum._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2353, 6)
    __totalValuesSum._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2353, 6)
    
    totalValuesSum = property(__totalValuesSum.value, __totalValuesSum.set, None, None)

    
    # Attribute totalSquaresSum uses Python identifier totalSquaresSum
    __totalSquaresSum = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'totalSquaresSum'), 'totalSquaresSum', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_181_totalSquaresSum', NUMBER)
    __totalSquaresSum._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2354, 6)
    __totalSquaresSum._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2354, 6)
    
    totalSquaresSum = property(__totalSquaresSum.value, __totalSquaresSum.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array,
        __Interval.name() : __Interval
    })
    _AttributeMap.update({
        __totalValuesSum.name() : __totalValuesSum,
        __totalSquaresSum.name() : __totalSquaresSum
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_182 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2372, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_name', pyxb.binding.datatypes.string)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2376, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2376, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute category uses Python identifier category
    __category = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'category'), 'category', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_category', pyxb.binding.datatypes.string)
    __category._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2377, 6)
    __category._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2377, 6)
    
    category = property(__category.value, __category.set, None, None)

    
    # Attribute exponent uses Python identifier exponent
    __exponent = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'exponent'), 'exponent', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_exponent', INT_NUMBER, unicode_default=u'1')
    __exponent._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2378, 6)
    __exponent._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2378, 6)
    
    exponent = property(__exponent.value, __exponent.set, None, None)

    
    # Attribute isIntercept uses Python identifier isIntercept
    __isIntercept = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isIntercept'), 'isIntercept', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_isIntercept', pyxb.binding.datatypes.boolean, unicode_default=u'false')
    __isIntercept._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2379, 6)
    __isIntercept._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2379, 6)
    
    isIntercept = property(__isIntercept.value, __isIntercept.set, None, None)

    
    # Attribute importance uses Python identifier importance
    __importance = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'importance'), 'importance', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_importance', PROB_NUMBER)
    __importance._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2380, 6)
    __importance._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2380, 6)
    
    importance = property(__importance.value, __importance.set, None, None)

    
    # Attribute stdError uses Python identifier stdError
    __stdError = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'stdError'), 'stdError', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_stdError', NUMBER)
    __stdError._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2381, 6)
    __stdError._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2381, 6)
    
    stdError = property(__stdError.value, __stdError.set, None, None)

    
    # Attribute tValue uses Python identifier tValue
    __tValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'tValue'), 'tValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_tValue', NUMBER)
    __tValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2382, 6)
    __tValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2382, 6)
    
    tValue = property(__tValue.value, __tValue.set, None, None)

    
    # Attribute chiSquareValue uses Python identifier chiSquareValue
    __chiSquareValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'chiSquareValue'), 'chiSquareValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_chiSquareValue', NUMBER)
    __chiSquareValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2383, 6)
    __chiSquareValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2383, 6)
    
    chiSquareValue = property(__chiSquareValue.value, __chiSquareValue.set, None, None)

    
    # Attribute fStatistic uses Python identifier fStatistic
    __fStatistic = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'fStatistic'), 'fStatistic', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_fStatistic', NUMBER)
    __fStatistic._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2384, 6)
    __fStatistic._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2384, 6)
    
    fStatistic = property(__fStatistic.value, __fStatistic.set, None, None)

    
    # Attribute dF uses Python identifier dF
    __dF = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dF'), 'dF', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_dF', NUMBER)
    __dF._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2385, 6)
    __dF._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2385, 6)
    
    dF = property(__dF.value, __dF.set, None, None)

    
    # Attribute pValueAlpha uses Python identifier pValueAlpha
    __pValueAlpha = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'pValueAlpha'), 'pValueAlpha', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_pValueAlpha', PROB_NUMBER)
    __pValueAlpha._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2386, 6)
    __pValueAlpha._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2386, 6)
    
    pValueAlpha = property(__pValueAlpha.value, __pValueAlpha.set, None, None)

    
    # Attribute pValueInitial uses Python identifier pValueInitial
    __pValueInitial = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'pValueInitial'), 'pValueInitial', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_pValueInitial', PROB_NUMBER)
    __pValueInitial._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2387, 6)
    __pValueInitial._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2387, 6)
    
    pValueInitial = property(__pValueInitial.value, __pValueInitial.set, None, None)

    
    # Attribute pValueFinal uses Python identifier pValueFinal
    __pValueFinal = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'pValueFinal'), 'pValueFinal', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_pValueFinal', PROB_NUMBER)
    __pValueFinal._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2388, 6)
    __pValueFinal._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2388, 6)
    
    pValueFinal = property(__pValueFinal.value, __pValueFinal.set, None, None)

    
    # Attribute confidenceLevel uses Python identifier confidenceLevel
    __confidenceLevel = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'confidenceLevel'), 'confidenceLevel', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_confidenceLevel', PROB_NUMBER, unicode_default=u'0.95')
    __confidenceLevel._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2389, 6)
    __confidenceLevel._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2389, 6)
    
    confidenceLevel = property(__confidenceLevel.value, __confidenceLevel.set, None, None)

    
    # Attribute confidenceLowerBound uses Python identifier confidenceLowerBound
    __confidenceLowerBound = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'confidenceLowerBound'), 'confidenceLowerBound', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_confidenceLowerBound', NUMBER)
    __confidenceLowerBound._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2390, 6)
    __confidenceLowerBound._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2390, 6)
    
    confidenceLowerBound = property(__confidenceLowerBound.value, __confidenceLowerBound.set, None, None)

    
    # Attribute confidenceUpperBound uses Python identifier confidenceUpperBound
    __confidenceUpperBound = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'confidenceUpperBound'), 'confidenceUpperBound', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_182_confidenceUpperBound', NUMBER)
    __confidenceUpperBound._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2391, 6)
    __confidenceUpperBound._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2391, 6)
    
    confidenceUpperBound = property(__confidenceUpperBound.value, __confidenceUpperBound.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __name.name() : __name,
        __category.name() : __category,
        __exponent.name() : __exponent,
        __isIntercept.name() : __isIntercept,
        __importance.name() : __importance,
        __stdError.name() : __stdError,
        __tValue.name() : __tValue,
        __chiSquareValue.name() : __chiSquareValue,
        __fStatistic.name() : __fStatistic,
        __dF.name() : __dF,
        __pValueAlpha.name() : __pValueAlpha,
        __pValueInitial.name() : __pValueInitial,
        __pValueFinal.name() : __pValueFinal,
        __confidenceLevel.name() : __confidenceLevel,
        __confidenceLowerBound.name() : __confidenceLowerBound,
        __confidenceUpperBound.name() : __confidenceUpperBound
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_183 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2395, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_183_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}AnovaRow uses Python identifier AnovaRow
    __AnovaRow = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'AnovaRow'), 'AnovaRow', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_183_httpwww_dmg_orgPMML_4_1AnovaRow', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2403, 2), )

    
    AnovaRow = property(__AnovaRow.value, __AnovaRow.set, None, None)

    
    # Attribute target uses Python identifier target
    __target = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'target'), 'target', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_183_target', FIELD_NAME)
    __target._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2400, 6)
    __target._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2400, 6)
    
    target = property(__target.value, __target.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __AnovaRow.name() : __AnovaRow
    })
    _AttributeMap.update({
        __target.name() : __target
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_184 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2404, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_184_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute type uses Python identifier type
    __type = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'type'), 'type', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_184_type', STD_ANON_26, required=True)
    __type._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2408, 6)
    __type._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2408, 6)
    
    type = property(__type.value, __type.set, None, None)

    
    # Attribute sumOfSquares uses Python identifier sumOfSquares
    __sumOfSquares = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'sumOfSquares'), 'sumOfSquares', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_184_sumOfSquares', NUMBER, required=True)
    __sumOfSquares._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2417, 6)
    __sumOfSquares._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2417, 6)
    
    sumOfSquares = property(__sumOfSquares.value, __sumOfSquares.set, None, None)

    
    # Attribute degreesOfFreedom uses Python identifier degreesOfFreedom
    __degreesOfFreedom = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'degreesOfFreedom'), 'degreesOfFreedom', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_184_degreesOfFreedom', NUMBER, required=True)
    __degreesOfFreedom._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2418, 6)
    __degreesOfFreedom._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2418, 6)
    
    degreesOfFreedom = property(__degreesOfFreedom.value, __degreesOfFreedom.set, None, None)

    
    # Attribute meanOfSquares uses Python identifier meanOfSquares
    __meanOfSquares = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'meanOfSquares'), 'meanOfSquares', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_184_meanOfSquares', NUMBER)
    __meanOfSquares._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2419, 6)
    __meanOfSquares._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2419, 6)
    
    meanOfSquares = property(__meanOfSquares.value, __meanOfSquares.set, None, None)

    
    # Attribute fValue uses Python identifier fValue
    __fValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'fValue'), 'fValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_184_fValue', NUMBER)
    __fValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2420, 6)
    __fValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2420, 6)
    
    fValue = property(__fValue.value, __fValue.set, None, None)

    
    # Attribute pValue uses Python identifier pValue
    __pValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'pValue'), 'pValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_184_pValue', PROB_NUMBER)
    __pValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2421, 6)
    __pValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2421, 6)
    
    pValue = property(__pValue.value, __pValue.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __type.name() : __type,
        __sumOfSquares.name() : __sumOfSquares,
        __degreesOfFreedom.name() : __degreesOfFreedom,
        __meanOfSquares.name() : __meanOfSquares,
        __fValue.name() : __fValue,
        __pValue.name() : __pValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_185 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2425, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_185_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PartitionFieldStats uses Python identifier PartitionFieldStats
    __PartitionFieldStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PartitionFieldStats'), 'PartitionFieldStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_185_httpwww_dmg_orgPMML_4_1PartitionFieldStats', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2434, 2), )

    
    PartitionFieldStats = property(__PartitionFieldStats.value, __PartitionFieldStats.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_185_name', pyxb.binding.datatypes.string, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2430, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2430, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute size uses Python identifier size
    __size = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'size'), 'size', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_185_size', NUMBER)
    __size._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2431, 6)
    __size._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2431, 6)
    
    size = property(__size.value, __size.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __PartitionFieldStats.name() : __PartitionFieldStats
    })
    _AttributeMap.update({
        __name.name() : __name,
        __size.name() : __size
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_186 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2435, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_186_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Array uses Python identifier Array
    __Array = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Array'), 'Array', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_186_httpwww_dmg_orgPMML_4_1Array', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2), )

    
    Array = property(__Array.value, __Array.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Counts uses Python identifier Counts
    __Counts = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Counts'), 'Counts', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_186_httpwww_dmg_orgPMML_4_1Counts', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2303, 2), )

    
    Counts = property(__Counts.value, __Counts.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NumericInfo uses Python identifier NumericInfo
    __NumericInfo = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NumericInfo'), 'NumericInfo', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_186_httpwww_dmg_orgPMML_4_1NumericInfo', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2314, 2), )

    
    NumericInfo = property(__NumericInfo.value, __NumericInfo.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_186_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2442, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2442, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute weighted uses Python identifier weighted
    __weighted = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'weighted'), 'weighted', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_186_weighted', STD_ANON_27, unicode_default=u'0')
    __weighted._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2443, 6)
    __weighted._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2443, 6)
    
    weighted = property(__weighted.value, __weighted.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Array.name() : __Array,
        __Counts.name() : __Counts,
        __NumericInfo.name() : __NumericInfo
    })
    _AttributeMap.update({
        __field.name() : __field,
        __weighted.name() : __weighted
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_187 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2462, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_187_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TargetValue uses Python identifier TargetValue
    __TargetValue = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TargetValue'), 'TargetValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_187_httpwww_dmg_orgPMML_4_1TargetValue', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2484, 2), )

    
    TargetValue = property(__TargetValue.value, __TargetValue.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_187_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2467, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2467, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute optype uses Python identifier optype
    __optype = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'optype'), 'optype', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_187_optype', OPTYPE)
    __optype._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2468, 6)
    __optype._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2468, 6)
    
    optype = property(__optype.value, __optype.set, None, None)

    
    # Attribute castInteger uses Python identifier castInteger
    __castInteger = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'castInteger'), 'castInteger', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_187_castInteger', STD_ANON_28)
    __castInteger._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2469, 6)
    __castInteger._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2469, 6)
    
    castInteger = property(__castInteger.value, __castInteger.set, None, None)

    
    # Attribute min uses Python identifier min
    __min = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'min'), 'min', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_187_min', pyxb.binding.datatypes.double)
    __min._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2478, 6)
    __min._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2478, 6)
    
    min = property(__min.value, __min.set, None, None)

    
    # Attribute max uses Python identifier max
    __max = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'max'), 'max', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_187_max', pyxb.binding.datatypes.double)
    __max._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2479, 6)
    __max._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2479, 6)
    
    max = property(__max.value, __max.set, None, None)

    
    # Attribute rescaleConstant uses Python identifier rescaleConstant
    __rescaleConstant = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'rescaleConstant'), 'rescaleConstant', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_187_rescaleConstant', pyxb.binding.datatypes.double, unicode_default=u'0')
    __rescaleConstant._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2480, 6)
    __rescaleConstant._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2480, 6)
    
    rescaleConstant = property(__rescaleConstant.value, __rescaleConstant.set, None, None)

    
    # Attribute rescaleFactor uses Python identifier rescaleFactor
    __rescaleFactor = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'rescaleFactor'), 'rescaleFactor', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_187_rescaleFactor', pyxb.binding.datatypes.double, unicode_default=u'1')
    __rescaleFactor._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2481, 6)
    __rescaleFactor._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2481, 6)
    
    rescaleFactor = property(__rescaleFactor.value, __rescaleFactor.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __TargetValue.name() : __TargetValue
    })
    _AttributeMap.update({
        __field.name() : __field,
        __optype.name() : __optype,
        __castInteger.name() : __castInteger,
        __min.name() : __min,
        __max.name() : __max,
        __rescaleConstant.name() : __rescaleConstant,
        __rescaleFactor.name() : __rescaleFactor
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_188 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2485, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_188_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Partition uses Python identifier Partition
    __Partition = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Partition'), 'Partition', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_188_httpwww_dmg_orgPMML_4_1Partition', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2424, 2), )

    
    Partition = property(__Partition.value, __Partition.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_188_value', pyxb.binding.datatypes.string)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2490, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2490, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute displayValue uses Python identifier displayValue
    __displayValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'displayValue'), 'displayValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_188_displayValue', pyxb.binding.datatypes.string)
    __displayValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2491, 6)
    __displayValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2491, 6)
    
    displayValue = property(__displayValue.value, __displayValue.set, None, None)

    
    # Attribute priorProbability uses Python identifier priorProbability
    __priorProbability = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'priorProbability'), 'priorProbability', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_188_priorProbability', PROB_NUMBER)
    __priorProbability._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2492, 6)
    __priorProbability._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2492, 6)
    
    priorProbability = property(__priorProbability.value, __priorProbability.set, None, None)

    
    # Attribute defaultValue uses Python identifier defaultValue
    __defaultValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'defaultValue'), 'defaultValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_188_defaultValue', NUMBER)
    __defaultValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2493, 6)
    __defaultValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2493, 6)
    
    defaultValue = property(__defaultValue.value, __defaultValue.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Partition.name() : __Partition
    })
    _AttributeMap.update({
        __value.name() : __value,
        __displayValue.name() : __displayValue,
        __priorProbability.name() : __priorProbability,
        __defaultValue.name() : __defaultValue
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_189 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2497, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ParameterList uses Python identifier ParameterList
    __ParameterList = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ParameterList'), 'ParameterList', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1ParameterList', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2564, 2), )

    
    ParameterList = property(__ParameterList.value, __ParameterList.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FactorList uses Python identifier FactorList
    __FactorList = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FactorList'), 'FactorList', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1FactorList', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2582, 2), )

    
    FactorList = property(__FactorList.value, __FactorList.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CovariateList uses Python identifier CovariateList
    __CovariateList = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CovariateList'), 'CovariateList', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1CovariateList', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2590, 2), )

    
    CovariateList = property(__CovariateList.value, __CovariateList.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PPMatrix uses Python identifier PPMatrix
    __PPMatrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PPMatrix'), 'PPMatrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1PPMatrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2625, 2), )

    
    PPMatrix = property(__PPMatrix.value, __PPMatrix.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PCovMatrix uses Python identifier PCovMatrix
    __PCovMatrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PCovMatrix'), 'PCovMatrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1PCovMatrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2644, 2), )

    
    PCovMatrix = property(__PCovMatrix.value, __PCovMatrix.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ParamMatrix uses Python identifier ParamMatrix
    __ParamMatrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ParamMatrix'), 'ParamMatrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1ParamMatrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2673, 2), )

    
    ParamMatrix = property(__ParamMatrix.value, __ParamMatrix.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BaseCumHazardTables uses Python identifier BaseCumHazardTables
    __BaseCumHazardTables = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BaseCumHazardTables'), 'BaseCumHazardTables', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1BaseCumHazardTables', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2692, 2), )

    
    BaseCumHazardTables = property(__BaseCumHazardTables.value, __BaseCumHazardTables.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}EventValues uses Python identifier EventValues
    __EventValues = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'EventValues'), 'EventValues', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1EventValues', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2724, 2), )

    
    EventValues = property(__EventValues.value, __EventValues.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Attribute targetVariableName uses Python identifier targetVariableName
    __targetVariableName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetVariableName'), 'targetVariableName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_targetVariableName', FIELD_NAME)
    __targetVariableName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2517, 6)
    __targetVariableName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2517, 6)
    
    targetVariableName = property(__targetVariableName.value, __targetVariableName.set, None, None)

    
    # Attribute modelType uses Python identifier modelType
    __modelType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelType'), 'modelType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_modelType', STD_ANON_29, required=True)
    __modelType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2518, 6)
    __modelType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2518, 6)
    
    modelType = property(__modelType.value, __modelType.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2530, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2530, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2531, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2531, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2532, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2532, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute targetReferenceCategory uses Python identifier targetReferenceCategory
    __targetReferenceCategory = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetReferenceCategory'), 'targetReferenceCategory', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_targetReferenceCategory', pyxb.binding.datatypes.string)
    __targetReferenceCategory._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2533, 6)
    __targetReferenceCategory._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2533, 6)
    
    targetReferenceCategory = property(__targetReferenceCategory.value, __targetReferenceCategory.set, None, None)

    
    # Attribute cumulativeLink uses Python identifier cumulativeLink
    __cumulativeLink = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'cumulativeLink'), 'cumulativeLink', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_cumulativeLink', CUMULATIVE_LINK_FUNCTION)
    __cumulativeLink._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2534, 6)
    __cumulativeLink._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2534, 6)
    
    cumulativeLink = property(__cumulativeLink.value, __cumulativeLink.set, None, None)

    
    # Attribute linkFunction uses Python identifier linkFunction
    __linkFunction = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'linkFunction'), 'linkFunction', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_linkFunction', LINK_FUNCTION)
    __linkFunction._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2535, 6)
    __linkFunction._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2535, 6)
    
    linkFunction = property(__linkFunction.value, __linkFunction.set, None, None)

    
    # Attribute linkParameter uses Python identifier linkParameter
    __linkParameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'linkParameter'), 'linkParameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_linkParameter', REAL_NUMBER)
    __linkParameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2536, 6)
    __linkParameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2536, 6)
    
    linkParameter = property(__linkParameter.value, __linkParameter.set, None, None)

    
    # Attribute trialsVariable uses Python identifier trialsVariable
    __trialsVariable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'trialsVariable'), 'trialsVariable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_trialsVariable', FIELD_NAME)
    __trialsVariable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2537, 6)
    __trialsVariable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2537, 6)
    
    trialsVariable = property(__trialsVariable.value, __trialsVariable.set, None, None)

    
    # Attribute trialsValue uses Python identifier trialsValue
    __trialsValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'trialsValue'), 'trialsValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_trialsValue', INT_NUMBER)
    __trialsValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2538, 6)
    __trialsValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2538, 6)
    
    trialsValue = property(__trialsValue.value, __trialsValue.set, None, None)

    
    # Attribute distribution uses Python identifier distribution
    __distribution = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'distribution'), 'distribution', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_distribution', STD_ANON_30)
    __distribution._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2539, 6)
    __distribution._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2539, 6)
    
    distribution = property(__distribution.value, __distribution.set, None, None)

    
    # Attribute distParameter uses Python identifier distParameter
    __distParameter = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'distParameter'), 'distParameter', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_distParameter', REAL_NUMBER)
    __distParameter._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2552, 6)
    __distParameter._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2552, 6)
    
    distParameter = property(__distParameter.value, __distParameter.set, None, None)

    
    # Attribute offsetVariable uses Python identifier offsetVariable
    __offsetVariable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'offsetVariable'), 'offsetVariable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_offsetVariable', FIELD_NAME)
    __offsetVariable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2553, 6)
    __offsetVariable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2553, 6)
    
    offsetVariable = property(__offsetVariable.value, __offsetVariable.set, None, None)

    
    # Attribute offsetValue uses Python identifier offsetValue
    __offsetValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'offsetValue'), 'offsetValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_offsetValue', REAL_NUMBER)
    __offsetValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2554, 6)
    __offsetValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2554, 6)
    
    offsetValue = property(__offsetValue.value, __offsetValue.set, None, None)

    
    # Attribute modelDF uses Python identifier modelDF
    __modelDF = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelDF'), 'modelDF', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_modelDF', REAL_NUMBER)
    __modelDF._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2555, 6)
    __modelDF._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2555, 6)
    
    modelDF = property(__modelDF.value, __modelDF.set, None, None)

    
    # Attribute endTimeVariable uses Python identifier endTimeVariable
    __endTimeVariable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'endTimeVariable'), 'endTimeVariable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_endTimeVariable', FIELD_NAME)
    __endTimeVariable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2556, 6)
    __endTimeVariable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2556, 6)
    
    endTimeVariable = property(__endTimeVariable.value, __endTimeVariable.set, None, None)

    
    # Attribute startTimeVariable uses Python identifier startTimeVariable
    __startTimeVariable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'startTimeVariable'), 'startTimeVariable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_startTimeVariable', FIELD_NAME)
    __startTimeVariable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2557, 6)
    __startTimeVariable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2557, 6)
    
    startTimeVariable = property(__startTimeVariable.value, __startTimeVariable.set, None, None)

    
    # Attribute subjectIDVariable uses Python identifier subjectIDVariable
    __subjectIDVariable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'subjectIDVariable'), 'subjectIDVariable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_subjectIDVariable', FIELD_NAME)
    __subjectIDVariable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2558, 6)
    __subjectIDVariable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2558, 6)
    
    subjectIDVariable = property(__subjectIDVariable.value, __subjectIDVariable.set, None, None)

    
    # Attribute statusVariable uses Python identifier statusVariable
    __statusVariable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'statusVariable'), 'statusVariable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_statusVariable', FIELD_NAME)
    __statusVariable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2559, 6)
    __statusVariable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2559, 6)
    
    statusVariable = property(__statusVariable.value, __statusVariable.set, None, None)

    
    # Attribute baselineStrataVariable uses Python identifier baselineStrataVariable
    __baselineStrataVariable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'baselineStrataVariable'), 'baselineStrataVariable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_baselineStrataVariable', FIELD_NAME)
    __baselineStrataVariable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2560, 6)
    __baselineStrataVariable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2560, 6)
    
    baselineStrataVariable = property(__baselineStrataVariable.value, __baselineStrataVariable.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_189_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2561, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2561, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __ParameterList.name() : __ParameterList,
        __FactorList.name() : __FactorList,
        __CovariateList.name() : __CovariateList,
        __PPMatrix.name() : __PPMatrix,
        __PCovMatrix.name() : __PCovMatrix,
        __ParamMatrix.name() : __ParamMatrix,
        __BaseCumHazardTables.name() : __BaseCumHazardTables,
        __EventValues.name() : __EventValues,
        __Output.name() : __Output
    })
    _AttributeMap.update({
        __targetVariableName.name() : __targetVariableName,
        __modelType.name() : __modelType,
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __targetReferenceCategory.name() : __targetReferenceCategory,
        __cumulativeLink.name() : __cumulativeLink,
        __linkFunction.name() : __linkFunction,
        __linkParameter.name() : __linkParameter,
        __trialsVariable.name() : __trialsVariable,
        __trialsValue.name() : __trialsValue,
        __distribution.name() : __distribution,
        __distParameter.name() : __distParameter,
        __offsetVariable.name() : __offsetVariable,
        __offsetValue.name() : __offsetValue,
        __modelDF.name() : __modelDF,
        __endTimeVariable.name() : __endTimeVariable,
        __startTimeVariable.name() : __startTimeVariable,
        __subjectIDVariable.name() : __subjectIDVariable,
        __statusVariable.name() : __statusVariable,
        __baselineStrataVariable.name() : __baselineStrataVariable,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_190 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2573, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_190_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_190_name', pyxb.binding.datatypes.string, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2577, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2577, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute label uses Python identifier label
    __label = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'label'), 'label', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_190_label', pyxb.binding.datatypes.string)
    __label._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2578, 6)
    __label._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2578, 6)
    
    label = property(__label.value, __label.set, None, None)

    
    # Attribute referencePoint uses Python identifier referencePoint
    __referencePoint = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'referencePoint'), 'referencePoint', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_190_referencePoint', REAL_NUMBER, unicode_default=u'0')
    __referencePoint._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2579, 6)
    __referencePoint._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2579, 6)
    
    referencePoint = property(__referencePoint.value, __referencePoint.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __name.name() : __name,
        __label.name() : __label,
        __referencePoint.name() : __referencePoint
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_191 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2599, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_191_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Matrix uses Python identifier Matrix
    __Matrix = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), 'Matrix', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_191_httpwww_dmg_orgPMML_4_1Matrix', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2), )

    
    Matrix = property(__Matrix.value, __Matrix.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Categories uses Python identifier Categories
    __Categories = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Categories'), 'Categories', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_191_httpwww_dmg_orgPMML_4_1Categories', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2609, 2), )

    
    Categories = property(__Categories.value, __Categories.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_191_name', FIELD_NAME, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2605, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2605, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute contrastMatrixType uses Python identifier contrastMatrixType
    __contrastMatrixType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'contrastMatrixType'), 'contrastMatrixType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_191_contrastMatrixType', pyxb.binding.datatypes.string)
    __contrastMatrixType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2606, 6)
    __contrastMatrixType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2606, 6)
    
    contrastMatrixType = property(__contrastMatrixType.value, __contrastMatrixType.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Matrix.name() : __Matrix,
        __Categories.name() : __Categories
    })
    _AttributeMap.update({
        __name.name() : __name,
        __contrastMatrixType.name() : __contrastMatrixType
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_192 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2634, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_192_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_192_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2638, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2638, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute predictorName uses Python identifier predictorName
    __predictorName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'predictorName'), 'predictorName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_192_predictorName', FIELD_NAME, required=True)
    __predictorName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2639, 6)
    __predictorName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2639, 6)
    
    predictorName = property(__predictorName.value, __predictorName.set, None, None)

    
    # Attribute parameterName uses Python identifier parameterName
    __parameterName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'parameterName'), 'parameterName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_192_parameterName', pyxb.binding.datatypes.string, required=True)
    __parameterName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2640, 6)
    __parameterName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2640, 6)
    
    parameterName = property(__parameterName.value, __parameterName.set, None, None)

    
    # Attribute targetCategory uses Python identifier targetCategory
    __targetCategory = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetCategory'), 'targetCategory', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_192_targetCategory', pyxb.binding.datatypes.string)
    __targetCategory._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2641, 6)
    __targetCategory._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2641, 6)
    
    targetCategory = property(__targetCategory.value, __targetCategory.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __value.name() : __value,
        __predictorName.name() : __predictorName,
        __parameterName.name() : __parameterName,
        __targetCategory.name() : __targetCategory
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_193 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2645, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_193_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}PCovCell uses Python identifier PCovCell
    __PCovCell = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'PCovCell'), 'PCovCell', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_193_httpwww_dmg_orgPMML_4_1PCovCell', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2660, 2), )

    
    PCovCell = property(__PCovCell.value, __PCovCell.set, None, None)

    
    # Attribute type uses Python identifier type
    __type = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'type'), 'type', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_193_type', STD_ANON_31)
    __type._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2650, 6)
    __type._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2650, 6)
    
    type = property(__type.value, __type.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __PCovCell.name() : __PCovCell
    })
    _AttributeMap.update({
        __type.name() : __type
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_194 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2661, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_194_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute pRow uses Python identifier pRow
    __pRow = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'pRow'), 'pRow', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_194_pRow', pyxb.binding.datatypes.string, required=True)
    __pRow._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2665, 6)
    __pRow._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2665, 6)
    
    pRow = property(__pRow.value, __pRow.set, None, None)

    
    # Attribute pCol uses Python identifier pCol
    __pCol = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'pCol'), 'pCol', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_194_pCol', pyxb.binding.datatypes.string, required=True)
    __pCol._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2666, 6)
    __pCol._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2666, 6)
    
    pCol = property(__pCol.value, __pCol.set, None, None)

    
    # Attribute tRow uses Python identifier tRow
    __tRow = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'tRow'), 'tRow', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_194_tRow', pyxb.binding.datatypes.string)
    __tRow._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2667, 6)
    __tRow._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2667, 6)
    
    tRow = property(__tRow.value, __tRow.set, None, None)

    
    # Attribute tCol uses Python identifier tCol
    __tCol = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'tCol'), 'tCol', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_194_tCol', pyxb.binding.datatypes.string)
    __tCol._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2668, 6)
    __tCol._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2668, 6)
    
    tCol = property(__tCol.value, __tCol.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_194_value', REAL_NUMBER, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2669, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2669, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute targetCategory uses Python identifier targetCategory
    __targetCategory = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetCategory'), 'targetCategory', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_194_targetCategory', pyxb.binding.datatypes.string)
    __targetCategory._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2670, 6)
    __targetCategory._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2670, 6)
    
    targetCategory = property(__targetCategory.value, __targetCategory.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __pRow.name() : __pRow,
        __pCol.name() : __pCol,
        __tRow.name() : __tRow,
        __tCol.name() : __tCol,
        __value.name() : __value,
        __targetCategory.name() : __targetCategory
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_195 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2682, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_195_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute targetCategory uses Python identifier targetCategory
    __targetCategory = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetCategory'), 'targetCategory', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_195_targetCategory', pyxb.binding.datatypes.string)
    __targetCategory._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2686, 6)
    __targetCategory._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2686, 6)
    
    targetCategory = property(__targetCategory.value, __targetCategory.set, None, None)

    
    # Attribute parameterName uses Python identifier parameterName
    __parameterName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'parameterName'), 'parameterName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_195_parameterName', pyxb.binding.datatypes.string, required=True)
    __parameterName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2687, 6)
    __parameterName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2687, 6)
    
    parameterName = property(__parameterName.value, __parameterName.set, None, None)

    
    # Attribute beta uses Python identifier beta
    __beta = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'beta'), 'beta', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_195_beta', REAL_NUMBER, required=True)
    __beta._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2688, 6)
    __beta._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2688, 6)
    
    beta = property(__beta.value, __beta.set, None, None)

    
    # Attribute df uses Python identifier df
    __df = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'df'), 'df', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_195_df', INT_NUMBER)
    __df._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2689, 6)
    __df._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2689, 6)
    
    df = property(__df.value, __df.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __targetCategory.name() : __targetCategory,
        __parameterName.name() : __parameterName,
        __beta.name() : __beta,
        __df.name() : __df
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_196 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2693, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_196_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BaselineStratum uses Python identifier BaselineStratum
    __BaselineStratum = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BaselineStratum'), 'BaselineStratum', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_196_httpwww_dmg_orgPMML_4_1BaselineStratum', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2704, 2), )

    
    BaselineStratum = property(__BaselineStratum.value, __BaselineStratum.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BaselineCell uses Python identifier BaselineCell
    __BaselineCell = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BaselineCell'), 'BaselineCell', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_196_httpwww_dmg_orgPMML_4_1BaselineCell', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2715, 2), )

    
    BaselineCell = property(__BaselineCell.value, __BaselineCell.set, None, None)

    
    # Attribute maxTime uses Python identifier maxTime
    __maxTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maxTime'), 'maxTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_196_maxTime', REAL_NUMBER)
    __maxTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2701, 6)
    __maxTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2701, 6)
    
    maxTime = property(__maxTime.value, __maxTime.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __BaselineStratum.name() : __BaselineStratum,
        __BaselineCell.name() : __BaselineCell
    })
    _AttributeMap.update({
        __maxTime.name() : __maxTime
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_197 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2705, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_197_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}BaselineCell uses Python identifier BaselineCell
    __BaselineCell = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'BaselineCell'), 'BaselineCell', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_197_httpwww_dmg_orgPMML_4_1BaselineCell', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2715, 2), )

    
    BaselineCell = property(__BaselineCell.value, __BaselineCell.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_197_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2710, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2710, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute label uses Python identifier label
    __label = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'label'), 'label', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_197_label', pyxb.binding.datatypes.string)
    __label._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2711, 6)
    __label._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2711, 6)
    
    label = property(__label.value, __label.set, None, None)

    
    # Attribute maxTime uses Python identifier maxTime
    __maxTime = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'maxTime'), 'maxTime', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_197_maxTime', REAL_NUMBER, required=True)
    __maxTime._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2712, 6)
    __maxTime._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2712, 6)
    
    maxTime = property(__maxTime.value, __maxTime.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __BaselineCell.name() : __BaselineCell
    })
    _AttributeMap.update({
        __value.name() : __value,
        __label.name() : __label,
        __maxTime.name() : __maxTime
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_198 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2716, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_198_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute time uses Python identifier time
    __time = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'time'), 'time', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_198_time', REAL_NUMBER, required=True)
    __time._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2720, 6)
    __time._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2720, 6)
    
    time = property(__time.value, __time.set, None, None)

    
    # Attribute cumHazard uses Python identifier cumHazard
    __cumHazard = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'cumHazard'), 'cumHazard', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_198_cumHazard', REAL_NUMBER, required=True)
    __cumHazard._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2721, 6)
    __cumHazard._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2721, 6)
    
    cumHazard = property(__cumHazard.value, __cumHazard.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __time.name() : __time,
        __cumHazard.name() : __cumHazard
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_199 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2767, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_199_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Value uses Python identifier Value
    __Value = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Value'), 'Value', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_199_httpwww_dmg_orgPMML_4_1Value', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2818, 2), )

    
    Value = property(__Value.value, __Value.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Interval uses Python identifier Interval
    __Interval = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Interval'), 'Interval', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_199_httpwww_dmg_orgPMML_4_1Interval', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2836, 2), )

    
    Interval = property(__Interval.value, __Interval.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_199_name', FIELD_NAME, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2775, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2775, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute displayName uses Python identifier displayName
    __displayName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'displayName'), 'displayName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_199_displayName', pyxb.binding.datatypes.string)
    __displayName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2776, 6)
    __displayName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2776, 6)
    
    displayName = property(__displayName.value, __displayName.set, None, None)

    
    # Attribute optype uses Python identifier optype
    __optype = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'optype'), 'optype', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_199_optype', OPTYPE, required=True)
    __optype._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2777, 6)
    __optype._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2777, 6)
    
    optype = property(__optype.value, __optype.set, None, None)

    
    # Attribute dataType uses Python identifier dataType
    __dataType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataType'), 'dataType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_199_dataType', DATATYPE, required=True)
    __dataType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2778, 6)
    __dataType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2778, 6)
    
    dataType = property(__dataType.value, __dataType.set, None, None)

    
    # Attribute taxonomy uses Python identifier taxonomy
    __taxonomy = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'taxonomy'), 'taxonomy', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_199_taxonomy', pyxb.binding.datatypes.string)
    __taxonomy._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2779, 6)
    __taxonomy._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2779, 6)
    
    taxonomy = property(__taxonomy.value, __taxonomy.set, None, None)

    
    # Attribute isCyclic uses Python identifier isCyclic
    __isCyclic = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isCyclic'), 'isCyclic', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_199_isCyclic', STD_ANON_32, unicode_default=u'0')
    __isCyclic._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2780, 6)
    __isCyclic._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2780, 6)
    
    isCyclic = property(__isCyclic.value, __isCyclic.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Value.name() : __Value,
        __Interval.name() : __Interval
    })
    _AttributeMap.update({
        __name.name() : __name,
        __displayName.name() : __displayName,
        __optype.name() : __optype,
        __dataType.name() : __dataType,
        __taxonomy.name() : __taxonomy,
        __isCyclic.name() : __isCyclic
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_200 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2819, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_200_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_200_value', pyxb.binding.datatypes.string, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2823, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2823, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute displayValue uses Python identifier displayValue
    __displayValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'displayValue'), 'displayValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_200_displayValue', pyxb.binding.datatypes.string)
    __displayValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2824, 6)
    __displayValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2824, 6)
    
    displayValue = property(__displayValue.value, __displayValue.set, None, None)

    
    # Attribute property uses Python identifier property_
    __property = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'property'), 'property_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_200_property', STD_ANON_33, unicode_default=u'valid')
    __property._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2825, 6)
    __property._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2825, 6)
    
    property_ = property(__property.value, __property.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __value.name() : __value,
        __displayValue.name() : __displayValue,
        __property.name() : __property
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_201 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2837, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_201_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute closure uses Python identifier closure
    __closure = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'closure'), 'closure', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_201_closure', STD_ANON_34, required=True)
    __closure._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2841, 6)
    __closure._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2841, 6)
    
    closure = property(__closure.value, __closure.set, None, None)

    
    # Attribute leftMargin uses Python identifier leftMargin
    __leftMargin = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'leftMargin'), 'leftMargin', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_201_leftMargin', NUMBER)
    __leftMargin._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2851, 6)
    __leftMargin._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2851, 6)
    
    leftMargin = property(__leftMargin.value, __leftMargin.set, None, None)

    
    # Attribute rightMargin uses Python identifier rightMargin
    __rightMargin = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'rightMargin'), 'rightMargin', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_201_rightMargin', NUMBER)
    __rightMargin._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2852, 6)
    __rightMargin._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2852, 6)
    
    rightMargin = property(__rightMargin.value, __rightMargin.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __closure.name() : __closure,
        __leftMargin.name() : __leftMargin,
        __rightMargin.name() : __rightMargin
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_202 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2864, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Apply uses Python identifier Apply
    __Apply = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Apply'), 'Apply', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1Apply', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 260, 2), )

    
    Apply = property(__Apply.value, __Apply.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Constant uses Python identifier Constant
    __Constant = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Constant'), 'Constant', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1Constant', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1018, 2), )

    
    Constant = property(__Constant.value, __Constant.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldRef uses Python identifier FieldRef
    __FieldRef = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), 'FieldRef', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1FieldRef', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2), )

    
    FieldRef = property(__FieldRef.value, __FieldRef.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NormContinuous uses Python identifier NormContinuous
    __NormContinuous = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous'), 'NormContinuous', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1NormContinuous', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1036, 2), )

    
    NormContinuous = property(__NormContinuous.value, __NormContinuous.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NormDiscrete uses Python identifier NormDiscrete
    __NormDiscrete = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete'), 'NormDiscrete', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1NormDiscrete', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1056, 2), )

    
    NormDiscrete = property(__NormDiscrete.value, __NormDiscrete.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Discretize uses Python identifier Discretize
    __Discretize = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Discretize'), 'Discretize', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1Discretize', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1073, 2), )

    
    Discretize = property(__Discretize.value, __Discretize.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MapValues uses Python identifier MapValues
    __MapValues = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MapValues'), 'MapValues', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1MapValues', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1094, 2), )

    
    MapValues = property(__MapValues.value, __MapValues.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Aggregate uses Python identifier Aggregate
    __Aggregate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Aggregate'), 'Aggregate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1Aggregate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1119, 2), )

    
    Aggregate = property(__Aggregate.value, __Aggregate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Decisions uses Python identifier Decisions
    __Decisions = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Decisions'), 'Decisions', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_httpwww_dmg_orgPMML_4_1Decisions', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2932, 2), )

    
    Decisions = property(__Decisions.value, __Decisions.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_name', FIELD_NAME, required=True)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2872, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2872, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute displayName uses Python identifier displayName
    __displayName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'displayName'), 'displayName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_displayName', pyxb.binding.datatypes.string)
    __displayName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2873, 6)
    __displayName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2873, 6)
    
    displayName = property(__displayName.value, __displayName.set, None, None)

    
    # Attribute optype uses Python identifier optype
    __optype = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'optype'), 'optype', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_optype', OPTYPE)
    __optype._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2874, 6)
    __optype._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2874, 6)
    
    optype = property(__optype.value, __optype.set, None, None)

    
    # Attribute dataType uses Python identifier dataType
    __dataType = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'dataType'), 'dataType', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_dataType', DATATYPE)
    __dataType._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2875, 6)
    __dataType._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2875, 6)
    
    dataType = property(__dataType.value, __dataType.set, None, None)

    
    # Attribute targetField uses Python identifier targetField
    __targetField = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'targetField'), 'targetField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_targetField', FIELD_NAME)
    __targetField._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2876, 6)
    __targetField._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2876, 6)
    
    targetField = property(__targetField.value, __targetField.set, None, None)

    
    # Attribute feature uses Python identifier feature
    __feature = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'feature'), 'feature', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_feature', RESULT_FEATURE)
    __feature._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2877, 6)
    __feature._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2877, 6)
    
    feature = property(__feature.value, __feature.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_value', pyxb.binding.datatypes.string)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2878, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2878, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute ruleFeature uses Python identifier ruleFeature
    __ruleFeature = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'ruleFeature'), 'ruleFeature', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_ruleFeature', RULE_FEATURE, unicode_default=u'consequent')
    __ruleFeature._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2879, 6)
    __ruleFeature._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2879, 6)
    
    ruleFeature = property(__ruleFeature.value, __ruleFeature.set, None, None)

    
    # Attribute algorithm uses Python identifier algorithm
    __algorithm = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithm'), 'algorithm', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_algorithm', STD_ANON_35, unicode_default=u'exclusiveRecommendation')
    __algorithm._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2880, 6)
    __algorithm._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2880, 6)
    
    algorithm = property(__algorithm.value, __algorithm.set, None, None)

    
    # Attribute rank uses Python identifier rank
    __rank = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'rank'), 'rank', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_rank', INT_NUMBER, unicode_default=u'1')
    __rank._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2889, 6)
    __rank._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2889, 6)
    
    rank = property(__rank.value, __rank.set, None, None)

    
    # Attribute rankBasis uses Python identifier rankBasis
    __rankBasis = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'rankBasis'), 'rankBasis', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_rankBasis', STD_ANON_36, unicode_default=u'confidence')
    __rankBasis._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2890, 6)
    __rankBasis._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2890, 6)
    
    rankBasis = property(__rankBasis.value, __rankBasis.set, None, None)

    
    # Attribute rankOrder uses Python identifier rankOrder
    __rankOrder = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'rankOrder'), 'rankOrder', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_rankOrder', STD_ANON_37, unicode_default=u'descending')
    __rankOrder._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2901, 6)
    __rankOrder._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2901, 6)
    
    rankOrder = property(__rankOrder.value, __rankOrder.set, None, None)

    
    # Attribute isMultiValued uses Python identifier isMultiValued
    __isMultiValued = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isMultiValued'), 'isMultiValued', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_isMultiValued', pyxb.binding.datatypes.anySimpleType, unicode_default=u'0')
    __isMultiValued._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2909, 6)
    __isMultiValued._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2909, 6)
    
    isMultiValued = property(__isMultiValued.value, __isMultiValued.set, None, None)

    
    # Attribute segmentId uses Python identifier segmentId
    __segmentId = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'segmentId'), 'segmentId', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_202_segmentId', pyxb.binding.datatypes.string)
    __segmentId._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2910, 6)
    __segmentId._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2910, 6)
    
    segmentId = property(__segmentId.value, __segmentId.set, None, None)

    _ElementMap.update({
        __Apply.name() : __Apply,
        __Extension.name() : __Extension,
        __Constant.name() : __Constant,
        __FieldRef.name() : __FieldRef,
        __NormContinuous.name() : __NormContinuous,
        __NormDiscrete.name() : __NormDiscrete,
        __Discretize.name() : __Discretize,
        __MapValues.name() : __MapValues,
        __Aggregate.name() : __Aggregate,
        __Decisions.name() : __Decisions
    })
    _AttributeMap.update({
        __name.name() : __name,
        __displayName.name() : __displayName,
        __optype.name() : __optype,
        __dataType.name() : __dataType,
        __targetField.name() : __targetField,
        __feature.name() : __feature,
        __value.name() : __value,
        __ruleFeature.name() : __ruleFeature,
        __algorithm.name() : __algorithm,
        __rank.name() : __rank,
        __rankBasis.name() : __rankBasis,
        __rankOrder.name() : __rankOrder,
        __isMultiValued.name() : __isMultiValued,
        __segmentId.name() : __segmentId
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_203 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2975, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_203_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TableLocator uses Python identifier TableLocator
    __TableLocator = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TableLocator'), 'TableLocator', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_203_httpwww_dmg_orgPMML_4_1TableLocator', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2996, 2), )

    
    TableLocator = property(__TableLocator.value, __TableLocator.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}InlineTable uses Python identifier InlineTable
    __InlineTable = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'InlineTable'), 'InlineTable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_203_httpwww_dmg_orgPMML_4_1InlineTable', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3003, 2), )

    
    InlineTable = property(__InlineTable.value, __InlineTable.set, None, None)

    
    # Attribute childField uses Python identifier childField
    __childField = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'childField'), 'childField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_203_childField', pyxb.binding.datatypes.string, required=True)
    __childField._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2983, 6)
    __childField._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2983, 6)
    
    childField = property(__childField.value, __childField.set, None, None)

    
    # Attribute parentField uses Python identifier parentField
    __parentField = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'parentField'), 'parentField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_203_parentField', pyxb.binding.datatypes.string, required=True)
    __parentField._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2984, 6)
    __parentField._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2984, 6)
    
    parentField = property(__parentField.value, __parentField.set, None, None)

    
    # Attribute parentLevelField uses Python identifier parentLevelField
    __parentLevelField = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'parentLevelField'), 'parentLevelField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_203_parentLevelField', pyxb.binding.datatypes.string)
    __parentLevelField._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2985, 6)
    __parentLevelField._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2985, 6)
    
    parentLevelField = property(__parentLevelField.value, __parentLevelField.set, None, None)

    
    # Attribute isRecursive uses Python identifier isRecursive
    __isRecursive = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isRecursive'), 'isRecursive', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_203_isRecursive', STD_ANON_38, unicode_default=u'no')
    __isRecursive._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2986, 6)
    __isRecursive._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2986, 6)
    
    isRecursive = property(__isRecursive.value, __isRecursive.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __TableLocator.name() : __TableLocator,
        __InlineTable.name() : __InlineTable
    })
    _AttributeMap.update({
        __childField.name() : __childField,
        __parentField.name() : __parentField,
        __parentLevelField.name() : __parentLevelField,
        __isRecursive.name() : __isRecursive
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_204 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3023, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}TestDistributions uses Python identifier TestDistributions
    __TestDistributions = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'TestDistributions'), 'TestDistributions', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_httpwww_dmg_orgPMML_4_1TestDistributions', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3042, 2), )

    
    TestDistributions = property(__TestDistributions.value, __TestDistributions.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3036, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3036, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3037, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3037, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3038, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3038, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_204_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3039, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3039, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output,
        __TestDistributions.name() : __TestDistributions
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_205 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3043, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_205_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Baseline uses Python identifier Baseline
    __Baseline = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Baseline'), 'Baseline', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_205_httpwww_dmg_orgPMML_4_1Baseline', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3066, 2), )

    
    Baseline = property(__Baseline.value, __Baseline.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Alternate uses Python identifier Alternate
    __Alternate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Alternate'), 'Alternate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_205_httpwww_dmg_orgPMML_4_1Alternate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3074, 2), )

    
    Alternate = property(__Alternate.value, __Alternate.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_205_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3049, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3049, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute testStatistic uses Python identifier testStatistic
    __testStatistic = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'testStatistic'), 'testStatistic', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_205_testStatistic', BASELINE_TEST_STATISTIC, required=True)
    __testStatistic._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3050, 6)
    __testStatistic._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3050, 6)
    
    testStatistic = property(__testStatistic.value, __testStatistic.set, None, None)

    
    # Attribute resetValue uses Python identifier resetValue
    __resetValue = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'resetValue'), 'resetValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_205_resetValue', REAL_NUMBER, unicode_default=u'0.0')
    __resetValue._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3051, 6)
    __resetValue._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3051, 6)
    
    resetValue = property(__resetValue.value, __resetValue.set, None, None)

    
    # Attribute windowSize uses Python identifier windowSize
    __windowSize = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'windowSize'), 'windowSize', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_205_windowSize', INT_NUMBER, unicode_default=u'0')
    __windowSize._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3052, 6)
    __windowSize._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3052, 6)
    
    windowSize = property(__windowSize.value, __windowSize.set, None, None)

    
    # Attribute weightField uses Python identifier weightField
    __weightField = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'weightField'), 'weightField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_205_weightField', FIELD_NAME)
    __weightField._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3053, 6)
    __weightField._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3053, 6)
    
    weightField = property(__weightField.value, __weightField.set, None, None)

    
    # Attribute normalizationScheme uses Python identifier normalizationScheme
    __normalizationScheme = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'normalizationScheme'), 'normalizationScheme', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_205_normalizationScheme', pyxb.binding.datatypes.string)
    __normalizationScheme._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3054, 6)
    __normalizationScheme._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3054, 6)
    
    normalizationScheme = property(__normalizationScheme.value, __normalizationScheme.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Baseline.name() : __Baseline,
        __Alternate.name() : __Alternate
    })
    _AttributeMap.update({
        __field.name() : __field,
        __testStatistic.name() : __testStatistic,
        __resetValue.name() : __resetValue,
        __windowSize.name() : __windowSize,
        __weightField.name() : __weightField,
        __normalizationScheme.name() : __normalizationScheme
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_206 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3093, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_206_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute mean uses Python identifier mean
    __mean = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mean'), 'mean', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_206_mean', REAL_NUMBER, required=True)
    __mean._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3097, 6)
    __mean._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3097, 6)
    
    mean = property(__mean.value, __mean.set, None, None)

    
    # Attribute variance uses Python identifier variance
    __variance = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'variance'), 'variance', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_206_variance', REAL_NUMBER, required=True)
    __variance._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3098, 6)
    __variance._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3098, 6)
    
    variance = property(__variance.value, __variance.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __mean.name() : __mean,
        __variance.name() : __variance
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_207 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3102, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_207_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute mean uses Python identifier mean
    __mean = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mean'), 'mean', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_207_mean', REAL_NUMBER, required=True)
    __mean._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3106, 6)
    __mean._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3106, 6)
    
    mean = property(__mean.value, __mean.set, None, None)

    
    # Attribute variance uses Python identifier variance
    __variance = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'variance'), 'variance', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_207_variance', REAL_NUMBER, required=True)
    __variance._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3107, 6)
    __variance._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3107, 6)
    
    variance = property(__variance.value, __variance.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __mean.name() : __mean,
        __variance.name() : __variance
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_208 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3111, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_208_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute mean uses Python identifier mean
    __mean = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'mean'), 'mean', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_208_mean', REAL_NUMBER, required=True)
    __mean._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3115, 6)
    __mean._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3115, 6)
    
    mean = property(__mean.value, __mean.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __mean.name() : __mean
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_209 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3119, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_209_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute lower uses Python identifier lower
    __lower = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'lower'), 'lower', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_209_lower', REAL_NUMBER, required=True)
    __lower._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3123, 6)
    __lower._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3123, 6)
    
    lower = property(__lower.value, __lower.set, None, None)

    
    # Attribute upper uses Python identifier upper
    __upper = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'upper'), 'upper', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_209_upper', REAL_NUMBER, required=True)
    __upper._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3124, 6)
    __upper._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3124, 6)
    
    upper = property(__upper.value, __upper.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __lower.name() : __lower,
        __upper.name() : __upper
    })



# Complex type {http://www.dmg.org/PMML-4_1}COUNT-TABLE-TYPE with content type ELEMENT_ONLY
class COUNT_TABLE_TYPE (pyxb.binding.basis.complexTypeDefinition):
    """Complex type {http://www.dmg.org/PMML-4_1}COUNT-TABLE-TYPE with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = pyxb.namespace.ExpandedName(Namespace, u'COUNT-TABLE-TYPE')
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3136, 2)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_COUNT_TABLE_TYPE_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldValue uses Python identifier FieldValue
    __FieldValue = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldValue'), 'FieldValue', '__httpwww_dmg_orgPMML_4_1_COUNT_TABLE_TYPE_httpwww_dmg_orgPMML_4_1FieldValue', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3146, 2), )

    
    FieldValue = property(__FieldValue.value, __FieldValue.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldValueCount uses Python identifier FieldValueCount
    __FieldValueCount = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldValueCount'), 'FieldValueCount', '__httpwww_dmg_orgPMML_4_1_COUNT_TABLE_TYPE_httpwww_dmg_orgPMML_4_1FieldValueCount', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3159, 2), )

    
    FieldValueCount = property(__FieldValueCount.value, __FieldValueCount.set, None, None)

    
    # Attribute sample uses Python identifier sample
    __sample = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'sample'), 'sample', '__httpwww_dmg_orgPMML_4_1_COUNT_TABLE_TYPE_sample', NUMBER)
    __sample._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3144, 4)
    __sample._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3144, 4)
    
    sample = property(__sample.value, __sample.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __FieldValue.name() : __FieldValue,
        __FieldValueCount.name() : __FieldValueCount
    })
    _AttributeMap.update({
        __sample.name() : __sample
    })
Namespace.addCategoryObject('typeBinding', u'COUNT-TABLE-TYPE', COUNT_TABLE_TYPE)


# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_210 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3147, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_210_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldValue uses Python identifier FieldValue
    __FieldValue = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldValue'), 'FieldValue', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_210_httpwww_dmg_orgPMML_4_1FieldValue', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3146, 2), )

    
    FieldValue = property(__FieldValue.value, __FieldValue.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}FieldValueCount uses Python identifier FieldValueCount
    __FieldValueCount = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'FieldValueCount'), 'FieldValueCount', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_210_httpwww_dmg_orgPMML_4_1FieldValueCount', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3159, 2), )

    
    FieldValueCount = property(__FieldValueCount.value, __FieldValueCount.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_210_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3155, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3155, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_210_value', pyxb.binding.datatypes.anySimpleType, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3156, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3156, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __FieldValue.name() : __FieldValue,
        __FieldValueCount.name() : __FieldValueCount
    })
    _AttributeMap.update({
        __field.name() : __field,
        __value.name() : __value
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_211 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3160, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_211_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute field uses Python identifier field
    __field = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'field'), 'field', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_211_field', FIELD_NAME, required=True)
    __field._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3164, 6)
    __field._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3164, 6)
    
    field = property(__field.value, __field.set, None, None)

    
    # Attribute value uses Python identifier value_
    __value = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'value'), 'value_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_211_value', pyxb.binding.datatypes.anySimpleType, required=True)
    __value._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3165, 6)
    __value._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3165, 6)
    
    value_ = property(__value.value, __value.set, None, None)

    
    # Attribute count uses Python identifier count
    __count = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'count'), 'count', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_211_count', NUMBER, required=True)
    __count._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3166, 6)
    __count._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3166, 6)
    
    count = property(__count.value, __count.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __field.name() : __field,
        __value.name() : __value,
        __count.name() : __count
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_212 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3170, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NeuralInputs uses Python identifier NeuralInputs
    __NeuralInputs = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NeuralInputs'), 'NeuralInputs', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1NeuralInputs', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3197, 2), )

    
    NeuralInputs = property(__NeuralInputs.value, __NeuralInputs.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NeuralLayer uses Python identifier NeuralLayer
    __NeuralLayer = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NeuralLayer'), 'NeuralLayer', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1NeuralLayer', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3206, 2), )

    
    NeuralLayer = property(__NeuralLayer.value, __NeuralLayer.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}NeuralOutputs uses Python identifier NeuralOutputs
    __NeuralOutputs = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'NeuralOutputs'), 'NeuralOutputs', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_httpwww_dmg_orgPMML_4_1NeuralOutputs', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3220, 2), )

    
    NeuralOutputs = property(__NeuralOutputs.value, __NeuralOutputs.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3185, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3185, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3186, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3186, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3187, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3187, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute activationFunction uses Python identifier activationFunction
    __activationFunction = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'activationFunction'), 'activationFunction', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_activationFunction', ACTIVATION_FUNCTION, required=True)
    __activationFunction._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3188, 6)
    __activationFunction._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3188, 6)
    
    activationFunction = property(__activationFunction.value, __activationFunction.set, None, None)

    
    # Attribute normalizationMethod uses Python identifier normalizationMethod
    __normalizationMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'normalizationMethod'), 'normalizationMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_normalizationMethod', NN_NORMALIZATION_METHOD, unicode_default=u'none')
    __normalizationMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3189, 6)
    __normalizationMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3189, 6)
    
    normalizationMethod = property(__normalizationMethod.value, __normalizationMethod.set, None, None)

    
    # Attribute threshold uses Python identifier threshold
    __threshold = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'threshold'), 'threshold', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_threshold', REAL_NUMBER, unicode_default=u'0')
    __threshold._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3190, 6)
    __threshold._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3190, 6)
    
    threshold = property(__threshold.value, __threshold.set, None, None)

    
    # Attribute width uses Python identifier width
    __width = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'width'), 'width', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_width', REAL_NUMBER)
    __width._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3191, 6)
    __width._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3191, 6)
    
    width = property(__width.value, __width.set, None, None)

    
    # Attribute altitude uses Python identifier altitude
    __altitude = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'altitude'), 'altitude', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_altitude', REAL_NUMBER, unicode_default=u'1.0')
    __altitude._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3192, 6)
    __altitude._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3192, 6)
    
    altitude = property(__altitude.value, __altitude.set, None, None)

    
    # Attribute numberOfLayers uses Python identifier numberOfLayers
    __numberOfLayers = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfLayers'), 'numberOfLayers', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_numberOfLayers', pyxb.binding.datatypes.nonNegativeInteger)
    __numberOfLayers._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3193, 6)
    __numberOfLayers._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3193, 6)
    
    numberOfLayers = property(__numberOfLayers.value, __numberOfLayers.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_212_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3194, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3194, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output,
        __NeuralInputs.name() : __NeuralInputs,
        __NeuralLayer.name() : __NeuralLayer,
        __NeuralOutputs.name() : __NeuralOutputs
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __activationFunction.name() : __activationFunction,
        __normalizationMethod.name() : __normalizationMethod,
        __threshold.name() : __threshold,
        __width.name() : __width,
        __altitude.name() : __altitude,
        __numberOfLayers.name() : __numberOfLayers,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_213 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3207, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_213_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Neuron uses Python identifier Neuron
    __Neuron = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Neuron'), 'Neuron', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_213_httpwww_dmg_orgPMML_4_1Neuron', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3268, 2), )

    
    Neuron = property(__Neuron.value, __Neuron.set, None, None)

    
    # Attribute numberOfNeurons uses Python identifier numberOfNeurons
    __numberOfNeurons = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'numberOfNeurons'), 'numberOfNeurons', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_213_numberOfNeurons', pyxb.binding.datatypes.nonNegativeInteger)
    __numberOfNeurons._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3212, 6)
    __numberOfNeurons._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3212, 6)
    
    numberOfNeurons = property(__numberOfNeurons.value, __numberOfNeurons.set, None, None)

    
    # Attribute activationFunction uses Python identifier activationFunction
    __activationFunction = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'activationFunction'), 'activationFunction', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_213_activationFunction', ACTIVATION_FUNCTION)
    __activationFunction._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3213, 6)
    __activationFunction._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3213, 6)
    
    activationFunction = property(__activationFunction.value, __activationFunction.set, None, None)

    
    # Attribute threshold uses Python identifier threshold
    __threshold = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'threshold'), 'threshold', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_213_threshold', REAL_NUMBER)
    __threshold._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3214, 6)
    __threshold._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3214, 6)
    
    threshold = property(__threshold.value, __threshold.set, None, None)

    
    # Attribute width uses Python identifier width
    __width = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'width'), 'width', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_213_width', REAL_NUMBER)
    __width._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3215, 6)
    __width._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3215, 6)
    
    width = property(__width.value, __width.set, None, None)

    
    # Attribute altitude uses Python identifier altitude
    __altitude = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'altitude'), 'altitude', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_213_altitude', REAL_NUMBER)
    __altitude._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3216, 6)
    __altitude._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3216, 6)
    
    altitude = property(__altitude.value, __altitude.set, None, None)

    
    # Attribute normalizationMethod uses Python identifier normalizationMethod
    __normalizationMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'normalizationMethod'), 'normalizationMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_213_normalizationMethod', NN_NORMALIZATION_METHOD)
    __normalizationMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3217, 6)
    __normalizationMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3217, 6)
    
    normalizationMethod = property(__normalizationMethod.value, __normalizationMethod.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Neuron.name() : __Neuron
    })
    _AttributeMap.update({
        __numberOfNeurons.name() : __numberOfNeurons,
        __activationFunction.name() : __activationFunction,
        __threshold.name() : __threshold,
        __width.name() : __width,
        __altitude.name() : __altitude,
        __normalizationMethod.name() : __normalizationMethod
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_214 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3260, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_214_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DerivedField uses Python identifier DerivedField
    __DerivedField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), 'DerivedField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_214_httpwww_dmg_orgPMML_4_1DerivedField', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2), )

    
    DerivedField = property(__DerivedField.value, __DerivedField.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_214_id', NN_NEURON_ID, required=True)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3265, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3265, 6)
    
    id = property(__id.value, __id.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __DerivedField.name() : __DerivedField
    })
    _AttributeMap.update({
        __id.name() : __id
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_215 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3269, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_215_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Con uses Python identifier Con
    __Con = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Con'), 'Con', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_215_httpwww_dmg_orgPMML_4_1Con', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3280, 2), )

    
    Con = property(__Con.value, __Con.set, None, None)

    
    # Attribute id uses Python identifier id
    __id = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'id'), 'id', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_215_id', NN_NEURON_ID, required=True)
    __id._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3274, 6)
    __id._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3274, 6)
    
    id = property(__id.value, __id.set, None, None)

    
    # Attribute bias uses Python identifier bias
    __bias = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'bias'), 'bias', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_215_bias', REAL_NUMBER)
    __bias._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3275, 6)
    __bias._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3275, 6)
    
    bias = property(__bias.value, __bias.set, None, None)

    
    # Attribute width uses Python identifier width
    __width = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'width'), 'width', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_215_width', REAL_NUMBER)
    __width._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3276, 6)
    __width._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3276, 6)
    
    width = property(__width.value, __width.set, None, None)

    
    # Attribute altitude uses Python identifier altitude
    __altitude = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'altitude'), 'altitude', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_215_altitude', REAL_NUMBER)
    __altitude._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3277, 6)
    __altitude._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3277, 6)
    
    altitude = property(__altitude.value, __altitude.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Con.name() : __Con
    })
    _AttributeMap.update({
        __id.name() : __id,
        __bias.name() : __bias,
        __width.name() : __width,
        __altitude.name() : __altitude
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_216 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3281, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_216_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Attribute from uses Python identifier from_
    __from = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'from'), 'from_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_216_from', NN_NEURON_IDREF, required=True)
    __from._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3285, 6)
    __from._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3285, 6)
    
    from_ = property(__from.value, __from.set, None, None)

    
    # Attribute weight uses Python identifier weight
    __weight = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'weight'), 'weight', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_216_weight', REAL_NUMBER, required=True)
    __weight._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3286, 6)
    __weight._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3286, 6)
    
    weight = property(__weight.value, __weight.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension
    })
    _AttributeMap.update({
        __from.name() : __from,
        __weight.name() : __weight
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_217 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3290, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_217_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}DerivedField uses Python identifier DerivedField
    __DerivedField = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), 'DerivedField', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_217_httpwww_dmg_orgPMML_4_1DerivedField', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2), )

    
    DerivedField = property(__DerivedField.value, __DerivedField.set, None, None)

    
    # Attribute outputNeuron uses Python identifier outputNeuron
    __outputNeuron = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'outputNeuron'), 'outputNeuron', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_217_outputNeuron', NN_NEURON_IDREF, required=True)
    __outputNeuron._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3295, 6)
    __outputNeuron._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3295, 6)
    
    outputNeuron = property(__outputNeuron.value, __outputNeuron.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __DerivedField.name() : __DerivedField
    })
    _AttributeMap.update({
        __outputNeuron.name() : __outputNeuron
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_218 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3299, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}ModelVerification uses Python identifier ModelVerification
    __ModelVerification = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), 'ModelVerification', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_httpwww_dmg_orgPMML_4_1ModelVerification', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2), )

    
    ModelVerification = property(__ModelVerification.value, __ModelVerification.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}MiningSchema uses Python identifier MiningSchema
    __MiningSchema = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), 'MiningSchema', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_httpwww_dmg_orgPMML_4_1MiningSchema', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2), )

    
    MiningSchema = property(__MiningSchema.value, __MiningSchema.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}LocalTransformations uses Python identifier LocalTransformations
    __LocalTransformations = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), 'LocalTransformations', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_httpwww_dmg_orgPMML_4_1LocalTransformations', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2), )

    
    LocalTransformations = property(__LocalTransformations.value, __LocalTransformations.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelExplanation uses Python identifier ModelExplanation
    __ModelExplanation = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), 'ModelExplanation', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_httpwww_dmg_orgPMML_4_1ModelExplanation', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2), )

    
    ModelExplanation = property(__ModelExplanation.value, __ModelExplanation.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}ModelStats uses Python identifier ModelStats
    __ModelStats = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), 'ModelStats', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_httpwww_dmg_orgPMML_4_1ModelStats', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2), )

    
    ModelStats = property(__ModelStats.value, __ModelStats.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Targets uses Python identifier Targets
    __Targets = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Targets'), 'Targets', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_httpwww_dmg_orgPMML_4_1Targets', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2), )

    
    Targets = property(__Targets.value, __Targets.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Output uses Python identifier Output
    __Output = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Output'), 'Output', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_httpwww_dmg_orgPMML_4_1Output', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2), )

    
    Output = property(__Output.value, __Output.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Characteristics uses Python identifier Characteristics
    __Characteristics = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Characteristics'), 'Characteristics', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_httpwww_dmg_orgPMML_4_1Characteristics', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3340, 2), )

    
    Characteristics = property(__Characteristics.value, __Characteristics.set, None, None)

    
    # Attribute modelName uses Python identifier modelName
    __modelName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'modelName'), 'modelName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_modelName', pyxb.binding.datatypes.string)
    __modelName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3312, 6)
    __modelName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3312, 6)
    
    modelName = property(__modelName.value, __modelName.set, None, None)

    
    # Attribute functionName uses Python identifier functionName
    __functionName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'functionName'), 'functionName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_functionName', MINING_FUNCTION, required=True)
    __functionName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3313, 6)
    __functionName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3313, 6)
    
    functionName = property(__functionName.value, __functionName.set, None, None)

    
    # Attribute algorithmName uses Python identifier algorithmName
    __algorithmName = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'algorithmName'), 'algorithmName', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_algorithmName', pyxb.binding.datatypes.string)
    __algorithmName._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3314, 6)
    __algorithmName._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3314, 6)
    
    algorithmName = property(__algorithmName.value, __algorithmName.set, None, None)

    
    # Attribute initialScore uses Python identifier initialScore
    __initialScore = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'initialScore'), 'initialScore', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_initialScore', NUMBER, unicode_default=u'0')
    __initialScore._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3315, 6)
    __initialScore._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3315, 6)
    
    initialScore = property(__initialScore.value, __initialScore.set, None, None)

    
    # Attribute useReasonCodes uses Python identifier useReasonCodes
    __useReasonCodes = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'useReasonCodes'), 'useReasonCodes', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_useReasonCodes', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __useReasonCodes._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3316, 6)
    __useReasonCodes._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3316, 6)
    
    useReasonCodes = property(__useReasonCodes.value, __useReasonCodes.set, None, None)

    
    # Attribute reasonCodeAlgorithm uses Python identifier reasonCodeAlgorithm
    __reasonCodeAlgorithm = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'reasonCodeAlgorithm'), 'reasonCodeAlgorithm', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_reasonCodeAlgorithm', STD_ANON_39, unicode_default=u'pointsBelow')
    __reasonCodeAlgorithm._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3317, 6)
    __reasonCodeAlgorithm._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3317, 6)
    
    reasonCodeAlgorithm = property(__reasonCodeAlgorithm.value, __reasonCodeAlgorithm.set, None, None)

    
    # Attribute baselineScore uses Python identifier baselineScore
    __baselineScore = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'baselineScore'), 'baselineScore', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_baselineScore', NUMBER)
    __baselineScore._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3325, 6)
    __baselineScore._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3325, 6)
    
    baselineScore = property(__baselineScore.value, __baselineScore.set, None, None)

    
    # Attribute baselineMethod uses Python identifier baselineMethod
    __baselineMethod = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'baselineMethod'), 'baselineMethod', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_baselineMethod', STD_ANON_40, unicode_default=u'other')
    __baselineMethod._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3326, 6)
    __baselineMethod._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3326, 6)
    
    baselineMethod = property(__baselineMethod.value, __baselineMethod.set, None, None)

    
    # Attribute isScorable uses Python identifier isScorable
    __isScorable = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'isScorable'), 'isScorable', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_218_isScorable', pyxb.binding.datatypes.boolean, unicode_default=u'true')
    __isScorable._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3337, 6)
    __isScorable._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3337, 6)
    
    isScorable = property(__isScorable.value, __isScorable.set, None, None)

    _ElementMap.update({
        __ModelVerification.name() : __ModelVerification,
        __MiningSchema.name() : __MiningSchema,
        __Extension.name() : __Extension,
        __LocalTransformations.name() : __LocalTransformations,
        __ModelExplanation.name() : __ModelExplanation,
        __ModelStats.name() : __ModelStats,
        __Targets.name() : __Targets,
        __Output.name() : __Output,
        __Characteristics.name() : __Characteristics
    })
    _AttributeMap.update({
        __modelName.name() : __modelName,
        __functionName.name() : __functionName,
        __algorithmName.name() : __algorithmName,
        __initialScore.name() : __initialScore,
        __useReasonCodes.name() : __useReasonCodes,
        __reasonCodeAlgorithm.name() : __reasonCodeAlgorithm,
        __baselineScore.name() : __baselineScore,
        __baselineMethod.name() : __baselineMethod,
        __isScorable.name() : __isScorable
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_219 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3349, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_219_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}Attribute uses Python identifier Attribute
    __Attribute = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Attribute'), 'Attribute', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_219_httpwww_dmg_orgPMML_4_1Attribute', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3359, 2), )

    
    Attribute = property(__Attribute.value, __Attribute.set, None, None)

    
    # Attribute name uses Python identifier name
    __name = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'name'), 'name', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_219_name', FIELD_NAME)
    __name._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3354, 6)
    __name._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3354, 6)
    
    name = property(__name.value, __name.set, None, None)

    
    # Attribute reasonCode uses Python identifier reasonCode
    __reasonCode = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'reasonCode'), 'reasonCode', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_219_reasonCode', pyxb.binding.datatypes.string)
    __reasonCode._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3355, 6)
    __reasonCode._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3355, 6)
    
    reasonCode = property(__reasonCode.value, __reasonCode.set, None, None)

    
    # Attribute baselineScore uses Python identifier baselineScore
    __baselineScore = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'baselineScore'), 'baselineScore', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_219_baselineScore', NUMBER)
    __baselineScore._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3356, 6)
    __baselineScore._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3356, 6)
    
    baselineScore = property(__baselineScore.value, __baselineScore.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __Attribute.name() : __Attribute
    })
    _AttributeMap.update({
        __name.name() : __name,
        __reasonCode.name() : __reasonCode,
        __baselineScore.name() : __baselineScore
    })



# Complex type [anonymous] with content type ELEMENT_ONLY
class CTD_ANON_220 (pyxb.binding.basis.complexTypeDefinition):
    """Complex type [anonymous] with content type ELEMENT_ONLY"""
    _TypeDefinition = None
    _ContentTypeTag = pyxb.binding.basis.complexTypeDefinition._CT_ELEMENT_ONLY
    _Abstract = False
    _ExpandedName = None
    _XSDLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3360, 4)
    _ElementMap = {}
    _AttributeMap = {}
    # Base type is pyxb.binding.datatypes.anyType
    
    # Element {http://www.dmg.org/PMML-4_1}Extension uses Python identifier Extension
    __Extension = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'Extension'), 'Extension', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_220_httpwww_dmg_orgPMML_4_1Extension', True, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2), )

    
    Extension = property(__Extension.value, __Extension.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimplePredicate uses Python identifier SimplePredicate
    __SimplePredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), 'SimplePredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_220_httpwww_dmg_orgPMML_4_1SimplePredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2), )

    
    SimplePredicate = property(__SimplePredicate.value, __SimplePredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}CompoundPredicate uses Python identifier CompoundPredicate
    __CompoundPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), 'CompoundPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_220_httpwww_dmg_orgPMML_4_1CompoundPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2), )

    
    CompoundPredicate = property(__CompoundPredicate.value, __CompoundPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}SimpleSetPredicate uses Python identifier SimpleSetPredicate
    __SimpleSetPredicate = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), 'SimpleSetPredicate', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_220_httpwww_dmg_orgPMML_4_1SimpleSetPredicate', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2), )

    
    SimpleSetPredicate = property(__SimpleSetPredicate.value, __SimpleSetPredicate.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}True uses Python identifier True_
    __True = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'True'), 'True_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_220_httpwww_dmg_orgPMML_4_1True', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2), )

    
    True_ = property(__True.value, __True.set, None, None)

    
    # Element {http://www.dmg.org/PMML-4_1}False uses Python identifier False_
    __False = pyxb.binding.content.ElementDeclaration(pyxb.namespace.ExpandedName(Namespace, u'False'), 'False_', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_220_httpwww_dmg_orgPMML_4_1False', False, pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2), )

    
    False_ = property(__False.value, __False.set, None, None)

    
    # Attribute reasonCode uses Python identifier reasonCode
    __reasonCode = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'reasonCode'), 'reasonCode', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_220_reasonCode', pyxb.binding.datatypes.string)
    __reasonCode._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3365, 6)
    __reasonCode._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3365, 6)
    
    reasonCode = property(__reasonCode.value, __reasonCode.set, None, None)

    
    # Attribute partialScore uses Python identifier partialScore
    __partialScore = pyxb.binding.content.AttributeUse(pyxb.namespace.ExpandedName(None, u'partialScore'), 'partialScore', '__httpwww_dmg_orgPMML_4_1_CTD_ANON_220_partialScore', NUMBER)
    __partialScore._DeclarationLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3366, 6)
    __partialScore._UseLocation = pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3366, 6)
    
    partialScore = property(__partialScore.value, __partialScore.set, None, None)

    _ElementMap.update({
        __Extension.name() : __Extension,
        __SimplePredicate.name() : __SimplePredicate,
        __CompoundPredicate.name() : __CompoundPredicate,
        __SimpleSetPredicate.name() : __SimpleSetPredicate,
        __True.name() : __True,
        __False.name() : __False
    })
    _AttributeMap.update({
        __reasonCode.name() : __reasonCode,
        __partialScore.name() : __partialScore
    })



SpectralAnalysis = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SpectralAnalysis'), pyxb.binding.datatypes.anyType, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1344, 2))
Namespace.addCategoryObject('elementBinding', SpectralAnalysis.name().localName(), SpectralAnalysis)

ARIMA = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ARIMA'), pyxb.binding.datatypes.anyType, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1345, 2))
Namespace.addCategoryObject('elementBinding', ARIMA.name().localName(), ARIMA)

SeasonalTrendDecomposition = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SeasonalTrendDecomposition'), pyxb.binding.datatypes.anyType, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1346, 2))
Namespace.addCategoryObject('elementBinding', SeasonalTrendDecomposition.name().localName(), SeasonalTrendDecomposition)

MissingValueWeights = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MissingValueWeights'), CTD_ANON, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 33, 2))
Namespace.addCategoryObject('elementBinding', MissingValueWeights.name().localName(), MissingValueWeights)

Cluster = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Cluster'), CTD_ANON_, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 41, 2))
Namespace.addCategoryObject('elementBinding', Cluster.name().localName(), Cluster)

KohonenMap = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'KohonenMap'), CTD_ANON_2, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 55, 2))
Namespace.addCategoryObject('elementBinding', KohonenMap.name().localName(), KohonenMap)

Covariances = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Covariances'), CTD_ANON_3, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 65, 2))
Namespace.addCategoryObject('elementBinding', Covariances.name().localName(), Covariances)

Comparisons = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Comparisons'), CTD_ANON_4, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 93, 2))
Namespace.addCategoryObject('elementBinding', Comparisons.name().localName(), Comparisons)

euclidean = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'euclidean'), CTD_ANON_5, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 139, 2))
Namespace.addCategoryObject('elementBinding', euclidean.name().localName(), euclidean)

squaredEuclidean = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'squaredEuclidean'), CTD_ANON_6, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 146, 2))
Namespace.addCategoryObject('elementBinding', squaredEuclidean.name().localName(), squaredEuclidean)

cityBlock = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'cityBlock'), CTD_ANON_7, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 153, 2))
Namespace.addCategoryObject('elementBinding', cityBlock.name().localName(), cityBlock)

chebychev = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'chebychev'), CTD_ANON_8, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 160, 2))
Namespace.addCategoryObject('elementBinding', chebychev.name().localName(), chebychev)

simpleMatching = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'simpleMatching'), CTD_ANON_9, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 175, 2))
Namespace.addCategoryObject('elementBinding', simpleMatching.name().localName(), simpleMatching)

jaccard = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'jaccard'), CTD_ANON_10, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 182, 2))
Namespace.addCategoryObject('elementBinding', jaccard.name().localName(), jaccard)

tanimoto = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'tanimoto'), CTD_ANON_11, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 189, 2))
Namespace.addCategoryObject('elementBinding', tanimoto.name().localName(), tanimoto)

VerificationFields = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VerificationFields'), CTD_ANON_12, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 222, 2))
Namespace.addCategoryObject('elementBinding', VerificationFields.name().localName(), VerificationFields)

VerificationField = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VerificationField'), CTD_ANON_13, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 230, 2))
Namespace.addCategoryObject('elementBinding', VerificationField.name().localName(), VerificationField)

MiningSchema = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2))
Namespace.addCategoryObject('elementBinding', MiningSchema.name().localName(), MiningSchema)

AntecedentSequence = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AntecedentSequence'), CTD_ANON_15, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 493, 2))
Namespace.addCategoryObject('elementBinding', AntecedentSequence.name().localName(), AntecedentSequence)

ConsequentSequence = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ConsequentSequence'), CTD_ANON_16, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 500, 2))
Namespace.addCategoryObject('elementBinding', ConsequentSequence.name().localName(), ConsequentSequence)

PMML = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PMML'), CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 507, 2))
Namespace.addCategoryObject('elementBinding', PMML.name().localName(), PMML)

MiningBuildTask = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningBuildTask'), CTD_ANON_18, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 542, 2))
Namespace.addCategoryObject('elementBinding', MiningBuildTask.name().localName(), MiningBuildTask)

Extension = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2))
Namespace.addCategoryObject('elementBinding', Extension.name().localName(), Extension)

Indices = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Indices'), STD_ANON_4, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 645, 2))
Namespace.addCategoryObject('elementBinding', Indices.name().localName(), Indices)

INT_Entries = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'INT-Entries'), STD_ANON_5, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 650, 2))
Namespace.addCategoryObject('elementBinding', INT_Entries.name().localName(), INT_Entries)

REAL_Entries = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'REAL-Entries'), STD_ANON_6, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 655, 2))
Namespace.addCategoryObject('elementBinding', REAL_Entries.name().localName(), REAL_Entries)

ItemRef = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ItemRef'), CTD_ANON_20, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 742, 2))
Namespace.addCategoryObject('elementBinding', ItemRef.name().localName(), ItemRef)

Header = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Header'), CTD_ANON_21, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 765, 2))
Namespace.addCategoryObject('elementBinding', Header.name().localName(), Header)

Application = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Application'), CTD_ANON_22, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 777, 2))
Namespace.addCategoryObject('elementBinding', Application.name().localName(), Application)

Annotation = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Annotation'), CTD_ANON_23, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 786, 2))
Namespace.addCategoryObject('elementBinding', Annotation.name().localName(), Annotation)

Timestamp = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Timestamp'), CTD_ANON_24, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 793, 2))
Namespace.addCategoryObject('elementBinding', Timestamp.name().localName(), Timestamp)

InstanceFields = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'InstanceFields'), CTD_ANON_25, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 842, 2))
Namespace.addCategoryObject('elementBinding', InstanceFields.name().localName(), InstanceFields)

InstanceField = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'InstanceField'), CTD_ANON_26, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 850, 2))
Namespace.addCategoryObject('elementBinding', InstanceField.name().localName(), InstanceField)

KNNInputs = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'KNNInputs'), CTD_ANON_27, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 859, 2))
Namespace.addCategoryObject('elementBinding', KNNInputs.name().localName(), KNNInputs)

TransformationDictionary = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TransformationDictionary'), CTD_ANON_28, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 988, 2))
Namespace.addCategoryObject('elementBinding', TransformationDictionary.name().localName(), TransformationDictionary)

LocalTransformations = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2))
Namespace.addCategoryObject('elementBinding', LocalTransformations.name().localName(), LocalTransformations)

DiscretizeBin = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DiscretizeBin'), CTD_ANON_30, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1085, 2))
Namespace.addCategoryObject('elementBinding', DiscretizeBin.name().localName(), DiscretizeBin)

LinearKernelType = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LinearKernelType'), CTD_ANON_31, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1391, 2))
Namespace.addCategoryObject('elementBinding', LinearKernelType.name().localName(), LinearKernelType)

TextDictionary = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextDictionary'), CTD_ANON_32, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1537, 2))
Namespace.addCategoryObject('elementBinding', TextDictionary.name().localName(), TextDictionary)

TextCorpus = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextCorpus'), CTD_ANON_33, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1546, 2))
Namespace.addCategoryObject('elementBinding', TextCorpus.name().localName(), TextCorpus)

DocumentTermMatrix = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DocumentTermMatrix'), CTD_ANON_34, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1565, 2))
Namespace.addCategoryObject('elementBinding', DocumentTermMatrix.name().localName(), DocumentTermMatrix)

True_ = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'True'), CTD_ANON_35, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2))
Namespace.addCategoryObject('elementBinding', True_.name().localName(), True_)

False_ = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'False'), CTD_ANON_36, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2))
Namespace.addCategoryObject('elementBinding', False_.name().localName(), False_)

BayesInputs = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BayesInputs'), CTD_ANON_37, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1931, 2))
Namespace.addCategoryObject('elementBinding', BayesInputs.name().localName(), BayesInputs)

BayesInput = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BayesInput'), CTD_ANON_38, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1939, 2))
Namespace.addCategoryObject('elementBinding', BayesInput.name().localName(), BayesInput)

BayesOutput = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BayesOutput'), CTD_ANON_39, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1949, 2))
Namespace.addCategoryObject('elementBinding', BayesOutput.name().localName(), BayesOutput)

PairCounts = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PairCounts'), CTD_ANON_40, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1958, 2))
Namespace.addCategoryObject('elementBinding', PairCounts.name().localName(), PairCounts)

TargetValueCounts = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCounts'), CTD_ANON_41, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1967, 2))
Namespace.addCategoryObject('elementBinding', TargetValueCounts.name().localName(), TargetValueCounts)

ModelExplanation = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2))
Namespace.addCategoryObject('elementBinding', ModelExplanation.name().localName(), ModelExplanation)

ModelLiftGraph = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelLiftGraph'), CTD_ANON_43, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2053, 2))
Namespace.addCategoryObject('elementBinding', ModelLiftGraph.name().localName(), ModelLiftGraph)

OptimumLiftGraph = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'OptimumLiftGraph'), CTD_ANON_44, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2061, 2))
Namespace.addCategoryObject('elementBinding', OptimumLiftGraph.name().localName(), OptimumLiftGraph)

RandomLiftGraph = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RandomLiftGraph'), CTD_ANON_45, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2069, 2))
Namespace.addCategoryObject('elementBinding', RandomLiftGraph.name().localName(), RandomLiftGraph)

LiftGraph = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph'), CTD_ANON_46, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2077, 2))
Namespace.addCategoryObject('elementBinding', LiftGraph.name().localName(), LiftGraph)

XCoordinates = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'XCoordinates'), CTD_ANON_47, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2088, 2))
Namespace.addCategoryObject('elementBinding', XCoordinates.name().localName(), XCoordinates)

YCoordinates = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'YCoordinates'), CTD_ANON_48, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2096, 2))
Namespace.addCategoryObject('elementBinding', YCoordinates.name().localName(), YCoordinates)

BoundaryValues = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValues'), CTD_ANON_49, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2104, 2))
Namespace.addCategoryObject('elementBinding', BoundaryValues.name().localName(), BoundaryValues)

BoundaryValueMeans = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValueMeans'), CTD_ANON_50, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2112, 2))
Namespace.addCategoryObject('elementBinding', BoundaryValueMeans.name().localName(), BoundaryValueMeans)

ROC = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ROC'), CTD_ANON_51, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2120, 2))
Namespace.addCategoryObject('elementBinding', ROC.name().localName(), ROC)

ROCGraph = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ROCGraph'), CTD_ANON_52, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2132, 2))
Namespace.addCategoryObject('elementBinding', ROCGraph.name().localName(), ROCGraph)

ConfusionMatrix = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ConfusionMatrix'), CTD_ANON_53, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2142, 2))
Namespace.addCategoryObject('elementBinding', ConfusionMatrix.name().localName(), ConfusionMatrix)

ClassLabels = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ClassLabels'), CTD_ANON_54, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2151, 2))
Namespace.addCategoryObject('elementBinding', ClassLabels.name().localName(), ClassLabels)

Correlations = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Correlations'), CTD_ANON_55, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2159, 2))
Namespace.addCategoryObject('elementBinding', Correlations.name().localName(), Correlations)

CorrelationFields = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CorrelationFields'), CTD_ANON_56, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2169, 2))
Namespace.addCategoryObject('elementBinding', CorrelationFields.name().localName(), CorrelationFields)

CorrelationValues = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CorrelationValues'), CTD_ANON_57, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2177, 2))
Namespace.addCategoryObject('elementBinding', CorrelationValues.name().localName(), CorrelationValues)

CorrelationMethods = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CorrelationMethods'), CTD_ANON_58, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2185, 2))
Namespace.addCategoryObject('elementBinding', CorrelationMethods.name().localName(), CorrelationMethods)

CompoundRule = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundRule'), CTD_ANON_59, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2264, 2))
Namespace.addCategoryObject('elementBinding', CompoundRule.name().localName(), CompoundRule)

ModelStats = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2))
Namespace.addCategoryObject('elementBinding', ModelStats.name().localName(), ModelStats)

DiscrStats = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DiscrStats'), CTD_ANON_61, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2337, 2))
Namespace.addCategoryObject('elementBinding', DiscrStats.name().localName(), DiscrStats)

MultivariateStats = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MultivariateStats'), CTD_ANON_62, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2362, 2))
Namespace.addCategoryObject('elementBinding', MultivariateStats.name().localName(), MultivariateStats)

Targets = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2))
Namespace.addCategoryObject('elementBinding', Targets.name().localName(), Targets)

ParameterList = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ParameterList'), CTD_ANON_64, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2564, 2))
Namespace.addCategoryObject('elementBinding', ParameterList.name().localName(), ParameterList)

FactorList = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FactorList'), CTD_ANON_65, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2582, 2))
Namespace.addCategoryObject('elementBinding', FactorList.name().localName(), FactorList)

CovariateList = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CovariateList'), CTD_ANON_66, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2590, 2))
Namespace.addCategoryObject('elementBinding', CovariateList.name().localName(), CovariateList)

Categories = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Categories'), CTD_ANON_67, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2609, 2))
Namespace.addCategoryObject('elementBinding', Categories.name().localName(), Categories)

Category = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Category'), CTD_ANON_68, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2617, 2))
Namespace.addCategoryObject('elementBinding', Category.name().localName(), Category)

PPMatrix = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PPMatrix'), CTD_ANON_69, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2625, 2))
Namespace.addCategoryObject('elementBinding', PPMatrix.name().localName(), PPMatrix)

ParamMatrix = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ParamMatrix'), CTD_ANON_70, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2673, 2))
Namespace.addCategoryObject('elementBinding', ParamMatrix.name().localName(), ParamMatrix)

EventValues = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'EventValues'), CTD_ANON_71, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2724, 2))
Namespace.addCategoryObject('elementBinding', EventValues.name().localName(), EventValues)

DataDictionary = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DataDictionary'), CTD_ANON_72, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2756, 2))
Namespace.addCategoryObject('elementBinding', DataDictionary.name().localName(), DataDictionary)

Output = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2))
Namespace.addCategoryObject('elementBinding', Output.name().localName(), Output)

Decisions = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Decisions'), CTD_ANON_74, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2932, 2))
Namespace.addCategoryObject('elementBinding', Decisions.name().localName(), Decisions)

Decision = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Decision'), CTD_ANON_75, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2942, 2))
Namespace.addCategoryObject('elementBinding', Decision.name().localName(), Decision)

Taxonomy = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Taxonomy'), CTD_ANON_76, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2965, 2))
Namespace.addCategoryObject('elementBinding', Taxonomy.name().localName(), Taxonomy)

TableLocator = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TableLocator'), CTD_ANON_77, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2996, 2))
Namespace.addCategoryObject('elementBinding', TableLocator.name().localName(), TableLocator)

InlineTable = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'InlineTable'), CTD_ANON_78, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3003, 2))
Namespace.addCategoryObject('elementBinding', InlineTable.name().localName(), InlineTable)

row = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'row'), CTD_ANON_79, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3011, 2))
Namespace.addCategoryObject('elementBinding', row.name().localName(), row)

Baseline = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Baseline'), CTD_ANON_80, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3066, 2))
Namespace.addCategoryObject('elementBinding', Baseline.name().localName(), Baseline)

Alternate = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Alternate'), CTD_ANON_81, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3074, 2))
Namespace.addCategoryObject('elementBinding', Alternate.name().localName(), Alternate)

NeuralInputs = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralInputs'), CTD_ANON_82, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3197, 2))
Namespace.addCategoryObject('elementBinding', NeuralInputs.name().localName(), NeuralInputs)

NeuralOutputs = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralOutputs'), CTD_ANON_83, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3220, 2))
Namespace.addCategoryObject('elementBinding', NeuralOutputs.name().localName(), NeuralOutputs)

Characteristics = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Characteristics'), CTD_ANON_84, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3340, 2))
Namespace.addCategoryObject('elementBinding', Characteristics.name().localName(), Characteristics)

ClusteringModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModel'), CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2, 2))
Namespace.addCategoryObject('elementBinding', ClusteringModel.name().localName(), ClusteringModel)

ClusteringField = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ClusteringField'), CTD_ANON_86, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 73, 2))
Namespace.addCategoryObject('elementBinding', ClusteringField.name().localName(), ClusteringField)

ComparisonMeasure = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ComparisonMeasure'), CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 110, 2))
Namespace.addCategoryObject('elementBinding', ComparisonMeasure.name().localName(), ComparisonMeasure)

minkowski = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'minkowski'), CTD_ANON_88, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 167, 2))
Namespace.addCategoryObject('elementBinding', minkowski.name().localName(), minkowski)

binarySimilarity = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'binarySimilarity'), CTD_ANON_89, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 196, 2))
Namespace.addCategoryObject('elementBinding', binarySimilarity.name().localName(), binarySimilarity)

ModelVerification = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2))
Namespace.addCategoryObject('elementBinding', ModelVerification.name().localName(), ModelVerification)

DefineFunction = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DefineFunction'), CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 241, 2))
Namespace.addCategoryObject('elementBinding', DefineFunction.name().localName(), DefineFunction)

ParameterField = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ParameterField'), CTD_ANON_92, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 253, 2))
Namespace.addCategoryObject('elementBinding', ParameterField.name().localName(), ParameterField)

Apply = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Apply'), CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 260, 2))
Namespace.addCategoryObject('elementBinding', Apply.name().localName(), Apply)

MiningField = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningField'), CTD_ANON_94, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 279, 2))
Namespace.addCategoryObject('elementBinding', MiningField.name().localName(), MiningField)

SequenceModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SequenceModel'), CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 330, 2))
Namespace.addCategoryObject('elementBinding', SequenceModel.name().localName(), SequenceModel)

Constraints = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Constraints'), CTD_ANON_96, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 357, 2))
Namespace.addCategoryObject('elementBinding', Constraints.name().localName(), Constraints)

SetPredicate = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SetPredicate'), CTD_ANON_97, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 382, 2))
Namespace.addCategoryObject('elementBinding', SetPredicate.name().localName(), SetPredicate)

Delimiter = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Delimiter'), CTD_ANON_98, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 406, 2))
Namespace.addCategoryObject('elementBinding', Delimiter.name().localName(), Delimiter)

Time = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Time'), CTD_ANON_99, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 415, 2))
Namespace.addCategoryObject('elementBinding', Time.name().localName(), Time)

Sequence = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Sequence'), CTD_ANON_100, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 434, 2))
Namespace.addCategoryObject('elementBinding', Sequence.name().localName(), Sequence)

SetReference = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SetReference'), CTD_ANON_101, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 450, 2))
Namespace.addCategoryObject('elementBinding', SetReference.name().localName(), SetReference)

SequenceRule = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SequenceRule'), CTD_ANON_102, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 458, 2))
Namespace.addCategoryObject('elementBinding', SequenceRule.name().localName(), SequenceRule)

SequenceReference = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SequenceReference'), CTD_ANON_103, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 485, 2))
Namespace.addCategoryObject('elementBinding', SequenceReference.name().localName(), SequenceReference)

Array = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2))
Namespace.addCategoryObject('elementBinding', Array.name().localName(), Array)

INT_SparseArray = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'INT-SparseArray'), CTD_ANON_104, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 625, 2))
Namespace.addCategoryObject('elementBinding', INT_SparseArray.name().localName(), INT_SparseArray)

REAL_SparseArray = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'REAL-SparseArray'), CTD_ANON_105, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 635, 2))
Namespace.addCategoryObject('elementBinding', REAL_SparseArray.name().localName(), REAL_SparseArray)

Matrix = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), CTD_ANON_106, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2))
Namespace.addCategoryObject('elementBinding', Matrix.name().localName(), Matrix)

MatCell = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MatCell'), CTD_ANON_107, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 681, 2))
Namespace.addCategoryObject('elementBinding', MatCell.name().localName(), MatCell)

AssociationModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AssociationModel'), CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 691, 2))
Namespace.addCategoryObject('elementBinding', AssociationModel.name().localName(), AssociationModel)

Item = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Item'), CTD_ANON_109, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 720, 2))
Namespace.addCategoryObject('elementBinding', Item.name().localName(), Item)

Itemset = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Itemset'), CTD_ANON_110, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 731, 2))
Namespace.addCategoryObject('elementBinding', Itemset.name().localName(), Itemset)

AssociationRule = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AssociationRule'), CTD_ANON_111, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 750, 2))
Namespace.addCategoryObject('elementBinding', AssociationRule.name().localName(), AssociationRule)

NearestNeighborModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NearestNeighborModel'), CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 800, 2))
Namespace.addCategoryObject('elementBinding', NearestNeighborModel.name().localName(), NearestNeighborModel)

TrainingInstances = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TrainingInstances'), CTD_ANON_113, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 827, 2))
Namespace.addCategoryObject('elementBinding', TrainingInstances.name().localName(), TrainingInstances)

KNNInput = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'KNNInput'), CTD_ANON_114, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 867, 2))
Namespace.addCategoryObject('elementBinding', KNNInput.name().localName(), KNNInput)

RegressionModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RegressionModel'), CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 890, 2))
Namespace.addCategoryObject('elementBinding', RegressionModel.name().localName(), RegressionModel)

RegressionTable = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RegressionTable'), CTD_ANON_116, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 934, 2))
Namespace.addCategoryObject('elementBinding', RegressionTable.name().localName(), RegressionTable)

NumericPredictor = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NumericPredictor'), CTD_ANON_117, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 946, 2))
Namespace.addCategoryObject('elementBinding', NumericPredictor.name().localName(), NumericPredictor)

CategoricalPredictor = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CategoricalPredictor'), CTD_ANON_118, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 956, 2))
Namespace.addCategoryObject('elementBinding', CategoricalPredictor.name().localName(), CategoricalPredictor)

PredictorTerm = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PredictorTerm'), CTD_ANON_119, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 966, 2))
Namespace.addCategoryObject('elementBinding', PredictorTerm.name().localName(), PredictorTerm)

DerivedField = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2))
Namespace.addCategoryObject('elementBinding', DerivedField.name().localName(), DerivedField)

Constant = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Constant'), CTD_ANON_121, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1018, 2))
Namespace.addCategoryObject('elementBinding', Constant.name().localName(), Constant)

FieldRef = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), CTD_ANON_122, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2))
Namespace.addCategoryObject('elementBinding', FieldRef.name().localName(), FieldRef)

NormContinuous = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous'), CTD_ANON_123, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1036, 2))
Namespace.addCategoryObject('elementBinding', NormContinuous.name().localName(), NormContinuous)

LinearNorm = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LinearNorm'), CTD_ANON_124, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1047, 2))
Namespace.addCategoryObject('elementBinding', LinearNorm.name().localName(), LinearNorm)

NormDiscrete = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete'), CTD_ANON_125, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1056, 2))
Namespace.addCategoryObject('elementBinding', NormDiscrete.name().localName(), NormDiscrete)

Discretize = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Discretize'), CTD_ANON_126, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1073, 2))
Namespace.addCategoryObject('elementBinding', Discretize.name().localName(), Discretize)

MapValues = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MapValues'), CTD_ANON_127, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1094, 2))
Namespace.addCategoryObject('elementBinding', MapValues.name().localName(), MapValues)

FieldColumnPair = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldColumnPair'), CTD_ANON_128, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1110, 2))
Namespace.addCategoryObject('elementBinding', FieldColumnPair.name().localName(), FieldColumnPair)

Aggregate = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Aggregate'), CTD_ANON_129, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1119, 2))
Namespace.addCategoryObject('elementBinding', Aggregate.name().localName(), Aggregate)

TimeSeriesModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeSeriesModel'), CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1141, 2))
Namespace.addCategoryObject('elementBinding', TimeSeriesModel.name().localName(), TimeSeriesModel)

TimeSeries = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeSeries'), CTD_ANON_131, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1173, 2))
Namespace.addCategoryObject('elementBinding', TimeSeries.name().localName(), TimeSeries)

TimeValue = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeValue'), CTD_ANON_132, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1192, 2))
Namespace.addCategoryObject('elementBinding', TimeValue.name().localName(), TimeValue)

TimeAnchor = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeAnchor'), CTD_ANON_133, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1203, 2))
Namespace.addCategoryObject('elementBinding', TimeAnchor.name().localName(), TimeAnchor)

TimeCycle = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeCycle'), CTD_ANON_134, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1215, 2))
Namespace.addCategoryObject('elementBinding', TimeCycle.name().localName(), TimeCycle)

TimeException = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeException'), CTD_ANON_135, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1255, 2))
Namespace.addCategoryObject('elementBinding', TimeException.name().localName(), TimeException)

ExponentialSmoothing = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ExponentialSmoothing'), CTD_ANON_136, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1278, 2))
Namespace.addCategoryObject('elementBinding', ExponentialSmoothing.name().localName(), ExponentialSmoothing)

Level = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Level'), CTD_ANON_137, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1298, 2))
Namespace.addCategoryObject('elementBinding', Level.name().localName(), Level)

Trend_ExpoSmooth = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Trend_ExpoSmooth'), CTD_ANON_138, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1304, 2))
Namespace.addCategoryObject('elementBinding', Trend_ExpoSmooth.name().localName(), Trend_ExpoSmooth)

Seasonality_ExpoSmooth = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Seasonality_ExpoSmooth'), CTD_ANON_139, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1325, 2))
Namespace.addCategoryObject('elementBinding', Seasonality_ExpoSmooth.name().localName(), Seasonality_ExpoSmooth)

SupportVectorMachineModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachineModel'), CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1347, 2))
Namespace.addCategoryObject('elementBinding', SupportVectorMachineModel.name().localName(), SupportVectorMachineModel)

PolynomialKernelType = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PolynomialKernelType'), CTD_ANON_141, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1399, 2))
Namespace.addCategoryObject('elementBinding', PolynomialKernelType.name().localName(), PolynomialKernelType)

RadialBasisKernelType = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RadialBasisKernelType'), CTD_ANON_142, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1410, 2))
Namespace.addCategoryObject('elementBinding', RadialBasisKernelType.name().localName(), RadialBasisKernelType)

SigmoidKernelType = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SigmoidKernelType'), CTD_ANON_143, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1419, 2))
Namespace.addCategoryObject('elementBinding', SigmoidKernelType.name().localName(), SigmoidKernelType)

VectorDictionary = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VectorDictionary'), CTD_ANON_144, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1432, 2))
Namespace.addCategoryObject('elementBinding', VectorDictionary.name().localName(), VectorDictionary)

VectorFields = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VectorFields'), CTD_ANON_145, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1442, 2))
Namespace.addCategoryObject('elementBinding', VectorFields.name().localName(), VectorFields)

VectorInstance = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VectorInstance'), CTD_ANON_146, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1451, 2))
Namespace.addCategoryObject('elementBinding', VectorInstance.name().localName(), VectorInstance)

SupportVectorMachine = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachine'), CTD_ANON_147, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1463, 2))
Namespace.addCategoryObject('elementBinding', SupportVectorMachine.name().localName(), SupportVectorMachine)

SupportVectors = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SupportVectors'), CTD_ANON_148, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1475, 2))
Namespace.addCategoryObject('elementBinding', SupportVectors.name().localName(), SupportVectors)

SupportVector = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SupportVector'), CTD_ANON_149, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1485, 2))
Namespace.addCategoryObject('elementBinding', SupportVector.name().localName(), SupportVector)

Coefficients = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Coefficients'), CTD_ANON_150, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1493, 2))
Namespace.addCategoryObject('elementBinding', Coefficients.name().localName(), Coefficients)

Coefficient = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Coefficient'), CTD_ANON_151, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1503, 2))
Namespace.addCategoryObject('elementBinding', Coefficient.name().localName(), Coefficient)

TextModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextModel'), CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1511, 2))
Namespace.addCategoryObject('elementBinding', TextModel.name().localName(), TextModel)

TextDocument = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextDocument'), CTD_ANON_153, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1554, 2))
Namespace.addCategoryObject('elementBinding', TextDocument.name().localName(), TextDocument)

TextModelNormalization = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextModelNormalization'), CTD_ANON_154, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1573, 2))
Namespace.addCategoryObject('elementBinding', TextModelNormalization.name().localName(), TextModelNormalization)

TextModelSimiliarity = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextModelSimiliarity'), CTD_ANON_155, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1609, 2))
Namespace.addCategoryObject('elementBinding', TextModelSimiliarity.name().localName(), TextModelSimiliarity)

TreeModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TreeModel'), CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1624, 2))
Namespace.addCategoryObject('elementBinding', TreeModel.name().localName(), TreeModel)

Node = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Node'), CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1655, 2))
Namespace.addCategoryObject('elementBinding', Node.name().localName(), Node)

SimplePredicate = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), CTD_ANON_158, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2))
Namespace.addCategoryObject('elementBinding', SimplePredicate.name().localName(), SimplePredicate)

CompoundPredicate = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), CTD_ANON_159, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2))
Namespace.addCategoryObject('elementBinding', CompoundPredicate.name().localName(), CompoundPredicate)

SimpleSetPredicate = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), CTD_ANON_160, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2))
Namespace.addCategoryObject('elementBinding', SimpleSetPredicate.name().localName(), SimpleSetPredicate)

ScoreDistribution = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution'), CTD_ANON_161, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1758, 2))
Namespace.addCategoryObject('elementBinding', ScoreDistribution.name().localName(), ScoreDistribution)

MiningModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningModel'), CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1785, 2))
Namespace.addCategoryObject('elementBinding', MiningModel.name().localName(), MiningModel)

Segmentation = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Segmentation'), CTD_ANON_163, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1809, 2))
Namespace.addCategoryObject('elementBinding', Segmentation.name().localName(), Segmentation)

Segment = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Segment'), CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1818, 2))
Namespace.addCategoryObject('elementBinding', Segment.name().localName(), Segment)

ResultField = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ResultField'), CTD_ANON_165, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1852, 2))
Namespace.addCategoryObject('elementBinding', ResultField.name().localName(), ResultField)

Regression = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Regression'), CTD_ANON_166, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1865, 2))
Namespace.addCategoryObject('elementBinding', Regression.name().localName(), Regression)

DecisionTree = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DecisionTree'), CTD_ANON_167, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1882, 2))
Namespace.addCategoryObject('elementBinding', DecisionTree.name().localName(), DecisionTree)

NaiveBayesModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NaiveBayesModel'), CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1909, 2))
Namespace.addCategoryObject('elementBinding', NaiveBayesModel.name().localName(), NaiveBayesModel)

TargetValueCount = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCount'), CTD_ANON_169, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1975, 2))
Namespace.addCategoryObject('elementBinding', TargetValueCount.name().localName(), TargetValueCount)

PredictiveModelQuality = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PredictiveModelQuality'), CTD_ANON_170, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1996, 2))
Namespace.addCategoryObject('elementBinding', PredictiveModelQuality.name().localName(), PredictiveModelQuality)

ClusteringModelQuality = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModelQuality'), CTD_ANON_171, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2033, 2))
Namespace.addCategoryObject('elementBinding', ClusteringModelQuality.name().localName(), ClusteringModelQuality)

LiftData = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LiftData'), CTD_ANON_172, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2040, 2))
Namespace.addCategoryObject('elementBinding', LiftData.name().localName(), LiftData)

RuleSetModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RuleSetModel'), CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2193, 2))
Namespace.addCategoryObject('elementBinding', RuleSetModel.name().localName(), RuleSetModel)

RuleSet = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RuleSet'), CTD_ANON_174, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2213, 2))
Namespace.addCategoryObject('elementBinding', RuleSet.name().localName(), RuleSet)

RuleSelectionMethod = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RuleSelectionMethod'), CTD_ANON_175, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2227, 2))
Namespace.addCategoryObject('elementBinding', RuleSelectionMethod.name().localName(), RuleSelectionMethod)

SimpleRule = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleRule'), CTD_ANON_176, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2249, 2))
Namespace.addCategoryObject('elementBinding', SimpleRule.name().localName(), SimpleRule)

UnivariateStats = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'UnivariateStats'), CTD_ANON_177, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2282, 2))
Namespace.addCategoryObject('elementBinding', UnivariateStats.name().localName(), UnivariateStats)

Counts = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Counts'), CTD_ANON_178, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2303, 2))
Namespace.addCategoryObject('elementBinding', Counts.name().localName(), Counts)

NumericInfo = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NumericInfo'), CTD_ANON_179, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2314, 2))
Namespace.addCategoryObject('elementBinding', NumericInfo.name().localName(), NumericInfo)

Quantile = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Quantile'), CTD_ANON_180, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2328, 2))
Namespace.addCategoryObject('elementBinding', Quantile.name().localName(), Quantile)

ContStats = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ContStats'), CTD_ANON_181, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2346, 2))
Namespace.addCategoryObject('elementBinding', ContStats.name().localName(), ContStats)

MultivariateStat = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MultivariateStat'), CTD_ANON_182, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2371, 2))
Namespace.addCategoryObject('elementBinding', MultivariateStat.name().localName(), MultivariateStat)

Anova = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Anova'), CTD_ANON_183, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2394, 2))
Namespace.addCategoryObject('elementBinding', Anova.name().localName(), Anova)

AnovaRow = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AnovaRow'), CTD_ANON_184, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2403, 2))
Namespace.addCategoryObject('elementBinding', AnovaRow.name().localName(), AnovaRow)

Partition = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Partition'), CTD_ANON_185, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2424, 2))
Namespace.addCategoryObject('elementBinding', Partition.name().localName(), Partition)

PartitionFieldStats = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PartitionFieldStats'), CTD_ANON_186, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2434, 2))
Namespace.addCategoryObject('elementBinding', PartitionFieldStats.name().localName(), PartitionFieldStats)

Target = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Target'), CTD_ANON_187, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2461, 2))
Namespace.addCategoryObject('elementBinding', Target.name().localName(), Target)

TargetValue = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TargetValue'), CTD_ANON_188, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2484, 2))
Namespace.addCategoryObject('elementBinding', TargetValue.name().localName(), TargetValue)

GeneralRegressionModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'GeneralRegressionModel'), CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2496, 2))
Namespace.addCategoryObject('elementBinding', GeneralRegressionModel.name().localName(), GeneralRegressionModel)

Parameter = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Parameter'), CTD_ANON_190, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2572, 2))
Namespace.addCategoryObject('elementBinding', Parameter.name().localName(), Parameter)

Predictor = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Predictor'), CTD_ANON_191, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2598, 2))
Namespace.addCategoryObject('elementBinding', Predictor.name().localName(), Predictor)

PPCell = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PPCell'), CTD_ANON_192, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2633, 2))
Namespace.addCategoryObject('elementBinding', PPCell.name().localName(), PPCell)

PCovMatrix = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PCovMatrix'), CTD_ANON_193, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2644, 2))
Namespace.addCategoryObject('elementBinding', PCovMatrix.name().localName(), PCovMatrix)

PCovCell = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PCovCell'), CTD_ANON_194, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2660, 2))
Namespace.addCategoryObject('elementBinding', PCovCell.name().localName(), PCovCell)

PCell = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PCell'), CTD_ANON_195, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2681, 2))
Namespace.addCategoryObject('elementBinding', PCell.name().localName(), PCell)

BaseCumHazardTables = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaseCumHazardTables'), CTD_ANON_196, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2692, 2))
Namespace.addCategoryObject('elementBinding', BaseCumHazardTables.name().localName(), BaseCumHazardTables)

BaselineStratum = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaselineStratum'), CTD_ANON_197, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2704, 2))
Namespace.addCategoryObject('elementBinding', BaselineStratum.name().localName(), BaselineStratum)

BaselineCell = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaselineCell'), CTD_ANON_198, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2715, 2))
Namespace.addCategoryObject('elementBinding', BaselineCell.name().localName(), BaselineCell)

DataField = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DataField'), CTD_ANON_199, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2766, 2))
Namespace.addCategoryObject('elementBinding', DataField.name().localName(), DataField)

Value = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Value'), CTD_ANON_200, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2818, 2))
Namespace.addCategoryObject('elementBinding', Value.name().localName(), Value)

Interval = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Interval'), CTD_ANON_201, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2836, 2))
Namespace.addCategoryObject('elementBinding', Interval.name().localName(), Interval)

OutputField = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'OutputField'), CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2863, 2))
Namespace.addCategoryObject('elementBinding', OutputField.name().localName(), OutputField)

ChildParent = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ChildParent'), CTD_ANON_203, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2974, 2))
Namespace.addCategoryObject('elementBinding', ChildParent.name().localName(), ChildParent)

BaselineModel = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaselineModel'), CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3022, 2))
Namespace.addCategoryObject('elementBinding', BaselineModel.name().localName(), BaselineModel)

TestDistributions = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TestDistributions'), CTD_ANON_205, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3042, 2))
Namespace.addCategoryObject('elementBinding', TestDistributions.name().localName(), TestDistributions)

AnyDistribution = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AnyDistribution'), CTD_ANON_206, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3092, 2))
Namespace.addCategoryObject('elementBinding', AnyDistribution.name().localName(), AnyDistribution)

GaussianDistribution = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'GaussianDistribution'), CTD_ANON_207, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3101, 2))
Namespace.addCategoryObject('elementBinding', GaussianDistribution.name().localName(), GaussianDistribution)

PoissonDistribution = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PoissonDistribution'), CTD_ANON_208, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3110, 2))
Namespace.addCategoryObject('elementBinding', PoissonDistribution.name().localName(), PoissonDistribution)

UniformDistribution = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'UniformDistribution'), CTD_ANON_209, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3118, 2))
Namespace.addCategoryObject('elementBinding', UniformDistribution.name().localName(), UniformDistribution)

CountTable = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CountTable'), COUNT_TABLE_TYPE, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3134, 2))
Namespace.addCategoryObject('elementBinding', CountTable.name().localName(), CountTable)

NormalizedCountTable = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormalizedCountTable'), COUNT_TABLE_TYPE, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3135, 2))
Namespace.addCategoryObject('elementBinding', NormalizedCountTable.name().localName(), NormalizedCountTable)

FieldValue = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldValue'), CTD_ANON_210, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3146, 2))
Namespace.addCategoryObject('elementBinding', FieldValue.name().localName(), FieldValue)

FieldValueCount = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldValueCount'), CTD_ANON_211, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3159, 2))
Namespace.addCategoryObject('elementBinding', FieldValueCount.name().localName(), FieldValueCount)

NeuralNetwork = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralNetwork'), CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3169, 2))
Namespace.addCategoryObject('elementBinding', NeuralNetwork.name().localName(), NeuralNetwork)

NeuralLayer = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralLayer'), CTD_ANON_213, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3206, 2))
Namespace.addCategoryObject('elementBinding', NeuralLayer.name().localName(), NeuralLayer)

NeuralInput = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralInput'), CTD_ANON_214, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3259, 2))
Namespace.addCategoryObject('elementBinding', NeuralInput.name().localName(), NeuralInput)

Neuron = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Neuron'), CTD_ANON_215, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3268, 2))
Namespace.addCategoryObject('elementBinding', Neuron.name().localName(), Neuron)

Con = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Con'), CTD_ANON_216, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3280, 2))
Namespace.addCategoryObject('elementBinding', Con.name().localName(), Con)

NeuralOutput = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralOutput'), CTD_ANON_217, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3289, 2))
Namespace.addCategoryObject('elementBinding', NeuralOutput.name().localName(), NeuralOutput)

Scorecard = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Scorecard'), CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3298, 2))
Namespace.addCategoryObject('elementBinding', Scorecard.name().localName(), Scorecard)

Characteristic = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Characteristic'), CTD_ANON_219, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3348, 2))
Namespace.addCategoryObject('elementBinding', Characteristic.name().localName(), Characteristic)

Attribute = pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Attribute'), CTD_ANON_220, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3359, 2))
Namespace.addCategoryObject('elementBinding', Attribute.name().localName(), Attribute)



CTD_ANON._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton
    del _BuildAutomaton
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 36, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 36, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 607, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON._Automaton = _BuildAutomaton()




CTD_ANON_._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'KohonenMap'), CTD_ANON_2, scope=CTD_ANON_, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 55, 2)))

CTD_ANON_._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Covariances'), CTD_ANON_3, scope=CTD_ANON_, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 65, 2)))

CTD_ANON_._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

CTD_ANON_._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Partition'), CTD_ANON_185, scope=CTD_ANON_, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2424, 2)))

def _BuildAutomaton_ ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_
    del _BuildAutomaton_
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 44, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 45, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 46, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 47, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 48, 8))
    counters.add(cc_4)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 44, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'KohonenMap')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 45, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 607, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Partition')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 47, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_4, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Covariances')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 48, 8))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_4, True) ]))
    st_4._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_._Automaton = _BuildAutomaton_()




CTD_ANON_2._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_2, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_2 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_2
    del _BuildAutomaton_2
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 58, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_2._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 58, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_2._Automaton = _BuildAutomaton_2()




CTD_ANON_3._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_3, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_3._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), CTD_ANON_106, scope=CTD_ANON_3, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2)))

def _BuildAutomaton_3 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_3
    del _BuildAutomaton_3
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 68, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_3._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 68, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_3._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Matrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 69, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_3._Automaton = _BuildAutomaton_3()




CTD_ANON_4._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_4, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_4._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), CTD_ANON_106, scope=CTD_ANON_4, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2)))

def _BuildAutomaton_4 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_4
    del _BuildAutomaton_4
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 96, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_4._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 96, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_4._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Matrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 97, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_4._Automaton = _BuildAutomaton_4()




CTD_ANON_5._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_5, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_5 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_5
    del _BuildAutomaton_5
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 142, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_5._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 142, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_5._Automaton = _BuildAutomaton_5()




CTD_ANON_6._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_6, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_6 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_6
    del _BuildAutomaton_6
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 149, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_6._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 149, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_6._Automaton = _BuildAutomaton_6()




CTD_ANON_7._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_7, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_7 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_7
    del _BuildAutomaton_7
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 156, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_7._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 156, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_7._Automaton = _BuildAutomaton_7()




CTD_ANON_8._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_8, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_8 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_8
    del _BuildAutomaton_8
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 163, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_8._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 163, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_8._Automaton = _BuildAutomaton_8()




CTD_ANON_9._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_9, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_9 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_9
    del _BuildAutomaton_9
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 178, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_9._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 178, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_9._Automaton = _BuildAutomaton_9()




CTD_ANON_10._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_10, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_10 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_10
    del _BuildAutomaton_10
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 185, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_10._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 185, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_10._Automaton = _BuildAutomaton_10()




CTD_ANON_11._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_11, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_11 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_11
    del _BuildAutomaton_11
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 192, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_11._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 192, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_11._Automaton = _BuildAutomaton_11()




CTD_ANON_12._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VerificationField'), CTD_ANON_13, scope=CTD_ANON_12, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 230, 2)))

CTD_ANON_12._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_12, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_12 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_12
    del _BuildAutomaton_12
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 225, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_12._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 225, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_12._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'VerificationField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 226, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_12._Automaton = _BuildAutomaton_12()




CTD_ANON_13._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_13, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_13 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_13
    del _BuildAutomaton_13
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 233, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_13._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 233, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_13._Automaton = _BuildAutomaton_13()




CTD_ANON_14._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningField'), CTD_ANON_94, scope=CTD_ANON_14, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 279, 2)))

CTD_ANON_14._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_14, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_14 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_14
    del _BuildAutomaton_14
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 274, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_14._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 274, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_14._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 275, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_14._Automaton = _BuildAutomaton_14()




CTD_ANON_15._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Time'), CTD_ANON_99, scope=CTD_ANON_15, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 415, 2)))

CTD_ANON_15._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SequenceReference'), CTD_ANON_103, scope=CTD_ANON_15, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 485, 2)))

CTD_ANON_15._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_15, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_15 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_15
    del _BuildAutomaton_15
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 479, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 482, 6))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_15._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 479, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_15._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SequenceReference')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 481, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_15._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Time')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 482, 6))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_15._Automaton = _BuildAutomaton_15()




CTD_ANON_16._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Time'), CTD_ANON_99, scope=CTD_ANON_16, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 415, 2)))

CTD_ANON_16._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SequenceReference'), CTD_ANON_103, scope=CTD_ANON_16, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 485, 2)))

CTD_ANON_16._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_16, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_16 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_16
    del _BuildAutomaton_16
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 479, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 482, 6))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_16._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 479, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_16._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SequenceReference')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 481, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_16._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Time')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 482, 6))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_16._Automaton = _BuildAutomaton_16()




CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModel'), CTD_ANON_85, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SequenceModel'), CTD_ANON_95, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 330, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningBuildTask'), CTD_ANON_18, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 542, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AssociationModel'), CTD_ANON_108, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 691, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Header'), CTD_ANON_21, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 765, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NearestNeighborModel'), CTD_ANON_112, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 800, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RegressionModel'), CTD_ANON_115, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 890, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TransformationDictionary'), CTD_ANON_28, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 988, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeSeriesModel'), CTD_ANON_130, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1141, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachineModel'), CTD_ANON_140, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1347, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextModel'), CTD_ANON_152, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1511, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TreeModel'), CTD_ANON_156, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1624, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningModel'), CTD_ANON_162, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1785, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NaiveBayesModel'), CTD_ANON_168, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1909, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RuleSetModel'), CTD_ANON_173, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2193, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'GeneralRegressionModel'), CTD_ANON_189, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2496, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DataDictionary'), CTD_ANON_72, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2756, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaselineModel'), CTD_ANON_204, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3022, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralNetwork'), CTD_ANON_212, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3169, 2)))

CTD_ANON_17._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Scorecard'), CTD_ANON_218, scope=CTD_ANON_17, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3298, 2)))

def _BuildAutomaton_17 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_17
    del _BuildAutomaton_17
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 511, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 513, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 514, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 517, 8))
    counters.add(cc_3)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Header')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 510, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningBuildTask')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 511, 8))
    st_1 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DataDictionary')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 512, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TransformationDictionary')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 513, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'AssociationModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 524, 6))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BaselineModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 525, 6))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 526, 6))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'GeneralRegressionModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 527, 6))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 528, 6))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NaiveBayesModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 529, 6))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NearestNeighborModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 530, 6))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NeuralNetwork')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 531, 6))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RegressionModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 532, 6))
    st_12 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_12)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RuleSetModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 533, 6))
    st_13 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_13)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SequenceModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 534, 6))
    st_14 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_14)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Scorecard')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 535, 6))
    st_15 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_15)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachineModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 536, 6))
    st_16 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_16)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TextModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 537, 6))
    st_17 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_17)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TimeSeriesModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 538, 6))
    st_18 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_18)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TreeModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 539, 6))
    st_19 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_19)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_17._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 517, 8))
    st_20 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_20)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    transitions.append(fac.Transition(st_2, [
         ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    transitions.append(fac.Transition(st_12, [
         ]))
    transitions.append(fac.Transition(st_13, [
         ]))
    transitions.append(fac.Transition(st_14, [
         ]))
    transitions.append(fac.Transition(st_15, [
         ]))
    transitions.append(fac.Transition(st_16, [
         ]))
    transitions.append(fac.Transition(st_17, [
         ]))
    transitions.append(fac.Transition(st_18, [
         ]))
    transitions.append(fac.Transition(st_19, [
         ]))
    transitions.append(fac.Transition(st_20, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_10._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_11._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_12._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_13._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_14._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_15._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_16._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_17._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_18._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_17, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_18, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_19, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_19._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_20, [
        fac.UpdateInstruction(cc_3, True) ]))
    st_20._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_17._Automaton = _BuildAutomaton_17()




CTD_ANON_18._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_18, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_18 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_18
    del _BuildAutomaton_18
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 545, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_18._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 545, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_18._Automaton = _BuildAutomaton_18()




def _BuildAutomaton_19 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_19
    del _BuildAutomaton_19
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 565, 12))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.WildcardUse(pyxb.binding.content.Wildcard(process_contents=pyxb.binding.content.Wildcard.PC_skip, namespace_constraint=pyxb.binding.content.Wildcard.NC_any), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 565, 12))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_19._Automaton = _BuildAutomaton_19()




CTD_ANON_20._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_20, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_20 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_20
    del _BuildAutomaton_20
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 745, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_20._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 745, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_20._Automaton = _BuildAutomaton_20()




CTD_ANON_21._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_21, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_21._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Application'), CTD_ANON_22, scope=CTD_ANON_21, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 777, 2)))

CTD_ANON_21._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Annotation'), CTD_ANON_23, scope=CTD_ANON_21, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 786, 2)))

CTD_ANON_21._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Timestamp'), CTD_ANON_24, scope=CTD_ANON_21, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 793, 2)))

def _BuildAutomaton_21 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_21
    del _BuildAutomaton_21
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 768, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 769, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 770, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 771, 8))
    counters.add(cc_3)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_21._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 768, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_21._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Application')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 769, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_21._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Annotation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 770, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_21._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Timestamp')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 771, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_3, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_21._Automaton = _BuildAutomaton_21()




CTD_ANON_22._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_22, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_22 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_22
    del _BuildAutomaton_22
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 780, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_22._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 780, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_22._Automaton = _BuildAutomaton_22()




CTD_ANON_23._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_23, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_23 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_23
    del _BuildAutomaton_23
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 789, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_23._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 789, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_23._Automaton = _BuildAutomaton_23()




CTD_ANON_24._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_24, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_24 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_24
    del _BuildAutomaton_24
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 796, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_24._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 796, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_24._Automaton = _BuildAutomaton_24()




CTD_ANON_25._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_25, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_25._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'InstanceField'), CTD_ANON_26, scope=CTD_ANON_25, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 850, 2)))

def _BuildAutomaton_25 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_25
    del _BuildAutomaton_25
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 845, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_25._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 845, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_25._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'InstanceField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 846, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_25._Automaton = _BuildAutomaton_25()




CTD_ANON_26._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_26, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_26 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_26
    del _BuildAutomaton_26
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 853, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_26._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 853, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_26._Automaton = _BuildAutomaton_26()




CTD_ANON_27._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_27, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_27._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'KNNInput'), CTD_ANON_114, scope=CTD_ANON_27, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 867, 2)))

def _BuildAutomaton_27 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_27
    del _BuildAutomaton_27
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 862, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_27._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 862, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_27._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'KNNInput')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 863, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_27._Automaton = _BuildAutomaton_27()




CTD_ANON_28._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DefineFunction'), CTD_ANON_91, scope=CTD_ANON_28, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 241, 2)))

CTD_ANON_28._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_28, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_28._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), CTD_ANON_120, scope=CTD_ANON_28, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2)))

def _BuildAutomaton_28 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_28
    del _BuildAutomaton_28
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 991, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 992, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 993, 8))
    counters.add(cc_2)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_28._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 991, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_28._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DefineFunction')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 992, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_28._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DerivedField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 993, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_28._Automaton = _BuildAutomaton_28()




CTD_ANON_29._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_29, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_29._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), CTD_ANON_120, scope=CTD_ANON_29, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2)))

def _BuildAutomaton_29 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_29
    del _BuildAutomaton_29
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1000, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1001, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_29._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1000, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_29._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DerivedField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1001, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_29._Automaton = _BuildAutomaton_29()




CTD_ANON_30._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_30, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_30._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Interval'), CTD_ANON_201, scope=CTD_ANON_30, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2836, 2)))

def _BuildAutomaton_30 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_30
    del _BuildAutomaton_30
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1088, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_30._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1088, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_30._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Interval')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1089, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_30._Automaton = _BuildAutomaton_30()




CTD_ANON_31._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_31, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_31 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_31
    del _BuildAutomaton_31
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1394, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_31._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1394, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_31._Automaton = _BuildAutomaton_31()




CTD_ANON_32._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_32, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_32._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_32, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

CTD_ANON_32._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Taxonomy'), CTD_ANON_76, scope=CTD_ANON_32, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2965, 2)))

def _BuildAutomaton_32 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_32
    del _BuildAutomaton_32
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1540, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1541, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_32._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1540, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_32._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Taxonomy')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1541, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_32._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 622, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_32._Automaton = _BuildAutomaton_32()




CTD_ANON_33._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_33, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_33._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextDocument'), CTD_ANON_153, scope=CTD_ANON_33, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1554, 2)))

def _BuildAutomaton_33 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_33
    del _BuildAutomaton_33
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1549, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1550, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_33._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1549, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_33._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TextDocument')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1550, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_33._Automaton = _BuildAutomaton_33()




CTD_ANON_34._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_34, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_34._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), CTD_ANON_106, scope=CTD_ANON_34, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2)))

def _BuildAutomaton_34 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_34
    del _BuildAutomaton_34
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1568, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_34._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1568, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_34._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Matrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1569, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_34._Automaton = _BuildAutomaton_34()




CTD_ANON_35._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_35, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_35 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_35
    del _BuildAutomaton_35
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1747, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_35._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1747, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_35._Automaton = _BuildAutomaton_35()




CTD_ANON_36._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_36, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_36 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_36
    del _BuildAutomaton_36
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1754, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_36._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1754, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_36._Automaton = _BuildAutomaton_36()




CTD_ANON_37._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_37, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_37._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BayesInput'), CTD_ANON_38, scope=CTD_ANON_37, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1939, 2)))

def _BuildAutomaton_37 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_37
    del _BuildAutomaton_37
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1934, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_37._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1934, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_37._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BayesInput')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1935, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_37._Automaton = _BuildAutomaton_37()




CTD_ANON_38._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_38, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_38._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), CTD_ANON_120, scope=CTD_ANON_38, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2)))

CTD_ANON_38._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PairCounts'), CTD_ANON_40, scope=CTD_ANON_38, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1958, 2)))

def _BuildAutomaton_38 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_38
    del _BuildAutomaton_38
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1942, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1943, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_38._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1942, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_38._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DerivedField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1943, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_38._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PairCounts')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1944, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_38._Automaton = _BuildAutomaton_38()




CTD_ANON_39._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_39, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_39._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCounts'), CTD_ANON_41, scope=CTD_ANON_39, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1967, 2)))

def _BuildAutomaton_39 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_39
    del _BuildAutomaton_39
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1952, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_39._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1952, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_39._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCounts')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1953, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_39._Automaton = _BuildAutomaton_39()




CTD_ANON_40._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_40, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_40._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCounts'), CTD_ANON_41, scope=CTD_ANON_40, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1967, 2)))

def _BuildAutomaton_40 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_40
    del _BuildAutomaton_40
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1961, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_40._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1961, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_40._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCounts')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1962, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_40._Automaton = _BuildAutomaton_40()




CTD_ANON_41._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_41, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_41._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCount'), CTD_ANON_169, scope=CTD_ANON_41, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1975, 2)))

def _BuildAutomaton_41 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_41
    del _BuildAutomaton_41
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1970, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_41._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1970, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_41._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TargetValueCount')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1971, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_41._Automaton = _BuildAutomaton_41()




CTD_ANON_42._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_42, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_42._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PredictiveModelQuality'), CTD_ANON_170, scope=CTD_ANON_42, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1996, 2)))

CTD_ANON_42._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModelQuality'), CTD_ANON_171, scope=CTD_ANON_42, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2033, 2)))

CTD_ANON_42._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Correlations'), CTD_ANON_55, scope=CTD_ANON_42, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2159, 2)))

def _BuildAutomaton_42 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_42
    del _BuildAutomaton_42
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1987, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1989, 10))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1990, 10))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1992, 8))
    counters.add(cc_3)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_42._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1987, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_42._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PredictiveModelQuality')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1989, 10))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_42._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModelQuality')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1990, 10))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_42._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Correlations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1992, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_3, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_42._Automaton = _BuildAutomaton_42()




CTD_ANON_43._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_43, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_43._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph'), CTD_ANON_46, scope=CTD_ANON_43, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2077, 2)))

def _BuildAutomaton_43 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_43
    del _BuildAutomaton_43
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2056, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_43._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2056, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_43._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2057, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_43._Automaton = _BuildAutomaton_43()




CTD_ANON_44._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_44, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_44._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph'), CTD_ANON_46, scope=CTD_ANON_44, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2077, 2)))

def _BuildAutomaton_44 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_44
    del _BuildAutomaton_44
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2064, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_44._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2064, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_44._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2065, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_44._Automaton = _BuildAutomaton_44()




CTD_ANON_45._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_45, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_45._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph'), CTD_ANON_46, scope=CTD_ANON_45, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2077, 2)))

def _BuildAutomaton_45 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_45
    del _BuildAutomaton_45
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2072, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_45._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2072, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_45._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LiftGraph')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2073, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_45._Automaton = _BuildAutomaton_45()




CTD_ANON_46._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_46, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_46._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'XCoordinates'), CTD_ANON_47, scope=CTD_ANON_46, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2088, 2)))

CTD_ANON_46._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'YCoordinates'), CTD_ANON_48, scope=CTD_ANON_46, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2096, 2)))

CTD_ANON_46._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValues'), CTD_ANON_49, scope=CTD_ANON_46, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2104, 2)))

CTD_ANON_46._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValueMeans'), CTD_ANON_50, scope=CTD_ANON_46, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2112, 2)))

def _BuildAutomaton_46 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_46
    del _BuildAutomaton_46
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2080, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2083, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2084, 8))
    counters.add(cc_2)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_46._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2080, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_46._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'XCoordinates')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2081, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_46._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'YCoordinates')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2082, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_46._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValues')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2083, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_46._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValueMeans')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2084, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_4._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_46._Automaton = _BuildAutomaton_46()




CTD_ANON_47._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_47, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_47._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_47, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_47 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_47
    del _BuildAutomaton_47
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2091, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_47._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2091, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_47._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 607, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_47._Automaton = _BuildAutomaton_47()




CTD_ANON_48._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_48, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_48._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_48, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_48 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_48
    del _BuildAutomaton_48
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2099, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_48._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2099, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_48._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 607, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_48._Automaton = _BuildAutomaton_48()




CTD_ANON_49._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_49, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_49._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_49, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_49 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_49
    del _BuildAutomaton_49
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2107, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_49._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2107, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_49._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 607, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_49._Automaton = _BuildAutomaton_49()




CTD_ANON_50._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_50, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_50._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_50, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_50 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_50
    del _BuildAutomaton_50
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2115, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_50._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2115, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_50._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 607, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_50._Automaton = _BuildAutomaton_50()




CTD_ANON_51._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_51, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_51._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ROCGraph'), CTD_ANON_52, scope=CTD_ANON_51, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2132, 2)))

def _BuildAutomaton_51 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_51
    del _BuildAutomaton_51
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2123, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_51._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2123, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_51._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ROCGraph')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2124, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_51._Automaton = _BuildAutomaton_51()




CTD_ANON_52._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_52, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_52._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'XCoordinates'), CTD_ANON_47, scope=CTD_ANON_52, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2088, 2)))

CTD_ANON_52._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'YCoordinates'), CTD_ANON_48, scope=CTD_ANON_52, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2096, 2)))

CTD_ANON_52._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValues'), CTD_ANON_49, scope=CTD_ANON_52, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2104, 2)))

def _BuildAutomaton_52 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_52
    del _BuildAutomaton_52
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2135, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2138, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_52._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2135, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_52._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'XCoordinates')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2136, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_52._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'YCoordinates')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2137, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_52._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BoundaryValues')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2138, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_52._Automaton = _BuildAutomaton_52()




CTD_ANON_53._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_53, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_53._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), CTD_ANON_106, scope=CTD_ANON_53, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2)))

CTD_ANON_53._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ClassLabels'), CTD_ANON_54, scope=CTD_ANON_53, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2151, 2)))

def _BuildAutomaton_53 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_53
    del _BuildAutomaton_53
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2145, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_53._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2145, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_53._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ClassLabels')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2146, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_53._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Matrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2147, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_53._Automaton = _BuildAutomaton_53()




CTD_ANON_54._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_54, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_54._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_54, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_54 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_54
    del _BuildAutomaton_54
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2154, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_54._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2154, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_54._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 622, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_54._Automaton = _BuildAutomaton_54()




CTD_ANON_55._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_55, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_55._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CorrelationFields'), CTD_ANON_56, scope=CTD_ANON_55, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2169, 2)))

CTD_ANON_55._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CorrelationValues'), CTD_ANON_57, scope=CTD_ANON_55, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2177, 2)))

CTD_ANON_55._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CorrelationMethods'), CTD_ANON_58, scope=CTD_ANON_55, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2185, 2)))

def _BuildAutomaton_55 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_55
    del _BuildAutomaton_55
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2162, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2165, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_55._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2162, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_55._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CorrelationFields')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2163, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_55._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CorrelationValues')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2164, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_55._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CorrelationMethods')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2165, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_55._Automaton = _BuildAutomaton_55()




CTD_ANON_56._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_56, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_56._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_56, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_56 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_56
    del _BuildAutomaton_56
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2172, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_56._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2172, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_56._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 622, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_56._Automaton = _BuildAutomaton_56()




CTD_ANON_57._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_57, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_57._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), CTD_ANON_106, scope=CTD_ANON_57, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2)))

def _BuildAutomaton_57 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_57
    del _BuildAutomaton_57
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2180, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_57._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2180, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_57._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Matrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2181, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_57._Automaton = _BuildAutomaton_57()




CTD_ANON_58._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_58, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_58._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), CTD_ANON_106, scope=CTD_ANON_58, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2)))

def _BuildAutomaton_58 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_58
    del _BuildAutomaton_58
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2188, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_58._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2188, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_58._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Matrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2189, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_58._Automaton = _BuildAutomaton_58()




CTD_ANON_59._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_59, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_59._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), CTD_ANON_158, scope=CTD_ANON_59, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2)))

CTD_ANON_59._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), CTD_ANON_159, scope=CTD_ANON_59, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2)))

CTD_ANON_59._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), CTD_ANON_160, scope=CTD_ANON_59, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2)))

CTD_ANON_59._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'True'), CTD_ANON_35, scope=CTD_ANON_59, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2)))

CTD_ANON_59._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'False'), CTD_ANON_36, scope=CTD_ANON_59, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2)))

CTD_ANON_59._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleRule'), CTD_ANON_176, scope=CTD_ANON_59, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2249, 2)))

CTD_ANON_59._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundRule'), CTD_ANON_59, scope=CTD_ANON_59, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2264, 2)))

def _BuildAutomaton_59 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_59
    del _BuildAutomaton_59
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2267, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_59._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2267, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_59._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1677, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_59._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1678, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_59._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1679, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_59._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'True')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1680, 6))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_59._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'False')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1681, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_59._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimpleRule')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2245, 6))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_59._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CompoundRule')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2246, 6))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_7._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_59._Automaton = _BuildAutomaton_59()




CTD_ANON_60._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_60, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_60._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'UnivariateStats'), CTD_ANON_177, scope=CTD_ANON_60, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2282, 2)))

CTD_ANON_60._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MultivariateStats'), CTD_ANON_62, scope=CTD_ANON_60, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2362, 2)))

def _BuildAutomaton_60 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_60
    del _BuildAutomaton_60
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2276, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2277, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2278, 8))
    counters.add(cc_2)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_60._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2276, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_60._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'UnivariateStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2277, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_60._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MultivariateStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2278, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_60._Automaton = _BuildAutomaton_60()




CTD_ANON_61._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_61, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_61._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_61, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_61 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_61
    del _BuildAutomaton_61
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2340, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=2L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2341, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_61._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2340, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_61._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2341, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_61._Automaton = _BuildAutomaton_61()




CTD_ANON_62._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_62, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_62._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MultivariateStat'), CTD_ANON_182, scope=CTD_ANON_62, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2371, 2)))

def _BuildAutomaton_62 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_62
    del _BuildAutomaton_62
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2365, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_62._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2365, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_62._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MultivariateStat')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2366, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_62._Automaton = _BuildAutomaton_62()




CTD_ANON_63._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_63, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_63._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Target'), CTD_ANON_187, scope=CTD_ANON_63, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2461, 2)))

def _BuildAutomaton_63 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_63
    del _BuildAutomaton_63
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2456, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_63._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2456, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_63._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Target')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2457, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_63._Automaton = _BuildAutomaton_63()




CTD_ANON_64._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_64, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_64._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Parameter'), CTD_ANON_190, scope=CTD_ANON_64, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2572, 2)))

def _BuildAutomaton_64 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_64
    del _BuildAutomaton_64
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2567, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2568, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_64._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2567, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_64._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Parameter')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2568, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_64._Automaton = _BuildAutomaton_64()




CTD_ANON_65._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_65, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_65._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Predictor'), CTD_ANON_191, scope=CTD_ANON_65, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2598, 2)))

def _BuildAutomaton_65 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_65
    del _BuildAutomaton_65
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2585, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2586, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_65._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2585, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_65._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Predictor')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2586, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_65._Automaton = _BuildAutomaton_65()




CTD_ANON_66._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_66, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_66._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Predictor'), CTD_ANON_191, scope=CTD_ANON_66, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2598, 2)))

def _BuildAutomaton_66 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_66
    del _BuildAutomaton_66
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2593, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2594, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_66._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2593, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_66._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Predictor')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2594, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_66._Automaton = _BuildAutomaton_66()




CTD_ANON_67._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_67, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_67._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Category'), CTD_ANON_68, scope=CTD_ANON_67, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2617, 2)))

def _BuildAutomaton_67 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_67
    del _BuildAutomaton_67
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2612, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_67._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2612, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_67._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Category')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2613, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_67._Automaton = _BuildAutomaton_67()




CTD_ANON_68._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_68, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_68 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_68
    del _BuildAutomaton_68
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2620, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_68._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2620, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_68._Automaton = _BuildAutomaton_68()




CTD_ANON_69._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_69, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_69._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PPCell'), CTD_ANON_192, scope=CTD_ANON_69, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2633, 2)))

def _BuildAutomaton_69 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_69
    del _BuildAutomaton_69
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2628, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2629, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_69._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2628, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_69._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PPCell')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2629, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_69._Automaton = _BuildAutomaton_69()




CTD_ANON_70._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_70, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_70._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PCell'), CTD_ANON_195, scope=CTD_ANON_70, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2681, 2)))

def _BuildAutomaton_70 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_70
    del _BuildAutomaton_70
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2676, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2677, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_70._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2676, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_70._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PCell')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2677, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_70._Automaton = _BuildAutomaton_70()




CTD_ANON_71._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_71, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_71._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Value'), CTD_ANON_200, scope=CTD_ANON_71, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2818, 2)))

CTD_ANON_71._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Interval'), CTD_ANON_201, scope=CTD_ANON_71, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2836, 2)))

def _BuildAutomaton_71 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_71
    del _BuildAutomaton_71
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2727, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2728, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2729, 8))
    counters.add(cc_2)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_71._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2727, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_71._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Value')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2728, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_71._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Interval')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2729, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_71._Automaton = _BuildAutomaton_71()




CTD_ANON_72._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_72, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_72._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DataField'), CTD_ANON_199, scope=CTD_ANON_72, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2766, 2)))

CTD_ANON_72._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Taxonomy'), CTD_ANON_76, scope=CTD_ANON_72, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2965, 2)))

def _BuildAutomaton_72 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_72
    del _BuildAutomaton_72
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2759, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2761, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_72._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2759, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_72._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DataField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2760, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_72._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Taxonomy')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2761, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_72._Automaton = _BuildAutomaton_72()




CTD_ANON_73._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_73, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_73._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'OutputField'), CTD_ANON_202, scope=CTD_ANON_73, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2863, 2)))

def _BuildAutomaton_73 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_73
    del _BuildAutomaton_73
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2858, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_73._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2858, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_73._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'OutputField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2859, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_73._Automaton = _BuildAutomaton_73()




CTD_ANON_74._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_74, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_74._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Decision'), CTD_ANON_75, scope=CTD_ANON_74, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2942, 2)))

def _BuildAutomaton_74 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_74
    del _BuildAutomaton_74
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2935, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_74._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2935, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_74._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Decision')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2936, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_74._Automaton = _BuildAutomaton_74()




CTD_ANON_75._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_75, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_75 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_75
    del _BuildAutomaton_75
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2945, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_75._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2945, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_75._Automaton = _BuildAutomaton_75()




CTD_ANON_76._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_76, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_76._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ChildParent'), CTD_ANON_203, scope=CTD_ANON_76, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2974, 2)))

def _BuildAutomaton_76 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_76
    del _BuildAutomaton_76
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2968, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_76._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2968, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_76._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ChildParent')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2969, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_76._Automaton = _BuildAutomaton_76()




CTD_ANON_77._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_77, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_77 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_77
    del _BuildAutomaton_77
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2999, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_77._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2999, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_77._Automaton = _BuildAutomaton_77()




CTD_ANON_78._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_78, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_78._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'row'), CTD_ANON_79, scope=CTD_ANON_78, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3011, 2)))

def _BuildAutomaton_78 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_78
    del _BuildAutomaton_78
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3006, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3007, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_78._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3006, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_78._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'row')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3007, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_78._Automaton = _BuildAutomaton_78()




def _BuildAutomaton_79 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_79
    del _BuildAutomaton_79
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=2L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3016, 12))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.WildcardUse(pyxb.binding.content.Wildcard(process_contents=pyxb.binding.content.Wildcard.PC_skip, namespace_constraint=pyxb.binding.content.Wildcard.NC_any), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3016, 12))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_79._Automaton = _BuildAutomaton_79()




CTD_ANON_80._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_80, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_80._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), CTD_ANON_122, scope=CTD_ANON_80, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2)))

CTD_ANON_80._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AnyDistribution'), CTD_ANON_206, scope=CTD_ANON_80, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3092, 2)))

CTD_ANON_80._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'GaussianDistribution'), CTD_ANON_207, scope=CTD_ANON_80, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3101, 2)))

CTD_ANON_80._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PoissonDistribution'), CTD_ANON_208, scope=CTD_ANON_80, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3110, 2)))

CTD_ANON_80._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'UniformDistribution'), CTD_ANON_209, scope=CTD_ANON_80, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3118, 2)))

CTD_ANON_80._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CountTable'), COUNT_TABLE_TYPE, scope=CTD_ANON_80, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3134, 2)))

CTD_ANON_80._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormalizedCountTable'), COUNT_TABLE_TYPE, scope=CTD_ANON_80, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3135, 2)))

def _BuildAutomaton_80 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_80
    del _BuildAutomaton_80
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3089, 6))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=2L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3131, 6))
    counters.add(cc_1)
    states = []
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_80._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'AnyDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3084, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_80._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'GaussianDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3085, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_80._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PoissonDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3086, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_80._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'UniformDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3087, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_80._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3089, 6))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_80._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CountTable')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3129, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_80._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NormalizedCountTable')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3130, 6))
    st_6 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_80._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldRef')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3131, 6))
    st_7 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    transitions = []
    transitions.append(fac.Transition(st_4, [
         ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
         ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    st_5._set_transitionSet(transitions)
    transitions = []
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_7._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_80._Automaton = _BuildAutomaton_80()




CTD_ANON_81._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_81, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_81._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AnyDistribution'), CTD_ANON_206, scope=CTD_ANON_81, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3092, 2)))

CTD_ANON_81._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'GaussianDistribution'), CTD_ANON_207, scope=CTD_ANON_81, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3101, 2)))

CTD_ANON_81._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PoissonDistribution'), CTD_ANON_208, scope=CTD_ANON_81, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3110, 2)))

CTD_ANON_81._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'UniformDistribution'), CTD_ANON_209, scope=CTD_ANON_81, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3118, 2)))

def _BuildAutomaton_81 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_81
    del _BuildAutomaton_81
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3089, 6))
    counters.add(cc_0)
    states = []
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_81._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'AnyDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3084, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_81._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'GaussianDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3085, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_81._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PoissonDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3086, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_81._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'UniformDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3087, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_81._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3089, 6))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    transitions = []
    transitions.append(fac.Transition(st_4, [
         ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
         ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_4._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_81._Automaton = _BuildAutomaton_81()




CTD_ANON_82._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_82, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_82._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralInput'), CTD_ANON_214, scope=CTD_ANON_82, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3259, 2)))

def _BuildAutomaton_82 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_82
    del _BuildAutomaton_82
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3200, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_82._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3200, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_82._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NeuralInput')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3201, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_82._Automaton = _BuildAutomaton_82()




CTD_ANON_83._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_83, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_83._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralOutput'), CTD_ANON_217, scope=CTD_ANON_83, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3289, 2)))

def _BuildAutomaton_83 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_83
    del _BuildAutomaton_83
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3223, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_83._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3223, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_83._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NeuralOutput')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3224, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_83._Automaton = _BuildAutomaton_83()




CTD_ANON_84._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_84, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_84._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Characteristic'), CTD_ANON_219, scope=CTD_ANON_84, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3348, 2)))

def _BuildAutomaton_84 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_84
    del _BuildAutomaton_84
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3343, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_84._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3343, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_84._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Characteristic')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3344, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_84._Automaton = _BuildAutomaton_84()




CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MissingValueWeights'), CTD_ANON, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 33, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Cluster'), CTD_ANON_, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 41, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ClusteringField'), CTD_ANON_86, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 73, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ComparisonMeasure'), CTD_ANON_87, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 110, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_85._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_85, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_85 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_85
    del _BuildAutomaton_85
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 5, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 7, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 8, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 9, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 10, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 12, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 13, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 15, 8))
    counters.add(cc_7)
    cc_8 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 16, 8))
    counters.add(cc_8)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 5, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 6, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 7, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 8, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 9, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 10, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ComparisonMeasure')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 11, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ClusteringField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 12, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MissingValueWeights')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 13, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Cluster')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 14, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 15, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_8, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_85._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 16, 8))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_7, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_7, False) ]))
    st_10._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_8, True) ]))
    st_11._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_85._Automaton = _BuildAutomaton_85()




CTD_ANON_86._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Comparisons'), CTD_ANON_4, scope=CTD_ANON_86, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 93, 2)))

CTD_ANON_86._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_86, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_86 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_86
    del _BuildAutomaton_86
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 76, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 77, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_86._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 76, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_86._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Comparisons')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 77, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_86._Automaton = _BuildAutomaton_86()




CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'euclidean'), CTD_ANON_5, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 139, 2)))

CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'squaredEuclidean'), CTD_ANON_6, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 146, 2)))

CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'cityBlock'), CTD_ANON_7, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 153, 2)))

CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'chebychev'), CTD_ANON_8, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 160, 2)))

CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'minkowski'), CTD_ANON_88, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 167, 2)))

CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'simpleMatching'), CTD_ANON_9, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 175, 2)))

CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'jaccard'), CTD_ANON_10, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 182, 2)))

CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'tanimoto'), CTD_ANON_11, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 189, 2)))

CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'binarySimilarity'), CTD_ANON_89, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 196, 2)))

CTD_ANON_87._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_87, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_87 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_87
    del _BuildAutomaton_87
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 113, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 113, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'euclidean')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 115, 10))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'squaredEuclidean')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 116, 10))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'chebychev')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 117, 10))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'cityBlock')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 118, 10))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'minkowski')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 119, 10))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'simpleMatching')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 120, 10))
    st_6 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'jaccard')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 121, 10))
    st_7 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'tanimoto')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 122, 10))
    st_8 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_87._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'binarySimilarity')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 123, 10))
    st_9 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    transitions = []
    st_3._set_transitionSet(transitions)
    transitions = []
    st_4._set_transitionSet(transitions)
    transitions = []
    st_5._set_transitionSet(transitions)
    transitions = []
    st_6._set_transitionSet(transitions)
    transitions = []
    st_7._set_transitionSet(transitions)
    transitions = []
    st_8._set_transitionSet(transitions)
    transitions = []
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_87._Automaton = _BuildAutomaton_87()




CTD_ANON_88._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_88, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_88 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_88
    del _BuildAutomaton_88
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 170, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_88._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 170, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_88._Automaton = _BuildAutomaton_88()




CTD_ANON_89._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_89, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_89 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_89
    del _BuildAutomaton_89
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 199, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_89._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 199, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_89._Automaton = _BuildAutomaton_89()




CTD_ANON_90._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VerificationFields'), CTD_ANON_12, scope=CTD_ANON_90, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 222, 2)))

CTD_ANON_90._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_90, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_90._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'InlineTable'), CTD_ANON_78, scope=CTD_ANON_90, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3003, 2)))

def _BuildAutomaton_90 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_90
    del _BuildAutomaton_90
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 214, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_90._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 214, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_90._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'VerificationFields')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 215, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_90._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'InlineTable')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 216, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_90._Automaton = _BuildAutomaton_90()




CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ParameterField'), CTD_ANON_92, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 253, 2)))

CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Apply'), CTD_ANON_93, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 260, 2)))

CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Constant'), CTD_ANON_121, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1018, 2)))

CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), CTD_ANON_122, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2)))

CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous'), CTD_ANON_123, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1036, 2)))

CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete'), CTD_ANON_125, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1056, 2)))

CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Discretize'), CTD_ANON_126, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1073, 2)))

CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MapValues'), CTD_ANON_127, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1094, 2)))

CTD_ANON_91._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Aggregate'), CTD_ANON_129, scope=CTD_ANON_91, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1119, 2)))

def _BuildAutomaton_91 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_91
    del _BuildAutomaton_91
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 244, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 244, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ParameterField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 245, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Constant')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 978, 6))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldRef')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 979, 6))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 980, 6))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 981, 6))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Discretize')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 982, 6))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MapValues')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 983, 6))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Apply')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 984, 6))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_91._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Aggregate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 985, 6))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    transitions = []
    st_3._set_transitionSet(transitions)
    transitions = []
    st_4._set_transitionSet(transitions)
    transitions = []
    st_5._set_transitionSet(transitions)
    transitions = []
    st_6._set_transitionSet(transitions)
    transitions = []
    st_7._set_transitionSet(transitions)
    transitions = []
    st_8._set_transitionSet(transitions)
    transitions = []
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_91._Automaton = _BuildAutomaton_91()




CTD_ANON_93._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Apply'), CTD_ANON_93, scope=CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 260, 2)))

CTD_ANON_93._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_93._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Constant'), CTD_ANON_121, scope=CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1018, 2)))

CTD_ANON_93._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), CTD_ANON_122, scope=CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2)))

CTD_ANON_93._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous'), CTD_ANON_123, scope=CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1036, 2)))

CTD_ANON_93._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete'), CTD_ANON_125, scope=CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1056, 2)))

CTD_ANON_93._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Discretize'), CTD_ANON_126, scope=CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1073, 2)))

CTD_ANON_93._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MapValues'), CTD_ANON_127, scope=CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1094, 2)))

CTD_ANON_93._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Aggregate'), CTD_ANON_129, scope=CTD_ANON_93, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1119, 2)))

def _BuildAutomaton_92 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_92
    del _BuildAutomaton_92
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 263, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 264, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_93._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 263, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_93._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Constant')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 978, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_93._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldRef')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 979, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_93._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 980, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_93._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 981, 6))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_93._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Discretize')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 982, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_93._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MapValues')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 983, 6))
    st_6 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_93._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Apply')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 984, 6))
    st_7 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_93._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Aggregate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 985, 6))
    st_8 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_8._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_93._Automaton = _BuildAutomaton_92()




CTD_ANON_94._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_94, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_93 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_93
    del _BuildAutomaton_93
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 282, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_94._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 282, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_94._Automaton = _BuildAutomaton_93()




CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Constraints'), CTD_ANON_96, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 357, 2)))

CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SetPredicate'), CTD_ANON_97, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 382, 2)))

CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Sequence'), CTD_ANON_100, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 434, 2)))

CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SequenceRule'), CTD_ANON_102, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 458, 2)))

CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Item'), CTD_ANON_109, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 720, 2)))

CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Itemset'), CTD_ANON_110, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 731, 2)))

CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_95._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_95, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

def _BuildAutomaton_94 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_94
    del _BuildAutomaton_94
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 333, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 335, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 336, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 337, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 338, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 339, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 340, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 342, 8))
    counters.add(cc_7)
    cc_8 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 343, 8))
    counters.add(cc_8)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 333, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 334, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 335, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 336, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Constraints')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 337, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Item')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 338, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Itemset')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 339, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SetPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 340, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Sequence')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 341, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SequenceRule')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 342, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_8, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_95._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 343, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_7, False) ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_8, True) ]))
    st_10._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_95._Automaton = _BuildAutomaton_94()




CTD_ANON_96._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_96, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_95 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_95
    del _BuildAutomaton_95
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 360, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_96._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 360, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_96._Automaton = _BuildAutomaton_95()




CTD_ANON_97._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_97, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_97._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_97, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_96 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_96
    del _BuildAutomaton_96
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 385, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_97._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 385, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_97._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 622, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_97._Automaton = _BuildAutomaton_96()




CTD_ANON_98._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_98, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_97 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_97
    del _BuildAutomaton_97
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 409, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_98._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 409, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_98._Automaton = _BuildAutomaton_97()




CTD_ANON_99._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_99, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_98 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_98
    del _BuildAutomaton_98
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 418, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_99._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 418, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_99._Automaton = _BuildAutomaton_98()




CTD_ANON_100._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Delimiter'), CTD_ANON_98, scope=CTD_ANON_100, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 406, 2)))

CTD_ANON_100._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Time'), CTD_ANON_99, scope=CTD_ANON_100, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 415, 2)))

CTD_ANON_100._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SetReference'), CTD_ANON_101, scope=CTD_ANON_100, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 450, 2)))

CTD_ANON_100._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_100, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_99 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_99
    del _BuildAutomaton_99
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 437, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 439, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 428, 6))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 430, 6))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 442, 8))
    counters.add(cc_4)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_100._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 437, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_100._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SetReference')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 438, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_100._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 428, 6))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_100._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Delimiter')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 429, 6))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_100._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Time')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 430, 6))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_100._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SetReference')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 431, 6))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_4, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_100._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Time')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 442, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, True) ]))
    st_6._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_100._Automaton = _BuildAutomaton_99()




CTD_ANON_101._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_101, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_100 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_100
    del _BuildAutomaton_100
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 453, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_101._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 453, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_101._Automaton = _BuildAutomaton_100()




CTD_ANON_102._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Delimiter'), CTD_ANON_98, scope=CTD_ANON_102, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 406, 2)))

CTD_ANON_102._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Time'), CTD_ANON_99, scope=CTD_ANON_102, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 415, 2)))

CTD_ANON_102._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AntecedentSequence'), CTD_ANON_15, scope=CTD_ANON_102, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 493, 2)))

CTD_ANON_102._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ConsequentSequence'), CTD_ANON_16, scope=CTD_ANON_102, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 500, 2)))

CTD_ANON_102._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_102, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_101 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_101
    del _BuildAutomaton_101
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 461, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 464, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 466, 8))
    counters.add(cc_2)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_102._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 461, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_102._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'AntecedentSequence')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 462, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_102._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Delimiter')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 463, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_102._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Time')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 464, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_102._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ConsequentSequence')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 465, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_102._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Time')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 466, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
         ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_5._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_102._Automaton = _BuildAutomaton_101()




CTD_ANON_103._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_103, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_102 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_102
    del _BuildAutomaton_102
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 488, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_103._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 488, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_103._Automaton = _BuildAutomaton_102()




def _BuildAutomaton_103 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_103
    del _BuildAutomaton_103
    import pyxb.utils.fac as fac

    counters = set()
    states = []
    return fac.Automaton(states, counters, True, containing_state=None)
ArrayType._Automaton = _BuildAutomaton_103()




CTD_ANON_104._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Indices'), STD_ANON_4, scope=CTD_ANON_104, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 645, 2)))

CTD_ANON_104._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'INT-Entries'), STD_ANON_5, scope=CTD_ANON_104, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 650, 2)))

def _BuildAutomaton_104 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_104
    del _BuildAutomaton_104
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 628, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 629, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_104._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Indices')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 628, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_104._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'INT-Entries')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 629, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_104._Automaton = _BuildAutomaton_104()




CTD_ANON_105._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Indices'), STD_ANON_4, scope=CTD_ANON_105, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 645, 2)))

CTD_ANON_105._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'REAL-Entries'), STD_ANON_6, scope=CTD_ANON_105, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 655, 2)))

def _BuildAutomaton_105 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_105
    del _BuildAutomaton_105
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 638, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 639, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_105._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Indices')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 638, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_105._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'REAL-Entries')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 639, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_105._Automaton = _BuildAutomaton_105()




CTD_ANON_106._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_106, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

CTD_ANON_106._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MatCell'), CTD_ANON_107, scope=CTD_ANON_106, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 681, 2)))

def _BuildAutomaton_106 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_106
    del _BuildAutomaton_106
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 662, 6))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_106._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 607, 6))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_106._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MatCell')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 664, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
         ]))
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
         ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_106._Automaton = _BuildAutomaton_106()




CTD_ANON_108._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_108._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_108._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_108._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Item'), CTD_ANON_109, scope=CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 720, 2)))

CTD_ANON_108._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Itemset'), CTD_ANON_110, scope=CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 731, 2)))

CTD_ANON_108._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AssociationRule'), CTD_ANON_111, scope=CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 750, 2)))

CTD_ANON_108._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_108._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_108._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_108, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_107 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_107
    del _BuildAutomaton_107
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 694, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 696, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 697, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 698, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 699, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 700, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 701, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 702, 8))
    counters.add(cc_7)
    cc_8 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 703, 8))
    counters.add(cc_8)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 694, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 695, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 696, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 697, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 698, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_4, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Item')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 699, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_5, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Itemset')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 700, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'AssociationRule')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 701, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 702, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_8, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_108._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 703, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_7, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_8, True) ]))
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_108._Automaton = _BuildAutomaton_107()




CTD_ANON_109._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_109, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_108 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_108
    del _BuildAutomaton_108
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 723, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_109._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 723, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_109._Automaton = _BuildAutomaton_108()




CTD_ANON_110._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_110, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_110._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ItemRef'), CTD_ANON_20, scope=CTD_ANON_110, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 742, 2)))

def _BuildAutomaton_109 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_109
    del _BuildAutomaton_109
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 734, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 735, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_110._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 734, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_110._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ItemRef')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 735, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_110._Automaton = _BuildAutomaton_109()




CTD_ANON_111._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_111, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_110 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_110
    del _BuildAutomaton_110
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 753, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_111._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 753, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_111._Automaton = _BuildAutomaton_110()




CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ComparisonMeasure'), CTD_ANON_87, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 110, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TrainingInstances'), CTD_ANON_113, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 827, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'KNNInputs'), CTD_ANON_27, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 859, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_112._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_112, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_111 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_111
    del _BuildAutomaton_111
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 803, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 805, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 806, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 807, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 808, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 809, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 813, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 814, 8))
    counters.add(cc_7)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 803, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 804, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 805, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 806, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 807, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 808, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 809, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TrainingInstances')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 810, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ComparisonMeasure')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 811, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'KNNInputs')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 812, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 813, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_112._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 814, 8))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_10._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_7, True) ]))
    st_11._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_112._Automaton = _BuildAutomaton_111()




CTD_ANON_113._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_113, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_113._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'InstanceFields'), CTD_ANON_25, scope=CTD_ANON_113, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 842, 2)))

CTD_ANON_113._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TableLocator'), CTD_ANON_77, scope=CTD_ANON_113, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2996, 2)))

CTD_ANON_113._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'InlineTable'), CTD_ANON_78, scope=CTD_ANON_113, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3003, 2)))

def _BuildAutomaton_112 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_112
    del _BuildAutomaton_112
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 830, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_113._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 830, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_113._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'InstanceFields')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 831, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_113._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TableLocator')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 833, 10))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_113._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'InlineTable')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 834, 10))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    transitions = []
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_113._Automaton = _BuildAutomaton_112()




CTD_ANON_114._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_114, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_113 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_113
    del _BuildAutomaton_113
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 870, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_114._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 870, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_114._Automaton = _BuildAutomaton_113()




CTD_ANON_115._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_115._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_115._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_115._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RegressionTable'), CTD_ANON_116, scope=CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 934, 2)))

CTD_ANON_115._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_115._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_115._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_115._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_115._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_115, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_114 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_114
    del _BuildAutomaton_114
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 893, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 895, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 896, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 897, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 898, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 899, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 901, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 902, 8))
    counters.add(cc_7)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 893, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 894, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 895, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 896, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 897, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 898, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 899, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RegressionTable')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 900, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 901, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_115._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 902, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, True) ]))
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_115._Automaton = _BuildAutomaton_114()




CTD_ANON_116._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_116, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_116._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NumericPredictor'), CTD_ANON_117, scope=CTD_ANON_116, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 946, 2)))

CTD_ANON_116._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CategoricalPredictor'), CTD_ANON_118, scope=CTD_ANON_116, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 956, 2)))

CTD_ANON_116._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PredictorTerm'), CTD_ANON_119, scope=CTD_ANON_116, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 966, 2)))

def _BuildAutomaton_115 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_115
    del _BuildAutomaton_115
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 937, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 938, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 939, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 940, 8))
    counters.add(cc_3)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_116._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 937, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_116._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NumericPredictor')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 938, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_116._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CategoricalPredictor')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 939, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_116._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PredictorTerm')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 940, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_3, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_116._Automaton = _BuildAutomaton_115()




CTD_ANON_117._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_117, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_116 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_116
    del _BuildAutomaton_116
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 949, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_117._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 949, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_117._Automaton = _BuildAutomaton_116()




CTD_ANON_118._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_118, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_117 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_117
    del _BuildAutomaton_117
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 959, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_118._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 959, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_118._Automaton = _BuildAutomaton_117()




CTD_ANON_119._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_119, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_119._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), CTD_ANON_122, scope=CTD_ANON_119, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2)))

def _BuildAutomaton_118 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_118
    del _BuildAutomaton_118
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 969, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_119._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 969, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_119._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldRef')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 970, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_119._Automaton = _BuildAutomaton_118()




CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Apply'), CTD_ANON_93, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 260, 2)))

CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Constant'), CTD_ANON_121, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1018, 2)))

CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), CTD_ANON_122, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2)))

CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous'), CTD_ANON_123, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1036, 2)))

CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete'), CTD_ANON_125, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1056, 2)))

CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Discretize'), CTD_ANON_126, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1073, 2)))

CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MapValues'), CTD_ANON_127, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1094, 2)))

CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Aggregate'), CTD_ANON_129, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1119, 2)))

CTD_ANON_120._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Value'), CTD_ANON_200, scope=CTD_ANON_120, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2818, 2)))

def _BuildAutomaton_119 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_119
    del _BuildAutomaton_119
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1008, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1010, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1008, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Constant')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 978, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldRef')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 979, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 980, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 981, 6))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Discretize')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 982, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MapValues')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 983, 6))
    st_6 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Apply')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 984, 6))
    st_7 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Aggregate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 985, 6))
    st_8 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_120._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Value')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1010, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_120._Automaton = _BuildAutomaton_119()




CTD_ANON_122._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_122, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_120 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_120
    del _BuildAutomaton_120
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1030, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_122._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1030, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_122._Automaton = _BuildAutomaton_120()




CTD_ANON_123._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_123, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_123._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LinearNorm'), CTD_ANON_124, scope=CTD_ANON_123, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1047, 2)))

def _BuildAutomaton_121 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_121
    del _BuildAutomaton_121
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1039, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=2L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1040, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_123._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1039, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_123._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LinearNorm')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1040, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_123._Automaton = _BuildAutomaton_121()




CTD_ANON_124._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_124, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_122 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_122
    del _BuildAutomaton_122
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1050, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_124._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1050, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_124._Automaton = _BuildAutomaton_122()




CTD_ANON_125._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_125, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_123 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_123
    del _BuildAutomaton_123
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1059, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_125._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1059, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_125._Automaton = _BuildAutomaton_123()




CTD_ANON_126._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_126, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_126._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DiscretizeBin'), CTD_ANON_30, scope=CTD_ANON_126, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1085, 2)))

def _BuildAutomaton_124 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_124
    del _BuildAutomaton_124
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1076, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1077, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_126._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1076, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_126._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DiscretizeBin')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1077, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_126._Automaton = _BuildAutomaton_124()




CTD_ANON_127._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_127, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_127._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldColumnPair'), CTD_ANON_128, scope=CTD_ANON_127, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1110, 2)))

CTD_ANON_127._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TableLocator'), CTD_ANON_77, scope=CTD_ANON_127, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2996, 2)))

CTD_ANON_127._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'InlineTable'), CTD_ANON_78, scope=CTD_ANON_127, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3003, 2)))

def _BuildAutomaton_125 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_125
    del _BuildAutomaton_125
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1097, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1099, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_127._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1097, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_127._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldColumnPair')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1098, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_127._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TableLocator')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1100, 10))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_127._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'InlineTable')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1101, 10))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_127._Automaton = _BuildAutomaton_125()




CTD_ANON_128._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_128, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_126 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_126
    del _BuildAutomaton_126
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1113, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_128._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1113, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_128._Automaton = _BuildAutomaton_126()




CTD_ANON_129._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_129, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_127 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_127
    del _BuildAutomaton_127
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1122, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_129._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1122, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_129._Automaton = _BuildAutomaton_127()




CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeSeries'), CTD_ANON_131, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1173, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ExponentialSmoothing'), CTD_ANON_136, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1278, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SpectralAnalysis'), pyxb.binding.datatypes.anyType, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1344, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ARIMA'), pyxb.binding.datatypes.anyType, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1345, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SeasonalTrendDecomposition'), pyxb.binding.datatypes.anyType, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1346, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_130._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_130, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_128 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_128
    del _BuildAutomaton_128
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1144, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1146, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1147, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1148, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1149, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=3L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1150, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1151, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1152, 8))
    counters.add(cc_7)
    cc_8 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1153, 8))
    counters.add(cc_8)
    cc_9 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1154, 8))
    counters.add(cc_9)
    cc_10 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1155, 8))
    counters.add(cc_10)
    cc_11 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1156, 8))
    counters.add(cc_11)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1144, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1145, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1146, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1147, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1148, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_4, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1149, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_5, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TimeSeries')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1150, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SpectralAnalysis')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1151, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ARIMA')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1152, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_8, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ExponentialSmoothing')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1153, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_9, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SeasonalTrendDecomposition')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1154, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_10, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1155, 8))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_11, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_130._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1156, 8))
    st_12 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_12)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    transitions.append(fac.Transition(st_12, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_7, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_7, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_7, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_7, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_8, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_8, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_8, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_8, False) ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_9, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_9, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_9, False) ]))
    st_10._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_10, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_10, False) ]))
    st_11._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_11, True) ]))
    st_12._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_130._Automaton = _BuildAutomaton_128()




CTD_ANON_131._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeValue'), CTD_ANON_132, scope=CTD_ANON_131, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1192, 2)))

CTD_ANON_131._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeAnchor'), CTD_ANON_133, scope=CTD_ANON_131, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1203, 2)))

def _BuildAutomaton_129 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_129
    del _BuildAutomaton_129
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1176, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1177, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_131._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TimeAnchor')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1176, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_131._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TimeValue')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1177, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_131._Automaton = _BuildAutomaton_129()




CTD_ANON_132._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Timestamp'), CTD_ANON_24, scope=CTD_ANON_132, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 793, 2)))

def _BuildAutomaton_130 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_130
    del _BuildAutomaton_130
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1195, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_132._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Timestamp')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1195, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_132._Automaton = _BuildAutomaton_130()




CTD_ANON_133._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeCycle'), CTD_ANON_134, scope=CTD_ANON_133, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1215, 2)))

CTD_ANON_133._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeException'), CTD_ANON_135, scope=CTD_ANON_133, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1255, 2)))

def _BuildAutomaton_131 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_131
    del _BuildAutomaton_131
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1206, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=2L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1207, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_133._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TimeCycle')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1206, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_133._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TimeException')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1207, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_133._Automaton = _BuildAutomaton_131()




CTD_ANON_134._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_134, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_132 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_132
    del _BuildAutomaton_132
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1218, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_134._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 612, 6))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_134._Automaton = _BuildAutomaton_132()




CTD_ANON_135._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_135, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_133 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_133
    del _BuildAutomaton_133
    import pyxb.utils.fac as fac

    counters = set()
    states = []
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_135._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 612, 6))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_135._Automaton = _BuildAutomaton_133()




CTD_ANON_136._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeValue'), CTD_ANON_132, scope=CTD_ANON_136, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1192, 2)))

CTD_ANON_136._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Level'), CTD_ANON_137, scope=CTD_ANON_136, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1298, 2)))

CTD_ANON_136._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Trend_ExpoSmooth'), CTD_ANON_138, scope=CTD_ANON_136, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1304, 2)))

CTD_ANON_136._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Seasonality_ExpoSmooth'), CTD_ANON_139, scope=CTD_ANON_136, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1325, 2)))

def _BuildAutomaton_134 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_134
    del _BuildAutomaton_134
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1282, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1283, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1284, 8))
    counters.add(cc_2)
    states = []
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_136._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Level')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1281, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_136._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Trend_ExpoSmooth')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1282, 8))
    st_1 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_136._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Seasonality_ExpoSmooth')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1283, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_136._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TimeValue')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1284, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_136._Automaton = _BuildAutomaton_134()




CTD_ANON_138._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_138, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_135 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_135
    del _BuildAutomaton_135
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1307, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_138._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 617, 6))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_138._Automaton = _BuildAutomaton_135()




CTD_ANON_139._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_139, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_136 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_136
    del _BuildAutomaton_136
    import pyxb.utils.fac as fac

    counters = set()
    states = []
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_139._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 617, 6))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_139._Automaton = _BuildAutomaton_136()




CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LinearKernelType'), CTD_ANON_31, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1391, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PolynomialKernelType'), CTD_ANON_141, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1399, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RadialBasisKernelType'), CTD_ANON_142, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1410, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SigmoidKernelType'), CTD_ANON_143, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1419, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VectorDictionary'), CTD_ANON_144, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1432, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachine'), CTD_ANON_147, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1463, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_140._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_140, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_137 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_137
    del _BuildAutomaton_137
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1350, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1352, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1353, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1354, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1355, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1356, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1367, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1368, 8))
    counters.add(cc_7)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1350, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1351, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1352, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1353, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1354, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1355, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1356, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LinearKernelType')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1359, 12))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PolynomialKernelType')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1360, 12))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RadialBasisKernelType')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1361, 12))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SigmoidKernelType')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1362, 12))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'VectorDictionary')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1365, 8))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachine')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1366, 8))
    st_12 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_12)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1367, 8))
    st_13 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_13)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_140._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1368, 8))
    st_14 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_14)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
         ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
         ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
         ]))
    st_10._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_12, [
         ]))
    st_11._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_12, [
         ]))
    transitions.append(fac.Transition(st_13, [
         ]))
    transitions.append(fac.Transition(st_14, [
         ]))
    st_12._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_13._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_7, True) ]))
    st_14._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_140._Automaton = _BuildAutomaton_137()




CTD_ANON_141._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_141, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_138 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_138
    del _BuildAutomaton_138
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1402, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_141._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1402, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_141._Automaton = _BuildAutomaton_138()




CTD_ANON_142._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_142, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_139 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_139
    del _BuildAutomaton_139
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1413, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_142._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1413, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_142._Automaton = _BuildAutomaton_139()




CTD_ANON_143._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_143, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_140 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_140
    del _BuildAutomaton_140
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1422, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_143._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1422, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_143._Automaton = _BuildAutomaton_140()




CTD_ANON_144._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_144, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_144._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VectorFields'), CTD_ANON_145, scope=CTD_ANON_144, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1442, 2)))

CTD_ANON_144._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'VectorInstance'), CTD_ANON_146, scope=CTD_ANON_144, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1451, 2)))

def _BuildAutomaton_141 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_141
    del _BuildAutomaton_141
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1435, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1437, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_144._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1435, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_144._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'VectorFields')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1436, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_144._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'VectorInstance')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1437, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_144._Automaton = _BuildAutomaton_141()




CTD_ANON_145._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_145, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_145._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), CTD_ANON_122, scope=CTD_ANON_145, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2)))

def _BuildAutomaton_142 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_142
    del _BuildAutomaton_142
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1445, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_145._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1445, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_145._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldRef')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1446, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_145._Automaton = _BuildAutomaton_142()




CTD_ANON_146._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_146, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_146._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_146, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

CTD_ANON_146._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'REAL-SparseArray'), CTD_ANON_105, scope=CTD_ANON_146, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 635, 2)))

def _BuildAutomaton_143 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_143
    del _BuildAutomaton_143
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1454, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_146._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1454, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_146._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'REAL-SparseArray')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1456, 10))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_146._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 617, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_146._Automaton = _BuildAutomaton_143()




CTD_ANON_147._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_147, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_147._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SupportVectors'), CTD_ANON_148, scope=CTD_ANON_147, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1475, 2)))

CTD_ANON_147._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Coefficients'), CTD_ANON_150, scope=CTD_ANON_147, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1493, 2)))

def _BuildAutomaton_144 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_144
    del _BuildAutomaton_144
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1466, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1467, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_147._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1466, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_147._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SupportVectors')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1467, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_147._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Coefficients')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1468, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_147._Automaton = _BuildAutomaton_144()




CTD_ANON_148._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_148, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_148._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SupportVector'), CTD_ANON_149, scope=CTD_ANON_148, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1485, 2)))

def _BuildAutomaton_145 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_145
    del _BuildAutomaton_145
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1478, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_148._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1478, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_148._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SupportVector')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1479, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_148._Automaton = _BuildAutomaton_145()




CTD_ANON_149._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_149, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_146 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_146
    del _BuildAutomaton_146
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1488, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_149._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1488, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_149._Automaton = _BuildAutomaton_146()




CTD_ANON_150._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_150, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_150._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Coefficient'), CTD_ANON_151, scope=CTD_ANON_150, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1503, 2)))

def _BuildAutomaton_147 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_147
    del _BuildAutomaton_147
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1496, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_150._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1496, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_150._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Coefficient')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1497, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_150._Automaton = _BuildAutomaton_147()




CTD_ANON_151._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_151, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_148 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_148
    del _BuildAutomaton_148
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1506, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_151._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1506, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_151._Automaton = _BuildAutomaton_148()




CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextDictionary'), CTD_ANON_32, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1537, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextCorpus'), CTD_ANON_33, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1546, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DocumentTermMatrix'), CTD_ANON_34, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1565, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextModelNormalization'), CTD_ANON_154, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1573, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextModelSimiliarity'), CTD_ANON_155, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1609, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_152._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_152, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_149 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_149
    del _BuildAutomaton_149
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1514, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1516, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1517, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1518, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1519, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1520, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1524, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1525, 8))
    counters.add(cc_7)
    cc_8 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1526, 8))
    counters.add(cc_8)
    cc_9 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1527, 8))
    counters.add(cc_9)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1514, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1515, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1516, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1517, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1518, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1519, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1520, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TextDictionary')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1521, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TextCorpus')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1522, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DocumentTermMatrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1523, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TextModelNormalization')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1524, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TextModelSimiliarity')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1525, 8))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_8, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1526, 8))
    st_12 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_12)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_9, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_152._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1527, 8))
    st_13 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_13)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    transitions.append(fac.Transition(st_12, [
         ]))
    transitions.append(fac.Transition(st_13, [
         ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_10._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_7, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_7, False) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_7, False) ]))
    st_11._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_8, True) ]))
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_8, False) ]))
    st_12._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_9, True) ]))
    st_13._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_152._Automaton = _BuildAutomaton_149()




CTD_ANON_153._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_153, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_150 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_150
    del _BuildAutomaton_150
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1557, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_153._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1557, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_153._Automaton = _BuildAutomaton_150()




CTD_ANON_154._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_154, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_151 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_151
    del _BuildAutomaton_151
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1576, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_154._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1576, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_154._Automaton = _BuildAutomaton_151()




CTD_ANON_155._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_155, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_152 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_152
    del _BuildAutomaton_152
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1612, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_155._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1612, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_155._Automaton = _BuildAutomaton_152()




CTD_ANON_156._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_156._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_156._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_156._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_156._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Node'), CTD_ANON_157, scope=CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1655, 2)))

CTD_ANON_156._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_156._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_156._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_156._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_156, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_153 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_153
    del _BuildAutomaton_153
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1627, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1629, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1630, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1631, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1632, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1633, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1635, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1636, 8))
    counters.add(cc_7)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1627, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1628, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1629, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1630, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1631, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1632, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1633, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Node')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1634, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1635, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_156._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1636, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, True) ]))
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_156._Automaton = _BuildAutomaton_153()




CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Node'), CTD_ANON_157, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1655, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), CTD_ANON_158, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), CTD_ANON_159, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), CTD_ANON_160, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'True'), CTD_ANON_35, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'False'), CTD_ANON_36, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution'), CTD_ANON_161, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1758, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Regression'), CTD_ANON_166, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1865, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DecisionTree'), CTD_ANON_167, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1882, 2)))

CTD_ANON_157._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Partition'), CTD_ANON_185, scope=CTD_ANON_157, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2424, 2)))

def _BuildAutomaton_154 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_154
    del _BuildAutomaton_154
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1658, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1662, 12))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1663, 12))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1664, 12))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1845, 6))
    counters.add(cc_4)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1658, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1677, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1678, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1679, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'True')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1680, 6))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'False')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1681, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Partition')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1662, 12))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1663, 12))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Node')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1664, 12))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1845, 6))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Regression')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1847, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_157._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DecisionTree')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1848, 8))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_3, True) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    st_10._set_transitionSet(transitions)
    transitions = []
    st_11._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_157._Automaton = _BuildAutomaton_154()




CTD_ANON_158._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_158, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_155 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_155
    del _BuildAutomaton_155
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1687, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_158._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1687, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_158._Automaton = _BuildAutomaton_155()




CTD_ANON_159._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_159, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_159._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), CTD_ANON_158, scope=CTD_ANON_159, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2)))

CTD_ANON_159._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), CTD_ANON_159, scope=CTD_ANON_159, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2)))

CTD_ANON_159._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), CTD_ANON_160, scope=CTD_ANON_159, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2)))

CTD_ANON_159._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'True'), CTD_ANON_35, scope=CTD_ANON_159, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2)))

CTD_ANON_159._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'False'), CTD_ANON_36, scope=CTD_ANON_159, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2)))

def _BuildAutomaton_156 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_156
    del _BuildAutomaton_156
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1710, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=2L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1711, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_159._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1710, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_159._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1677, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_159._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1678, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_159._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1679, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_159._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'True')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1680, 6))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_159._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'False')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1681, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_5._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_159._Automaton = _BuildAutomaton_156()




CTD_ANON_160._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_160, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_160._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_160, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

def _BuildAutomaton_157 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_157
    del _BuildAutomaton_157
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1730, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_160._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1730, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_160._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1731, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_160._Automaton = _BuildAutomaton_157()




CTD_ANON_161._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_161, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_158 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_158
    del _BuildAutomaton_158
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1761, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_161._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1761, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_161._Automaton = _BuildAutomaton_158()




CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Segmentation'), CTD_ANON_163, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1809, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Regression'), CTD_ANON_166, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1865, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DecisionTree'), CTD_ANON_167, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1882, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_162._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_162, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_159 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_159
    del _BuildAutomaton_159
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1788, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1790, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1791, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1792, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1793, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1794, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1795, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1799, 8))
    counters.add(cc_7)
    cc_8 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1800, 8))
    counters.add(cc_8)
    cc_9 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1801, 8))
    counters.add(cc_9)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1788, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1789, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1790, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1791, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1792, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_4, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1793, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_5, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1794, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Regression')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1796, 10))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DecisionTree')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1797, 10))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Segmentation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1799, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_8, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1800, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_9, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_162._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1801, 8))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_5, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_7, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_7, False) ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_8, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_8, False) ]))
    st_10._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_9, True) ]))
    st_11._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_162._Automaton = _BuildAutomaton_159()




CTD_ANON_163._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_163, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_163._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Segment'), CTD_ANON_164, scope=CTD_ANON_163, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1818, 2)))

def _BuildAutomaton_160 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_160
    del _BuildAutomaton_160
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1812, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_163._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1812, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_163._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Segment')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1813, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_163._Automaton = _BuildAutomaton_160()




CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModel'), CTD_ANON_85, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SequenceModel'), CTD_ANON_95, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 330, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AssociationModel'), CTD_ANON_108, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 691, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NearestNeighborModel'), CTD_ANON_112, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 800, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RegressionModel'), CTD_ANON_115, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 890, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TimeSeriesModel'), CTD_ANON_130, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1141, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachineModel'), CTD_ANON_140, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1347, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TextModel'), CTD_ANON_152, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1511, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TreeModel'), CTD_ANON_156, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1624, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), CTD_ANON_158, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), CTD_ANON_159, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), CTD_ANON_160, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'True'), CTD_ANON_35, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'False'), CTD_ANON_36, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningModel'), CTD_ANON_162, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1785, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NaiveBayesModel'), CTD_ANON_168, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1909, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RuleSetModel'), CTD_ANON_173, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2193, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'GeneralRegressionModel'), CTD_ANON_189, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2496, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaselineModel'), CTD_ANON_204, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3022, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralNetwork'), CTD_ANON_212, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3169, 2)))

CTD_ANON_164._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Scorecard'), CTD_ANON_218, scope=CTD_ANON_164, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3298, 2)))

def _BuildAutomaton_161 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_161
    del _BuildAutomaton_161
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1821, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1821, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1677, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1678, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1679, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'True')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1680, 6))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'False')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1681, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'AssociationModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 524, 6))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BaselineModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 525, 6))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ClusteringModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 526, 6))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'GeneralRegressionModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 527, 6))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 528, 6))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NaiveBayesModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 529, 6))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NearestNeighborModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 530, 6))
    st_12 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_12)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NeuralNetwork')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 531, 6))
    st_13 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_13)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RegressionModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 532, 6))
    st_14 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_14)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RuleSetModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 533, 6))
    st_15 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_15)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SequenceModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 534, 6))
    st_16 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_16)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Scorecard')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 535, 6))
    st_17 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_17)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SupportVectorMachineModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 536, 6))
    st_18 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_18)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TextModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 537, 6))
    st_19 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_19)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TimeSeriesModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 538, 6))
    st_20 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_20)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_164._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TreeModel')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 539, 6))
    st_21 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_21)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    transitions.append(fac.Transition(st_12, [
         ]))
    transitions.append(fac.Transition(st_13, [
         ]))
    transitions.append(fac.Transition(st_14, [
         ]))
    transitions.append(fac.Transition(st_15, [
         ]))
    transitions.append(fac.Transition(st_16, [
         ]))
    transitions.append(fac.Transition(st_17, [
         ]))
    transitions.append(fac.Transition(st_18, [
         ]))
    transitions.append(fac.Transition(st_19, [
         ]))
    transitions.append(fac.Transition(st_20, [
         ]))
    transitions.append(fac.Transition(st_21, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    transitions.append(fac.Transition(st_12, [
         ]))
    transitions.append(fac.Transition(st_13, [
         ]))
    transitions.append(fac.Transition(st_14, [
         ]))
    transitions.append(fac.Transition(st_15, [
         ]))
    transitions.append(fac.Transition(st_16, [
         ]))
    transitions.append(fac.Transition(st_17, [
         ]))
    transitions.append(fac.Transition(st_18, [
         ]))
    transitions.append(fac.Transition(st_19, [
         ]))
    transitions.append(fac.Transition(st_20, [
         ]))
    transitions.append(fac.Transition(st_21, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    transitions.append(fac.Transition(st_12, [
         ]))
    transitions.append(fac.Transition(st_13, [
         ]))
    transitions.append(fac.Transition(st_14, [
         ]))
    transitions.append(fac.Transition(st_15, [
         ]))
    transitions.append(fac.Transition(st_16, [
         ]))
    transitions.append(fac.Transition(st_17, [
         ]))
    transitions.append(fac.Transition(st_18, [
         ]))
    transitions.append(fac.Transition(st_19, [
         ]))
    transitions.append(fac.Transition(st_20, [
         ]))
    transitions.append(fac.Transition(st_21, [
         ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    transitions.append(fac.Transition(st_12, [
         ]))
    transitions.append(fac.Transition(st_13, [
         ]))
    transitions.append(fac.Transition(st_14, [
         ]))
    transitions.append(fac.Transition(st_15, [
         ]))
    transitions.append(fac.Transition(st_16, [
         ]))
    transitions.append(fac.Transition(st_17, [
         ]))
    transitions.append(fac.Transition(st_18, [
         ]))
    transitions.append(fac.Transition(st_19, [
         ]))
    transitions.append(fac.Transition(st_20, [
         ]))
    transitions.append(fac.Transition(st_21, [
         ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    transitions.append(fac.Transition(st_12, [
         ]))
    transitions.append(fac.Transition(st_13, [
         ]))
    transitions.append(fac.Transition(st_14, [
         ]))
    transitions.append(fac.Transition(st_15, [
         ]))
    transitions.append(fac.Transition(st_16, [
         ]))
    transitions.append(fac.Transition(st_17, [
         ]))
    transitions.append(fac.Transition(st_18, [
         ]))
    transitions.append(fac.Transition(st_19, [
         ]))
    transitions.append(fac.Transition(st_20, [
         ]))
    transitions.append(fac.Transition(st_21, [
         ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    st_6._set_transitionSet(transitions)
    transitions = []
    st_7._set_transitionSet(transitions)
    transitions = []
    st_8._set_transitionSet(transitions)
    transitions = []
    st_9._set_transitionSet(transitions)
    transitions = []
    st_10._set_transitionSet(transitions)
    transitions = []
    st_11._set_transitionSet(transitions)
    transitions = []
    st_12._set_transitionSet(transitions)
    transitions = []
    st_13._set_transitionSet(transitions)
    transitions = []
    st_14._set_transitionSet(transitions)
    transitions = []
    st_15._set_transitionSet(transitions)
    transitions = []
    st_16._set_transitionSet(transitions)
    transitions = []
    st_17._set_transitionSet(transitions)
    transitions = []
    st_18._set_transitionSet(transitions)
    transitions = []
    st_19._set_transitionSet(transitions)
    transitions = []
    st_20._set_transitionSet(transitions)
    transitions = []
    st_21._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_164._Automaton = _BuildAutomaton_161()




CTD_ANON_165._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_165, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_162 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_162
    del _BuildAutomaton_162
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1855, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_165._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1855, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_165._Automaton = _BuildAutomaton_162()




CTD_ANON_166._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_166, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_166._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RegressionTable'), CTD_ANON_116, scope=CTD_ANON_166, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 934, 2)))

CTD_ANON_166._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_166, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_166._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ResultField'), CTD_ANON_165, scope=CTD_ANON_166, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1852, 2)))

CTD_ANON_166._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_166, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_166._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_166, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_166._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_166, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_163 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_163
    del _BuildAutomaton_163
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1868, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1869, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1870, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1871, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1872, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1873, 8))
    counters.add(cc_5)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_166._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1868, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_166._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1869, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_166._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1870, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_166._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1871, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_166._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1872, 8))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_166._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ResultField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1873, 8))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_166._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RegressionTable')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1874, 8))
    st_6 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    st_6._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_166._Automaton = _BuildAutomaton_163()




CTD_ANON_167._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_167, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_167._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_167, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_167._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Node'), CTD_ANON_157, scope=CTD_ANON_167, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1655, 2)))

CTD_ANON_167._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ResultField'), CTD_ANON_165, scope=CTD_ANON_167, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1852, 2)))

CTD_ANON_167._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_167, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_167._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_167, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_167._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_167, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_164 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_164
    del _BuildAutomaton_164
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1885, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1886, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1887, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1888, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1889, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1890, 8))
    counters.add(cc_5)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_167._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1885, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_167._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1886, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_167._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1887, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_167._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1888, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_167._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1889, 8))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_167._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ResultField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1890, 8))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_167._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Node')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1891, 8))
    st_6 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    st_6._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_167._Automaton = _BuildAutomaton_164()




CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BayesInputs'), CTD_ANON_37, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1931, 2)))

CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BayesOutput'), CTD_ANON_39, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1949, 2)))

CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_168._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_168, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_165 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_165
    del _BuildAutomaton_165
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1912, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1914, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1915, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1916, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1917, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1918, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1921, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1922, 8))
    counters.add(cc_7)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1912, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1913, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1914, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1915, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1916, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1917, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1918, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BayesInputs')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1919, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BayesOutput')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1920, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1921, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_168._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1922, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_7, True) ]))
    st_10._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_168._Automaton = _BuildAutomaton_165()




CTD_ANON_169._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_169, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_166 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_166
    del _BuildAutomaton_166
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1978, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_169._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1978, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_169._Automaton = _BuildAutomaton_166()




CTD_ANON_170._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_170, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_170._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LiftData'), CTD_ANON_172, scope=CTD_ANON_170, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2040, 2)))

CTD_ANON_170._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ROC'), CTD_ANON_51, scope=CTD_ANON_170, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2120, 2)))

CTD_ANON_170._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ConfusionMatrix'), CTD_ANON_53, scope=CTD_ANON_170, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2142, 2)))

def _BuildAutomaton_167 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_167
    del _BuildAutomaton_167
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1999, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2000, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2001, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2002, 8))
    counters.add(cc_3)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_170._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1999, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_170._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ConfusionMatrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2000, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_170._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LiftData')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2001, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_170._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ROC')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2002, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_3, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_170._Automaton = _BuildAutomaton_167()




CTD_ANON_172._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_172, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_172._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelLiftGraph'), CTD_ANON_43, scope=CTD_ANON_172, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2053, 2)))

CTD_ANON_172._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'OptimumLiftGraph'), CTD_ANON_44, scope=CTD_ANON_172, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2061, 2)))

CTD_ANON_172._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RandomLiftGraph'), CTD_ANON_45, scope=CTD_ANON_172, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2069, 2)))

def _BuildAutomaton_168 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_168
    del _BuildAutomaton_168
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2043, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2045, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2046, 8))
    counters.add(cc_2)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_172._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2043, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_172._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelLiftGraph')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2044, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_172._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'OptimumLiftGraph')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2045, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_172._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RandomLiftGraph')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2046, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_172._Automaton = _BuildAutomaton_168()




CTD_ANON_173._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_173._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_173._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_173._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_173._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_173._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RuleSet'), CTD_ANON_174, scope=CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2213, 2)))

CTD_ANON_173._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_173._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_173._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_173, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_169 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_169
    del _BuildAutomaton_169
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2196, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2198, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2199, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2200, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2201, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2202, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2204, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2205, 8))
    counters.add(cc_7)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2196, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2197, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2198, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2199, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2200, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2201, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2202, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RuleSet')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2203, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2204, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_173._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2205, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, True) ]))
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_173._Automaton = _BuildAutomaton_169()




CTD_ANON_174._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_174, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_174._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution'), CTD_ANON_161, scope=CTD_ANON_174, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1758, 2)))

CTD_ANON_174._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'RuleSelectionMethod'), CTD_ANON_175, scope=CTD_ANON_174, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2227, 2)))

CTD_ANON_174._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleRule'), CTD_ANON_176, scope=CTD_ANON_174, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2249, 2)))

CTD_ANON_174._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundRule'), CTD_ANON_59, scope=CTD_ANON_174, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2264, 2)))

def _BuildAutomaton_170 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_170
    del _BuildAutomaton_170
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2216, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2218, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2219, 8))
    counters.add(cc_2)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_174._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2216, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_174._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'RuleSelectionMethod')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2217, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_174._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2218, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_174._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimpleRule')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2245, 6))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_174._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CompoundRule')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2246, 6))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_4._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_174._Automaton = _BuildAutomaton_170()




CTD_ANON_175._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_175, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_171 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_171
    del _BuildAutomaton_171
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2230, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_175._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2230, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_175._Automaton = _BuildAutomaton_171()




CTD_ANON_176._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_176, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_176._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), CTD_ANON_158, scope=CTD_ANON_176, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2)))

CTD_ANON_176._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), CTD_ANON_159, scope=CTD_ANON_176, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2)))

CTD_ANON_176._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), CTD_ANON_160, scope=CTD_ANON_176, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2)))

CTD_ANON_176._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'True'), CTD_ANON_35, scope=CTD_ANON_176, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2)))

CTD_ANON_176._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'False'), CTD_ANON_36, scope=CTD_ANON_176, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2)))

CTD_ANON_176._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution'), CTD_ANON_161, scope=CTD_ANON_176, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1758, 2)))

def _BuildAutomaton_172 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_172
    del _BuildAutomaton_172
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2252, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2254, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_176._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2252, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_176._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1677, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_176._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1678, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_176._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1679, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_176._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'True')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1680, 6))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_176._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'False')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1681, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_176._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ScoreDistribution')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2254, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
         ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_6._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_176._Automaton = _BuildAutomaton_172()




CTD_ANON_177._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_177, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_177._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Counts'), CTD_ANON_178, scope=CTD_ANON_177, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2303, 2)))

CTD_ANON_177._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NumericInfo'), CTD_ANON_179, scope=CTD_ANON_177, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2314, 2)))

CTD_ANON_177._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DiscrStats'), CTD_ANON_61, scope=CTD_ANON_177, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2337, 2)))

CTD_ANON_177._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ContStats'), CTD_ANON_181, scope=CTD_ANON_177, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2346, 2)))

CTD_ANON_177._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Anova'), CTD_ANON_183, scope=CTD_ANON_177, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2394, 2)))

def _BuildAutomaton_173 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_173
    del _BuildAutomaton_173
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2285, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2286, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2287, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2288, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2289, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2290, 8))
    counters.add(cc_5)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_177._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2285, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_177._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Counts')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2286, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_177._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NumericInfo')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2287, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_177._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DiscrStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2288, 8))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_4, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_177._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ContStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2289, 8))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_5, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_177._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Anova')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2290, 8))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_5, True) ]))
    st_5._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_177._Automaton = _BuildAutomaton_173()




CTD_ANON_178._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_178, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_174 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_174
    del _BuildAutomaton_174
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2306, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_178._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2306, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_178._Automaton = _BuildAutomaton_174()




CTD_ANON_179._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_179, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_179._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Quantile'), CTD_ANON_180, scope=CTD_ANON_179, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2328, 2)))

def _BuildAutomaton_175 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_175
    del _BuildAutomaton_175
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2317, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2318, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_179._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2317, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_179._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Quantile')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2318, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_179._Automaton = _BuildAutomaton_175()




CTD_ANON_180._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_180, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_176 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_176
    del _BuildAutomaton_176
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2331, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_180._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2331, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_180._Automaton = _BuildAutomaton_176()




CTD_ANON_181._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_181, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_181._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_181, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

CTD_ANON_181._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Interval'), CTD_ANON_201, scope=CTD_ANON_181, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2836, 2)))

def _BuildAutomaton_177 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_177
    del _BuildAutomaton_177
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2349, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2350, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2351, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=1L, max=3L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2359, 6))
    counters.add(cc_3)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_181._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2349, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_181._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Interval')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2350, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    final_update.add(fac.UpdateInstruction(cc_3, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_181._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 607, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True),
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_3, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_181._Automaton = _BuildAutomaton_177()




CTD_ANON_182._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_182, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_178 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_178
    del _BuildAutomaton_178
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2374, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_182._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2374, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_182._Automaton = _BuildAutomaton_178()




CTD_ANON_183._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_183, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_183._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'AnovaRow'), CTD_ANON_184, scope=CTD_ANON_183, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2403, 2)))

def _BuildAutomaton_179 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_179
    del _BuildAutomaton_179
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2397, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=3L, max=3L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2398, 8))
    counters.add(cc_1)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_183._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2397, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_183._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'AnovaRow')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2398, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_183._Automaton = _BuildAutomaton_179()




CTD_ANON_184._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_184, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_180 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_180
    del _BuildAutomaton_180
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2406, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_184._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2406, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_184._Automaton = _BuildAutomaton_180()




CTD_ANON_185._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_185, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_185._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PartitionFieldStats'), CTD_ANON_186, scope=CTD_ANON_185, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2434, 2)))

def _BuildAutomaton_181 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_181
    del _BuildAutomaton_181
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2427, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2428, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_185._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2427, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_185._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PartitionFieldStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2428, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_185._Automaton = _BuildAutomaton_181()




CTD_ANON_186._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_186, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_186._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Array'), ArrayType, scope=CTD_ANON_186, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 604, 2)))

CTD_ANON_186._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Counts'), CTD_ANON_178, scope=CTD_ANON_186, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2303, 2)))

CTD_ANON_186._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NumericInfo'), CTD_ANON_179, scope=CTD_ANON_186, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2314, 2)))

def _BuildAutomaton_182 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_182
    del _BuildAutomaton_182
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2437, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2438, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2439, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2440, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=1L, max=3L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2359, 6))
    counters.add(cc_4)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_186._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2437, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_186._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Counts')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2438, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_186._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NumericInfo')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2439, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_3, False))
    final_update.add(fac.UpdateInstruction(cc_4, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_186._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Array')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 607, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_3, True),
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_4, True) ]))
    st_3._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_186._Automaton = _BuildAutomaton_182()




CTD_ANON_187._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_187, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_187._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TargetValue'), CTD_ANON_188, scope=CTD_ANON_187, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2484, 2)))

def _BuildAutomaton_183 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_183
    del _BuildAutomaton_183
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2464, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2465, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_187._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2464, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_187._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TargetValue')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2465, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_187._Automaton = _BuildAutomaton_183()




CTD_ANON_188._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_188, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_188._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Partition'), CTD_ANON_185, scope=CTD_ANON_188, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2424, 2)))

def _BuildAutomaton_184 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_184
    del _BuildAutomaton_184
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2487, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2488, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_188._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2487, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_188._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Partition')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2488, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_188._Automaton = _BuildAutomaton_184()




CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ParameterList'), CTD_ANON_64, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2564, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FactorList'), CTD_ANON_65, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2582, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CovariateList'), CTD_ANON_66, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2590, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PPMatrix'), CTD_ANON_69, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2625, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PCovMatrix'), CTD_ANON_193, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2644, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ParamMatrix'), CTD_ANON_70, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2673, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaseCumHazardTables'), CTD_ANON_196, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2692, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'EventValues'), CTD_ANON_71, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2724, 2)))

CTD_ANON_189._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_189, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

def _BuildAutomaton_185 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_185
    del _BuildAutomaton_185
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2499, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2501, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2502, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2503, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2504, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2505, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2507, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2508, 8))
    counters.add(cc_7)
    cc_8 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2510, 8))
    counters.add(cc_8)
    cc_9 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2512, 8))
    counters.add(cc_9)
    cc_10 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2513, 8))
    counters.add(cc_10)
    cc_11 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2514, 8))
    counters.add(cc_11)
    cc_12 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2515, 8))
    counters.add(cc_12)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2499, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2500, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2501, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2502, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2503, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2504, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2505, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ParameterList')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2506, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FactorList')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2507, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CovariateList')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2508, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PPMatrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2509, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PCovMatrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2510, 8))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ParamMatrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2511, 8))
    st_12 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_12)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_9, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'EventValues')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2512, 8))
    st_13 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_13)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_10, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BaseCumHazardTables')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2513, 8))
    st_14 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_14)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_11, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2514, 8))
    st_15 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_15)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_12, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_189._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2515, 8))
    st_16 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_16)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_7, False) ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
         ]))
    transitions.append(fac.Transition(st_12, [
         ]))
    st_10._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_8, True) ]))
    transitions.append(fac.Transition(st_12, [
        fac.UpdateInstruction(cc_8, False) ]))
    st_11._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_13, [
         ]))
    transitions.append(fac.Transition(st_14, [
         ]))
    transitions.append(fac.Transition(st_15, [
         ]))
    transitions.append(fac.Transition(st_16, [
         ]))
    st_12._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_13, [
        fac.UpdateInstruction(cc_9, True) ]))
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_9, False) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_9, False) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_9, False) ]))
    st_13._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_14, [
        fac.UpdateInstruction(cc_10, True) ]))
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_10, False) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_10, False) ]))
    st_14._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_15, [
        fac.UpdateInstruction(cc_11, True) ]))
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_11, False) ]))
    st_15._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_16, [
        fac.UpdateInstruction(cc_12, True) ]))
    st_16._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_189._Automaton = _BuildAutomaton_185()




CTD_ANON_190._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_190, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_186 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_186
    del _BuildAutomaton_186
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2575, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_190._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2575, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_190._Automaton = _BuildAutomaton_186()




CTD_ANON_191._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_191, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_191._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Matrix'), CTD_ANON_106, scope=CTD_ANON_191, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 660, 2)))

CTD_ANON_191._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Categories'), CTD_ANON_67, scope=CTD_ANON_191, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2609, 2)))

def _BuildAutomaton_187 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_187
    del _BuildAutomaton_187
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2601, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2602, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2603, 8))
    counters.add(cc_2)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_191._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2601, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_191._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Categories')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2602, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_191._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Matrix')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2603, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_191._Automaton = _BuildAutomaton_187()




CTD_ANON_192._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_192, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_188 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_188
    del _BuildAutomaton_188
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2636, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_192._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2636, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_192._Automaton = _BuildAutomaton_188()




CTD_ANON_193._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_193, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_193._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'PCovCell'), CTD_ANON_194, scope=CTD_ANON_193, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2660, 2)))

def _BuildAutomaton_189 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_189
    del _BuildAutomaton_189
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2647, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_193._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2647, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_193._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'PCovCell')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2648, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_193._Automaton = _BuildAutomaton_189()




CTD_ANON_194._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_194, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_190 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_190
    del _BuildAutomaton_190
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2663, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_194._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2663, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_194._Automaton = _BuildAutomaton_190()




CTD_ANON_195._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_195, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_191 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_191
    del _BuildAutomaton_191
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2684, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_195._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2684, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_195._Automaton = _BuildAutomaton_191()




CTD_ANON_196._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_196, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_196._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaselineStratum'), CTD_ANON_197, scope=CTD_ANON_196, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2704, 2)))

CTD_ANON_196._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaselineCell'), CTD_ANON_198, scope=CTD_ANON_196, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2715, 2)))

def _BuildAutomaton_192 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_192
    del _BuildAutomaton_192
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2695, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_196._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2695, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_196._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BaselineStratum')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2697, 10))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_196._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BaselineCell')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2698, 10))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_196._Automaton = _BuildAutomaton_192()




CTD_ANON_197._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_197, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_197._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'BaselineCell'), CTD_ANON_198, scope=CTD_ANON_197, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2715, 2)))

def _BuildAutomaton_193 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_193
    del _BuildAutomaton_193
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2707, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2708, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_197._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2707, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_197._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'BaselineCell')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2708, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_197._Automaton = _BuildAutomaton_193()




CTD_ANON_198._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_198, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_194 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_194
    del _BuildAutomaton_194
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2718, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_198._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2718, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_198._Automaton = _BuildAutomaton_194()




CTD_ANON_199._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_199, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_199._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Value'), CTD_ANON_200, scope=CTD_ANON_199, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2818, 2)))

CTD_ANON_199._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Interval'), CTD_ANON_201, scope=CTD_ANON_199, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2836, 2)))

def _BuildAutomaton_195 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_195
    del _BuildAutomaton_195
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2769, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2771, 10))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2772, 10))
    counters.add(cc_2)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_199._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2769, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_199._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Interval')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2771, 10))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_2, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_199._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Value')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2772, 10))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_199._Automaton = _BuildAutomaton_195()




CTD_ANON_200._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_200, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_196 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_196
    del _BuildAutomaton_196
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2821, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_200._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2821, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_200._Automaton = _BuildAutomaton_196()




CTD_ANON_201._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_201, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_197 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_197
    del _BuildAutomaton_197
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2839, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_201._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2839, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_201._Automaton = _BuildAutomaton_197()




CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Apply'), CTD_ANON_93, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 260, 2)))

CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Constant'), CTD_ANON_121, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1018, 2)))

CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldRef'), CTD_ANON_122, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1027, 2)))

CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous'), CTD_ANON_123, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1036, 2)))

CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete'), CTD_ANON_125, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1056, 2)))

CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Discretize'), CTD_ANON_126, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1073, 2)))

CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MapValues'), CTD_ANON_127, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1094, 2)))

CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Aggregate'), CTD_ANON_129, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1119, 2)))

CTD_ANON_202._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Decisions'), CTD_ANON_74, scope=CTD_ANON_202, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2932, 2)))

def _BuildAutomaton_198 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_198
    del _BuildAutomaton_198
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2866, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2867, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1L, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2868, 10))
    counters.add(cc_2)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2866, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Decisions')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2868, 10))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Constant')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 978, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldRef')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 979, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NormContinuous')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 980, 6))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NormDiscrete')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 981, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Discretize')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 982, 6))
    st_6 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MapValues')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 983, 6))
    st_7 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Apply')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 984, 6))
    st_8 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_202._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Aggregate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 985, 6))
    st_9 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_202._Automaton = _BuildAutomaton_198()




CTD_ANON_203._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_203, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_203._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TableLocator'), CTD_ANON_77, scope=CTD_ANON_203, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2996, 2)))

CTD_ANON_203._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'InlineTable'), CTD_ANON_78, scope=CTD_ANON_203, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3003, 2)))

def _BuildAutomaton_199 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_199
    del _BuildAutomaton_199
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2977, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_203._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2977, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_203._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TableLocator')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2979, 10))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_203._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'InlineTable')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2980, 10))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_203._Automaton = _BuildAutomaton_199()




CTD_ANON_204._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_204._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_204._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_204._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_204._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_204._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_204._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_204._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

CTD_ANON_204._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'TestDistributions'), CTD_ANON_205, scope=CTD_ANON_204, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3042, 2)))

def _BuildAutomaton_200 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_200
    del _BuildAutomaton_200
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3025, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3027, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3028, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3029, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3030, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3031, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3033, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3034, 8))
    counters.add(cc_7)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3025, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3026, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3027, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3028, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3029, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3030, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3031, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'TestDistributions')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3032, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3033, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_204._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3034, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, True) ]))
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_204._Automaton = _BuildAutomaton_200()




CTD_ANON_205._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_205, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_205._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Baseline'), CTD_ANON_80, scope=CTD_ANON_205, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3066, 2)))

CTD_ANON_205._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Alternate'), CTD_ANON_81, scope=CTD_ANON_205, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3074, 2)))

def _BuildAutomaton_201 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_201
    del _BuildAutomaton_201
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3046, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3047, 8))
    counters.add(cc_1)
    states = []
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_205._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Baseline')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3045, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_205._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Alternate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3046, 8))
    st_1 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_1, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_205._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3047, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    transitions.append(fac.Transition(st_2, [
         ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_205._Automaton = _BuildAutomaton_201()




CTD_ANON_206._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_206, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_202 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_202
    del _BuildAutomaton_202
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3095, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_206._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3095, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_206._Automaton = _BuildAutomaton_202()




CTD_ANON_207._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_207, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_203 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_203
    del _BuildAutomaton_203
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3104, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_207._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3104, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_207._Automaton = _BuildAutomaton_203()




CTD_ANON_208._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_208, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_204 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_204
    del _BuildAutomaton_204
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3113, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_208._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3113, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_208._Automaton = _BuildAutomaton_204()




CTD_ANON_209._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_209, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_205 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_205
    del _BuildAutomaton_205
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3121, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_209._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3121, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_209._Automaton = _BuildAutomaton_205()




COUNT_TABLE_TYPE._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=COUNT_TABLE_TYPE, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

COUNT_TABLE_TYPE._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldValue'), CTD_ANON_210, scope=COUNT_TABLE_TYPE, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3146, 2)))

COUNT_TABLE_TYPE._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldValueCount'), CTD_ANON_211, scope=COUNT_TABLE_TYPE, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3159, 2)))

def _BuildAutomaton_206 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_206
    del _BuildAutomaton_206
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3138, 6))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(COUNT_TABLE_TYPE._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3138, 6))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(COUNT_TABLE_TYPE._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldValue')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3140, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(COUNT_TABLE_TYPE._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldValueCount')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3141, 8))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
COUNT_TABLE_TYPE._Automaton = _BuildAutomaton_206()




CTD_ANON_210._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_210, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_210._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldValue'), CTD_ANON_210, scope=CTD_ANON_210, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3146, 2)))

CTD_ANON_210._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'FieldValueCount'), CTD_ANON_211, scope=CTD_ANON_210, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3159, 2)))

def _BuildAutomaton_207 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_207
    del _BuildAutomaton_207
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3149, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_210._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3149, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_210._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldValue')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3151, 10))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_210._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'FieldValueCount')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3152, 10))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    st_2._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_210._Automaton = _BuildAutomaton_207()




CTD_ANON_211._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_211, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_208 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_208
    del _BuildAutomaton_208
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3162, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_211._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3162, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_211._Automaton = _BuildAutomaton_208()




CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralInputs'), CTD_ANON_82, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3197, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralLayer'), CTD_ANON_213, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3206, 2)))

CTD_ANON_212._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'NeuralOutputs'), CTD_ANON_83, scope=CTD_ANON_212, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3220, 2)))

def _BuildAutomaton_209 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_209
    del _BuildAutomaton_209
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3172, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3174, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3175, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3176, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3177, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3178, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3181, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3182, 8))
    counters.add(cc_7)
    cc_8 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3183, 8))
    counters.add(cc_8)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3172, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3173, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3174, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3175, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3176, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3177, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3178, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NeuralInputs')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3179, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NeuralLayer')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3180, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'NeuralOutputs')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3181, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3182, 8))
    st_10 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_10)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_8, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_212._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3183, 8))
    st_11 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_11)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    transitions.append(fac.Transition(st_10, [
         ]))
    transitions.append(fac.Transition(st_11, [
         ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_6, False) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_9._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_10, [
        fac.UpdateInstruction(cc_7, True) ]))
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_7, False) ]))
    st_10._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_11, [
        fac.UpdateInstruction(cc_8, True) ]))
    st_11._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_212._Automaton = _BuildAutomaton_209()




CTD_ANON_213._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_213, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_213._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Neuron'), CTD_ANON_215, scope=CTD_ANON_213, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3268, 2)))

def _BuildAutomaton_210 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_210
    del _BuildAutomaton_210
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3209, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_213._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3209, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_213._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Neuron')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3210, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_213._Automaton = _BuildAutomaton_210()




CTD_ANON_214._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_214, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_214._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), CTD_ANON_120, scope=CTD_ANON_214, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2)))

def _BuildAutomaton_211 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_211
    del _BuildAutomaton_211
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3262, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_214._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3262, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_214._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DerivedField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3263, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_214._Automaton = _BuildAutomaton_211()




CTD_ANON_215._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_215, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_215._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Con'), CTD_ANON_216, scope=CTD_ANON_215, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3280, 2)))

def _BuildAutomaton_212 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_212
    del _BuildAutomaton_212
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3271, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_215._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3271, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_215._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Con')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3272, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_215._Automaton = _BuildAutomaton_212()




CTD_ANON_216._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_216, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

def _BuildAutomaton_213 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_213
    del _BuildAutomaton_213
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3283, 8))
    counters.add(cc_0)
    states = []
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_0, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_216._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3283, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    st_0._set_transitionSet(transitions)
    return fac.Automaton(states, counters, True, containing_state=None)
CTD_ANON_216._Automaton = _BuildAutomaton_213()




CTD_ANON_217._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_217, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_217._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'DerivedField'), CTD_ANON_120, scope=CTD_ANON_217, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1005, 2)))

def _BuildAutomaton_214 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_214
    del _BuildAutomaton_214
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3292, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_217._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3292, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_217._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'DerivedField')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3293, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_217._Automaton = _BuildAutomaton_214()




CTD_ANON_218._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification'), CTD_ANON_90, scope=CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 211, 2)))

CTD_ANON_218._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema'), CTD_ANON_14, scope=CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 271, 2)))

CTD_ANON_218._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_218._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations'), CTD_ANON_29, scope=CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 997, 2)))

CTD_ANON_218._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation'), CTD_ANON_42, scope=CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1984, 2)))

CTD_ANON_218._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'ModelStats'), CTD_ANON_60, scope=CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2273, 2)))

CTD_ANON_218._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Targets'), CTD_ANON_63, scope=CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2453, 2)))

CTD_ANON_218._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Output'), CTD_ANON_73, scope=CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 2855, 2)))

CTD_ANON_218._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Characteristics'), CTD_ANON_84, scope=CTD_ANON_218, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3340, 2)))

def _BuildAutomaton_215 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_215
    del _BuildAutomaton_215
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3301, 8))
    counters.add(cc_0)
    cc_1 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3303, 8))
    counters.add(cc_1)
    cc_2 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3304, 8))
    counters.add(cc_2)
    cc_3 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3305, 8))
    counters.add(cc_3)
    cc_4 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3306, 8))
    counters.add(cc_4)
    cc_5 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3307, 8))
    counters.add(cc_5)
    cc_6 = fac.CounterCondition(min=0L, max=1, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3309, 8))
    counters.add(cc_6)
    cc_7 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3310, 8))
    counters.add(cc_7)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3301, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'MiningSchema')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3302, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Output')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3303, 8))
    st_2 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelStats')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3304, 8))
    st_3 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelExplanation')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3305, 8))
    st_4 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Targets')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3306, 8))
    st_5 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'LocalTransformations')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3307, 8))
    st_6 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_6)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Characteristics')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3308, 8))
    st_7 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_7)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_6, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'ModelVerification')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3309, 8))
    st_8 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_8)
    final_update = set()
    final_update.add(fac.UpdateInstruction(cc_7, False))
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_218._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3310, 8))
    st_9 = fac.State(symbol, is_initial=False, final_update=final_update, is_unordered_catenation=False)
    states.append(st_9)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
         ]))
    transitions.append(fac.Transition(st_3, [
         ]))
    transitions.append(fac.Transition(st_4, [
         ]))
    transitions.append(fac.Transition(st_5, [
         ]))
    transitions.append(fac.Transition(st_6, [
         ]))
    transitions.append(fac.Transition(st_7, [
         ]))
    st_1._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_1, True) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_1, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_1, False) ]))
    st_2._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_2, True) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_2, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_2, False) ]))
    st_3._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_3, True) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_3, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_3, False) ]))
    st_4._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_4, True) ]))
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_4, False) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_4, False) ]))
    st_5._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_6, [
        fac.UpdateInstruction(cc_5, True) ]))
    transitions.append(fac.Transition(st_7, [
        fac.UpdateInstruction(cc_5, False) ]))
    st_6._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
         ]))
    transitions.append(fac.Transition(st_9, [
         ]))
    st_7._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_8, [
        fac.UpdateInstruction(cc_6, True) ]))
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_6, False) ]))
    st_8._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_9, [
        fac.UpdateInstruction(cc_7, True) ]))
    st_9._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_218._Automaton = _BuildAutomaton_215()




CTD_ANON_219._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_219, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_219._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Attribute'), CTD_ANON_220, scope=CTD_ANON_219, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3359, 2)))

def _BuildAutomaton_216 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_216
    del _BuildAutomaton_216
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3351, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_219._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3351, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_219._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Attribute')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3352, 8))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    transitions.append(fac.Transition(st_1, [
         ]))
    st_1._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_219._Automaton = _BuildAutomaton_216()




CTD_ANON_220._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'Extension'), CTD_ANON_19, scope=CTD_ANON_220, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 560, 2)))

CTD_ANON_220._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate'), CTD_ANON_158, scope=CTD_ANON_220, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1684, 2)))

CTD_ANON_220._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate'), CTD_ANON_159, scope=CTD_ANON_220, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1707, 2)))

CTD_ANON_220._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate'), CTD_ANON_160, scope=CTD_ANON_220, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1727, 2)))

CTD_ANON_220._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'True'), CTD_ANON_35, scope=CTD_ANON_220, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1744, 2)))

CTD_ANON_220._AddElement(pyxb.binding.basis.element(pyxb.namespace.ExpandedName(Namespace, u'False'), CTD_ANON_36, scope=CTD_ANON_220, location=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1751, 2)))

def _BuildAutomaton_217 ():
    # Remove this helper function from the namespace after it is invoked
    global _BuildAutomaton_217
    del _BuildAutomaton_217
    import pyxb.utils.fac as fac

    counters = set()
    cc_0 = fac.CounterCondition(min=0L, max=None, metadata=pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3362, 8))
    counters.add(cc_0)
    states = []
    final_update = None
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_220._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'Extension')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 3362, 8))
    st_0 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_0)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_220._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimplePredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1677, 6))
    st_1 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_1)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_220._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'CompoundPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1678, 6))
    st_2 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_2)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_220._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'SimpleSetPredicate')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1679, 6))
    st_3 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_3)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_220._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'True')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1680, 6))
    st_4 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_4)
    final_update = set()
    symbol = pyxb.binding.content.ElementUse(CTD_ANON_220._UseForTag(pyxb.namespace.ExpandedName(Namespace, u'False')), pyxb.utils.utility.Location('/Users/pjayaram/Downloads/pmml-4-1.xsd', 1681, 6))
    st_5 = fac.State(symbol, is_initial=True, final_update=final_update, is_unordered_catenation=False)
    states.append(st_5)
    transitions = []
    transitions.append(fac.Transition(st_0, [
        fac.UpdateInstruction(cc_0, True) ]))
    transitions.append(fac.Transition(st_1, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_2, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_3, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_4, [
        fac.UpdateInstruction(cc_0, False) ]))
    transitions.append(fac.Transition(st_5, [
        fac.UpdateInstruction(cc_0, False) ]))
    st_0._set_transitionSet(transitions)
    transitions = []
    st_1._set_transitionSet(transitions)
    transitions = []
    st_2._set_transitionSet(transitions)
    transitions = []
    st_3._set_transitionSet(transitions)
    transitions = []
    st_4._set_transitionSet(transitions)
    transitions = []
    st_5._set_transitionSet(transitions)
    return fac.Automaton(states, counters, False, containing_state=None)
CTD_ANON_220._Automaton = _BuildAutomaton_217()

