Esempio n. 1
0
def XXXtest_braid():
    from random import shuffle, seed, randint
    from operator import matmul
    from functools import reduce

    seed(1)

    scale = 0.5
    w = 1.4 * scale
    h = 1.8 * scale
    Id = lambda: VWire(min_height=0.5, min_width=0.5)
    Swap = lambda inverse: Braid(
        inverse=inverse, min_width=w, min_height=h, space=0.7)

    box = None
    m, n = 4, 4
    k = 2 * m + n
    for count in range(6):
        items = [Swap(randint(0, 1))
                 for k in range(m)] + [Id() for k in range(n)]
        shuffle(items)
        row = reduce(matmul, items)
        if box is None:
            box = row
        else:
            box = box * row

    #box = Id() @ box
    lhs = reduce(matmul, [Id() for i in range(k)])
    box = lhs @ box
    rels = [(i, 2 * k - i - 1) for i in range(k)]
    #rels = [(i, i+k) for i in range(k)]
    rel = Relation(0, 2 * k, botbot=rels, weight=200.0)
    box = rel * box
    rels = [(i, 2 * k - i - 1) for i in range(k)]
    rel = Relation(2 * k, 0, toptop=rels, weight=200.0)
    box = box * rel

    #rect = RectBox(box, bg=color.rgb(0.9, 0.9, 0.3, 0.6))

    Box.DEBUG = False

    cvs = canvas.canvas()
    #cvs.append(trafo.rotate(pi/2))

    system = box.layout(cvs)

    def rectbox(box):
        x = system[box.llx]
        y = system[box.lly]
        width = system[box.width]
        height = system[box.height]
        return x, y, width, height

    def fillbox(box, st):
        rect = rectbox(box)
        p = path.rect(*rect)
        cvs.fill(p, st)

    #fillbox(box, [color.rgb(0.9, 0.8, 0.5)])

    sub = box[0][1][1]
    x = 0.5 * (system[box.llx] + system[box.urx])
    y = system[sub.lly]
    width = system[box.urx] - x
    height = system[sub.ury] - y
    p = path.rect(x, y, width, height)
    cvs.fill(p, [color.rgb(0.9, 0.9, 0.6)])
    cvs.stroke(p, [style.linewidth.thick])

    cvs.append(style.linewidth.THICk)
    #cvs.append(color.rgb(0.2,0.5,0.2))
    box.render(cvs)

    cvs.append(style.linewidth.thick)
    cvs.append(color.rgb(0.9, 0.9, 0.9))
    box.render(cvs)

    #cvs.writePDFfile("test_diagram.pdf")

    yield cvs
Esempio n. 2
0
 def fillbox(box, st):
     rect = rectbox(box)
     p = path.rect(*rect)
     cvs.fill(p, st)
Esempio n. 3
0
def test_braid():

    from random import shuffle, seed, randint
    from operator import matmul
    from functools import reduce

    from huygens import canvas, color, style, path
    from huygens.box import Box, HBox
    from huygens.diagram import VWire, Braid, Relation

    seed(1)

    scale = 0.3
    w = 1.4 * scale
    h = 1.8 * scale
    Id = lambda: VWire(min_height=scale, min_width=scale)
    Swap = lambda inverse: Braid(
        inverse=inverse, min_width=w, min_height=h, space=0.5)

    box = None
    m, n = 3, 3
    k = 2 * m + n
    for count in range(3):
        items = [Swap(randint(0, 1))
                 for k in range(m)] + [Id() for k in range(n)]
        shuffle(items)
        row = reduce(matmul, items)
        if box is None:
            box = row
        else:
            box = box * row

    # This is what the `box` looks like now:

    yield box, "braid-strands"

    # Now we take the closure of this braid:

    #box = Id() @ box
    lhs = reduce(matmul, [Id() for i in range(k)])
    box = lhs @ box
    rels = [(i, 2 * k - i - 1) for i in range(k)]
    #rels = [(i, i+k) for i in range(k)]
    rel = Relation(0, 2 * k, botbot=rels, weight=200.0)
    box = rel * box
    rels = [(i, 2 * k - i - 1) for i in range(k)]
    rel = Relation(2 * k, 0, toptop=rels, weight=200.0)
    box = box * rel

    yield box

    # Draw this now with some more fancy tricks.

    cvs = canvas.canvas()

    system = box.layout(cvs)

    sub = box[0][1][1]
    x = 0.5 * (box.llx + box.urx)
    y = sub.lly
    width = box.urx - x
    height = sub.ury - y
    p = path.rect(x, y, width, height)
    cvs.fill(p, [color.rgb(0.9, 0.9, 0.6)])
    cvs.stroke(p, [style.linewidth.thick])

    system.refresh()  # refresh for a new render

    cvs.append(style.linewidth.THICk)
    #cvs.append(color.rgb(0.2,0.5,0.2))
    box.render(cvs)

    cvs.append(style.linewidth.thick)
    cvs.append(color.rgb(0.9, 0.0, 0.0))
    box.render(cvs)

    #cvs.writePDFfile("test_diagram.pdf")

    yield cvs