Examples

9.2. Examples#

In the following notebook you can try several examples. If you are interested you can also download the notebook and the trussopt.py file and explore the script further.

import trussopt
import itertools
#from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[1], line 1
----> 1 import trussopt
      2 import itertools
      3 #from mpl_toolkits.mplot3d import Axes3D

File /book/advanced_topics/layopt/trussopt.py:2
      1 import numpy as np
----> 2 import cvxpy as cvx
      3 from scipy import sparse
      4 from math import ceil

ModuleNotFoundError: No module named 'cvxpy'

Example 1: Simple Truss

Example 1 shows how to manually state a problem for the truss optimizer to solve. It is possible to define all the nodes, lines between nodes, supports and loads by hand. This way the problem you want to solve can be highly tunable but it becomes quite a lot of work for a larger problem.

# Node data as list of XYZ coordinates. z=0 for 2D trusses
nodes = [
    [0.0, 0.0, 0.0],   # Node 0
    [1.0, 1.0, 0.0],   # Node 1
    [2.0, 0.0, 0.0],   # Node 2
    [3.0, 1.0, 0.0],    # Node 3
    [4.0, 0.0, 0.0],    # Node 4
    [5.0, 1.0, 0.0],    # Node 5
    [6.0, 0.0, 0.0],    # Node 6
]

# Line data as list of tuples (start node index, end node index, include in starting set, tensile strength, compressive strength)
lines = [
    (0, 1, True, 1, 1),  # Line 0 between Node 0 and Node 1
    (0, 2, True, 1, 1),  # Line 1 between Node 0 and Node 2
    (1, 2, True, 1, 1),  # Line 2 between Node 1 and Node 2
    (1, 3, True, 1, 1),  # Line 3 between Node 2 and Node 3
    (2, 3, True, 1, 1),  # Line 4 between Node 2 and Node 3
    (2, 4, True, 1, 1),  # Line 5 between Node 2 and Node 4
    (3, 4, True, 1, 1),  # Line 6 between Node 3 and Node 4
    (3, 5, True, 1, 1),  # Line 7 between Node 3 and Node 5
    (4, 5, True, 1, 1),  # Line 8 between Node 4 and Node 5
    (4, 6, True, 1, 1),  # Line 9 between Node 4 and Node 6
    (5, 6, True, 1, 1),  # Line 10 between Node 5 and Node 6
]

# Support data as a dictionary of node indices to support conditions
supports = {
    0: [0, 0, 0],  # Node 0 is fixed in all directions
    6: [1, 0, 0],  # Node 6 is free in x direction
}

# Load data as a list of dictionary of node indices to load vectors
loads = [{
    2: [0, 0.5, 0],    # Load on Node 2, the value also has effect on the size of the arrow
    4: [0, 0.5, 0]     # Load on Node 4
}]

# Joint cost
joint_cost = 0.0  # Adding cost of joints to members

For the optimization itself we simply call to functions from the trussopt.py. First with trussopt.lo we solve the optimization problem we defined above. Take a look at the documentation to understand what the parameters are and what the function returns. With trussopt.lo_plot() the result is plotted. Does the joint cost have any effect on this problem?

Note that we include all members in the starting set for now.

Nd, Cn, a, q = trussopt.lo(nodes, lines, supports, loads, joint_cost=0.0)
trussopt.lo_plot(Nd, Cn, a, q, supports, loads, threshold=0.1, str='Example 1: Simple truss', update=True, plane='xy')
../../_images/2381fcbb24528bff69cd6ce10d7bd70a5cb740a0f0f73c70b34b9af31b2e1bb1.png

Example 2: Creating a 2D grid with Itertools

In the second example we solve the problem from figure 1. First we need to define the grid of points and the lines. With the funcion generate_3D_grid we use itertools to make all possible combination between nodes and store the lines in the correct array. The input for the member adding scheme can also be created in this function. We can for example say that every line longer than 2 is not included in the initial set. We define plot_grid to check if we succesfully created the wished grid.

(note that we directly define the 3D functions but it also works for 2D problems)

def generate_3D_grid(x, y, z):
    
    # Create a list to store all the nodes
    nodes = [(i, j, k) for i in range(x) for j in range(y) for k in range(z)]
    
    # Create a mapping from node positions to point numbers
    node_to_number = {node: index for index, node in enumerate(nodes)}
    
    # Use itertools.combinations to generate all pairs of nodes (lines between nodes)
    lines = []
    for node1, node2 in itertools.combinations(nodes, 2):
        point1 = node_to_number[node1]
        point2 = node_to_number[node2]
        if ((node1[0] - node2[0])**2 + (node1[1] - node2[1])**2 + (node1[2] - node2[2])**2)**0.5 > 2:
            lines.append((point1, point2, False, 1, 1))
        else: 
            lines.append((point1, point2, True, 1, 1))
    
    return nodes, lines

def plot_grid(nodes, lines):
    fig, ax = plt.subplots()
    
    # Plot nodes
    for node in nodes:
        ax.plot(node[0], node[1], 'bo')  # 'bo' means blue color, circle marker
        for i, node in enumerate(nodes): #create the node index again
            ax.text(node[0], node[1], str(i), fontsize=12, ha='right')
    
    # Plot lines
    for line in lines:
        if line[2] == True:
            node1 = nodes[line[0]]
            node2 = nodes[line[1]]
            ax.plot([node1[0], node2[0]], [node1[1], node2[1]], 'k-')  # 'k-' means black color, solid line
        else:
            node1 = nodes[line[0]]
            node2 = nodes[line[1]]
            ax.plot([node1[0], node2[0]], [node1[1], node2[1]], 'r-')
    
    ax.set_aspect('equal')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.title('Grid of Nodes and Lines')
    plt.show()

If we generate and plot the grid we can check if all nodes and lines are created correctly and if the longer lines are indeed excluded from the intitial set. The node numbers are included in the plot so we can easily pick points to add supports and loads.

x, y, z = 5, 5, 1 #set z the 1 to make it 2D
nodes, lines = generate_3D_grid(x, y, z)
plot_grid(nodes, lines)
../../_images/59cb1e66f64e512f228082fdc12f0a1c4d9f02d4050b0731b526f40fe0710e93.png

That looks like what we want! Now we can easily see which at which nodes we should define the supports and the loads and run the optimizer. Change the joint_cost and see what happens.

# Support data as a dictionary of node indices to support conditions
supports = {
    0: [0, 0, 0],  # Node 0 is fixed in all directions
    4: [0, 0, 0]  # Node 4 is fixed in all directions
}

# Load data as a list of dictionary of node indices to load vectors
loads = [{
    22: [0, -1, 0]    # Load on Node 22
}]

# Joint cost
joint_cost = 0.0  # Adding cost of joints to members, the number is a bit arbitrary but here every number higher than 0 will change the outcome

Nd, Cn, a, q = trussopt.lo(nodes, lines, supports, loads, joint_cost=joint_cost)
trussopt.lo_plot(Nd, Cn, a, q, supports, loads, threshold=0.1, str='Example 2: 2D grid', update=True, plane='xy')
../../_images/2155e24a3832f57d9ba7d33b0b3c8306df03cbfc628f516292baaa35fc116cbd.png

Example 3: Half wheel

For the third example we want to create a half wheel supported at the ends and with one load in the middle. It will take a long time to plot an example grid of this size, but we know from the previous example how the numbering works. So we can quite easily work out where the supports and loads are. Try again to change the joint_cost and see what happens this time

x, y, z = 11, 5, 1  # Example grid dimensions (3x3x3)
nodes, lines = generate_3D_grid(x, y, z)
#print((nodes))
#print(lines)
#plot_grid(nodes, lines) #plotting this will take a long time
# Support data as a dictionary of node indices to support conditions
supports = {
    0: [0, 0, 0],  # Node 0 is fixed in all directions
    50: [1, 0, 0]  # Node 50 is free in x direction  
}

# Load data as a list of dictionary of node indices to load vectors
loads = [{
    25: [0, -1, 0]  # Load on Node 25
}]

# Joint cost
joint_cost = 0.0  # Adding cost of joints to members, the number is a bit arbitrary but here every number higher than 0 will change the outcome

Nd, Cn, a, q = trussopt.lo(nodes, lines, supports, loads, joint_cost=joint_cost)
trussopt.lo_plot(Nd, Cn, a, q, supports, loads, threshold=0.1, str='Example 3: Half Wheel', update=True, plane='xy')
../../_images/8b797b923e63bf2406a127c413c165834ea1a213a8ecf73772544bbfbb53cfcd.png

Example 4: Non-convex domain

For the fourth example we create a non-convex domain. We define an area that we want to keep free of lines before we start the optimization.

def generate_non_convex(x, y, exclude_rect=None):
    """
    Generate a 2D grid of nodes and lines, excluding a rectangular section if specified.
    
    Parameters:
    x (int): Number of nodes along the x-axis.
    y (int): Number of nodes along the y-axis.
    exclude_rect (tuple): A tuple (x1, y1, x2, y2) defining the rectangular section to exclude.
                          (x1, y1) is the bottom-left corner and (x2, y2) is the top-right corner.
    
    Returns:
    nodes (list): List of node coordinates.
    lines (list): List of lines between nodes.
    """
    # Create a list to store all the nodes
    nodes = [(i, j) for i in range(x+1) for j in range(y+1)]
    
    # Exclude nodes within the specified rectangular section
    if exclude_rect:
        x1, y1, x2, y2 = exclude_rect
        nodes = [(i, j) for i, j in nodes if not (x1 <= i <= x2 and y1 <= j <= y2)]
    
    # create the 4 corners of the rectangle
    offset = 0.1 # offset to make sure the lines between the corners are still possible
    rect = [(x1+offset, y1+offset), (x2-offset, y1+offset), (x2-offset, y2-offset), (x1+offset, y2-offset)]

    # Create a mapping from node positions to point numbers
    node_to_number = {node: index for index, node in enumerate(nodes)}
    
    # Use itertools.combinations to generate all pairs of nodes (lines between nodes)
    lines = []
    for node1, node2 in itertools.combinations(nodes, 2):
        # Check if the line crosses the excluded rectangle
        if exclude_rect:
            x1, y1, x2, y2 = exclude_rect
            def ccw(A, B, C): # Helps to determine if the points are in a clockwise or counter clockwise order.
                return (C[1] - A[1]) * (B[0] - A[0]) > (B[1] - A[1]) * (C[0] - A[0])

            def intersect(A, B, C, D): # Function to check if two line segments intersect by comparing the orientations of their endpoints.
                return ccw(A, C, D) != ccw(B, C, D) and ccw(A, B, C) != ccw(A, B, D)

            if any(intersect(node1, node2, rect[i], rect[(i + 1) % 4]) for i in range(4)):
                continue
            
        point1 = node_to_number[node1]
        point2 = node_to_number[node2]
        lines.append((point1, point2, True, 1, 1))
    
    # Add z = 0 coordinate to all nodes
    nodes = [(i, j, 0) for i, j in nodes]

    # Add z = 0 coordinate to all lines
    lines = [(point1, point2, True, 1, 1) for point1, point2, _, _, _ in lines]

    return nodes, lines

