User Tools

Site Tools


academics:ml:bo:bayesopt

Learn BayesOpt

在Windows下编译运行Matlab Interface

  • 所有操作尽量避免在文件路径中有空格,避免不必要的麻烦。如果出现奇怪的错误,先google一下是不是跟空格有关。
  • 在Windows写路径永远注意 /\ 的区别,不确定的时候就google一下。

安装MATLAB使用的MinGW64编译器

在MATLAB中使用,需要安装MATLAB支持的C/C++编译器,参考Matlab关于MinGW的官方说明,mex不一定要选择MinGW但是BayesOpt文档中使用了MinGW。 最终安装的是Mingw-W64。 安装完插件后,需要用mex -setupmex -setup C++选择相应的编译器。

(这里不需要这一步)如果要安装编译环境,只需要安装MSYS2,然后在MSYS2中安装好mingw64就好。不需要独立安装mingw64,cygwin等环境。 MSYS2之于C/C++可以近似类比于Anaconda之于python。

谷歌找到MATLAB mex安装的mingw64的路径,当前R2020a是:

C:/ProgramData/MATLAB/SupportPackages/R2020a/3P.instrset/mingw_w64.instrset/bin/
C:\ProgramData\MATLAB\SupportPackages\R2020a\3P.instrset\mingw_w64.instrset\bin\ (windows格式)

上述地址要添加到环境变量中。 因为后面CMake需要能看到mingw32-make才可以。

下载Boost

不需要独立编译,BayesOpt会自动编译,只需要从官方地址下载,然后解压到一个位置即可,比如我放在了:

C:/Tools/boost/boost_1_75_0
C:\Tools\boost\boost_1_75_0 (windows格式)

Boost是C++的peer-reviewed portable C++ source libraries。似乎是很多项目的必备。

检查最终的环境变量

进行下一步前,检查一下系统环境变量中的设置,这里只考虑最简单的情况。 在系统Path变量中

  • 应该只包含Matlab使用的编译器的bin文件夹的路径,这个路径应该只出现在这里。这步保证mingw32-make.exe可以被CMD找到。
  • 不包含其它Matlab的路径,否则有可能会导致nlopt被解析到Matlab自带的某个nlopt。
  • 编译BayesOpt不需要有Boost和cmake的路径。

CMake安装和使用

官方地址下载,正常用默认安装即可。

CMake可以理解成,根据一系列的cmake配置,来生成makefile。最终的makefile文件被编译器的make函数调用(对于上述安装的编译器,是调用mingw32-make.exe,只是mingw32起的不同的名称而已)。

选择下载的BayesOpt源文件地址,设置一个独立的文件夹进行编译(方便弄乱后删除重来),勾选两个设置,然后generate。
generator选择MinGW Makefiles,选择手动设置compiler。
填入上面找到的Matlab的mingw编译器的地址,c/c++/fortran分别对应gcc/g++/gfortran.exe
最终会跳出错误,OK即可,后续继续设置。
这里填入之前指定的Boost源文件的地址。
点Add Entry添加CMAKE_CXX_STANDARD类型为String值为98(BayesOpt官方文档说明使用了C++98标准)。
先configure,再Generate,然后应该就成功了。

如果上述操作弄乱了,直接清空目标文件夹(即图1中where to build the binaries的文件夹),然后就可以重新操作了。 更高级的操作直接各种google cmake的用法。

调用Matlab的mingw编译器中的make

在CMD下定位到cmake的输出文件夹,然后运行编译:

mingw32-make

等编译完即可。

这里有可能NLOPT报错,检查一下cmake中的NLOPT参数是否被解析到了其它路径,应该是用默认的NLOPT-NOTFOUND,然后BayesOpt会编译自带的nlopt2。

在MATLAB中的设置

