importFrom("cluster", "silhouette")
importFrom("stats", "median")

export("as.relation",
       "as.relation_ensemble",
       "is.relation",
       "is.relation_ensemble",
       "reflexive_reduction",
       "reflexive_closure",
       "relation",
       "relation_arity",
       "relation_charfun",
       "relation_class_ids",
       "relation_classes",
       "relation_consensus",
       "relation_dissimilarity",
       "relation_domain",
       "relation_domain<-",
       "relation_domain_names",
       "relation_domain_names<-",
       "relation_ensemble",
       "relation_graph",
       "relation_graph<-",
       "relation_incidence",
       "relation_incidence<-",
       "relation_is_antisymmetric",
       "relation_is_asymmetric",
       "relation_is_bijective",
       "relation_is_binary",
       "relation_is_complete",
       "relation_is_coreflexive",
       "relation_is_endorelation",
       "relation_is_equivalence",
       "relation_is_functional",
       "relation_is_injective",
       "relation_is_irreflexive",
       "relation_is_left_total",
       "relation_is_linear_order",
       "relation_is_partial_order",
       "relation_is_preference",
       "relation_is_reflexive",
       "relation_is_right_total",
       "relation_is_strict_linear_order",
       "relation_is_strict_partial_order",
       "relation_is_surjective",
       "relation_is_symmetric",
       "relation_is_tournament",
       "relation_is_transitive",
       "relation_is_weak_order",
       "relation_is_preorder",
       "relation_is_quasiorder",
       "relation_size",
       "relation_pclust",
       "relation_properties",
       "relation_property",
       "relation_scores",
       "relation_table",
       "relation_violations",
       "transform_incidences",
       "transitive_reduction",
       "transitive_closure"
       )

S3method("[", "relation_ensemble")
S3method("Ops", "relation")
S3method("Ops", "relation_ensemble")
S3method("Summary", "relation")
S3method("Summary", "relation_ensemble")
S3method("as.list", "relation_ensemble")
S3method("c", "relation_ensemble")
S3method("t", "relation_ensemble")
S3method("plot", "relation")
S3method("plot", "relation_ensemble")
S3method("print", "relation")
S3method("print", "relation_classes_of_objects")
S3method("print", "relation_domain")
S3method("print", "relation_graph")
S3method("print", "relation_ensemble")
S3method("print", "relation_incidence")
S3method("print", "relation_pclust")
S3method("print", "relation_table")
S3method("rep", "relation_ensemble")
S3method("t", "relation")
S3method("unique", "relation_ensemble")

S3method("as.relation", "relation")
S3method("as.relation", "numeric")
S3method("as.relation", "integer")
S3method("as.relation", "ordered")
S3method("as.relation", "factor")
S3method("as.relation", "logical")
S3method("as.relation", "matrix")
S3method("as.relation", "data.frame")
S3method("as.relation", "cl_partition")
S3method("as.data.frame", "relation")

S3method("as.relation_ensemble", "data.frame")
S3method("as.relation_ensemble", "default")
S3method("as.relation_ensemble", "relation_ensemble")

S3method(".make_relation_graph_components", "data.frame")
S3method(".make_relation_graph_components", "default")
S3method(".make_relation_graph_components", "list")
S3method(".make_relation_graph_components", "set")
S3method(".make_relation_graph_components", "matrix")
S3method(".make_relation_graph_components", "relation")

## Relational algebra.
export("%><%",
       "%=><%",
       "%><=%",
       "%=><=%",
       "%|><%",
       "%><|%",
       "%|><|%",
       "%|>%",
       "%<|%",
       "%U%",
       "relation_antijoin",
       "relation_cartesian",
       "relation_division",
       "relation_intersection",
       "relation_join",
       "relation_projection",
       "relation_selection",
       "relation_semijoin",
       "relation_symdiff",
       "relation_union"
       )

## S3 methods for internal S3 generics.

S3method(".arity", "relation")
S3method(".arity", "relation_ensemble")
S3method(".arity", "relation_by_domain_and_incidence")

S3method(".domain", "relation")
S3method(".domain", "relation_ensemble")
S3method(".domain", "relation_by_domain_and_incidence")

S3method(".incidence", "relation")
S3method(".incidence", "relation_by_domain_and_incidence")

S3method(".size", "relation")
S3method(".size", "relation_ensemble")
S3method(".size", "relation_by_domain_and_incidence")

## Set stuff.
export("%e%",
       "%D%",
       "as.set",
       "is.set",
       "set",
       "set_is_element",
       "set_is_empty",
       "set_is_equal",
       "set_is_proper_subset",
       "set_is_subset",
       "set_cartesian",
       "set_combn",
       "set_complement",
       "set_intersection",
       "set_power",
       "set_symdiff",
       "set_union",
       "set_outer"
       )

S3method("Ops","set")
S3method("Summary","set")
S3method("print","set")
S3method("print","summary.set")
S3method("mean", "set")
S3method("median", "set")
S3method("rep","set")
S3method("c","set")
S3method("summary","set")
S3method("format", "set")
S3method("as.list", "set")
S3method("as.relation", "set")
S3method("as.set", "character")
S3method("as.set", "data.frame")
S3method("as.set", "default")
S3method("as.set", "factor")
S3method("as.set", "integer")
S3method("as.set", "list")
S3method("as.set", "logical")
S3method("as.set", "numeric")
S3method("as.set", "ordered")
S3method("as.set", "set")
S3method("as.set", "tuple")
S3method("as.set", "relation_graph")

## Tuple stuff.
export("%e%",
       "as.tuple",
       "tuple",
       "singleton",
       "pair",
       "triple",
       "is.tuple",
       "tuple_is_ntuple",
       "tuple_is_singleton",
       "tuple_is_pair",
       "tuple_is_triple",
       "tuple_outer"
       )

S3method("[", "tuple")
S3method("[<-", "tuple")
S3method("Ops","tuple")
S3method("Summary","tuple")
S3method("print","tuple")
S3method("format", "tuple")
S3method("as.tuple", "default")
S3method("as.tuple", "factor")
S3method("as.tuple", "integer")
S3method("as.tuple", "list")
S3method("as.tuple", "logical")
S3method("as.tuple", "character")
S3method("as.tuple", "numeric")
S3method("as.tuple", "ordered")
S3method("as.tuple", "tuple")
S3method("as.tuple", "data.frame")
S3method("as.tuple", "set")
S3method("as.tuple", "relation")
S3method("as.tuple", "relation_domain")
S3method("c", "tuple")
S3method("mean", "tuple")
S3method("median", "tuple")
S3method("rep", "tuple")

## LABEL(S)
export("LABEL",
       "LABELS")

S3method("LABEL", "character")
S3method("LABEL", "default")
S3method("LABEL", "factor")
S3method("LABEL", "integer")
S3method("LABEL", "logical")
S3method("LABEL", "matrix")
S3method("LABEL", "numeric")
S3method("LABEL", "set")
S3method("LABEL", "tuple")
S3method("LABEL", "list")