We define a 10 x 10 grid and let the newly defined function fill it with a grid of points and subtract all points and lines that pass the rectangle we want to leave out. The resulting grid is printed to check if it worked.

# Example usage
x, y = 10, 10
exclude_rect = (2, 3, 8, 7)  # Exclude the rectangular section from (2, 3) to (8, 7)
nodes, lines = generate_non_convex(x, y, exclude_rect)
print(nodes)
print(lines)
plot_grid(nodes, lines) #comment this to make it run faster
[(0, 0, 0), (0, 1, 0), (0, 2, 0), (0, 3, 0), (0, 4, 0), (0, 5, 0), (0, 6, 0), (0, 7, 0), (0, 8, 0), (0, 9, 0), (0, 10, 0), (1, 0, 0), (1, 1, 0), (1, 2, 0), (1, 3, 0), (1, 4, 0), (1, 5, 0), (1, 6, 0), (1, 7, 0), (1, 8, 0), (1, 9, 0), (1, 10, 0), (2, 0, 0), (2, 1, 0), (2, 2, 0), (2, 8, 0), (2, 9, 0), (2, 10, 0), (3, 0, 0), (3, 1, 0), (3, 2, 0), (3, 8, 0), (3, 9, 0), (3, 10, 0), (4, 0, 0), (4, 1, 0), (4, 2, 0), (4, 8, 0), (4, 9, 0), (4, 10, 0), (5, 0, 0), (5, 1, 0), (5, 2, 0), (5, 8, 0), (5, 9, 0), (5, 10, 0), (6, 0, 0), (6, 1, 0), (6, 2, 0), (6, 8, 0), (6, 9, 0), (6, 10, 0), (7, 0, 0), (7, 1, 0), (7, 2, 0), (7, 8, 0), (7, 9, 0), (7, 10, 0), (8, 0, 0), (8, 1, 0), (8, 2, 0), (8, 8, 0), (8, 9, 0), (8, 10, 0), (9, 0, 0), (9, 1, 0), (9, 2, 0), (9, 3, 0), (9, 4, 0), (9, 5, 0), (9, 6, 0), (9, 7, 0), (9, 8, 0), (9, 9, 0), (9, 10, 0), (10, 0, 0), (10, 1, 0), (10, 2, 0), (10, 3, 0), (10, 4, 0), (10, 5, 0), (10, 6, 0), (10, 7, 0), (10, 8, 0), (10, 9, 0), (10, 10, 0)]
[(0, 1, True, 1, 1), (0, 2, True, 1, 1), (0, 3, True, 1, 1), (0, 4, True, 1, 1), (0, 5, True, 1, 1), (0, 6, True, 1, 1), (0, 7, True, 1, 1), (0, 8, True, 1, 1), (0, 9, True, 1, 1), (0, 10, True, 1, 1), (0, 11, True, 1, 1), (0, 12, True, 1, 1), (0, 13, True, 1, 1), (0, 14, True, 1, 1), (0, 15, True, 1, 1), (0, 16, True, 1, 1), (0, 17, True, 1, 1), (0, 18, True, 1, 1), (0, 19, True, 1, 1), (0, 20, True, 1, 1), (0, 21, True, 1, 1), (0, 22, True, 1, 1), (0, 23, True, 1, 1), (0, 24, True, 1, 1), (0, 25, True, 1, 1), (0, 26, True, 1, 1), (0, 27, True, 1, 1), (0, 28, True, 1, 1), (0, 29, True, 1, 1), (0, 30, True, 1, 1), (0, 33, True, 1, 1), (0, 34, True, 1, 1), (0, 35, True, 1, 1), (0, 36, True, 1, 1), (0, 40, True, 1, 1), (0, 41, True, 1, 1), (0, 42, True, 1, 1), (0, 46, True, 1, 1), (0, 47, True, 1, 1), (0, 48, True, 1, 1), (0, 52, True, 1, 1), (0, 53, True, 1, 1), (0, 54, True, 1, 1), (0, 58, True, 1, 1), (0, 59, True, 1, 1), (0, 60, True, 1, 1), (0, 64, True, 1, 1), (0, 65, True, 1, 1), (0, 66, True, 1, 1), (0, 67, True, 1, 1), (0, 75, True, 1, 1), (0, 76, True, 1, 1), (0, 77, True, 1, 1), (0, 78, True, 1, 1), (1, 2, True, 1, 1), (1, 3, True, 1, 1), (1, 4, True, 1, 1), (1, 5, True, 1, 1), (1, 6, True, 1, 1), (1, 7, True, 1, 1), (1, 8, True, 1, 1), (1, 9, True, 1, 1), (1, 10, True, 1, 1), (1, 11, True, 1, 1), (1, 12, True, 1, 1), (1, 13, True, 1, 1), (1, 14, True, 1, 1), (1, 15, True, 1, 1), (1, 16, True, 1, 1), (1, 17, True, 1, 1), (1, 18, True, 1, 1), (1, 19, True, 1, 1), (1, 20, True, 1, 1), (1, 21, True, 1, 1), (1, 22, True, 1, 1), (1, 23, True, 1, 1), (1, 24, True, 1, 1), (1, 25, True, 1, 1), (1, 26, True, 1, 1), (1, 27, True, 1, 1), (1, 28, True, 1, 1), (1, 29, True, 1, 1), (1, 30, True, 1, 1), (1, 33, True, 1, 1), (1, 34, True, 1, 1), (1, 35, True, 1, 1), (1, 36, True, 1, 1), (1, 40, True, 1, 1), (1, 41, True, 1, 1), (1, 42, True, 1, 1), (1, 46, True, 1, 1), (1, 47, True, 1, 1), (1, 48, True, 1, 1), (1, 52, True, 1, 1), (1, 53, True, 1, 1), (1, 54, True, 1, 1), (1, 58, True, 1, 1), (1, 59, True, 1, 1), (1, 60, True, 1, 1), (1, 64, True, 1, 1), (1, 65, True, 1, 1), (1, 66, True, 1, 1), (1, 67, True, 1, 1), (1, 75, True, 1, 1), (1, 76, True, 1, 1), (1, 77, True, 1, 1), (1, 78, True, 1, 1), (2, 3, True, 1, 1), (2, 4, True, 1, 1), (2, 5, True, 1, 1), (2, 6, True, 1, 1), (2, 7, True, 1, 1), (2, 8, True, 1, 1), (2, 9, True, 1, 1), (2, 10, True, 1, 1), (2, 11, True, 1, 1), (2, 12, True, 1, 1), (2, 13, True, 1, 1), (2, 14, True, 1, 1), (2, 15, True, 1, 1), (2, 16, True, 1, 1), (2, 17, True, 1, 1), (2, 18, True, 1, 1), (2, 19, True, 1, 1), (2, 20, True, 1, 1), (2, 21, True, 1, 1), (2, 22, True, 1, 1), (2, 23, True, 1, 1), (2, 24, True, 1, 1), (2, 25, True, 1, 1), (2, 26, True, 1, 1), (2, 27, True, 1, 1), (2, 28, True, 1, 1), (2, 29, True, 1, 1), (2, 30, True, 1, 1), (2, 32, True, 1, 1), (2, 33, True, 1, 1), (2, 34, True, 1, 1), (2, 35, True, 1, 1), (2, 36, True, 1, 1), (2, 40, True, 1, 1), (2, 41, True, 1, 1), (2, 42, True, 1, 1), (2, 46, True, 1, 1), (2, 47, True, 1, 1), (2, 48, True, 1, 1), (2, 52, True, 1, 1), (2, 53, True, 1, 1), (2, 54, True, 1, 1), (2, 58, True, 1, 1), (2, 59, True, 1, 1), (2, 60, True, 1, 1), (2, 64, True, 1, 1), (2, 65, True, 1, 1), (2, 66, True, 1, 1), (2, 67, True, 1, 1), (2, 75, True, 1, 1), (2, 76, True, 1, 1), (2, 77, True, 1, 1), (2, 78, True, 1, 1), (3, 4, True, 1, 1), (3, 5, True, 1, 1), (3, 6, True, 1, 1), (3, 7, True, 1, 1), (3, 8, True, 1, 1), (3, 9, True, 1, 1), (3, 10, True, 1, 1), (3, 11, True, 1, 1), (3, 12, True, 1, 1), (3, 13, True, 1, 1), (3, 14, True, 1, 1), (3, 15, True, 1, 1), (3, 16, True, 1, 1), (3, 17, True, 1, 1), (3, 18, True, 1, 1), (3, 19, True, 1, 1), (3, 20, True, 1, 1), (3, 21, True, 1, 1), (3, 22, True, 1, 1), (3, 23, True, 1, 1), (3, 24, True, 1, 1), (3, 25, True, 1, 1), (3, 26, True, 1, 1), (3, 27, True, 1, 1), (3, 28, True, 1, 1), (3, 29, True, 1, 1), (3, 30, True, 1, 1), (3, 32, True, 1, 1), (3, 33, True, 1, 1), (3, 34, True, 1, 1), (3, 35, True, 1, 1), (3, 36, True, 1, 1), (3, 40, True, 1, 1), (3, 41, True, 1, 1), (3, 42, True, 1, 1), (3, 46, True, 1, 1), (3, 47, True, 1, 1), (3, 48, True, 1, 1), (3, 52, True, 1, 1), (3, 53, True, 1, 1), (3, 54, True, 1, 1), (3, 58, True, 1, 1), (3, 59, True, 1, 1), (3, 60, True, 1, 1), (3, 64, True, 1, 1), (3, 65, True, 1, 1), (3, 66, True, 1, 1), (3, 67, True, 1, 1), (3, 75, True, 1, 1), (3, 76, True, 1, 1), (3, 77, True, 1, 1), (3, 78, True, 1, 1), (4, 5, True, 1, 1), (4, 6, True, 1, 1), (4, 7, True, 1, 1), (4, 8, True, 1, 1), (4, 9, True, 1, 1), (4, 10, True, 1, 1), (4, 11, True, 1, 1), (4, 12, True, 1, 1), (4, 13, True, 1, 1), (4, 14, True, 1, 1), (4, 15, True, 1, 1), (4, 16, True, 1, 1), (4, 17, True, 1, 1), (4, 18, True, 1, 1), (4, 19, True, 1, 1), (4, 20, True, 1, 1), (4, 21, True, 1, 1), (4, 22, True, 1, 1), (4, 23, True, 1, 1), (4, 24, True, 1, 1), (4, 25, True, 1, 1), (4, 26, True, 1, 1), (4, 27, True, 1, 1), (4, 28, True, 1, 1), (4, 29, True, 1, 1), (4, 30, True, 1, 1), (4, 32, True, 1, 1), (4, 33, True, 1, 1), (4, 34, True, 1, 1), (4, 35, True, 1, 1), (4, 36, True, 1, 1), (4, 39, True, 1, 1), (4, 40, True, 1, 1), (4, 41, True, 1, 1), (4, 46, True, 1, 1), (4, 47, True, 1, 1), (4, 52, True, 1, 1), (4, 53, True, 1, 1), (4, 58, True, 1, 1), (4, 64, True, 1, 1), (5, 6, True, 1, 1), (5, 7, True, 1, 1), (5, 8, True, 1, 1), (5, 9, True, 1, 1), (5, 10, True, 1, 1), (5, 11, True, 1, 1), (5, 12, True, 1, 1), (5, 13, True, 1, 1), (5, 14, True, 1, 1), (5, 15, True, 1, 1), (5, 16, True, 1, 1), (5, 17, True, 1, 1), (5, 18, True, 1, 1), (5, 19, True, 1, 1), (5, 20, True, 1, 1), (5, 21, True, 1, 1), (5, 22, True, 1, 1), (5, 23, True, 1, 1), (5, 24, True, 1, 1), (5, 25, True, 1, 1), (5, 26, True, 1, 1), (5, 27, True, 1, 1), (5, 28, True, 1, 1), (5, 29, True, 1, 1), (5, 30, True, 1, 1), (5, 31, True, 1, 1), (5, 32, True, 1, 1), (5, 33, True, 1, 1), (5, 34, True, 1, 1), (5, 35, True, 1, 1), (5, 38, True, 1, 1), (5, 39, True, 1, 1), (5, 40, True, 1, 1), (5, 45, True, 1, 1), (6, 7, True, 1, 1), (6, 8, True, 1, 1), (6, 9, True, 1, 1), (6, 10, True, 1, 1), (6, 11, True, 1, 1), (6, 12, True, 1, 1), (6, 13, True, 1, 1), (6, 14, True, 1, 1), (6, 15, True, 1, 1), (6, 16, True, 1, 1), (6, 17, True, 1, 1), (6, 18, True, 1, 1), (6, 19, True, 1, 1), (6, 20, True, 1, 1), (6, 21, True, 1, 1), (6, 22, True, 1, 1), (6, 23, True, 1, 1), (6, 24, True, 1, 1), (6, 25, True, 1, 1), (6, 26, True, 1, 1), (6, 27, True, 1, 1), (6, 28, True, 1, 1), (6, 29, True, 1, 1), (6, 31, True, 1, 1), (6, 32, True, 1, 1), (6, 33, True, 1, 1), (6, 34, True, 1, 1), (6, 37, True, 1, 1), (6, 38, True, 1, 1), (6, 39, True, 1, 1), (6, 44, True, 1, 1), (6, 45, True, 1, 1), (6, 50, True, 1, 1), (6, 51, True, 1, 1), (6, 57, True, 1, 1), (6, 63, True, 1, 1), (6, 74, True, 1, 1), (7, 8, True, 1, 1), (7, 9, True, 1, 1), (7, 10, True, 1, 1), (7, 11, True, 1, 1), (7, 12, True, 1, 1), (7, 13, True, 1, 1), (7, 14, True, 1, 1), (7, 15, True, 1, 1), (7, 16, True, 1, 1), (7, 17, True, 1, 1), (7, 18, True, 1, 1), (7, 19, True, 1, 1), (7, 20, True, 1, 1), (7, 21, True, 1, 1), (7, 22, True, 1, 1), (7, 23, True, 1, 1), (7, 24, True, 1, 1), (7, 25, True, 1, 1), (7, 26, True, 1, 1), (7, 27, True, 1, 1), (7, 28, True, 1, 1), (7, 29, True, 1, 1), (7, 31, True, 1, 1), (7, 32, True, 1, 1), (7, 33, True, 1, 1), (7, 37, True, 1, 1), (7, 38, True, 1, 1), (7, 39, True, 1, 1), (7, 43, True, 1, 1), (7, 44, True, 1, 1), (7, 45, True, 1, 1), (7, 49, True, 1, 1), (7, 50, True, 1, 1), (7, 51, True, 1, 1), (7, 55, True, 1, 1), (7, 56, True, 1, 1), (7, 57, True, 1, 1), (7, 61, True, 1, 1), (7, 62, True, 1, 1), (7, 63, True, 1, 1), (7, 71, True, 1, 1), (7, 72, True, 1, 1), (7, 73, True, 1, 1), (7, 74, True, 1, 1), (7, 82, True, 1, 1), (7, 83, True, 1, 1), (7, 84, True, 1, 1), (7, 85, True, 1, 1), (8, 9, True, 1, 1), (8, 10, True, 1, 1), (8, 11, True, 1, 1), (8, 12, True, 1, 1), (8, 13, True, 1, 1), (8, 14, True, 1, 1), (8, 15, True, 1, 1), (8, 16, True, 1, 1), (8, 17, True, 1, 1), (8, 18, True, 1, 1), (8, 19, True, 1, 1), (8, 20, True, 1, 1), (8, 21, True, 1, 1), (8, 22, True, 1, 1), (8, 23, True, 1, 1), (8, 24, True, 1, 1), (8, 25, True, 1, 1), (8, 26, True, 1, 1), (8, 27, True, 1, 1), (8, 28, True, 1, 1), (8, 31, True, 1, 1), (8, 32, True, 1, 1), (8, 33, True, 1, 1), (8, 37, True, 1, 1), (8, 38, True, 1, 1), (8, 39, True, 1, 1), (8, 43, True, 1, 1), (8, 44, True, 1, 1), (8, 45, True, 1, 1), (8, 49, True, 1, 1), (8, 50, True, 1, 1), (8, 51, True, 1, 1), (8, 55, True, 1, 1), (8, 56, True, 1, 1), (8, 57, True, 1, 1), (8, 61, True, 1, 1), (8, 62, True, 1, 1), (8, 63, True, 1, 1), (8, 71, True, 1, 1), (8, 72, True, 1, 1), (8, 73, True, 1, 1), (8, 74, True, 1, 1), (8, 82, True, 1, 1), (8, 83, True, 1, 1), (8, 84, True, 1, 1), (8, 85, True, 1, 1), (9, 10, True, 1, 1), (9, 11, True, 1, 1), (9, 12, True, 1, 1), (9, 13, True, 1, 1), (9, 14, True, 1, 1), (9, 15, True, 1, 1), (9, 16, True, 1, 1), (9, 17, True, 1, 1), (9, 18, True, 1, 1), (9, 19, True, 1, 1), (9, 20, True, 1, 1), (9, 21, True, 1, 1), (9, 22, True, 1, 1), (9, 23, True, 1, 1), (9, 24, True, 1, 1), (9, 25, True, 1, 1), (9, 26, True, 1, 1), (9, 27, True, 1, 1), (9, 28, True, 1, 1), (9, 31, True, 1, 1), (9, 32, True, 1, 1), (9, 33, True, 1, 1), (9, 37, True, 1, 1), (9, 38, True, 1, 1), (9, 39, True, 1, 1), (9, 43, True, 1, 1), (9, 44, True, 1, 1), (9, 45, True, 1, 1), (9, 49, True, 1, 1), (9, 50, True, 1, 1), (9, 51, True, 1, 1), (9, 55, True, 1, 1), (9, 56, True, 1, 1), (9, 57, True, 1, 1), (9, 61, True, 1, 1), (9, 62, True, 1, 1), (9, 63, True, 1, 1), (9, 71, True, 1, 1), (9, 72, True, 1, 1), (9, 73, True, 1, 1), (9, 74, True, 1, 1), (9, 82, True, 1, 1), (9, 83, True, 1, 1), (9, 84, True, 1, 1), (9, 85, True, 1, 1), (10, 11, True, 1, 1), (10, 12, True, 1, 1), (10, 13, True, 1, 1), (10, 14, True, 1, 1), (10, 15, True, 1, 1), (10, 16, True, 1, 1), (10, 17, True, 1, 1), (10, 18, True, 1, 1), (10, 19, True, 1, 1), (10, 20, True, 1, 1), (10, 21, True, 1, 1), (10, 22, True, 1, 1), (10, 23, True, 1, 1), (10, 24, True, 1, 1), (10, 25, True, 1, 1), (10, 26, True, 1, 1), (10, 27, True, 1, 1), (10, 28, True, 1, 1), (10, 31, True, 1, 1), (10, 32, True, 1, 1), (10, 33, True, 1, 1), (10, 37, True, 1, 1), (10, 38, True, 1, 1), (10, 39, True, 1, 1), (10, 43, True, 1, 1), (10, 44, True, 1, 1), (10, 45, True, 1, 1), (10, 49, True, 1, 1), (10, 50, True, 1, 1), (10, 51, True, 1, 1), (10, 55, True, 1, 1), (10, 56, True, 1, 1), (10, 57, True, 1, 1), (10, 61, True, 1, 1), (10, 62, True, 1, 1), (10, 63, True, 1, 1), (10, 71, True, 1, 1), (10, 72, True, 1, 1), (10, 73, True, 1, 1), (10, 74, True, 1, 1), (10, 82, True, 1, 1), (10, 83, True, 1, 1), (10, 84, True, 1, 1), (10, 85, True, 1, 1), (11, 12, True, 1, 1), (11, 13, True, 1, 1), (11, 14, True, 1, 1), (11, 15, True, 1, 1), (11, 16, True, 1, 1), (11, 17, True, 1, 1), (11, 18, True, 1, 1), (11, 19, True, 1, 1), (11, 20, True, 1, 1), (11, 21, True, 1, 1), (11, 22, True, 1, 1), (11, 23, True, 1, 1), (11, 24, True, 1, 1), (11, 25, True, 1, 1), (11, 26, True, 1, 1), (11, 27, True, 1, 1), (11, 28, True, 1, 1), (11, 29, True, 1, 1), (11, 30, True, 1, 1), (11, 34, True, 1, 1), (11, 35, True, 1, 1), (11, 36, True, 1, 1), (11, 40, True, 1, 1), (11, 41, True, 1, 1), (11, 42, True, 1, 1), (11, 46, True, 1, 1), (11, 47, True, 1, 1), (11, 48, True, 1, 1), (11, 52, True, 1, 1), (11, 53, True, 1, 1), (11, 54, True, 1, 1), (11, 58, True, 1, 1), (11, 59, True, 1, 1), (11, 60, True, 1, 1), (11, 64, True, 1, 1), (11, 65, True, 1, 1), (11, 66, True, 1, 1), (11, 67, True, 1, 1), (11, 75, True, 1, 1), (11, 76, True, 1, 1), (11, 77, True, 1, 1), (11, 78, True, 1, 1), (11, 79, True, 1, 1), (12, 13, True, 1, 1), (12, 14, True, 1, 1), (12, 15, True, 1, 1), (12, 16, True, 1, 1), (12, 17, True, 1, 1), (12, 18, True, 1, 1), (12, 19, True, 1, 1), (12, 20, True, 1, 1), (12, 21, True, 1, 1), (12, 22, True, 1, 1), (12, 23, True, 1, 1), (12, 24, True, 1, 1), (12, 25, True, 1, 1), (12, 26, True, 1, 1), (12, 27, True, 1, 1), (12, 28, True, 1, 1), (12, 29, True, 1, 1), (12, 30, True, 1, 1), (12, 34, True, 1, 1), (12, 35, True, 1, 1), (12, 36, True, 1, 1), (12, 40, True, 1, 1), (12, 41, True, 1, 1), (12, 42, True, 1, 1), (12, 46, True, 1, 1), (12, 47, True, 1, 1), (12, 48, True, 1, 1), (12, 52, True, 1, 1), (12, 53, True, 1, 1), (12, 54, True, 1, 1), (12, 58, True, 1, 1), (12, 59, True, 1, 1), (12, 60, True, 1, 1), (12, 64, True, 1, 1), (12, 65, True, 1, 1), (12, 66, True, 1, 1), (12, 67, True, 1, 1), (12, 75, True, 1, 1), (12, 76, True, 1, 1), (12, 77, True, 1, 1), (12, 78, True, 1, 1), (13, 14, True, 1, 1), (13, 15, True, 1, 1), (13, 16, True, 1, 1), (13, 17, True, 1, 1), (13, 18, True, 1, 1), (13, 19, True, 1, 1), (13, 20, True, 1, 1), (13, 21, True, 1, 1), (13, 22, True, 1, 1), (13, 23, True, 1, 1), (13, 24, True, 1, 1), (13, 25, True, 1, 1), (13, 26, True, 1, 1), (13, 27, True, 1, 1), (13, 28, True, 1, 1), (13, 29, True, 1, 1), (13, 30, True, 1, 1), (13, 34, True, 1, 1), (13, 35, True, 1, 1), (13, 36, True, 1, 1), (13, 40, True, 1, 1), (13, 41, True, 1, 1), (13, 42, True, 1, 1), (13, 46, True, 1, 1), (13, 47, True, 1, 1), (13, 48, True, 1, 1), (13, 52, True, 1, 1), (13, 53, True, 1, 1), (13, 54, True, 1, 1), (13, 58, True, 1, 1), (13, 59, True, 1, 1), (13, 60, True, 1, 1), (13, 64, True, 1, 1), (13, 65, True, 1, 1), (13, 66, True, 1, 1), (13, 67, True, 1, 1), (13, 75, True, 1, 1), (13, 76, True, 1, 1), (13, 77, True, 1, 1), (13, 78, True, 1, 1), (14, 15, True, 1, 1), (14, 16, True, 1, 1), (14, 17, True, 1, 1), (14, 18, True, 1, 1), (14, 19, True, 1, 1), (14, 20, True, 1, 1), (14, 21, True, 1, 1), (14, 22, True, 1, 1), (14, 23, True, 1, 1), (14, 24, True, 1, 1), (14, 25, True, 1, 1), (14, 26, True, 1, 1), (14, 27, True, 1, 1), (14, 28, True, 1, 1), (14, 29, True, 1, 1), (14, 30, True, 1, 1), (14, 34, True, 1, 1), (14, 35, True, 1, 1), (14, 36, True, 1, 1), (14, 40, True, 1, 1), (14, 41, True, 1, 1), (14, 42, True, 1, 1), (14, 46, True, 1, 1), (14, 47, True, 1, 1), (14, 48, True, 1, 1), (14, 52, True, 1, 1), (14, 53, True, 1, 1), (14, 54, True, 1, 1), (14, 58, True, 1, 1), (14, 59, True, 1, 1), (14, 60, True, 1, 1), (14, 64, True, 1, 1), (14, 65, True, 1, 1), (14, 66, True, 1, 1), (14, 67, True, 1, 1), (14, 75, True, 1, 1), (14, 76, True, 1, 1), (14, 77, True, 1, 1), (14, 78, True, 1, 1), (15, 16, True, 1, 1), (15, 17, True, 1, 1), (15, 18, True, 1, 1), (15, 19, True, 1, 1), (15, 20, True, 1, 1), (15, 21, True, 1, 1), (15, 22, True, 1, 1), (15, 23, True, 1, 1), (15, 24, True, 1, 1), (15, 25, True, 1, 1), (15, 26, True, 1, 1), (15, 27, True, 1, 1), (15, 28, True, 1, 1), (15, 29, True, 1, 1), (15, 30, True, 1, 1), (15, 33, True, 1, 1), (15, 34, True, 1, 1), (15, 35, True, 1, 1), (15, 40, True, 1, 1), (16, 17, True, 1, 1), (16, 18, True, 1, 1), (16, 19, True, 1, 1), (16, 20, True, 1, 1), (16, 21, True, 1, 1), (16, 22, True, 1, 1), (16, 23, True, 1, 1), (16, 24, True, 1, 1), (16, 25, True, 1, 1), (16, 26, True, 1, 1), (16, 27, True, 1, 1), (16, 28, True, 1, 1), (16, 29, True, 1, 1), (16, 32, True, 1, 1), (16, 33, True, 1, 1), (17, 18, True, 1, 1), (17, 19, True, 1, 1), (17, 20, True, 1, 1), (17, 21, True, 1, 1), (17, 22, True, 1, 1), (17, 23, True, 1, 1), (17, 24, True, 1, 1), (17, 25, True, 1, 1), (17, 26, True, 1, 1), (17, 27, True, 1, 1), (17, 28, True, 1, 1), (17, 31, True, 1, 1), (17, 32, True, 1, 1), (17, 33, True, 1, 1), (17, 38, True, 1, 1), (17, 39, True, 1, 1), (17, 45, True, 1, 1), (18, 19, True, 1, 1), (18, 20, True, 1, 1), (18, 21, True, 1, 1), (18, 22, True, 1, 1), (18, 23, True, 1, 1), (18, 24, True, 1, 1), (18, 25, True, 1, 1), (18, 26, True, 1, 1), (18, 27, True, 1, 1), (18, 31, True, 1, 1), (18, 32, True, 1, 1), (18, 33, True, 1, 1), (18, 37, True, 1, 1), (18, 38, True, 1, 1), (18, 39, True, 1, 1), (18, 43, True, 1, 1), (18, 44, True, 1, 1), (18, 45, True, 1, 1), (18, 49, True, 1, 1), (18, 50, True, 1, 1), (18, 51, True, 1, 1), (18, 55, True, 1, 1), (18, 56, True, 1, 1), (18, 57, True, 1, 1), (18, 61, True, 1, 1), (18, 62, True, 1, 1), (18, 63, True, 1, 1), (18, 71, True, 1, 1), (18, 72, True, 1, 1), (18, 73, True, 1, 1), (18, 74, True, 1, 1), (18, 82, True, 1, 1), (18, 83, True, 1, 1), (18, 84, True, 1, 1), (18, 85, True, 1, 1), (19, 20, True, 1, 1), (19, 21, True, 1, 1), (19, 22, True, 1, 1), (19, 23, True, 1, 1), (19, 24, True, 1, 1), (19, 25, True, 1, 1), (19, 26, True, 1, 1), (19, 27, True, 1, 1), (19, 31, True, 1, 1), (19, 32, True, 1, 1), (19, 33, True, 1, 1), (19, 37, True, 1, 1), (19, 38, True, 1, 1), (19, 39, True, 1, 1), (19, 43, True, 1, 1), (19, 44, True, 1, 1), (19, 45, True, 1, 1), (19, 49, True, 1, 1), (19, 50, True, 1, 1), (19, 51, True, 1, 1), (19, 55, True, 1, 1), (19, 56, True, 1, 1), (19, 57, True, 1, 1), (19, 61, True, 1, 1), (19, 62, True, 1, 1), (19, 63, True, 1, 1), (19, 71, True, 1, 1), (19, 72, True, 1, 1), (19, 73, True, 1, 1), (19, 74, True, 1, 1), (19, 82, True, 1, 1), (19, 83, True, 1, 1), (19, 84, True, 1, 1), (19, 85, True, 1, 1), (20, 21, True, 1, 1), (20, 22, True, 1, 1), (20, 23, True, 1, 1), (20, 24, True, 1, 1), (20, 25, True, 1, 1), (20, 26, True, 1, 1), (20, 27, True, 1, 1), (20, 31, True, 1, 1), (20, 32, True, 1, 1), (20, 33, True, 1, 1), (20, 37, True, 1, 1), (20, 38, True, 1, 1), (20, 39, True, 1, 1), (20, 43, True, 1, 1), (20, 44, True, 1, 1), (20, 45, True, 1, 1), (20, 49, True, 1, 1), (20, 50, True, 1, 1), (20, 51, True, 1, 1), (20, 55, True, 1, 1), (20, 56, True, 1, 1), (20, 57, True, 1, 1), (20, 61, True, 1, 1), (20, 62, True, 1, 1), (20, 63, True, 1, 1), (20, 71, True, 1, 1), (20, 72, True, 1, 1), (20, 73, True, 1, 1), (20, 74, True, 1, 1), (20, 82, True, 1, 1), (20, 83, True, 1, 1), (20, 84, True, 1, 1), (20, 85, True, 1, 1), (21, 22, True, 1, 1), (21, 23, True, 1, 1), (21, 24, True, 1, 1), (21, 25, True, 1, 1), (21, 26, True, 1, 1), (21, 27, True, 1, 1), (21, 31, True, 1, 1), (21, 32, True, 1, 1), (21, 33, True, 1, 1), (21, 37, True, 1, 1), (21, 38, True, 1, 1), (21, 39, True, 1, 1), (21, 43, True, 1, 1), (21, 44, True, 1, 1), (21, 45, True, 1, 1), (21, 49, True, 1, 1), (21, 50, True, 1, 1), (21, 51, True, 1, 1), (21, 55, True, 1, 1), (21, 56, True, 1, 1), (21, 57, True, 1, 1), (21, 61, True, 1, 1), (21, 62, True, 1, 1), (21, 63, True, 1, 1), (21, 71, True, 1, 1), (21, 72, True, 1, 1), (21, 73, True, 1, 1), (21, 74, True, 1, 1), (21, 81, True, 1, 1), (21, 82, True, 1, 1), (21, 83, True, 1, 1), (21, 84, True, 1, 1), (21, 85, True, 1, 1), (22, 23, True, 1, 1), (22, 24, True, 1, 1), (22, 25, True, 1, 1), (22, 26, True, 1, 1), (22, 27, True, 1, 1), (22, 28, True, 1, 1), (22, 29, True, 1, 1), (22, 30, True, 1, 1), (22, 34, True, 1, 1), (22, 35, True, 1, 1), (22, 36, True, 1, 1), (22, 40, True, 1, 1), (22, 41, True, 1, 1), (22, 42, True, 1, 1), (22, 46, True, 1, 1), (22, 47, True, 1, 1), (22, 48, True, 1, 1), (22, 52, True, 1, 1), (22, 53, True, 1, 1), (22, 54, True, 1, 1), (22, 58, True, 1, 1), (22, 59, True, 1, 1), (22, 60, True, 1, 1), (22, 64, True, 1, 1), (22, 65, True, 1, 1), (22, 66, True, 1, 1), (22, 67, True, 1, 1), (22, 75, True, 1, 1), (22, 76, True, 1, 1), (22, 77, True, 1, 1), (22, 78, True, 1, 1), (22, 79, True, 1, 1), (23, 24, True, 1, 1), (23, 25, True, 1, 1), (23, 26, True, 1, 1), (23, 27, True, 1, 1), (23, 28, True, 1, 1), (23, 29, True, 1, 1), (23, 30, True, 1, 1), (23, 34, True, 1, 1), (23, 35, True, 1, 1), (23, 36, True, 1, 1), (23, 40, True, 1, 1), (23, 41, True, 1, 1), (23, 42, True, 1, 1), (23, 46, True, 1, 1), (23, 47, True, 1, 1), (23, 48, True, 1, 1), (23, 52, True, 1, 1), (23, 53, True, 1, 1), (23, 54, True, 1, 1), (23, 58, True, 1, 1), (23, 59, True, 1, 1), (23, 60, True, 1, 1), (23, 64, True, 1, 1), (23, 65, True, 1, 1), (23, 66, True, 1, 1), (23, 67, True, 1, 1), (23, 75, True, 1, 1), (23, 76, True, 1, 1), (23, 77, True, 1, 1), (23, 78, True, 1, 1), (24, 25, True, 1, 1), (24, 26, True, 1, 1), (24, 27, True, 1, 1), (24, 28, True, 1, 1), (24, 29, True, 1, 1), (24, 30, True, 1, 1), (24, 34, True, 1, 1), (24, 35, True, 1, 1), (24, 36, True, 1, 1), (24, 40, True, 1, 1), (24, 41, True, 1, 1), (24, 42, True, 1, 1), (24, 46, True, 1, 1), (24, 47, True, 1, 1), (24, 48, True, 1, 1), (24, 52, True, 1, 1), (24, 53, True, 1, 1), (24, 54, True, 1, 1), (24, 58, True, 1, 1), (24, 59, True, 1, 1), (24, 60, True, 1, 1), (24, 64, True, 1, 1), (24, 65, True, 1, 1), (24, 66, True, 1, 1), (24, 67, True, 1, 1), (24, 75, True, 1, 1), (24, 76, True, 1, 1), (24, 77, True, 1, 1), (24, 78, True, 1, 1), (25, 26, True, 1, 1), (25, 27, True, 1, 1), (25, 31, True, 1, 1), (25, 32, True, 1, 1), (25, 33, True, 1, 1), (25, 37, True, 1, 1), (25, 38, True, 1, 1), (25, 39, True, 1, 1), (25, 43, True, 1, 1), (25, 44, True, 1, 1), (25, 45, True, 1, 1), (25, 49, True, 1, 1), (25, 50, True, 1, 1), (25, 51, True, 1, 1), (25, 55, True, 1, 1), (25, 56, True, 1, 1), (25, 57, True, 1, 1), (25, 61, True, 1, 1), (25, 62, True, 1, 1), (25, 63, True, 1, 1), (25, 71, True, 1, 1), (25, 72, True, 1, 1), (25, 73, True, 1, 1), (25, 74, True, 1, 1), (25, 82, True, 1, 1), (25, 83, True, 1, 1), (25, 84, True, 1, 1), (25, 85, True, 1, 1), (26, 27, True, 1, 1), (26, 31, True, 1, 1), (26, 32, True, 1, 1), (26, 33, True, 1, 1), (26, 37, True, 1, 1), (26, 38, True, 1, 1), (26, 39, True, 1, 1), (26, 43, True, 1, 1), (26, 44, True, 1, 1), (26, 45, True, 1, 1), (26, 49, True, 1, 1), (26, 50, True, 1, 1), (26, 51, True, 1, 1), (26, 55, True, 1, 1), (26, 56, True, 1, 1), (26, 57, True, 1, 1), (26, 61, True, 1, 1), (26, 62, True, 1, 1), (26, 63, True, 1, 1), (26, 71, True, 1, 1), (26, 72, True, 1, 1), (26, 73, True, 1, 1), (26, 74, True, 1, 1), (26, 82, True, 1, 1), (26, 83, True, 1, 1), (26, 84, True, 1, 1), (26, 85, True, 1, 1), (27, 31, True, 1, 1), (27, 32, True, 1, 1), (27, 33, True, 1, 1), (27, 37, True, 1, 1), (27, 38, True, 1, 1), (27, 39, True, 1, 1), (27, 43, True, 1, 1), (27, 44, True, 1, 1), (27, 45, True, 1, 1), (27, 49, True, 1, 1), (27, 50, True, 1, 1), (27, 51, True, 1, 1), (27, 55, True, 1, 1), (27, 56, True, 1, 1), (27, 57, True, 1, 1), (27, 61, True, 1, 1), (27, 62, True, 1, 1), (27, 63, True, 1, 1), (27, 71, True, 1, 1), (27, 72, True, 1, 1), (27, 73, True, 1, 1), (27, 74, True, 1, 1), (27, 81, True, 1, 1), (27, 82, True, 1, 1), (27, 83, True, 1, 1), (27, 84, True, 1, 1), (27, 85, True, 1, 1), (28, 29, True, 1, 1), (28, 30, True, 1, 1), (28, 34, True, 1, 1), (28, 35, True, 1, 1), (28, 36, True, 1, 1), (28, 40, True, 1, 1), (28, 41, True, 1, 1), (28, 42, True, 1, 1), (28, 46, True, 1, 1), (28, 47, True, 1, 1), (28, 48, True, 1, 1), (28, 52, True, 1, 1), (28, 53, True, 1, 1), (28, 54, True, 1, 1), (28, 58, True, 1, 1), (28, 59, True, 1, 1), (28, 60, True, 1, 1), (28, 64, True, 1, 1), (28, 65, True, 1, 1), (28, 66, True, 1, 1), (28, 67, True, 1, 1), (28, 75, True, 1, 1), (28, 76, True, 1, 1), (28, 77, True, 1, 1), (28, 78, True, 1, 1), (28, 79, True, 1, 1), (29, 30, True, 1, 1), (29, 34, True, 1, 1), (29, 35, True, 1, 1), (29, 36, True, 1, 1), (29, 40, True, 1, 1), (29, 41, True, 1, 1), (29, 42, True, 1, 1), (29, 46, True, 1, 1), (29, 47, True, 1, 1), (29, 48, True, 1, 1), (29, 52, True, 1, 1), (29, 53, True, 1, 1), (29, 54, True, 1, 1), (29, 58, True, 1, 1), (29, 59, True, 1, 1), (29, 60, True, 1, 1), (29, 64, True, 1, 1), (29, 65, True, 1, 1), (29, 66, True, 1, 1), (29, 67, True, 1, 1), (29, 75, True, 1, 1), (29, 76, True, 1, 1), (29, 77, True, 1, 1), (29, 78, True, 1, 1), (30, 34, True, 1, 1), (30, 35, True, 1, 1), (30, 36, True, 1, 1), (30, 40, True, 1, 1), (30, 41, True, 1, 1), (30, 42, True, 1, 1), (30, 46, True, 1, 1), (30, 47, True, 1, 1), (30, 48, True, 1, 1), (30, 52, True, 1, 1), (30, 53, True, 1, 1), (30, 54, True, 1, 1), (30, 58, True, 1, 1), (30, 59, True, 1, 1), (30, 60, True, 1, 1), (30, 64, True, 1, 1), (30, 65, True, 1, 1), (30, 66, True, 1, 1), (30, 67, True, 1, 1), (30, 75, True, 1, 1), (30, 76, True, 1, 1), (30, 77, True, 1, 1), (30, 78, True, 1, 1), (31, 32, True, 1, 1), (31, 33, True, 1, 1), (31, 37, True, 1, 1), (31, 38, True, 1, 1), (31, 39, True, 1, 1), (31, 43, True, 1, 1), (31, 44, True, 1, 1), (31, 45, True, 1, 1), (31, 49, True, 1, 1), (31, 50, True, 1, 1), (31, 51, True, 1, 1), (31, 55, True, 1, 1), (31, 56, True, 1, 1), (31, 57, True, 1, 1), (31, 61, True, 1, 1), (31, 62, True, 1, 1), (31, 63, True, 1, 1), (31, 71, True, 1, 1), (31, 72, True, 1, 1), (31, 73, True, 1, 1), (31, 74, True, 1, 1), (31, 82, True, 1, 1), (31, 83, True, 1, 1), (31, 84, True, 1, 1), (31, 85, True, 1, 1), (32, 33, True, 1, 1), (32, 37, True, 1, 1), (32, 38, True, 1, 1), (32, 39, True, 1, 1), (32, 43, True, 1, 1), (32, 44, True, 1, 1), (32, 45, True, 1, 1), (32, 49, True, 1, 1), (32, 50, True, 1, 1), (32, 51, True, 1, 1), (32, 55, True, 1, 1), (32, 56, True, 1, 1), (32, 57, True, 1, 1), (32, 61, True, 1, 1), (32, 62, True, 1, 1), (32, 63, True, 1, 1), (32, 71, True, 1, 1), (32, 72, True, 1, 1), (32, 73, True, 1, 1), (32, 74, True, 1, 1), (32, 82, True, 1, 1), (32, 83, True, 1, 1), (32, 84, True, 1, 1), (32, 85, True, 1, 1), (33, 37, True, 1, 1), (33, 38, True, 1, 1), (33, 39, True, 1, 1), (33, 43, True, 1, 1), (33, 44, True, 1, 1), (33, 45, True, 1, 1), (33, 49, True, 1, 1), (33, 50, True, 1, 1), (33, 51, True, 1, 1), (33, 55, True, 1, 1), (33, 56, True, 1, 1), (33, 57, True, 1, 1), (33, 61, True, 1, 1), (33, 62, True, 1, 1), (33, 63, True, 1, 1), (33, 71, True, 1, 1), (33, 72, True, 1, 1), (33, 73, True, 1, 1), (33, 74, True, 1, 1), (33, 81, True, 1, 1), (33, 82, True, 1, 1), (33, 83, True, 1, 1), (33, 84, True, 1, 1), (33, 85, True, 1, 1), (34, 35, True, 1, 1), (34, 36, True, 1, 1), (34, 40, True, 1, 1), (34, 41, True, 1, 1), (34, 42, True, 1, 1), (34, 46, True, 1, 1), (34, 47, True, 1, 1), (34, 48, True, 1, 1), (34, 52, True, 1, 1), (34, 53, True, 1, 1), (34, 54, True, 1, 1), (34, 58, True, 1, 1), (34, 59, True, 1, 1), (34, 60, True, 1, 1), (34, 64, True, 1, 1), (34, 65, True, 1, 1), (34, 66, True, 1, 1), (34, 67, True, 1, 1), (34, 75, True, 1, 1), (34, 76, True, 1, 1), (34, 77, True, 1, 1), (34, 78, True, 1, 1), (34, 79, True, 1, 1), (35, 36, True, 1, 1), (35, 40, True, 1, 1), (35, 41, True, 1, 1), (35, 42, True, 1, 1), (35, 46, True, 1, 1), (35, 47, True, 1, 1), (35, 48, True, 1, 1), (35, 52, True, 1, 1), (35, 53, True, 1, 1), (35, 54, True, 1, 1), (35, 58, True, 1, 1), (35, 59, True, 1, 1), (35, 60, True, 1, 1), (35, 64, True, 1, 1), (35, 65, True, 1, 1), (35, 66, True, 1, 1), (35, 67, True, 1, 1), (35, 75, True, 1, 1), (35, 76, True, 1, 1), (35, 77, True, 1, 1), (35, 78, True, 1, 1), (35, 79, True, 1, 1), (36, 40, True, 1, 1), (36, 41, True, 1, 1), (36, 42, True, 1, 1), (36, 46, True, 1, 1), (36, 47, True, 1, 1), (36, 48, True, 1, 1), (36, 52, True, 1, 1), (36, 53, True, 1, 1), (36, 54, True, 1, 1), (36, 58, True, 1, 1), (36, 59, True, 1, 1), (36, 60, True, 1, 1), (36, 64, True, 1, 1), (36, 65, True, 1, 1), (36, 66, True, 1, 1), (36, 67, True, 1, 1), (36, 75, True, 1, 1), (36, 76, True, 1, 1), (36, 77, True, 1, 1), (36, 78, True, 1, 1), (37, 38, True, 1, 1), (37, 39, True, 1, 1), (37, 43, True, 1, 1), (37, 44, True, 1, 1), (37, 45, True, 1, 1), (37, 49, True, 1, 1), (37, 50, True, 1, 1), (37, 51, True, 1, 1), (37, 55, True, 1, 1), (37, 56, True, 1, 1), (37, 57, True, 1, 1), (37, 61, True, 1, 1), (37, 62, True, 1, 1), (37, 63, True, 1, 1), (37, 71, True, 1, 1), (37, 72, True, 1, 1), (37, 73, True, 1, 1), (37, 74, True, 1, 1), (37, 82, True, 1, 1), (37, 83, True, 1, 1), (37, 84, True, 1, 1), (37, 85, True, 1, 1), (38, 39, True, 1, 1), (38, 43, True, 1, 1), (38, 44, True, 1, 1), (38, 45, True, 1, 1), (38, 49, True, 1, 1), (38, 50, True, 1, 1), (38, 51, True, 1, 1), (38, 55, True, 1, 1), (38, 56, True, 1, 1), (38, 57, True, 1, 1), (38, 61, True, 1, 1), (38, 62, True, 1, 1), (38, 63, True, 1, 1), (38, 71, True, 1, 1), (38, 72, True, 1, 1), (38, 73, True, 1, 1), (38, 74, True, 1, 1), (38, 81, True, 1, 1), (38, 82, True, 1, 1), (38, 83, True, 1, 1), (38, 84, True, 1, 1), (38, 85, True, 1, 1), (39, 43, True, 1, 1), (39, 44, True, 1, 1), (39, 45, True, 1, 1), (39, 49, True, 1, 1), (39, 50, True, 1, 1), (39, 51, True, 1, 1), (39, 55, True, 1, 1), (39, 56, True, 1, 1), (39, 57, True, 1, 1), (39, 61, True, 1, 1), (39, 62, True, 1, 1), (39, 63, True, 1, 1), (39, 71, True, 1, 1), (39, 72, True, 1, 1), (39, 73, True, 1, 1), (39, 74, True, 1, 1), (39, 81, True, 1, 1), (39, 82, True, 1, 1), (39, 83, True, 1, 1), (39, 84, True, 1, 1), (39, 85, True, 1, 1), (40, 41, True, 1, 1), (40, 42, True, 1, 1), (40, 46, True, 1, 1), (40, 47, True, 1, 1), (40, 48, True, 1, 1), (40, 52, True, 1, 1), (40, 53, True, 1, 1), (40, 54, True, 1, 1), (40, 58, True, 1, 1), (40, 59, True, 1, 1), (40, 60, True, 1, 1), (40, 64, True, 1, 1), (40, 65, True, 1, 1), (40, 66, True, 1, 1), (40, 67, True, 1, 1), (40, 68, True, 1, 1), (40, 75, True, 1, 1), (40, 76, True, 1, 1), (40, 77, True, 1, 1), (40, 78, True, 1, 1), (40, 79, True, 1, 1), (40, 80, True, 1, 1), (41, 42, True, 1, 1), (41, 46, True, 1, 1), (41, 47, True, 1, 1), (41, 48, True, 1, 1), (41, 52, True, 1, 1), (41, 53, True, 1, 1), (41, 54, True, 1, 1), (41, 58, True, 1, 1), (41, 59, True, 1, 1), (41, 60, True, 1, 1), (41, 64, True, 1, 1), (41, 65, True, 1, 1), (41, 66, True, 1, 1), (41, 67, True, 1, 1), (41, 75, True, 1, 1), (41, 76, True, 1, 1), (41, 77, True, 1, 1), (41, 78, True, 1, 1), (41, 79, True, 1, 1), (42, 46, True, 1, 1), (42, 47, True, 1, 1), (42, 48, True, 1, 1), (42, 52, True, 1, 1), (42, 53, True, 1, 1), (42, 54, True, 1, 1), (42, 58, True, 1, 1), (42, 59, True, 1, 1), (42, 60, True, 1, 1), (42, 64, True, 1, 1), (42, 65, True, 1, 1), (42, 66, True, 1, 1), (42, 67, True, 1, 1), (42, 75, True, 1, 1), (42, 76, True, 1, 1), (42, 77, True, 1, 1), (42, 78, True, 1, 1), (43, 44, True, 1, 1), (43, 45, True, 1, 1), (43, 49, True, 1, 1), (43, 50, True, 1, 1), (43, 51, True, 1, 1), (43, 55, True, 1, 1), (43, 56, True, 1, 1), (43, 57, True, 1, 1), (43, 61, True, 1, 1), (43, 62, True, 1, 1), (43, 63, True, 1, 1), (43, 71, True, 1, 1), (43, 72, True, 1, 1), (43, 73, True, 1, 1), (43, 74, True, 1, 1), (43, 82, True, 1, 1), (43, 83, True, 1, 1), (43, 84, True, 1, 1), (43, 85, True, 1, 1), (44, 45, True, 1, 1), (44, 49, True, 1, 1), (44, 50, True, 1, 1), (44, 51, True, 1, 1), (44, 55, True, 1, 1), (44, 56, True, 1, 1), (44, 57, True, 1, 1), (44, 61, True, 1, 1), (44, 62, True, 1, 1), (44, 63, True, 1, 1), (44, 71, True, 1, 1), (44, 72, True, 1, 1), (44, 73, True, 1, 1), (44, 74, True, 1, 1), (44, 81, True, 1, 1), (44, 82, True, 1, 1), (44, 83, True, 1, 1), (44, 84, True, 1, 1), (44, 85, True, 1, 1), (45, 49, True, 1, 1), (45, 50, True, 1, 1), (45, 51, True, 1, 1), (45, 55, True, 1, 1), (45, 56, True, 1, 1), (45, 57, True, 1, 1), (45, 61, True, 1, 1), (45, 62, True, 1, 1), (45, 63, True, 1, 1), (45, 70, True, 1, 1), (45, 71, True, 1, 1), (45, 72, True, 1, 1), (45, 73, True, 1, 1), (45, 74, True, 1, 1), (45, 80, True, 1, 1), (45, 81, True, 1, 1), (45, 82, True, 1, 1), (45, 83, True, 1, 1), (45, 84, True, 1, 1), (45, 85, True, 1, 1), (46, 47, True, 1, 1), (46, 48, True, 1, 1), (46, 52, True, 1, 1), (46, 53, True, 1, 1), (46, 54, True, 1, 1), (46, 58, True, 1, 1), (46, 59, True, 1, 1), (46, 60, True, 1, 1), (46, 64, True, 1, 1), (46, 65, True, 1, 1), (46, 66, True, 1, 1), (46, 67, True, 1, 1), (46, 68, True, 1, 1), (46, 75, True, 1, 1), (46, 76, True, 1, 1), (46, 77, True, 1, 1), (46, 78, True, 1, 1), (46, 79, True, 1, 1), (46, 80, True, 1, 1), (46, 81, True, 1, 1), (47, 48, True, 1, 1), (47, 52, True, 1, 1), (47, 53, True, 1, 1), (47, 54, True, 1, 1), (47, 58, True, 1, 1), (47, 59, True, 1, 1), (47, 60, True, 1, 1), (47, 64, True, 1, 1), (47, 65, True, 1, 1), (47, 66, True, 1, 1), (47, 67, True, 1, 1), (47, 68, True, 1, 1), (47, 75, True, 1, 1), (47, 76, True, 1, 1), (47, 77, True, 1, 1), (47, 78, True, 1, 1), (47, 79, True, 1, 1), (47, 80, True, 1, 1), (48, 52, True, 1, 1), (48, 53, True, 1, 1), (48, 54, True, 1, 1), (48, 58, True, 1, 1), (48, 59, True, 1, 1), (48, 60, True, 1, 1), (48, 64, True, 1, 1), (48, 65, True, 1, 1), (48, 66, True, 1, 1), (48, 67, True, 1, 1), (48, 75, True, 1, 1), (48, 76, True, 1, 1), (48, 77, True, 1, 1), (48, 78, True, 1, 1), (48, 79, True, 1, 1), (49, 50, True, 1, 1), (49, 51, True, 1, 1), (49, 55, True, 1, 1), (49, 56, True, 1, 1), (49, 57, True, 1, 1), (49, 61, True, 1, 1), (49, 62, True, 1, 1), (49, 63, True, 1, 1), (49, 71, True, 1, 1), (49, 72, True, 1, 1), (49, 73, True, 1, 1), (49, 74, True, 1, 1), (49, 81, True, 1, 1), (49, 82, True, 1, 1), (49, 83, True, 1, 1), (49, 84, True, 1, 1), (49, 85, True, 1, 1), (50, 51, True, 1, 1), (50, 55, True, 1, 1), (50, 56, True, 1, 1), (50, 57, True, 1, 1), (50, 61, True, 1, 1), (50, 62, True, 1, 1), (50, 63, True, 1, 1), (50, 70, True, 1, 1), (50, 71, True, 1, 1), (50, 72, True, 1, 1), (50, 73, True, 1, 1), (50, 74, True, 1, 1), (50, 80, True, 1, 1), (50, 81, True, 1, 1), (50, 82, True, 1, 1), (50, 83, True, 1, 1), (50, 84, True, 1, 1), (50, 85, True, 1, 1), (51, 55, True, 1, 1), (51, 56, True, 1, 1), (51, 57, True, 1, 1), (51, 61, True, 1, 1), (51, 62, True, 1, 1), (51, 63, True, 1, 1), (51, 70, True, 1, 1), (51, 71, True, 1, 1), (51, 72, True, 1, 1), (51, 73, True, 1, 1), (51, 74, True, 1, 1), (51, 79, True, 1, 1), (51, 80, True, 1, 1), (51, 81, True, 1, 1), (51, 82, True, 1, 1), (51, 83, True, 1, 1), (51, 84, True, 1, 1), (51, 85, True, 1, 1), (52, 53, True, 1, 1), (52, 54, True, 1, 1), (52, 58, True, 1, 1), (52, 59, True, 1, 1), (52, 60, True, 1, 1), (52, 64, True, 1, 1), (52, 65, True, 1, 1), (52, 66, True, 1, 1), (52, 67, True, 1, 1), (52, 68, True, 1, 1), (52, 69, True, 1, 1), (52, 70, True, 1, 1), (52, 75, True, 1, 1), (52, 76, True, 1, 1), (52, 77, True, 1, 1), (52, 78, True, 1, 1), (52, 79, True, 1, 1), (52, 80, True, 1, 1), (52, 81, True, 1, 1), (52, 82, True, 1, 1), (52, 83, True, 1, 1), (52, 84, True, 1, 1), (52, 85, True, 1, 1), (53, 54, True, 1, 1), (53, 58, True, 1, 1), (53, 59, True, 1, 1), (53, 60, True, 1, 1), (53, 64, True, 1, 1), (53, 65, True, 1, 1), (53, 66, True, 1, 1), (53, 67, True, 1, 1), (53, 68, True, 1, 1), (53, 69, True, 1, 1), (53, 75, True, 1, 1), (53, 76, True, 1, 1), (53, 77, True, 1, 1), (53, 78, True, 1, 1), (53, 79, True, 1, 1), (53, 80, True, 1, 1), (53, 81, True, 1, 1), (53, 82, True, 1, 1), (54, 58, True, 1, 1), (54, 59, True, 1, 1), (54, 60, True, 1, 1), (54, 64, True, 1, 1), (54, 65, True, 1, 1), (54, 66, True, 1, 1), (54, 67, True, 1, 1), (54, 68, True, 1, 1), (54, 75, True, 1, 1), (54, 76, True, 1, 1), (54, 77, True, 1, 1), (54, 78, True, 1, 1), (54, 79, True, 1, 1), (54, 80, True, 1, 1), (55, 56, True, 1, 1), (55, 57, True, 1, 1), (55, 61, True, 1, 1), (55, 62, True, 1, 1), (55, 63, True, 1, 1), (55, 70, True, 1, 1), (55, 71, True, 1, 1), (55, 72, True, 1, 1), (55, 73, True, 1, 1), (55, 74, True, 1, 1), (55, 80, True, 1, 1), (55, 81, True, 1, 1), (55, 82, True, 1, 1), (55, 83, True, 1, 1), (55, 84, True, 1, 1), (55, 85, True, 1, 1), (56, 57, True, 1, 1), (56, 61, True, 1, 1), (56, 62, True, 1, 1), (56, 63, True, 1, 1), (56, 69, True, 1, 1), (56, 70, True, 1, 1), (56, 71, True, 1, 1), (56, 72, True, 1, 1), (56, 73, True, 1, 1), (56, 74, True, 1, 1), (56, 78, True, 1, 1), (56, 79, True, 1, 1), (56, 80, True, 1, 1), (56, 81, True, 1, 1), (56, 82, True, 1, 1), (56, 83, True, 1, 1), (56, 84, True, 1, 1), (56, 85, True, 1, 1), (57, 61, True, 1, 1), (57, 62, True, 1, 1), (57, 63, True, 1, 1), (57, 68, True, 1, 1), (57, 69, True, 1, 1), (57, 70, True, 1, 1), (57, 71, True, 1, 1), (57, 72, True, 1, 1), (57, 73, True, 1, 1), (57, 74, True, 1, 1), (57, 75, True, 1, 1), (57, 76, True, 1, 1), (57, 77, True, 1, 1), (57, 78, True, 1, 1), (57, 79, True, 1, 1), (57, 80, True, 1, 1), (57, 81, True, 1, 1), (57, 82, True, 1, 1), (57, 83, True, 1, 1), (57, 84, True, 1, 1), (57, 85, True, 1, 1), (58, 59, True, 1, 1), (58, 60, True, 1, 1), (58, 61, True, 1, 1), (58, 62, True, 1, 1), (58, 63, True, 1, 1), (58, 64, True, 1, 1), (58, 65, True, 1, 1), (58, 66, True, 1, 1), (58, 67, True, 1, 1), (58, 68, True, 1, 1), (58, 69, True, 1, 1), (58, 70, True, 1, 1), (58, 71, True, 1, 1), (58, 72, True, 1, 1), (58, 73, True, 1, 1), (58, 74, True, 1, 1), (58, 75, True, 1, 1), (58, 76, True, 1, 1), (58, 77, True, 1, 1), (58, 78, True, 1, 1), (58, 79, True, 1, 1), (58, 80, True, 1, 1), (58, 81, True, 1, 1), (58, 82, True, 1, 1), (58, 83, True, 1, 1), (58, 84, True, 1, 1), (58, 85, True, 1, 1), (59, 60, True, 1, 1), (59, 61, True, 1, 1), (59, 62, True, 1, 1), (59, 63, True, 1, 1), (59, 64, True, 1, 1), (59, 65, True, 1, 1), (59, 66, True, 1, 1), (59, 67, True, 1, 1), (59, 68, True, 1, 1), (59, 69, True, 1, 1), (59, 70, True, 1, 1), (59, 71, True, 1, 1), (59, 72, True, 1, 1), (59, 73, True, 1, 1), (59, 74, True, 1, 1), (59, 75, True, 1, 1), (59, 76, True, 1, 1), (59, 77, True, 1, 1), (59, 78, True, 1, 1), (59, 79, True, 1, 1), (59, 80, True, 1, 1), (59, 81, True, 1, 1), (59, 82, True, 1, 1), (59, 83, True, 1, 1), (59, 84, True, 1, 1), (59, 85, True, 1, 1), (60, 61, True, 1, 1), (60, 62, True, 1, 1), (60, 63, True, 1, 1), (60, 64, True, 1, 1), (60, 65, True, 1, 1), (60, 66, True, 1, 1), (60, 67, True, 1, 1), (60, 68, True, 1, 1), (60, 69, True, 1, 1), (60, 70, True, 1, 1), (60, 71, True, 1, 1), (60, 72, True, 1, 1), (60, 73, True, 1, 1), (60, 74, True, 1, 1), (60, 75, True, 1, 1), (60, 76, True, 1, 1), (60, 77, True, 1, 1), (60, 78, True, 1, 1), (60, 79, True, 1, 1), (60, 80, True, 1, 1), (60, 81, True, 1, 1), (60, 82, True, 1, 1), (60, 83, True, 1, 1), (60, 84, True, 1, 1), (60, 85, True, 1, 1), (61, 62, True, 1, 1), (61, 63, True, 1, 1), (61, 64, True, 1, 1), (61, 65, True, 1, 1), (61, 66, True, 1, 1), (61, 67, True, 1, 1), (61, 68, True, 1, 1), (61, 69, True, 1, 1), (61, 70, True, 1, 1), (61, 71, True, 1, 1), (61, 72, True, 1, 1), (61, 73, True, 1, 1), (61, 74, True, 1, 1), (61, 75, True, 1, 1), (61, 76, True, 1, 1), (61, 77, True, 1, 1), (61, 78, True, 1, 1), (61, 79, True, 1, 1), (61, 80, True, 1, 1), (61, 81, True, 1, 1), (61, 82, True, 1, 1), (61, 83, True, 1, 1), (61, 84, True, 1, 1), (61, 85, True, 1, 1), (62, 63, True, 1, 1), (62, 64, True, 1, 1), (62, 65, True, 1, 1), (62, 66, True, 1, 1), (62, 67, True, 1, 1), (62, 68, True, 1, 1), (62, 69, True, 1, 1), (62, 70, True, 1, 1), (62, 71, True, 1, 1), (62, 72, True, 1, 1), (62, 73, True, 1, 1), (62, 74, True, 1, 1), (62, 75, True, 1, 1), (62, 76, True, 1, 1), (62, 77, True, 1, 1), (62, 78, True, 1, 1), (62, 79, True, 1, 1), (62, 80, True, 1, 1), (62, 81, True, 1, 1), (62, 82, True, 1, 1), (62, 83, True, 1, 1), (62, 84, True, 1, 1), (62, 85, True, 1, 1), (63, 64, True, 1, 1), (63, 65, True, 1, 1), (63, 66, True, 1, 1), (63, 67, True, 1, 1), (63, 68, True, 1, 1), (63, 69, True, 1, 1), (63, 70, True, 1, 1), (63, 71, True, 1, 1), (63, 72, True, 1, 1), (63, 73, True, 1, 1), (63, 74, True, 1, 1), (63, 75, True, 1, 1), (63, 76, True, 1, 1), (63, 77, True, 1, 1), (63, 78, True, 1, 1), (63, 79, True, 1, 1), (63, 80, True, 1, 1), (63, 81, True, 1, 1), (63, 82, True, 1, 1), (63, 83, True, 1, 1), (63, 84, True, 1, 1), (63, 85, True, 1, 1), (64, 65, True, 1, 1), (64, 66, True, 1, 1), (64, 67, True, 1, 1), (64, 68, True, 1, 1), (64, 69, True, 1, 1), (64, 70, True, 1, 1), (64, 71, True, 1, 1), (64, 72, True, 1, 1), (64, 73, True, 1, 1), (64, 74, True, 1, 1), (64, 75, True, 1, 1), (64, 76, True, 1, 1), (64, 77, True, 1, 1), (64, 78, True, 1, 1), (64, 79, True, 1, 1), (64, 80, True, 1, 1), (64, 81, True, 1, 1), (64, 82, True, 1, 1), (64, 83, True, 1, 1), (64, 84, True, 1, 1), (64, 85, True, 1, 1), (65, 66, True, 1, 1), (65, 67, True, 1, 1), (65, 68, True, 1, 1), (65, 69, True, 1, 1), (65, 70, True, 1, 1), (65, 71, True, 1, 1), (65, 72, True, 1, 1), (65, 73, True, 1, 1), (65, 74, True, 1, 1), (65, 75, True, 1, 1), (65, 76, True, 1, 1), (65, 77, True, 1, 1), (65, 78, True, 1, 1), (65, 79, True, 1, 1), (65, 80, True, 1, 1), (65, 81, True, 1, 1), (65, 82, True, 1, 1), (65, 83, True, 1, 1), (65, 84, True, 1, 1), (65, 85, True, 1, 1), (66, 67, True, 1, 1), (66, 68, True, 1, 1), (66, 69, True, 1, 1), (66, 70, True, 1, 1), (66, 71, True, 1, 1), (66, 72, True, 1, 1), (66, 73, True, 1, 1), (66, 74, True, 1, 1), (66, 75, True, 1, 1), (66, 76, True, 1, 1), (66, 77, True, 1, 1), (66, 78, True, 1, 1), (66, 79, True, 1, 1), (66, 80, True, 1, 1), (66, 81, True, 1, 1), (66, 82, True, 1, 1), (66, 83, True, 1, 1), (66, 84, True, 1, 1), (66, 85, True, 1, 1), (67, 68, True, 1, 1), (67, 69, True, 1, 1), (67, 70, True, 1, 1), (67, 71, True, 1, 1), (67, 72, True, 1, 1), (67, 73, True, 1, 1), (67, 74, True, 1, 1), (67, 75, True, 1, 1), (67, 76, True, 1, 1), (67, 77, True, 1, 1), (67, 78, True, 1, 1), (67, 79, True, 1, 1), (67, 80, True, 1, 1), (67, 81, True, 1, 1), (67, 82, True, 1, 1), (67, 83, True, 1, 1), (67, 84, True, 1, 1), (67, 85, True, 1, 1), (68, 69, True, 1, 1), (68, 70, True, 1, 1), (68, 71, True, 1, 1), (68, 72, True, 1, 1), (68, 73, True, 1, 1), (68, 74, True, 1, 1), (68, 75, True, 1, 1), (68, 76, True, 1, 1), (68, 77, True, 1, 1), (68, 78, True, 1, 1), (68, 79, True, 1, 1), (68, 80, True, 1, 1), (68, 81, True, 1, 1), (68, 82, True, 1, 1), (68, 83, True, 1, 1), (68, 84, True, 1, 1), (68, 85, True, 1, 1), (69, 70, True, 1, 1), (69, 71, True, 1, 1), (69, 72, True, 1, 1), (69, 73, True, 1, 1), (69, 74, True, 1, 1), (69, 75, True, 1, 1), (69, 76, True, 1, 1), (69, 77, True, 1, 1), (69, 78, True, 1, 1), (69, 79, True, 1, 1), (69, 80, True, 1, 1), (69, 81, True, 1, 1), (69, 82, True, 1, 1), (69, 83, True, 1, 1), (69, 84, True, 1, 1), (69, 85, True, 1, 1), (70, 71, True, 1, 1), (70, 72, True, 1, 1), (70, 73, True, 1, 1), (70, 74, True, 1, 1), (70, 75, True, 1, 1), (70, 76, True, 1, 1), (70, 77, True, 1, 1), (70, 78, True, 1, 1), (70, 79, True, 1, 1), (70, 80, True, 1, 1), (70, 81, True, 1, 1), (70, 82, True, 1, 1), (70, 83, True, 1, 1), (70, 84, True, 1, 1), (70, 85, True, 1, 1), (71, 72, True, 1, 1), (71, 73, True, 1, 1), (71, 74, True, 1, 1), (71, 75, True, 1, 1), (71, 76, True, 1, 1), (71, 77, True, 1, 1), (71, 78, True, 1, 1), (71, 79, True, 1, 1), (71, 80, True, 1, 1), (71, 81, True, 1, 1), (71, 82, True, 1, 1), (71, 83, True, 1, 1), (71, 84, True, 1, 1), (71, 85, True, 1, 1), (72, 73, True, 1, 1), (72, 74, True, 1, 1), (72, 75, True, 1, 1), (72, 76, True, 1, 1), (72, 77, True, 1, 1), (72, 78, True, 1, 1), (72, 79, True, 1, 1), (72, 80, True, 1, 1), (72, 81, True, 1, 1), (72, 82, True, 1, 1), (72, 83, True, 1, 1), (72, 84, True, 1, 1), (72, 85, True, 1, 1), (73, 74, True, 1, 1), (73, 75, True, 1, 1), (73, 76, True, 1, 1), (73, 77, True, 1, 1), (73, 78, True, 1, 1), (73, 79, True, 1, 1), (73, 80, True, 1, 1), (73, 81, True, 1, 1), (73, 82, True, 1, 1), (73, 83, True, 1, 1), (73, 84, True, 1, 1), (73, 85, True, 1, 1), (74, 75, True, 1, 1), (74, 76, True, 1, 1), (74, 77, True, 1, 1), (74, 78, True, 1, 1), (74, 79, True, 1, 1), (74, 80, True, 1, 1), (74, 81, True, 1, 1), (74, 82, True, 1, 1), (74, 83, True, 1, 1), (74, 84, True, 1, 1), (74, 85, True, 1, 1), (75, 76, True, 1, 1), (75, 77, True, 1, 1), (75, 78, True, 1, 1), (75, 79, True, 1, 1), (75, 80, True, 1, 1), (75, 81, True, 1, 1), (75, 82, True, 1, 1), (75, 83, True, 1, 1), (75, 84, True, 1, 1), (75, 85, True, 1, 1), (76, 77, True, 1, 1), (76, 78, True, 1, 1), (76, 79, True, 1, 1), (76, 80, True, 1, 1), (76, 81, True, 1, 1), (76, 82, True, 1, 1), (76, 83, True, 1, 1), (76, 84, True, 1, 1), (76, 85, True, 1, 1), (77, 78, True, 1, 1), (77, 79, True, 1, 1), (77, 80, True, 1, 1), (77, 81, True, 1, 1), (77, 82, True, 1, 1), (77, 83, True, 1, 1), (77, 84, True, 1, 1), (77, 85, True, 1, 1), (78, 79, True, 1, 1), (78, 80, True, 1, 1), (78, 81, True, 1, 1), (78, 82, True, 1, 1), (78, 83, True, 1, 1), (78, 84, True, 1, 1), (78, 85, True, 1, 1), (79, 80, True, 1, 1), (79, 81, True, 1, 1), (79, 82, True, 1, 1), (79, 83, True, 1, 1), (79, 84, True, 1, 1), (79, 85, True, 1, 1), (80, 81, True, 1, 1), (80, 82, True, 1, 1), (80, 83, True, 1, 1), (80, 84, True, 1, 1), (80, 85, True, 1, 1), (81, 82, True, 1, 1), (81, 83, True, 1, 1), (81, 84, True, 1, 1), (81, 85, True, 1, 1), (82, 83, True, 1, 1), (82, 84, True, 1, 1), (82, 85, True, 1, 1), (83, 84, True, 1, 1), (83, 85, True, 1, 1), (84, 85, True, 1, 1)]
../../_images/9e0b81c2016c2f3e9b16b98ab3b06f442215d261a2d5c41ffde8e52212a9d31c.png

