from cereeberus import ReebGraph, MapperGraph
from cereeberus.data import ex_graphs
from cereeberus.data import ex_reebgraphs as ex_rg
[docs]
def line(a = 0, b = 3, seed = None):
    """
    Returns the Mapper graph of a simple line as a MapperGraph class. The endpoints have function value a and b respectively.
    Parameters:
        a, b (int): The function values for the two vertices in increasing order.
        seed (int): Optional. The seed to use for the random number generator, which only controls the layout function.
    Returns:
        MapperGraph: The Mapper graph of the line.
        
    .. figure:: ../../images/line_mapper.png
        :figwidth: 400px
    """
    MG = ex_rg.line(a, b, seed = seed).to_mapper()
    MG.set_pos_from_f(seed = seed)
    return MG 
[docs]
def torus(a = 0, b = 1, c = 4, d = 5, 
            delta = .1, seed=None):
    '''
    Returns the Mapper graph of a simple upright torus as a MapperGraph class. 
    Parameters:
        a ,b, c, d (int): The integer function values for the four vertices in increasing order.
        delta (float): Optional. The delta value to use for the Mapper graph.
        seed (int): Optional. The seed to use for the random number generator, which only controls the layout function.
    Returns:
        Mapper: The mapper graph of the torus.
    
    .. figure:: ../../images/torus_mapper.png
        :figwidth: 400px
    '''
    # make sure a, b, c, and d are integers
    if not all(isinstance(x, int) for x in [a, b, c, d]):
        raise ValueError('a, b, c, and d must be integers.')
    MG = ex_rg.torus(a,b,c,d, multigraph = True, seed = seed).to_mapper(delta = delta)
    MG.set_pos_from_f(seed = seed)
    return MG 
[docs]
def dancing_man(delta = .1, seed=None):
    '''
    Returns the Mapper graph of the dancing man as a MapperGraph class. 
    Parameters:
        seed (int): Optional. The seed to use for the random number generator, which only controls the layout function.
    Returns:
        MapperGraph: The mapper graph of the dancing man.
    
    .. figure:: ../../images/dancing_man_mapper.png
        :figwidth: 400px
    '''
    return ReebGraph(ex_graphs.dancing_man(), seed=seed).to_mapper(delta = delta) 
[docs]
def juggling_man(delta = .1, seed=None):
    '''
    Returns a modified mapper graph of the juggling man as a MapperGraph class. Some vertex locations were moved to make them integers. 
    Parameters:
        seed (int): Optional. The seed to use for the random number generator, which only controls the layout function.
    Returns:
        MapperGraph: The mapper graph of the juggling man.
    
    .. figure:: ../../images/juggling_man_mapper.png
        :figwidth: 400px
    '''
    R = ReebGraph(ex_graphs.juggling_man(), seed=seed)
    R.f[9] = 7
    R.f[8] = 6
    R.f[10] = 5
    return R.to_mapper(delta = delta) 
[docs]
def simple_loops(delta = .1, seed=None):
    '''
    Returns the mapper graph of the simple loops example.
    Parameters:
        seed (int): Optional. The seed to use for the random number generator, which only controls the layout function.
    Returns:
        MapperGraph: The mapper graph of the simple loops example.
    
    .. figure:: ../../images/simple_loops_mapper.png
        :figwidth: 400px
    '''
    return ReebGraph(ex_graphs.simple_loops(), seed=seed).to_mapper() 
[docs]
def simple_loops_unordered(seed=None):
    '''
    Returns the mapper graph of the unordered simple loops example.
    Parameters:
        seed (int): Optional. The seed to use for the random number generator, which only controls the layout function.
    Returns:
        MapperGraph: The mapper graph of the simple loops example.
    '''
    return ReebGraph(ex_graphs.simple_loops_unordered(), seed=seed).to_mapper() 
[docs]
def interleave_example_A(seed = None):
    '''
    Returns the mapper graph of the first example for the interleave function.
    Parameters:
        seed (int): Optional. The seed to use for the random number generator, which only controls the layout function.
    Returns:
        MapperGraph: The mapper graph of the first example for the interleave function.
    
    .. figure:: ../../images/interleave_example_A_mapper.png
        :figwidth: 400px
    '''
    return ex_rg.interleave_example_A(seed = seed).to_mapper() 
[docs]
def interleave_example_B(seed = None):
    '''
    Returns the mapper graph of the second example for the interleave function.
    Parameters:
        seed (int): Optional. The seed to use for the random number generator, which only controls the layout function.
    Returns:
        MapperGraph: The mapper graph of the second example for the interleave function.
    
    .. figure:: ../../images/interleave_example_B_mapper.png
        :figwidth: 400px
    '''
    return ex_rg.interleave_example_B(seed = seed).to_mapper()