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')

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)

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')

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')

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)]

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')

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.