把上一步编译好的bayesopt-test/lib/*.a文件,全部复制到bayesopt-master\lib\Release\文件夹下,这里需要新建liblib\Release文件夹。 (因为在BayesOpt提供的matlab interface编译代码中指定了在Release文件夹下找编译好的libs,所以只要两边改得对应了就可以。)

设置Matlab中的编译器

mex -setup
设置mex的编译器。我这里的mingw显示的名字比较奇怪,似乎两个指向是同一个位置,任选一个即可,不行再换另一个。
把这个matlab文件夹下的三个文件从*.c改为*.cpp。如果不改*.c*.cpp,mex会调用C编译器,导致各种无法找到库的错误。
相应地,把这个compile_matlab文件夹中所有的*.c改为*.cpp
运行后,应该会编译出三个mex文件,注意这里都是使用的c++编译器。

到此结束,应该已经编译完成。

运行demo_*.mat可以测试运行结果。



以下是摸索过程记录,不是操作步骤,仅留作参考(待清理)

安装 MinGW64

MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本,http://rmcantin.github.io/bayesopt/html/install.html#cinwin

https://zhuanlan.zhihu.com/p/76613134

''MinGW+MSYS'' or ''CygWin''

cygwin和mingw选哪个? - ttbachyinsda的回答 - 知乎 https://www.zhihu.com/question/283946185/answer/440495136

  • 先解释一下这俩的区别,cygwin是在windows下模拟了一套类似UNIX的环境;mingw是将一些UNIX/Linux的系统调用映射成windows下的系统调用,从而使得原来在Linux下编译运行的程序可以在windows下编译运行。

关于MinGW和Cygwin的一些个人总结和推测 ,https://xnerv.wang/mingw-cygwin-summary-and-thinking/

  • “MinGW(mingw32)据说更新太慢代码太老,因此另一帮人就新搞了一个MinGW-w64,据说老的MinGW不支持编译64位程序。不知道是不是这就意味着可以完全放弃掉MinGW而直接采用MinGW-x64?”
  • 根据MinGW官网对于MSYS的描述,MSYS是对MinGW的补充,提供了bash,make, gawk和grep等GNU工具来辅助编译。

MinGW/cygwin 快速开始,https://www.codenong.com/cs100750900/

  • 安装 MinGW-w64

cygwin和mingw的区别,https://developer.aliyun.com/article/69974

  • 说白了,如果你是想在windows环境下开发linux运行程序,那么CygWin/gcc是你的不二之选。
  • 而如果你想开发的是windows运行程序,并且追求速度,那么二者相比而言,MinGW是更好的选择

Install MSYS2

https://www.msys2.org/

直接下载安装的。

安装完后可以使用 pacman 包管理工具。

暂时不懂安装这个有什么用。

Install Boost (这步可以跳过,这里不需要提前编译)

设置环境变量

添加了 cmake, mingw64, Boost 到系统环境变量。

CMake GUI 使用

选择 MINGW MAKEFILE 作为 generator。

需要手动设置 boost 的地址。只需要提供 source file 的地址即可,不需要编译后安装。

然后在运行Cmake GUI的目录下,在cmd中运行 mingw32-make 就可以了。

以上失败了。 因为matlab只支持自己版本的mingw。

把上述所有mingw64的地址换成matlab自己的官方compiler,然后重新进行。 在matlab中执行 mex -setup 的过程中,会看到安装的编译器的地址,这里是

C:/ProgramData/MATLAB/SupportPackages/R2020a/3P.instrset/mingw_w64.instrset/bin/

只要勾选了 BAYESOPT_BUILD_EXAMPLES 就会编译过程中失败,报错似乎跟某个地方的文件操作有关,猜测是 exmaple 中调用了在windows下不支持的函数。

  • 最终发现是 cmake 在设置 compiler 的时候,我把 c/c++/fortran 全部设置为了 gcc.exe,实际上应该分别是 gcc/g++/gfortran.exe,改掉之后重新编译就可以了。
  • 仍然报错

编译

Windows搭建类UNIX环境: Msys2+MinGW,https://www.dazhuanlan.com/2019/12/20/5dfc4b8899600/

  • 根据这里安装 msys2
  • 官方的安装教程也很有用,https://www.msys2.org/
  • 然后在 msys2 中安装 mingw64,而不是独立安装,把独立安装的全部删除掉
  • 注意添加相应的环境变量

似乎C++11对std::string之类的东西进行了修改,导致gcc在link的时候会出问题,很多相关的讨论。 比如

但是我似乎没有碰到这个问题

academics/ml/bo/bayesopt.txt · Last modified: 2021/03/30 21:19 by foreverph