πŸ“˜ Antitone Galois connections

πŸ“˜ Antitone Galois connections#

Antitone Galois connections are a fundamental concept in order theory and lattice theory, establishing a relationship between two partially ordered sets (posets) through a pair of antitone functions that are adjoint to each other.

In the GALACTIC framework, antitone Galois connections are implemented using specific classes and methods.

Closure operators#

The GaloisConnection class from the galactic.algebras.concept.core module represents an antitone Galois connection between two posets (parts of two universes). It provides methods to create and manipulate antitone Galois connections, as well as to compute the associated closure operators.

from galactic.algebras.concept.core import (
    GaloisConnection,
    create_context_from_dataset
)
from galactic.algebras.concept.examples.animals.core import ANIMAL_ATTRS, ANIMAL_DATA
context = create_context_from_dataset(ANIMAL_DATA, ANIMAL_ATTRS)
connection = GaloisConnection(context)
display(connection, connection.polarities, connection.closures, connection.context)
<galactic.algebras.concept.core.GaloisConnection object at 0x76060cb690c0>
(<galactic.algebras.concept.core.AttrPolarity object at 0x7605f7f54400>,
 <galactic.algebras.concept.core.ItemPolarity object at 0x7605f7f54430>)
(compose(<galactic.algebras.concept.core.ItemPolarity object at 0x7605f7f54430>, <galactic.algebras.concept.core.AttrPolarity object at 0x7605f7f54400>),
 compose(<galactic.algebras.concept.core.AttrPolarity object at 0x7605f7f54400>, <galactic.algebras.concept.core.ItemPolarity object at 0x7605f7f54430>))
<galactic.algebras.concept.core.Context object at 0x76061e258900>

The closures operators can be accessed using the closures attribute of the GaloisConnection instance. These operators allow for the computation of the closure of a collection of items or attributes within the context of the antitone Galois connection.

item_closure = connection.closures[0]
attr_closure = connection.closures[1]
display(item_closure, attr_closure)
closed_items = item_closure(
    [
        context.domain.item(key='Cat'),
        context.domain.item(key='Dog'),
    ],
)
display(closed_items, list(closed_items), len(closed_items))
closed_attrs = attr_closure(
    [
        context.co_domain.attr(name='feathers'),
    ],
)
display(closed_attrs, list(closed_attrs), len(closed_attrs))
compose(<galactic.algebras.concept.core.ItemPolarity object at 0x7605f7f54430>, <galactic.algebras.concept.core.AttrPolarity object at 0x7605f7f54400>)
compose(<galactic.algebras.concept.core.AttrPolarity object at 0x7605f7f54400>, <galactic.algebras.concept.core.ItemPolarity object at 0x7605f7f54430>)
<galactic.algebras.concept.core.Extent object at 0x76060cbce080>
[Item(key='Fox', value=<tuple object at 0x7605f7f393f0>),
 Item(key='Dog', value=<tuple object at 0x76060cb3aa70>),
 Item(key='Wolf', value=<tuple object at 0x76060cb09180>),
 Item(key='Cat', value=<tuple object at 0x7605f7f39440>),
 Item(key='Tiger', value=<tuple object at 0x7605f7f39490>),
 Item(key='Lion', value=<tuple object at 0x7605f7f06140>),
 Item(key='Horse', value=<tuple object at 0x7605f7f07a60>),
 Item(key='Zebra', value=<tuple object at 0x7605f7f07a60>)]
8
<galactic.algebras.concept.core.Intent object at 0x7605f7f624c0>
[<function twolegs at 0x7605f7f2e980>, <function feathers at 0x7605f7f2e160>]
2

Closed sets of items and attributes#

The application of the closure operators demonstrates how the antitone Galois connection can be used to derive closed sets of items and attributes based on the relationships defined in the context. The first closure operation computes the closure of the items β€œCat” and β€œDog”, resulting in a closed set that includes all items sharing the same attributes using the Extent class. The second closure operation computes the closure of the attribute β€œfeathers”, resulting in a closed set of attributes that are common to all items possessing that attribute using the Intent class.

The Extent and Intent classes implement the Closed protocol from the galactic.algebras.closure.core module, providing a structured way to represent closed sets of items and attributes within the framework of antitone Galois connections.

from galactic.algebras.concept.core import Intent, Extent
extent_1 = Extent(
    connection,
    [context.co_domain.attr(name='feathers')],
)
extent_2 = Extent(
    connection,
    [context.co_domain.attr(name='medium')],
)
join = extent_1 | extent_2
meet = extent_1 & extent_2
display(extent_1, list(extent_1), len(extent_1))
display(extent_2, list(extent_2), len(extent_2))
display(join, list(join), len(join))
display(meet, list(meet), len(meet))
<galactic.algebras.concept.core.Extent object at 0x7605f7f5a300>
[Item(key='Dove', value=<tuple object at 0x76060cb3a980>),
 Item(key='Hen', value=<tuple object at 0x76060cb5a240>),
 Item(key='Duck', value=<tuple object at 0x7605f7f39300>),
 Item(key='Goose', value=<tuple object at 0x7605f7f39300>),
 Item(key='Owl', value=<tuple object at 0x7605f7f39350>),
 Item(key='Hawk', value=<tuple object at 0x7605f7f39350>),
 Item(key='Eagle', value=<tuple object at 0x7605f7f393a0>)]
