Faster Multi-Object Segmentation using Parallel Quadratic Pseudo-Boolean Optimization, ICCV 2021 Paper
Author: Niels Jeppesen (niejep@dtu.dk)
This notebook is based on the NerveSegmentation3D.ipynb notebook by Jeppesen et. al. Parts of this notebook is copied directly from the NerveSegmentation3D.ipynb notebook with little or no modification.
The goal of this notebook is to benchmark three different QPBO implementations (P-QPBO, M-QPBO and K-QPBO) on two large 3D segmentation tasks.
To run the benchmark, a modified version of the slgbuilder package, which includes P-QPBO and M-QPBO is required. This version of the slgbuilder package relies on the shrdr package for P-QPBO and M-QPBO C++ wrappers. Both packages are included in the supplementary material alongside this notebook.
from datetime import datetime
import os
import platform
import time
import nibabel as nib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.ndimage import filters, interpolation
from scipy.spatial.transform import Rotation as R
from sklearn import neighbors
from tqdm import tqdm
from slgbuilder import GraphObject, QPBOBuilder, MQPBOBuilder, PQPBOBuilder
The N1 and N2 segmentation tasks are based on the same raw data. However, N2 uses more samples, resulting in a larger graph. The two cells below contain the paramters used for the N1 and N2 tasks, respectively. For N2 we have use to 64-bit edge/arc indices to avoid overflow due to the number of edges.
# N1
arc_index_type = np.uint32
runs_per_config = 10
steps = 40
angles = 30
# N2
# arc_index_type = np.uint64
# runs_per_config = 3
# steps = 60
# angles = 45
The data we'll be working with comes from volume of a small cut-out from the hand or wrist of a person. In this data, the nerves are clearly visible and almost completely aligned in terms of direction. In this notebook we'll working with the full volume and segment our over one hundred nerves. For the nerves we'll be segmenting center lines have been annotated by a another process.
The raw volume is 2048x2048x2048. The center annotations were made on a 512x512x512 downscaled volume, but we can use them here.
Let's load the image and annotated approximate center positions.
data_dir = '../originals'
results_dir = '../benchmark'
data_path = os.path.join(data_dir, 'NT32_tomo3_.raw')
centers_path = os.path.join(data_dir, 'NT32_cLineLabel_scale4_preSegm_v3.nii.gz')
data_centers_scale = 4
data = np.memmap(data_path, shape=(2048, 2048, 2048), dtype=np.uint8, mode='c')
ni_centers = nib.load(centers_path)
centers_data = np.asanyarray(ni_centers.dataobj).transpose()
# Show two slices.
plt.figure(figsize=(20, 20))
ax = plt.subplot(1, 2, 1, title='Slice 800')
ax.imshow(data[800].T, cmap='gray', vmin=0, vmax=255)
ax = plt.subplot(1, 2, 2, title='Slice 1600')
ax.imshow(data[1600].T, cmap='gray', vmin=0, vmax=255)
plt.show()
Because the center positions where created on a lower resolution we need to translate their positions and use interpolation to estimates centers in the slices we create. Each nerve will have a center line, which we will create as a simple list of points.
nerve_labels = np.unique(centers_data)[1:]
center_lines_original = {l: [] for l in nerve_labels}
center_lines = {l: [] for l in nerve_labels}
# For each slice, create points for each labelled pixel.
for x, center_slice in enumerate(tqdm(centers_data)):
ys, zs = np.where(center_slice)
for y, z in zip(ys, zs):
center_lines_original[center_slice[y, z]].append((x, y, z))
# Center positions may be more than one pixel per slice.
# To ensure we have only a single point per label per slice, we group by x (slice) position and take the mean value.
for label in center_lines_original:
label_points = pd.DataFrame(center_lines_original[label]).groupby(0).mean() * data_centers_scale
center_lines[label] = np.concatenate([label_points.index.values.astype(np.float32)[..., np.newaxis] * data_centers_scale, label_points.to_numpy().astype(np.float32)], axis=-1)
100%|██████████| 512/512 [00:01<00:00, 330.47it/s]
fig = plt.figure(figsize=(15, 15))
ax = fig.add_subplot(1, 1, 1, projection='3d')
for label in center_lines:
line = center_lines[label]
ax.plot(line[:, 2], line[:, 1], line[:, 0])
ax.view_init(30, 45)
plt.show()
plt.figure(figsize=(15, 15))
ax = plt.subplot(1, 1, 1)
ax.imshow(data[1000].T, cmap='gray')
for label in center_lines:
line = center_lines[label]
for center in line:
if center[0] == 1000:
ax.scatter(center[1], center[2])
plt.show()
We need unfold the nerves to use them with column-ordered graphs.
def angle(v1, v2):
cosang = np.dot(v1, v2)
sinang = np.linalg.norm(np.cross(v1, v2))
return np.arctan2(sinang, cosang)
def unfold_around_centers(data, centers, r_min=2, r_max=50, angles=40, steps=30, prefilter=False):
"""Radially samples an image around a given center position with a given radius and resolution."""
# Sampling angles and radii.
angles = np.linspace(0, 2*np.pi, angles, endpoint=False, dtype=np.float32)
distances = np.linspace(r_min, r_max, steps, endpoint=True, dtype=np.float32)
# Get angles.
angles_cos = np.cos(angles)
angles_sin = np.sin(angles)
# Calculate points positions.
y_pos = np.outer(angles_cos, distances)
z_pos = np.outer(angles_sin, distances)
# Smooth center line before taking gradient to avoid sharp bends.
grad = np.gradient(filters.gaussian_filter(centers, sigma=(5, 0)), axis=0)
samples_vol = []
sampling_points_vol = []
for norm, center in zip(grad, centers):
sampling_points = np.array([np.zeros(y_pos.shape, dtype=np.float32), y_pos, z_pos]).transpose()
# Create list of sampling points.
sampling_shape = sampling_points.shape
sampling_points_flat = sampling_points.reshape((-1, 3))
v_x = np.array([1.0, 0, 0])
norm /= np.linalg.norm(norm)
diff = np.cross(v_x, norm)
diff_norm = np.linalg.norm(diff)
if diff_norm > 0:
diff /= diff_norm
diff *= angle(v_x, norm)
rot = R.from_rotvec(diff)
sampling_points_flat = rot.apply(sampling_points_flat)
# Translate to real position.
sampling_points_flat += center[np.newaxis]
sampling_points = sampling_points_flat.reshape(sampling_shape)
# Sample from image.
samples = interpolation.map_coordinates(data, sampling_points_flat.transpose(), mode='nearest', prefilter=prefilter)
samples = samples.reshape(sampling_shape[:2])
samples_vol.append(samples)
sampling_points_vol.append(sampling_points)
return np.asarray(samples_vol), np.asarray(sampling_points_vol)
s, sp = unfold_around_centers(data, center_lines[1], r_min=5, r_max=80, steps=25, angles=30)
fig = plt.figure(figsize=(15, 15))
plt.scatter(sp[256, ..., 2], sp[256, ..., 1], c=s[256], s=100, cmap='gray')
plt.show()
plt.figure(figsize=(20, 7))
for i in range(24):
ax = plt.subplot(3, 8, i + 1)
ax.imshow(s[i * 20], cmap='gray')
plt.show()
We define functions for constructing the energy function using slgbuilder, specifically the MQPBOBuilder. We also define functions for copying a builder, building and solving the defined QPBO problem. The reason we copy the builder is to save time in the build process.
def build_and_solve(helper):
build_time = None
try:
start = time.time()
helper.build_graph()
build_time = time.time() - start
except Exception as ex:
print(str(ex))
raise ex
solve_time = None
weak_persistencies_time = None
if build_time is not None:
try:
start = time.time()
helper.solve(compute_weak_persistencies=False)
solve_time = time.time() - start
start = time.time()
helper.graph.compute_weak_persistencies()
weak_persistencies_time = time.time() - start
twice_energy = helper.graph.compute_twice_energy()
except Exception as ex:
print(str(ex))
raise ex
return twice_energy, build_time, solve_time, weak_persistencies_time
def print_results(stats):
s = '%s:\nNodes: %s, Terms: %s, Build: %s, Solve: %s, Weak persistencies: %s, Twice energy: %s, Timstamp: %s'
print(s % tuple(stats))
def create_qpbo_builder(data, center_lines, layered_smoothness=2, containment_min_margin=10, containment_max_margin=35, exclusion_margin=3, capacity_type=np.int32, arc_index_type=np.uint32):
# Lists for storing nerve objects.
outer_nerves = []
inner_nerves = []
# For each center, create an inner and outer never.
for centers in tqdm(center_lines, desc='Creating objects'):
# Unfold nerve.
samples, sample_points = unfold_around_centers(data, centers, r_min=5, r_max=80, steps=steps, angles=angles)
# Move x-axis last.
samples = np.moveaxis(samples, 0, -1).astype(np.float32)
sample_points = np.moveaxis(sample_points, 0, -2)
# Create outer and inner nerve objects.
outer_diff_samples = np.gradient(-samples, axis=0)
outer_diff_sample_points = sample_points
inner_diff_samples = np.gradient(samples, axis=0)
inner_diff_sample_points = sample_points
outer_nerves.append(GraphObject(outer_diff_samples, outer_diff_sample_points))
inner_nerves.append(GraphObject(inner_diff_samples, inner_diff_sample_points))
estimated_nodes = sum(o.data.size for o in outer_nerves) + sum(o.data.size for o in inner_nerves)
helper = MQPBOBuilder(estimated_nodes, 0, jit_build=True, capacity_type=capacity_type, arc_index_type=arc_index_type)
for outer_nerve, inner_nerve in zip(outer_nerves, inner_nerves):
helper.add_objects([outer_nerve, inner_nerve])
helper.add_layered_boundary_cost()
wrap = np.ones((len(helper.objects), 2), dtype=np.bool)
wrap[:, -1] = False
helper.add_layered_smoothness(delta=layered_smoothness, wrap=wrap)
for outer_nerve, inner_nerve in tqdm(zip(outer_nerves, inner_nerves), total=len(outer_nerves), desc='Containment'):
helper.add_layered_containment(outer_nerve, inner_nerve, min_margin=containment_min_margin, max_margin=containment_max_margin, distance_metric='l2')
# Add exclusion constraints between all pairs of outer nerves.
if exclusion_margin is not None:
start = time.time()
exclusions_dic = {}
for i in range(len(outer_nerves)):
ex_list = []
neigh = neighbors.NearestNeighbors(radius=80*2 + exclusion_margin, metric='l2')
neigh.fit(center_lines[i])
for j in range(i + 1, len(outer_nerves)):
neigh_indices = neigh.radius_neighbors(center_lines[j], return_distance=False)
if neigh_indices[0].size > 0:
ex_list.append(outer_nerves[j])
if ex_list:
exclusions_dic[outer_nerves[i]] = ex_list
helper.add_layered_exclusions(exclusions_dic, margin=exclusion_margin, distance_metric='l2')
print(f'Exclusion: {round(time.time() - start, 3)}')
node_count = 2 * np.sum([o.data.size for o in helper.objects])
edge_count = 2 * np.sum([l.size for l in helper.pairwise_from])
print(f'Graph has {node_count} nodes and {edge_count} terms.')
return helper
def copy_and_solve(builder, builder_fn):
# Create new builder.
helper = builder_fn(0, 0)
# Copy graph structure from previous builder.
helper.objects = builder.objects[:]
helper.nodes = builder.nodes[:]
helper.unary_nodes = builder.unary_nodes[:]
helper.unary_e0 = builder.unary_e0[:]
helper.unary_e1 = builder.unary_e1[:]
helper.pairwise_from = builder.pairwise_from[:]
helper.pairwise_to = builder.pairwise_to[:]
helper.pairwise_e00 = builder.pairwise_e00[:]
helper.pairwise_e01 = builder.pairwise_e01[:]
helper.pairwise_e10 = builder.pairwise_e10[:]
helper.pairwise_e11 = builder.pairwise_e11[:]
node_count = 2 * np.sum([o.data.size for o in helper.objects])
edge_count = 2 * np.sum([l.size for l in helper.pairwise_from])
# Build and solve.
twice_energy, build_time, solve_time, weak_persistencies_time = build_and_solve(helper)
return helper, [type(helper.graph).__name__, node_count, edge_count, build_time, solve_time, weak_persistencies_time, twice_energy, datetime.now()]
We solve QPBO problem with each of the three different implementations a number of times. For P-QPBO we benchmark the implementation for a number of different parallel thread configurations.
capacity_type = np.int32
arc_index_type = np.uint32
cl = [center_lines[l] for l in list(center_lines.keys())]
reference_helper = create_qpbo_builder(data, cl, capacity_type=capacity_type, arc_index_type=arc_index_type)
Creating objects: 100%|██████████| 216/216 [01:51<00:00, 1.93it/s] Containment: 100%|██████████| 216/216 [00:02<00:00, 87.55it/s]
Exclusion: 96.541 Graph has 363748800 nodes and 2124073454 terms.
cpu_counts = [1, 2, 4, 8, 16, 24, 32, 40, 48, 56, 64]
parallel_builders = [PQPBOBuilder]
serial_builders = [QPBOBuilder, MQPBOBuilder]
helper_stats_list = []
cpu_counts_list = []
for builder in parallel_builders:
for cpu_count in cpu_counts:
for i in range(runs_per_config):
print(f'\n{builder.__name__} - cpus: {cpu_count}, run: {i + 1}/{runs_per_config}')
# Create builder function.
builder_fn = lambda estimated_nodes, estimated_terms:builder(estimated_nodes, estimated_terms, capacity_type=capacity_type, arc_index_type=arc_index_type, num_threads=cpu_count)
# Build and solve.
helper, helper_stats = copy_and_solve(reference_helper, builder_fn)
# Print segmentation time and graph stats.
print_results(helper_stats)
# Clear memory.
del helper
# Save stats.
helper_stats_list.append(helper_stats)
cpu_counts_list.append(cpu_count)
for builder in serial_builders:
for i in range(runs_per_config):
print(f'\n{builder.__name__} - run: {i + 1}/{runs_per_config}')
# Create builder function.
if builder == QPBOBuilder:
builder_fn = lambda estimated_nodes, estimated_terms:builder(estimated_nodes, estimated_terms, capacity_type=capacity_type)
else:
builder_fn = lambda estimated_nodes, estimated_terms:builder(estimated_nodes, estimated_terms, capacity_type=capacity_type, arc_index_type=arc_index_type)
# Build and solve.
helper, helper_stats = copy_and_solve(reference_helper, builder_fn)
# Print segmentation time and graph stats.
print_results(helper_stats)
# Clear memory.
del helper
# Save stats.
helper_stats_list.append(helper_stats)
cpu_counts_list.append(-1)
PQPBOBuilder - cpus: 1, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 80.65334725379944, Solve: 581.638644695282, Weak persistencies: 9.369482517242432, Twice energy: 7574420340, Timstamp: 2021-06-17 00:02:53.123763 PQPBOBuilder - cpus: 1, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 77.5102767944336, Solve: 581.7039611339569, Weak persistencies: 9.508867025375366, Twice energy: 7574420340, Timstamp: 2021-06-17 00:14:21.601783 PQPBOBuilder - cpus: 1, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 78.70468878746033, Solve: 558.5768587589264, Weak persistencies: 5.89591383934021, Twice energy: 7574420340, Timstamp: 2021-06-17 00:25:16.826738 PQPBOBuilder - cpus: 1, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.53807544708252, Solve: 582.5492641925812, Weak persistencies: 9.268694639205933, Twice energy: 7574420340, Timstamp: 2021-06-17 00:36:41.875594 PQPBOBuilder - cpus: 1, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 77.92284679412842, Solve: 577.5938990116119, Weak persistencies: 9.768810749053955, Twice energy: 7574420340, Timstamp: 2021-06-17 00:48:03.866198 PQPBOBuilder - cpus: 1, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 80.92832469940186, Solve: 594.4569773674011, Weak persistencies: 9.435430765151978, Twice energy: 7574420340, Timstamp: 2021-06-17 00:59:45.849547 PQPBOBuilder - cpus: 1, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.10574793815613, Solve: 585.1762070655823, Weak persistencies: 9.938615083694458, Twice energy: 7574420340, Timstamp: 2021-06-17 01:11:12.750957 PQPBOBuilder - cpus: 1, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 79.46453046798706, Solve: 558.328070640564, Weak persistencies: 6.744489431381226, Twice energy: 7574420340, Timstamp: 2021-06-17 01:22:10.858124 PQPBOBuilder - cpus: 1, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.13308620452881, Solve: 588.3563692569733, Weak persistencies: 8.682661056518555, Twice energy: 7574420340, Timstamp: 2021-06-17 01:33:41.325769 PQPBOBuilder - cpus: 1, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.92514944076538, Solve: 584.6919767856598, Weak persistencies: 9.366860389709473, Twice energy: 7574420340, Timstamp: 2021-06-17 01:45:05.665529 PQPBOBuilder - cpus: 2, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 72.47607159614563, Solve: 319.30420756340027, Weak persistencies: 7.041268587112427, Twice energy: 7574420340, Timstamp: 2021-06-17 01:51:58.076546 PQPBOBuilder - cpus: 2, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 78.53314447402954, Solve: 317.27924609184265, Weak persistencies: 7.25062370300293, Twice energy: 7574420340, Timstamp: 2021-06-17 01:58:55.749262 PQPBOBuilder - cpus: 2, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.07917141914368, Solve: 318.87112045288086, Weak persistencies: 7.03556489944458, Twice energy: 7574420340, Timstamp: 2021-06-17 02:05:51.190341 PQPBOBuilder - cpus: 2, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 80.39770245552063, Solve: 320.9440772533417, Weak persistencies: 7.260425090789795, Twice energy: 7574420340, Timstamp: 2021-06-17 02:12:53.879728 PQPBOBuilder - cpus: 2, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 74.32124876976013, Solve: 319.0771162509918, Weak persistencies: 7.802107572555542, Twice energy: 7574420340, Timstamp: 2021-06-17 02:19:49.401542 PQPBOBuilder - cpus: 2, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 74.15477323532104, Solve: 320.8344192504883, Weak persistencies: 6.89723801612854, Twice energy: 7574420340, Timstamp: 2021-06-17 02:26:44.847296 PQPBOBuilder - cpus: 2, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.0473039150238, Solve: 320.3148741722107, Weak persistencies: 8.084923028945923, Twice energy: 7574420340, Timstamp: 2021-06-17 02:33:40.861319 PQPBOBuilder - cpus: 2, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 79.06694459915161, Solve: 322.17648339271545, Weak persistencies: 7.0728795528411865, Twice energy: 7574420340, Timstamp: 2021-06-17 02:40:43.611159 PQPBOBuilder - cpus: 2, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.87736988067627, Solve: 318.12467765808105, Weak persistencies: 6.793903112411499, Twice energy: 7574420340, Timstamp: 2021-06-17 02:47:35.730180 PQPBOBuilder - cpus: 2, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.65539836883545, Solve: 321.6174669265747, Weak persistencies: 7.210913181304932, Twice energy: 7574420340, Timstamp: 2021-06-17 02:54:32.681938 PQPBOBuilder - cpus: 4, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.4823579788208, Solve: 194.99895644187927, Weak persistencies: 7.288970470428467, Twice energy: 7574420340, Timstamp: 2021-06-17 02:59:23.198531 PQPBOBuilder - cpus: 4, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.68500924110413, Solve: 195.44495344161987, Weak persistencies: 6.7927305698394775, Twice energy: 7574420340, Timstamp: 2021-06-17 03:04:12.424080 PQPBOBuilder - cpus: 4, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 79.32459139823914, Solve: 194.35584092140198, Weak persistencies: 7.7721848487854, Twice energy: 7574420340, Timstamp: 2021-06-17 03:09:09.995735 PQPBOBuilder - cpus: 4, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 74.85574460029602, Solve: 192.66683745384216, Weak persistencies: 7.801312685012817, Twice energy: 7574420340, Timstamp: 2021-06-17 03:13:59.860354 PQPBOBuilder - cpus: 4, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.54584503173828, Solve: 195.89446306228638, Weak persistencies: 8.071591138839722, Twice energy: 7574420340, Timstamp: 2021-06-17 03:18:53.541786 PQPBOBuilder - cpus: 4, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.57643485069275, Solve: 192.55952048301697, Weak persistencies: 7.414165019989014, Twice energy: 7574420340, Timstamp: 2021-06-17 03:23:43.597715 PQPBOBuilder - cpus: 4, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.26758885383606, Solve: 195.67984461784363, Weak persistencies: 6.914372444152832, Twice energy: 7574420340, Timstamp: 2021-06-17 03:28:34.632756 PQPBOBuilder - cpus: 4, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.15048265457153, Solve: 196.40013885498047, Weak persistencies: 8.007570028305054, Twice energy: 7574420340, Timstamp: 2021-06-17 03:33:26.711795 PQPBOBuilder - cpus: 4, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.66126275062561, Solve: 195.93259263038635, Weak persistencies: 7.483513116836548, Twice energy: 7574420340, Timstamp: 2021-06-17 03:38:18.231699 PQPBOBuilder - cpus: 4, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 83.5103509426117, Solve: 197.79768443107605, Weak persistencies: 7.707669258117676, Twice energy: 7574420340, Timstamp: 2021-06-17 03:43:22.062014 PQPBOBuilder - cpus: 8, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 74.52747654914856, Solve: 128.02074599266052, Weak persistencies: 7.929288625717163, Twice energy: 7574420340, Timstamp: 2021-06-17 03:47:06.628106 PQPBOBuilder - cpus: 8, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.9390435218811, Solve: 132.97631287574768, Weak persistencies: 7.741607189178467, Twice energy: 7574420340, Timstamp: 2021-06-17 03:50:51.325835 PQPBOBuilder - cpus: 8, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 79.42064881324768, Solve: 132.3592119216919, Weak persistencies: 8.125296592712402, Twice energy: 7574420340, Timstamp: 2021-06-17 03:54:45.606708 PQPBOBuilder - cpus: 8, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.63007831573486, Solve: 129.23027348518372, Weak persistencies: 7.748581886291504, Twice energy: 7574420340, Timstamp: 2021-06-17 03:58:29.835001 PQPBOBuilder - cpus: 8, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.06236600875854, Solve: 129.65858793258667, Weak persistencies: 6.827851057052612, Twice energy: 7574420340, Timstamp: 2021-06-17 04:02:14.633135 PQPBOBuilder - cpus: 8, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.27879524230957, Solve: 133.49747705459595, Weak persistencies: 6.758480072021484, Twice energy: 7574420340, Timstamp: 2021-06-17 04:05:58.261699 PQPBOBuilder - cpus: 8, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.48887896537781, Solve: 132.14233708381653, Weak persistencies: 7.521306276321411, Twice energy: 7574420340, Timstamp: 2021-06-17 04:09:43.359856 PQPBOBuilder - cpus: 8, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.45572519302368, Solve: 128.42929005622864, Weak persistencies: 7.26791524887085, Twice energy: 7574420340, Timstamp: 2021-06-17 04:13:23.390174 PQPBOBuilder - cpus: 8, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.40386152267456, Solve: 134.44049978256226, Weak persistencies: 6.7671074867248535, Twice energy: 7574420340, Timstamp: 2021-06-17 04:17:08.160731 PQPBOBuilder - cpus: 8, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.30215167999268, Solve: 130.01209616661072, Weak persistencies: 6.321028709411621, Twice energy: 7574420340, Timstamp: 2021-06-17 04:20:47.586485 PQPBOBuilder - cpus: 16, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.31557989120483, Solve: 94.46328449249268, Weak persistencies: 7.087776184082031, Twice energy: 7574420340, Timstamp: 2021-06-17 04:23:54.205434 PQPBOBuilder - cpus: 16, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.40816473960876, Solve: 97.31603169441223, Weak persistencies: 6.554815053939819, Twice energy: 7574420340, Timstamp: 2021-06-17 04:27:02.224176 PQPBOBuilder - cpus: 16, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.32644152641296, Solve: 99.4332172870636, Weak persistencies: 6.5546441078186035, Twice energy: 7574420340, Timstamp: 2021-06-17 04:30:11.421065 PQPBOBuilder - cpus: 16, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.29328489303589, Solve: 97.84842228889465, Weak persistencies: 7.470799684524536, Twice energy: 7574420340, Timstamp: 2021-06-17 04:33:20.781455 PQPBOBuilder - cpus: 16, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.38752913475037, Solve: 95.23822927474976, Weak persistencies: 6.431898593902588, Twice energy: 7574420340, Timstamp: 2021-06-17 04:36:25.643166 PQPBOBuilder - cpus: 16, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.21928191184998, Solve: 97.26571035385132, Weak persistencies: 6.657552003860474, Twice energy: 7574420340, Timstamp: 2021-06-17 04:39:32.770767 PQPBOBuilder - cpus: 16, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.04249835014343, Solve: 95.62014484405518, Weak persistencies: 6.853668689727783, Twice energy: 7574420340, Timstamp: 2021-06-17 04:42:38.832243 PQPBOBuilder - cpus: 16, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.10432147979736, Solve: 100.3750205039978, Weak persistencies: 6.579121351242065, Twice energy: 7574420340, Timstamp: 2021-06-17 04:45:49.376011 PQPBOBuilder - cpus: 16, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.34158325195312, Solve: 96.07040452957153, Weak persistencies: 7.14763879776001, Twice energy: 7574420340, Timstamp: 2021-06-17 04:48:56.240380 PQPBOBuilder - cpus: 16, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.34701442718506, Solve: 99.95738124847412, Weak persistencies: 6.2529237270355225, Twice energy: 7574420340, Timstamp: 2021-06-17 04:52:05.395821 PQPBOBuilder - cpus: 24, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.33022356033325, Solve: 91.75022339820862, Weak persistencies: 6.635121583938599, Twice energy: 7574420340, Timstamp: 2021-06-17 04:55:07.299187 PQPBOBuilder - cpus: 24, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.85884404182434, Solve: 83.8469467163086, Weak persistencies: 7.393137216567993, Twice energy: 7574420340, Timstamp: 2021-06-17 04:58:02.007172 PQPBOBuilder - cpus: 24, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.87686800956726, Solve: 89.47715783119202, Weak persistencies: 6.445160627365112, Twice energy: 7574420340, Timstamp: 2021-06-17 05:01:00.630954 PQPBOBuilder - cpus: 24, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.57500553131104, Solve: 94.4508376121521, Weak persistencies: 9.413538694381714, Twice energy: 7574420340, Timstamp: 2021-06-17 05:04:18.454286 PQPBOBuilder - cpus: 24, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 72.6573965549469, Solve: 87.43620228767395, Weak persistencies: 9.40109395980835, Twice energy: 7574420340, Timstamp: 2021-06-17 05:07:25.521346 PQPBOBuilder - cpus: 24, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 76.3176519870758, Solve: 93.72780275344849, Weak persistencies: 7.780707359313965, Twice energy: 7574420340, Timstamp: 2021-06-17 05:10:37.129197 PQPBOBuilder - cpus: 24, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 92.53620600700378, Solve: 93.29030656814575, Weak persistencies: 7.5429346561431885, Twice energy: 7574420340, Timstamp: 2021-06-17 05:14:06.615693 PQPBOBuilder - cpus: 24, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 78.32997035980225, Solve: 91.59800958633423, Weak persistencies: 6.737820148468018, Twice energy: 7574420340, Timstamp: 2021-06-17 05:17:16.447165 PQPBOBuilder - cpus: 24, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 78.95071983337402, Solve: 90.07310843467712, Weak persistencies: 6.436463356018066, Twice energy: 7574420340, Timstamp: 2021-06-17 05:20:25.101841 PQPBOBuilder - cpus: 24, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.59737229347229, Solve: 87.50256729125977, Weak persistencies: 6.352186441421509, Twice energy: 7574420340, Timstamp: 2021-06-17 05:23:22.375523 PQPBOBuilder - cpus: 32, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 74.22797179222107, Solve: 86.27904152870178, Weak persistencies: 7.031266927719116, Twice energy: 7574420340, Timstamp: 2021-06-17 05:26:23.883614 PQPBOBuilder - cpus: 32, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 71.90548825263977, Solve: 88.38476729393005, Weak persistencies: 8.929356813430786, Twice energy: 7574420340, Timstamp: 2021-06-17 05:29:28.883327 PQPBOBuilder - cpus: 32, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.07476472854614, Solve: 88.18248271942139, Weak persistencies: 6.876945734024048, Twice energy: 7574420340, Timstamp: 2021-06-17 05:32:30.973063 PQPBOBuilder - cpus: 32, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 83.98448538780212, Solve: 90.54338812828064, Weak persistencies: 6.18959641456604, Twice energy: 7574420340, Timstamp: 2021-06-17 05:35:44.384186 PQPBOBuilder - cpus: 32, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.83849287033081, Solve: 88.98801040649414, Weak persistencies: 7.138167381286621, Twice energy: 7574420340, Timstamp: 2021-06-17 05:38:43.895021 PQPBOBuilder - cpus: 32, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.70299553871155, Solve: 90.51684975624084, Weak persistencies: 7.210923910140991, Twice energy: 7574420340, Timstamp: 2021-06-17 05:41:44.889303 PQPBOBuilder - cpus: 32, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.29722905158997, Solve: 79.91004753112793, Weak persistencies: 6.496055841445923, Twice energy: 7574420340, Timstamp: 2021-06-17 05:44:34.481348 PQPBOBuilder - cpus: 32, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.82669258117676, Solve: 83.97240424156189, Weak persistencies: 6.986653089523315, Twice energy: 7574420340, Timstamp: 2021-06-17 05:47:29.663833 PQPBOBuilder - cpus: 32, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.90950846672058, Solve: 86.53749656677246, Weak persistencies: 7.005360841751099, Twice energy: 7574420340, Timstamp: 2021-06-17 05:50:26.980266 PQPBOBuilder - cpus: 32, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.4620430469513, Solve: 85.45812106132507, Weak persistencies: 7.734010457992554, Twice energy: 7574420340, Timstamp: 2021-06-17 05:53:25.134848 PQPBOBuilder - cpus: 40, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.84688377380371, Solve: 76.01695609092712, Weak persistencies: 7.205386400222778, Twice energy: 7574420340, Timstamp: 2021-06-17 05:56:13.754013 PQPBOBuilder - cpus: 40, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.87126922607422, Solve: 74.72023820877075, Weak persistencies: 7.342589378356934, Twice energy: 7574420340, Timstamp: 2021-06-17 05:59:00.245915 PQPBOBuilder - cpus: 40, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.23014545440674, Solve: 85.0000410079956, Weak persistencies: 7.005663633346558, Twice energy: 7574420340, Timstamp: 2021-06-17 06:01:56.050430 PQPBOBuilder - cpus: 40, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.2013669013977, Solve: 75.55758929252625, Weak persistencies: 7.509995222091675, Twice energy: 7574420340, Timstamp: 2021-06-17 06:04:44.394007 PQPBOBuilder - cpus: 40, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.36549234390259, Solve: 74.91759634017944, Weak persistencies: 7.179295063018799, Twice energy: 7574420340, Timstamp: 2021-06-17 06:07:30.443129 PQPBOBuilder - cpus: 40, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.84700298309326, Solve: 74.39283418655396, Weak persistencies: 7.054501295089722, Twice energy: 7574420340, Timstamp: 2021-06-17 06:10:15.363075 PQPBOBuilder - cpus: 40, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.81821489334106, Solve: 80.41390752792358, Weak persistencies: 8.33160662651062, Twice energy: 7574420340, Timstamp: 2021-06-17 06:13:10.694165 PQPBOBuilder - cpus: 40, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.53169059753418, Solve: 76.29109978675842, Weak persistencies: 7.072057723999023, Twice energy: 7574420340, Timstamp: 2021-06-17 06:16:03.470046 PQPBOBuilder - cpus: 40, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.35738968849182, Solve: 75.91360926628113, Weak persistencies: 6.936490297317505, Twice energy: 7574420340, Timstamp: 2021-06-17 06:18:50.897954 PQPBOBuilder - cpus: 40, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.87799668312073, Solve: 75.24637341499329, Weak persistencies: 7.11826491355896, Twice energy: 7574420340, Timstamp: 2021-06-17 06:21:36.972987 PQPBOBuilder - cpus: 48, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.00672817230225, Solve: 78.18508791923523, Weak persistencies: 6.927419662475586, Twice energy: 7574420340, Timstamp: 2021-06-17 06:24:25.301077 PQPBOBuilder - cpus: 48, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.41017246246338, Solve: 81.71470212936401, Weak persistencies: 6.943307638168335, Twice energy: 7574420340, Timstamp: 2021-06-17 06:27:18.353130 PQPBOBuilder - cpus: 48, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.92680883407593, Solve: 81.7659559249878, Weak persistencies: 6.897298336029053, Twice energy: 7574420340, Timstamp: 2021-06-17 06:30:10.895640 PQPBOBuilder - cpus: 48, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.00067830085754, Solve: 78.66832518577576, Weak persistencies: 7.878228664398193, Twice energy: 7574420340, Timstamp: 2021-06-17 06:33:01.527222 PQPBOBuilder - cpus: 48, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.63791608810425, Solve: 79.07553434371948, Weak persistencies: 8.590818643569946, Twice energy: 7574420340, Timstamp: 2021-06-17 06:35:56.363145 PQPBOBuilder - cpus: 48, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.67204451560974, Solve: 80.00284814834595, Weak persistencies: 7.4491705894470215, Twice energy: 7574420340, Timstamp: 2021-06-17 06:38:51.537752 PQPBOBuilder - cpus: 48, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.34964275360107, Solve: 77.93241047859192, Weak persistencies: 7.868905067443848, Twice energy: 7574420340, Timstamp: 2021-06-17 06:41:42.192279 PQPBOBuilder - cpus: 48, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.87676525115967, Solve: 78.56529760360718, Weak persistencies: 8.414214611053467, Twice energy: 7574420340, Timstamp: 2021-06-17 06:44:34.850698 PQPBOBuilder - cpus: 48, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.05074858665466, Solve: 76.21027874946594, Weak persistencies: 9.054741144180298, Twice energy: 7574420340, Timstamp: 2021-06-17 06:47:27.581446 PQPBOBuilder - cpus: 48, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 76.32668375968933, Solve: 76.88245964050293, Weak persistencies: 7.0015199184417725, Twice energy: 7574420340, Timstamp: 2021-06-17 06:50:21.569602 PQPBOBuilder - cpus: 56, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 87.79049158096313, Solve: 78.61696004867554, Weak persistencies: 8.721734046936035, Twice energy: 7574420340, Timstamp: 2021-06-17 06:53:33.242768 PQPBOBuilder - cpus: 56, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 74.14323282241821, Solve: 80.50499272346497, Weak persistencies: 8.898065567016602, Twice energy: 7574420340, Timstamp: 2021-06-17 06:56:35.301027 PQPBOBuilder - cpus: 56, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.90076851844788, Solve: 80.93696689605713, Weak persistencies: 8.19500994682312, Twice energy: 7574420340, Timstamp: 2021-06-17 06:59:37.489645 PQPBOBuilder - cpus: 56, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.14960193634033, Solve: 84.92139601707458, Weak persistencies: 7.888627767562866, Twice energy: 7574420340, Timstamp: 2021-06-17 07:02:38.866239 PQPBOBuilder - cpus: 56, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 77.0738091468811, Solve: 78.03535795211792, Weak persistencies: 7.7435994148254395, Twice energy: 7574420340, Timstamp: 2021-06-17 07:05:37.752496 PQPBOBuilder - cpus: 56, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.6959445476532, Solve: 79.04115152359009, Weak persistencies: 6.976170778274536, Twice energy: 7574420340, Timstamp: 2021-06-17 07:08:33.124305 PQPBOBuilder - cpus: 56, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 72.57749128341675, Solve: 77.41061234474182, Weak persistencies: 7.2091920375823975, Twice energy: 7574420340, Timstamp: 2021-06-17 07:11:25.465376 PQPBOBuilder - cpus: 56, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 71.07396936416626, Solve: 82.36644649505615, Weak persistencies: 9.082802772521973, Twice energy: 7574420340, Timstamp: 2021-06-17 07:14:22.333422 PQPBOBuilder - cpus: 56, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.37004327774048, Solve: 80.78734540939331, Weak persistencies: 6.5679543018341064, Twice energy: 7574420340, Timstamp: 2021-06-17 07:17:18.367365 PQPBOBuilder - cpus: 56, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 74.84134554862976, Solve: 77.5645842552185, Weak persistencies: 6.443521022796631, Twice energy: 7574420340, Timstamp: 2021-06-17 07:20:10.217532 PQPBOBuilder - cpus: 64, run: 1/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 73.47877597808838, Solve: 81.78148627281189, Weak persistencies: 7.841395854949951, Twice energy: 7574420340, Timstamp: 2021-06-17 07:23:06.797031 PQPBOBuilder - cpus: 64, run: 2/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 78.30021119117737, Solve: 79.5587420463562, Weak persistencies: 7.1840128898620605, Twice energy: 7574420340, Timstamp: 2021-06-17 07:26:06.185689 PQPBOBuilder - cpus: 64, run: 3/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 81.2385938167572, Solve: 79.7009699344635, Weak persistencies: 9.29591178894043, Twice energy: 7574420340, Timstamp: 2021-06-17 07:29:14.352321 PQPBOBuilder - cpus: 64, run: 4/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.21014285087585, Solve: 82.84066891670227, Weak persistencies: 9.028217554092407, Twice energy: 7574420340, Timstamp: 2021-06-17 07:32:16.902746 PQPBOBuilder - cpus: 64, run: 5/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 85.94377875328064, Solve: 79.37947130203247, Weak persistencies: 7.455692291259766, Twice energy: 7574420340, Timstamp: 2021-06-17 07:35:26.057567 PQPBOBuilder - cpus: 64, run: 6/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 75.39586853981018, Solve: 84.02703499794006, Weak persistencies: 7.740365266799927, Twice energy: 7574420340, Timstamp: 2021-06-17 07:38:28.833492 PQPBOBuilder - cpus: 64, run: 7/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 72.00553154945374, Solve: 81.72744345664978, Weak persistencies: 7.3593292236328125, Twice energy: 7574420340, Timstamp: 2021-06-17 07:41:25.637620 PQPBOBuilder - cpus: 64, run: 8/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 85.9041211605072, Solve: 79.9649167060852, Weak persistencies: 6.521064281463623, Twice energy: 7574420340, Timstamp: 2021-06-17 07:44:31.397110 PQPBOBuilder - cpus: 64, run: 9/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 69.93844532966614, Solve: 82.04396677017212, Weak persistencies: 6.925846576690674, Twice energy: 7574420340, Timstamp: 2021-06-17 07:47:24.480755 PQPBOBuilder - cpus: 64, run: 10/10 ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 70.04649019241333, Solve: 80.05342698097229, Weak persistencies: 7.45951771736145, Twice energy: 7574420340, Timstamp: 2021-06-17 07:50:17.211825 QPBOBuilder - run: 1/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 355.65432500839233, Solve: 848.0211288928986, Weak persistencies: 7.063548803329468, Twice energy: -1015514252, Timstamp: 2021-06-17 08:10:50.814705 QPBOBuilder - run: 2/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 333.2425904273987, Solve: 836.2612385749817, Weak persistencies: 7.044548511505127, Twice energy: -1015514252, Timstamp: 2021-06-17 08:30:50.601737 QPBOBuilder - run: 3/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 355.74418091773987, Solve: 843.3224456310272, Weak persistencies: 7.312949180603027, Twice energy: -1015514252, Timstamp: 2021-06-17 08:51:20.620796 QPBOBuilder - run: 4/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 335.10728549957275, Solve: 843.820750951767, Weak persistencies: 7.192887544631958, Twice energy: -1015514252, Timstamp: 2021-06-17 09:11:30.488966 QPBOBuilder - run: 5/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 317.1583755016327, Solve: 843.7470066547394, Weak persistencies: 7.24939227104187, Twice energy: -1015514252, Timstamp: 2021-06-17 09:31:22.341543 QPBOBuilder - run: 6/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 317.9572093486786, Solve: 844.486677646637, Weak persistencies: 7.3133087158203125, Twice energy: -1015514252, Timstamp: 2021-06-17 09:51:15.854136 QPBOBuilder - run: 7/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 318.65458250045776, Solve: 843.8770537376404, Weak persistencies: 7.397085189819336, Twice energy: -1015514252, Timstamp: 2021-06-17 10:11:09.547604 QPBOBuilder - run: 8/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 315.61745595932007, Solve: 836.709897518158, Weak persistencies: 7.233877420425415, Twice energy: -1015514252, Timstamp: 2021-06-17 10:30:52.656019 QPBOBuilder - run: 9/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 314.53891491889954, Solve: 836.7031388282776, Weak persistencies: 7.142343521118164, Twice energy: -1015514252, Timstamp: 2021-06-17 10:50:34.578362 QPBOBuilder - run: 10/10 QPBOInt: Nodes: 363748800, Terms: 2124073454, Build: 317.06231021881104, Solve: 836.7879869937897, Weak persistencies: 7.441163778305054, Twice energy: -1015514252, Timstamp: 2021-06-17 11:10:19.277154 MQPBOBuilder - run: 1/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.10228729248047, Solve: 627.918220281601, Weak persistencies: 5.7683398723602295, Twice energy: 7574420340, Timstamp: 2021-06-17 11:21:44.415707 MQPBOBuilder - run: 2/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.02128887176514, Solve: 627.7847385406494, Weak persistencies: 5.770031929016113, Twice energy: 7574420340, Timstamp: 2021-06-17 11:33:09.084403 MQPBOBuilder - run: 3/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.093061447143555, Solve: 627.9801027774811, Weak persistencies: 5.769933462142944, Twice energy: 7574420340, Timstamp: 2021-06-17 11:44:33.916689 MQPBOBuilder - run: 4/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.11833381652832, Solve: 627.9787013530731, Weak persistencies: 5.763119220733643, Twice energy: 7574420340, Timstamp: 2021-06-17 11:55:58.771813 MQPBOBuilder - run: 5/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.08680009841919, Solve: 627.8581094741821, Weak persistencies: 5.767861604690552, Twice energy: 7574420340, Timstamp: 2021-06-17 12:07:23.485419 MQPBOBuilder - run: 6/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.09514307975769, Solve: 627.8660051822662, Weak persistencies: 5.768171072006226, Twice energy: 7574420340, Timstamp: 2021-06-17 12:18:48.211892 MQPBOBuilder - run: 7/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.10273051261902, Solve: 628.0247275829315, Weak persistencies: 5.76542592048645, Twice energy: 7574420340, Timstamp: 2021-06-17 12:30:13.093364 MQPBOBuilder - run: 8/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.09021997451782, Solve: 627.7922477722168, Weak persistencies: 5.84303879737854, Twice energy: 7574420340, Timstamp: 2021-06-17 12:41:37.795361 MQPBOBuilder - run: 9/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.089648723602295, Solve: 627.870463848114, Weak persistencies: 5.7683000564575195, Twice energy: 7574420340, Timstamp: 2021-06-17 12:53:02.510474 MQPBOBuilder - run: 10/10 QpboCapInt32ArcIdxUInt32NodeIdxUInt32: Nodes: 363748800, Terms: 2124073454, Build: 39.1074538230896, Solve: 627.9772715568542, Weak persistencies: 5.7656409740448, Twice energy: 7574420340, Timstamp: 2021-06-17 13:04:27.352958
We add system information to the results and save them as CSV.
df = pd.DataFrame(data=helper_stats_list, columns=['Class', 'NodeCount', 'EdgeCount', 'BuildTime', 'SolveTime', 'WeakPersistenciesTime', 'TwiceEnergy', 'Timestamp'])
df['CpuCount'] = np.array(cpu_counts_list, dtype=np.int16)
df['ShortName'] = df['Class'].str[:4]
df.loc[df['CpuCount'] != -1, 'ShortName'] += ' (' + df['CpuCount'].astype(np.str) + ')'
df['SystemName'] = platform.node()
try:
import cpuinfo
info = cpuinfo.get_cpu_info()
df['SystemCpu'] = info['brand_raw']
except:
df['SystemCpu'] = platform.processor()
df['SystemCpuCount'] = np.array(os.cpu_count(), np.int16)
df['NerveCount'] = np.array(len(cl), np.int16)
df_full = df
df_full
| Class | NodeCount | EdgeCount | BuildTime | SolveTime | WeakPersistenciesTime | TwiceEnergy | Timestamp | CpuCount | ShortName | SystemName | SystemCpu | SystemCpuCount | NerveCount | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 80.653347 | 581.638645 | 9.369483 | 7574420340 | 2021-06-17 00:02:53.123763 | 1 | Para (1) | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
| 1 | ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 77.510277 | 581.703961 | 9.508867 | 7574420340 | 2021-06-17 00:14:21.601783 | 1 | Para (1) | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
| 2 | ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 78.704689 | 558.576859 | 5.895914 | 7574420340 | 2021-06-17 00:25:16.826738 | 1 | Para (1) | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
| 3 | ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 73.538075 | 582.549264 | 9.268695 | 7574420340 | 2021-06-17 00:36:41.875594 | 1 | Para (1) | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
| 4 | ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 77.922847 | 577.593899 | 9.768811 | 7574420340 | 2021-06-17 00:48:03.866198 | 1 | Para (1) | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 125 | QpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 39.095143 | 627.866005 | 5.768171 | 7574420340 | 2021-06-17 12:18:48.211892 | -1 | Qpbo | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
| 126 | QpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 39.102731 | 628.024728 | 5.765426 | 7574420340 | 2021-06-17 12:30:13.093364 | -1 | Qpbo | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
| 127 | QpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 39.090220 | 627.792248 | 5.843039 | 7574420340 | 2021-06-17 12:41:37.795361 | -1 | Qpbo | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
| 128 | QpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 39.089649 | 627.870464 | 5.768300 | 7574420340 | 2021-06-17 12:53:02.510474 | -1 | Qpbo | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
| 129 | QpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 363748800 | 2124073454 | 39.107454 | 627.977272 | 5.765641 | 7574420340 | 2021-06-17 13:04:27.352958 | -1 | Qpbo | n-62-11-56 | Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz | 32 | 216 |
130 rows × 14 columns
timestr = time.strftime("%Y%m%d-%H%M%S")
df_full.to_csv(os.path.join(results_dir, f'parallel_qpbo_benchmark_results_{timestr}.csv'))
df_group = df.groupby(['Class', 'CpuCount'])
df_group[['BuildTime', 'SolveTime']].describe()
| BuildTime | SolveTime | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | mean | std | min | 25% | 50% | 75% | max | count | mean | std | min | 25% | 50% | 75% | max | ||
| Class | CpuCount | ||||||||||||||||
| ParallelQpboCapInt32ArcIdxUInt32NodeIdxUInt32 | 1 | 10.0 | 76.788607 | 3.431278 | 70.925149 | 73.936828 | 77.716562 | 79.274570 | 80.928325 | 10.0 | 579.307223 | 11.875941 | 558.328071 | 578.605085 | 582.126613 | 585.055149 | 594.456977 |
| 2 | 10.0 | 75.460913 | 2.798150 | 72.476072 | 73.710891 | 74.238011 | 77.669651 | 80.397702 | 10.0 | 319.854369 | 1.576121 | 317.279246 | 318.922619 | 319.809541 | 320.916663 | 322.176483 | |
| 4 | 10.0 | 75.605967 | 3.320656 | 73.150483 | 73.574699 | 74.270377 | 75.499223 | 83.510351 | 10.0 | 195.173083 | 1.620437 | 192.559520 | 194.516620 | 195.562399 | 195.923060 | 197.797684 | |
| 8 | 10.0 | 72.150903 | 3.158585 | 69.939044 | 70.327579 | 70.472302 | 73.553127 | 79.420649 | 10.0 | 131.076683 | 2.272190 | 128.020746 | 129.337352 | 131.077217 | 132.822038 | 134.440500 | |
| 16 | 10.0 | 70.278570 | 0.120558 | 70.042498 | 70.237783 | 70.321011 | 70.345657 | 70.408165 | 10.0 | 97.358785 | 2.053922 | 94.463284 | 95.732710 | 97.290871 | 99.037019 | 100.375021 | |
| 24 | 10.0 | 75.503026 | 6.937079 | 69.858844 | 70.397011 | 74.116201 | 77.826891 | 92.536206 | 10.0 | 90.315316 | 3.335071 | 83.846947 | 87.996215 | 90.835559 | 92.905286 | 94.450838 | |
| 32 | 10.0 | 72.322967 | 4.384559 | 69.702996 | 69.856247 | 70.379636 | 72.782446 | 83.984485 | 10.0 | 86.877261 | 3.241845 | 79.910048 | 85.663351 | 87.359990 | 88.837200 | 90.543388 | |
| 40 | 10.0 | 70.694745 | 1.729895 | 69.818215 | 69.872951 | 70.215756 | 70.363467 | 75.531691 | 10.0 | 76.847025 | 3.325948 | 74.392834 | 74.999791 | 75.735599 | 76.222564 | 85.000041 | |
| 48 | 10.0 | 71.125819 | 2.148818 | 69.876765 | 70.002191 | 70.200196 | 70.580980 | 76.326684 | 10.0 | 78.900290 | 1.834891 | 76.210279 | 77.995580 | 78.616811 | 79.771020 | 81.765956 | |
| 56 | 10.0 | 75.761670 | 4.582504 | 71.073969 | 73.398010 | 75.105694 | 75.849563 | 87.790492 | 10.0 | 80.018581 | 2.378089 | 77.410612 | 78.180758 | 79.773072 | 80.899562 | 84.921396 | |
| 64 | 10.0 | 76.746196 | 5.959344 | 69.938445 | 72.373843 | 75.303006 | 80.503998 | 85.943779 | 10.0 | 81.107813 | 1.599401 | 79.379471 | 79.766957 | 80.890435 | 81.978347 | 84.027035 | |
| QPBOInt | -1 | 10.0 | 328.073723 | 16.235564 | 314.538915 | 317.086327 | 318.305896 | 334.641112 | 355.744181 | 10.0 | 841.373733 | 4.298516 | 836.261239 | 836.729420 | 843.534726 | 843.862978 | 848.021129 |
| QpboCapInt32ArcIdxUInt32NodeIdxUInt32 | -1 | 10.0 | 39.090697 | 0.026211 | 39.021289 | 39.089792 | 39.094102 | 39.102620 | 39.118334 | 10.0 | 627.905059 | 0.083595 | 627.784739 | 627.860083 | 627.894342 | 627.978344 | 628.024728 |