Source code for knit_graphs.artin_wale_braids.Wale_Braid

"""Model of knitted structure as a set of crossing wales using artin braid groups.

This module provides the Wale_Braid class which represents complex cable knitting patterns as mathematical braid structures,
using concepts from algebraic topology to model how wales cross over and under each other.
"""
from knit_graphs.artin_wale_braids.Wale_Braid_Word import Wale_Braid_Word
from knit_graphs.artin_wale_braids.Wale_Group import Wale_Group


[docs] class Wale_Braid: """A model of knitted structure as a set of crossing wales using Artin braid groups. This class represents complex cable knitting patterns using mathematical braid theory, where wales are treated as strands in a braid and their crossings are represented as braid operations. This provides a formal mathematical framework for analyzing and manipulating cable patterns. Attributes: wale_groups (list[Wale_Group]): The collection of wale groups that participate in the braid structure. wale_words (list[Wale_Braid_Word]): The sequence of braid words that describe the crossing operations between wales. """
[docs] def __init__(self, wale_groups: list[Wale_Group], wale_words: list[Wale_Braid_Word]) -> None: """Initialize a wale braid with the specified groups and braid words. Args: wale_groups (list[Wale_Group]): The wale groups that participate in this braid structure. wale_words (list[Wale_Braid_Word]): The sequence of braid words describing the crossing operations. """ self.wale_groups: list[Wale_Group] = wale_groups self.wale_words: list[Wale_Braid_Word] = wale_words
[docs] def reduce(self) -> None: """Simplify the braid by removing pairs of braid words that invert each other. This method modifies the wale_words list by identifying and removing adjacent pairs of braid words that are inverses of each other, effectively canceling out their operations to create a simplified but equivalent braid representation. """ reduced_words: list[Wale_Braid_Word] = [] remaining_words: list[Wale_Braid_Word] = [*self.wale_words[1:]] while len(remaining_words) > 0: if len(reduced_words) == 0: reduced_words.append(remaining_words.pop(0)) else: next_word = remaining_words.pop(0) current_word = reduced_words[-1] if next_word.is_inversion(current_word): reduced_words.pop() # remove current word because its inverted else: reduced_words.append(next_word) self.wale_words = reduced_words