7
<galactic.algebras.concept.core.Extent object at 0x76060cbcdf00>
[Item(key='Eagle', value=<tuple object at 0x7605f7f393a0>),
 Item(key='Fox', value=<tuple object at 0x7605f7f393f0>),
 Item(key='Dog', value=<tuple object at 0x76060cb3aa70>),
 Item(key='Wolf', value=<tuple object at 0x76060cb09180>)]
4
<galactic.algebras.concept.core.Extent object at 0x76061c175cc0>
[Item(key='Dove', value=<tuple object at 0x76060cb3a980>),
 Item(key='Hen', value=<tuple object at 0x76060cb5a240>),
 Item(key='Duck', value=<tuple object at 0x7605f7f39300>),
 Item(key='Goose', value=<tuple object at 0x7605f7f39300>),
 Item(key='Owl', value=<tuple object at 0x7605f7f39350>),
 Item(key='Hawk', value=<tuple object at 0x7605f7f39350>),
 Item(key='Eagle', value=<tuple object at 0x7605f7f393a0>),
 Item(key='Fox', value=<tuple object at 0x7605f7f393f0>),
 Item(key='Dog', value=<tuple object at 0x76060cb3aa70>),
 Item(key='Wolf', value=<tuple object at 0x76060cb09180>),
 Item(key='Cat', value=<tuple object at 0x7605f7f39440>),
 Item(key='Tiger', value=<tuple object at 0x7605f7f39490>),
 Item(key='Lion', value=<tuple object at 0x7605f7f06140>),
 Item(key='Horse', value=<tuple object at 0x7605f7f07a60>),
 Item(key='Zebra', value=<tuple object at 0x7605f7f07a60>),
 Item(key='Cow', value=<tuple object at 0x7605f7f390d0>)]
16
<galactic.algebras.concept.core.Extent object at 0x76060cb6a7c0>
[Item(key='Eagle', value=<tuple object at 0x7605f7f393a0>)]
1
intent_1 = Intent(
    connection,
    [context.domain.item(key='Zebra')],
)
intent_2 = Intent(
    connection,
    [context.domain.item(key='Wolf')],
)
join = intent_1 | intent_2
meet = intent_1 & intent_2
display(intent_1, list(intent_1), len(intent_1))
display(intent_2, list(intent_2), len(intent_2))
display(join, list(join), len(join))
display(meet, list(meet), len(meet))
<galactic.algebras.concept.core.Intent object at 0x7605f7f62980>
[<function big at 0x7605f7f2e5c0>,
 <function fourlegs at 0x7605f7f2ed40>,
 <function hair at 0x7605f7f2f100>,
 <function run at 0x7605f7f2ff60>,
 <function mane at 0x7605f7f50720>,
 <function hooves at 0x7605f7f50ae0>]
6
<galactic.algebras.concept.core.Intent object at 0x7605f7f61640>
[<function medium at 0x7605f7f2e480>,
 <function fourlegs at 0x7605f7f2ed40>,
 <function hair at 0x7605f7f2f100>,
 <function run at 0x7605f7f2ff60>,
 <function hunt at 0x7605f7f50360>,
 <function mane at 0x7605f7f50720>]
6
<galactic.algebras.concept.core.Intent object at 0x7605f7f61d80>
[<function small at 0x7605f7f18860>,
 <function medium at 0x7605f7f2e480>,
 <function big at 0x7605f7f2e5c0>,
 <function twolegs at 0x7605f7f2e980>,
 <function fourlegs at 0x7605f7f2ed40>,
 <function hair at 0x7605f7f2f100>,
 <function feathers at 0x7605f7f2e160>,
 <function fly at 0x7605f7f2f7e0>,
 <function swim at 0x7605f7f2fba0>,
 <function run at 0x7605f7f2ff60>,
 <function hunt at 0x7605f7f50360>,
 <function mane at 0x7605f7f50720>,
 <function hooves at 0x7605f7f50ae0>]
13
<galactic.algebras.concept.core.Intent object at 0x7605f7f63b00>
[<function fourlegs at 0x7605f7f2ed40>,
 <function hair at 0x7605f7f2f100>,
 <function run at 0x7605f7f2ff60>,
 <function mane at 0x7605f7f50720>]
4

Iterable given in arguments to constructors can be any iterable including instance of the other closed set class (in that case, the operation is optimized since intents and extents are represented by bitmaps).

extent_from_intent = Extent(
    connection,
    intent_1,
)
display(extent_from_intent, list(extent_from_intent), len(extent_from_intent))
intent_from_extent = Intent(
    connection,
    extent_1,
)
display(intent_from_extent, list(intent_from_extent), len(intent_from_extent))
<galactic.algebras.concept.core.Extent object at 0x7605f7f62240>
[Item(key='Horse', value=<tuple object at 0x7605f7f07a60>),
 Item(key='Zebra', value=<tuple object at 0x7605f7f07a60>)]
2
<galactic.algebras.concept.core.Intent object at 0x7605f7f657c0>
[<function twolegs at 0x7605f7f2e980>, <function feathers at 0x7605f7f2e160>]
2