wscript 8.6 KB
Newer Older
1
2
#!/usr/bin/env python
# encoding: utf-8
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
#| Copyright Inria May 2015
#| This project has received funding from the European Research Council (ERC) under
#| the European Union's Horizon 2020 research and innovation programme (grant
#| agreement No 637972) - see http://www.resibots.eu
#| 
#| Contributor(s):
#|   - Jean-Baptiste Mouret (jean-baptiste.mouret@inria.fr)
#|   - Antoine Cully (antoinecully@gmail.com)
#|   - Kontantinos Chatzilygeroudis (konstantinos.chatzilygeroudis@inria.fr)
#|   - Federico Allocati (fede.allocati@gmail.com)
#|   - Vaios Papaspyros (b.papaspyros@gmail.com)
#| 
#| This software is a computer library whose purpose is to optimize continuous,
#| black-box functions. It mainly implements Gaussian processes and Bayesian
#| optimization.
#| Main repository: http://github.com/resibots/limbo
#| Documentation: http://www.resibots.eu/limbo
#| 
#| This software is governed by the CeCILL-C license under French law and
#| abiding by the rules of distribution of free software.  You can  use,
#| modify and/ or redistribute the software under the terms of the CeCILL-C
#| license as circulated by CEA, CNRS and INRIA at the following URL
#| "http://www.cecill.info".
#| 
#| As a counterpart to the access to the source code and  rights to copy,
#| modify and redistribute granted by the license, users are provided only
#| with a limited warranty  and the software's author,  the holder of the
#| economic rights,  and the successive licensors  have only  limited
#| liability.
#| 
#| In this respect, the user's attention is drawn to the risks associated
#| with loading,  using,  modifying and/or developing or reproducing the
#| software by the user in light of its specific status of free software,
#| that may mean  that it is complicated to manipulate,  and  that  also
#| therefore means  that it is reserved for developers  and  experienced
#| professionals having in-depth computer knowledge. Users are therefore
#| encouraged to load and test the software's suitability as regards their
#| requirements in conditions enabling the security of their systems and/or
#| data to be ensured and,  more generally, to use and operate it in the
#| same conditions as regards security.
#| 
#| The fact that you are presently reading this means that you have had
#| knowledge of the CeCILL-C license and that you accept its terms.
#| 
47
48
import sys
sys.path.insert(0, './waf_tools')
49

50
51
VERSION = '0.0.1'
APPNAME = 'limbo'
52
53
54
55

srcdir = '.'
blddir = 'build'

56
import glob
57
58
import os
import subprocess
59
import limbo
Federico Allocati's avatar
Federico Allocati committed
60
import inspect
61
from waflib.Build import BuildContext
62

63
64
65
66
67
def options(opt):
        opt.load('compiler_cxx boost waf_unit_test')
        opt.load('compiler_c')
        opt.load('eigen')
        opt.load('tbb')
68
        opt.load('mkl')
Jean-Baptiste Mouret's avatar
Jean-Baptiste Mouret committed
69
        opt.load('sferes')
70
        opt.load('limbo')
71
        opt.load('openmp')
72
        opt.load('nlopt')
73
74
        opt.load('libcmaes')

75
        opt.add_option('--exp', type='string', help='exp(s) to build, separate by comma', dest='exp')
Jean-Baptiste Mouret's avatar
Jean-Baptiste Mouret committed
76
77
        opt.add_option('--qsub', type='string', help='config file (json) to submit to torque', dest='qsub')
        opt.add_option('--oar', type='string', help='config file (json) to submit to oar', dest='oar')
78
        opt.add_option('--local', type='string', help='config file (json) to run local', dest='local')
79
        opt.add_option('--local_serial', type='string', help='config file (json) to run local', dest='local_serial')
80
        opt.add_option('--experimental', action='store_true', help='specify to compile the experimental examples', dest='experimental')
81
        opt.add_option('--nb_replicates', type='int', help='number of replicates performed during the benchmark', dest='nb_rep')
82
        # tests
83
        opt.add_option('--tests', action='store_true', help='compile tests or not', dest='tests')
Jean-Baptiste Mouret's avatar
Jean-Baptiste Mouret committed
84
        opt.load('xcode')
85
        for i in glob.glob('exp/*'):
Federico Allocati's avatar
Federico Allocati committed
86
87
                if os.path.isdir(i):
                    opt.recurse(i)
88

89
        opt.recurse('src/benchmarks')
90

91
def configure(conf):
92
        conf.load('compiler_cxx boost waf_unit_test')
93
94
95
        conf.load('compiler_c')
        conf.load('eigen')
        conf.load('tbb')
Jean-Baptiste Mouret's avatar
Jean-Baptiste Mouret committed
96
        conf.load('sferes')
97
        conf.load('openmp')
98
        conf.load('mkl')
Jean-Baptiste Mouret's avatar
Jean-Baptiste Mouret committed
99
        conf.load('xcode')
100
        conf.load('nlopt')
101
        conf.load('libcmaes')
102

103
104
105
        if conf.env.CXX_NAME in ["icc", "icpc"]:
            common_flags = "-Wall -std=c++11"
            opt_flags = " -O3 -xHost  -march=native -mtune=native -unroll -fma -g"
106
        else:
107
            if conf.env.CXX_NAME in ["gcc", "g++"] and int(conf.env['CC_VERSION'][0]+conf.env['CC_VERSION'][1]) < 47:
