English
File size: 4,214 Bytes
26225c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# -------------------------------------------------------------------- #
#        Distutils setup script for compiling python extensions        #
# -------------------------------------------------------------------- #
""" 
Compilation command: `python scripts/setup_dependencies.py build_ext`
Camille Baudoin and Hugo Raguet (2019), adapted by Loic Landrieu (2020), and Damien Robert (2022)
Source: https://github.com/loicland/img2svg
"""

from distutils.core import setup, Extension
from distutils.command.build import build
import numpy
import shutil
import os
import os.path as osp
import re


########################################################################
#                     Targets and compile options                      #
########################################################################

# Keep track of directories of interest
WORK_DIR = osp.realpath(os.curdir)
PROJECT_DIR = osp.realpath(osp.dirname(osp.dirname(__file__)))
DEPENDENCIES_DIR = osp.join(PROJECT_DIR, 'src', 'dependencies')

# Find the Numpy headers
include_dirs = [numpy.get_include(), "../include"]

# Compilation and linkage options
# MIN_OPS_PER_THREAD roughly controls parallelization, see doc in README.md
# COMP_T_ON_32_BITS for components identifiers on 32 bits rather than 16
if os.name == 'nt':  # windows
    extra_compile_args = ["/std:c++11", "/openmp",
        "-DMIN_OPS_PER_THREAD=10000", "-DCOMP_T_ON_32_BITS"]
    extra_link_args = ["/lgomp"]
elif os.name == 'posix':  # linux
    extra_compile_args = ["-std=c++11", "-fopenmp",
        "-DMIN_OPS_PER_THREAD=10000", "-DCOMP_T_ON_32_BITS"]
    extra_link_args = ["-lgomp"]
else:
    raise NotImplementedError('OS not supported yet.')


########################################################################
#                         Auxiliary functions                          #
########################################################################

class build_class(build):
    def initialize_options(self):
        build.initialize_options(self)
        self.build_lib = "bin"

    def run(self):
        build_path = self.build_lib


def purge(dir, pattern):
    for f in os.listdir(dir):
        if re.search(pattern, f):
            os.remove(osp.join(dir, f))


########################################################################
#                              Grid graph                              #
########################################################################

# Move to the appropriate working directory
os.chdir(osp.join(DEPENDENCIES_DIR, 'grid_graph/python'))
name = "grid_graph"
if not osp.exists("bin"):
    os.mkdir("bin")

# Remove previously compiled lib
purge("bin/", name)

# Compilation
mod = Extension(
    name,
    # list source files
    ["cpython/grid_graph_cpy.cpp",
     "../src/edge_list_to_forward_star.cpp",
     "../src/grid_to_graph.cpp"],
    include_dirs=include_dirs,
    extra_compile_args=extra_compile_args,
    extra_link_args=extra_link_args)

setup(name=name, ext_modules=[mod], cmdclass=dict(build=build_class))

# Postprocessing
try:
    # remove temporary compilation products
    shutil.rmtree("build")
except FileNotFoundError:
    pass

########################################################################
#                         Parallel cut-pursuit                         #
########################################################################

# Move to the appropriate working directory
os.chdir(osp.join(DEPENDENCIES_DIR, 'parallel_cut_pursuit/python'))
name = "cp_d0_dist_cpy"

if not osp.exists("bin"):
    os.mkdir("bin")

# Remove previously compiled lib
purge("bin/", name)

# Compilation
mod = Extension(
    name,
    # list source files
    ["cpython/cp_d0_dist_cpy.cpp", "../src/cp_d0_dist.cpp",
     "../src/cut_pursuit_d0.cpp", "../src/cut_pursuit.cpp",
     "../src/maxflow.cpp"],
    include_dirs=include_dirs,
    extra_compile_args=extra_compile_args,
    extra_link_args=extra_link_args)

setup(name=name, ext_modules=[mod], cmdclass=dict(build=build_class))

# Postprocessing
try:
    # remove temporary compilation products
    shutil.rmtree("build")
except FileNotFoundError:
    pass

# Restore the initial working directory
os.chdir(WORK_DIR)