@startuml

set namespaceseparator none
skinparam dpi 96
skinparam shadowing true
skinparam ArrowColor Black
skinparam class {
  backgroundColor Business
  borderColor Red
}

abstract class BaseAnsatz {
    ob_map: dict
}
class TensorAnsatz {
    ob_map: Mapping[Ty, Dim]
    functor
}
class CircuitAnsatz {
    functor: Functor
    ob_map: Mapping[Ty, int]
    n_layers: int
    n_single_qubit_params: int
    discard: bool
}
class MPSAnsatz {
    BOND_TYPE
    bond_dim: int
    max_order: int
    split_functor
    tensor_functor
}
class SpiderAnsatz {
    max_order: int
    split_functor
    tensor_functor
}

class IQPAnsatz {}
class StronglyEntanglingAnsatz {}
class Sim14Ansatz {}
class Sim15Ansatz {}
class Sim4Ansatz {}

class Symbol {
    size: int
    sort_key(order)
}
class sympy.core.symbol.Symbol #back:wheat;line:tomato {}

BaseAnsatz <|-- TensorAnsatz
BaseAnsatz <|-- CircuitAnsatz
TensorAnsatz <|-- MPSAnsatz
TensorAnsatz <|-- SpiderAnsatz
CircuitAnsatz <|-- IQPAnsatz
CircuitAnsatz <|-- StronglyEntanglingAnsatz
CircuitAnsatz <|-- Sim14Ansatz
CircuitAnsatz <|-- Sim15Ansatz
CircuitAnsatz <|-- Sim4Ansatz

MPSAnsatz::split_functor *-left- backend.grammar.Functor
MPSAnsatz::tensor_functor *-- backend.grammar.Functor
SpiderAnsatz::split_functor *-- backend.grammar.Functor
SpiderAnsatz::tensor_functor *-- backend.grammar.Functor
MPSAnsatz::BOND_TYPE *--left backend.grammar.Ty
CircuitAnsatz::functor *-- backend.grammar.Functor
TensorAnsatz::functor *-- backend.grammar.Functor
sympy.core.symbol.Symbol <|-- Symbol

BaseAnsatz --> Symbol : uses

@enduml