108
109
110
                common_flags = "-Wall -std=c++0x"
            else:
                common_flags = "-Wall -std=c++11"
111
112
            if conf.env.CXX_NAME in ["clang", "llvm"]:
                common_flags += " -fdiagnostics-color"
113
            opt_flags = " -O3 -march=native -g"
114

115
        conf.check_boost(lib='serialization filesystem \
Jean-Baptiste Mouret's avatar
Jean-Baptiste Mouret committed
116
            system unit_test_framework program_options \
117
            graph thread', min_version='1.39')
118
119
        conf.check_eigen()
        conf.check_tbb()
120
        conf.check_sferes()
121
122
        conf.check_openmp()
        conf.check_mkl()
123
        conf.check_nlopt()
124
        conf.check_libcmaes()
Jean-Baptiste Mouret's avatar
Jean-Baptiste Mouret committed
125

Federico Allocati's avatar
Federico Allocati committed
126
127
        conf.env.INCLUDES_LIMBO = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) + "/src"

128
129
        all_flags = common_flags + opt_flags
        conf.env['CXXFLAGS'] = conf.env['CXXFLAGS'] + all_flags.split(' ')
130
131
        print conf.env['CXXFLAGS']

Jean-Baptiste Mouret's avatar
misc    
Jean-Baptiste Mouret committed
132
133
134
135
        if conf.options.exp:
                for i in conf.options.exp.split(','):
                        print 'configuring for exp: ' + i
                        conf.recurse('exp/' + i)
136
        conf.recurse('src/benchmarks')
Jean-Baptiste Mouret's avatar
misc    
Jean-Baptiste Mouret committed
137

138
def build(bld):
139
140
141
142
143
    bld.recurse('src/')
    if bld.options.exp:
        for i in bld.options.exp.split(','):
            print 'Building exp: ' + i
            bld.recurse('exp/' + i)
144
            limbo.output_params('exp/'+i)
145
    bld.add_post_fun(limbo.summary)
Jean-Baptiste Mouret's avatar
Jean-Baptiste Mouret committed
146

147
def build_extensive_tests(ctx):
148
    ctx.recurse('src/')
149
150
    ctx.recurse('src/tests')

151
152
153
def build_benchmark(ctx):
    ctx.recurse('src/benchmarks')

154
155
156
157
158
159
160
def run_extensive_tests(ctx):
    for fullname in glob.glob('build/src/tests/combinations/*'):
        if os.path.isfile(fullname) and os.access(fullname, os.X_OK):
            fpath, fname = os.path.split(fullname)
            print "Running: " + fname
            s = "cd " + fpath + "; ./" + fname
            retcode = subprocess.call(s, shell=True, env=None)
161

162
163
164
165
def submit_extensive_tests(ctx):
    for fullname in glob.glob('build/src/tests/combinations/*'):
        if os.path.isfile(fullname) and os.access(fullname, os.X_OK):
            fpath, fname = os.path.split(fullname)
166
            s = "cd " + fpath + ";oarsub -l /nodes=1/core=2,walltime=00:15:00 -n " + fname + " -O " + fname + ".stdout.%jobid%.log -E " + fname + ".stderr.%jobid%.log ./" + fname
167
168
169
            retcode = subprocess.call(s, shell=True, env=None)
            print "oarsub returned:" + str(retcode)

170
def run_benchmark(ctx):
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
    HEADER='\033[95m'
    NC='\033[0m'
    res_dir=os.getcwd()+"/benchmark_results/"
    try:
        os.makedirs(res_dir)
    except:
        print "WARNING, dir:" + res_dir + " not be created"
    for fullname in glob.glob('build/src/benchmarks/*'):
        if os.path.isfile(fullname) and os.access(fullname, os.X_OK):
            fpath, fname = os.path.split(fullname)
            directory = res_dir + "/" + fname
            try:
                os.makedirs(directory)
            except:
                print "WARNING, dir:" + directory + " not be created, the new results will be concatenated to the old ones"
            s = "cp " + fullname + " " + directory
            retcode = subprocess.call(s, shell=True, env=None)
            if ctx.options.nb_rep:
                nb_rep = ctx.options.nb_rep
            else:
                nb_rep = 10
            for i in range(0,nb_rep):
                print HEADER+" Running: " + fname + " for the "+str(i)+"th time"+NC
                s="cd " + directory +";./" + fname
                retcode = subprocess.call(s, shell=True, env=None)
196

197
def shutdown(ctx):
198
199
    if ctx.options.qsub:
        limbo.qsub(ctx.options.qsub)
Jean-Baptiste Mouret's avatar
Jean-Baptiste Mouret committed
200
201
    if ctx.options.oar:
        limbo.oar(ctx.options.oar)
202
    if ctx.options.local:
203
204
205
        limbo.run_local(ctx.options.local, False)
    if ctx.options.local_serial:
        limbo.run_local(ctx.options.local_serial)
206

207
208
209
def insert_license(ctx):
    limbo.insert_license()

210
211
212
class BuildExtensiveTestsContext(BuildContext):
    cmd = 'build_extensive_tests'
    fun = 'build_extensive_tests'
213
214
215
216

class BuildBenchmark(BuildContext):
    cmd = 'build_benchmark'
    fun = 'build_benchmark'
217
218
219
220

class InsertLicense(BuildContext):
    cmd = 'insert_license'
    fun = 'insert_license'