Now we only have to define the supports and loads and we can run the optimizer again

supports = {
    0: [0, 0, 0],
    1: [0, 0, 0],
    2: [0, 0, 0],
    3: [0, 0, 0],
    4: [0, 0, 0],
    5: [0, 0, 0],
    6: [0, 0, 0],
    7: [0, 0, 0],
    8: [0, 0, 0],
    9: [0, 0, 0],
    10: [0, 0, 0],
}

# Load data as a list of dictionary of node indices to load vectors
loads = [{
    83: [1, 1, 0],
    78: [1, 1, 0],
}]

# Joint cost
joint_cost = 2.5 

Nd, Cn, a, q = trussopt.lo(nodes, lines, supports, loads, joint_cost=joint_cost)
trussopt.lo_plot(Nd, Cn, a, q, supports, loads, threshold=0.01, str='Example 4 non-convex domain', update=True, plane='xy')
../../_images/fefe2a71b107174c78df5c8ada6981af1d26296b51d4aa077d6245c645fa70bc.png

Postprocessing:

Now we created quite a complicated structure and there are some interesting things to note:

You might have wondered what the treshold in the lo_plot is doing. The treshold is the minimum cross-section a member should have to be plotted. Note that we only avoid plotting very small members, but not avoid them in the optimization function itself. If this value is set too high, we might plot a structure with weird inconsistencies like members only attached on one end or kinks or changes in cross-section.

In this example changing the joint_cost matters a lot. Try different values, also in combination with changing the treshold. You should be able to see that with joint_cost = 0 the plot shows inconsistencies in member cross-section even if we set the threshold to a very low value.

Note how the optimizer only uses a limited set of the supports.