├── paper ├── img │ ├── .gitignore │ ├── pf.jpg │ ├── classE.png │ ├── sopam.pdf │ └── branin.eps ├── icml2018.bst ├── ICML_poster.pdf ├── .gitignore ├── conclusion.tex ├── makefile ├── abstract.tex ├── algorithm.sty ├── mo_description.tex ├── supp.tex ├── mace.tex ├── paper.tex ├── intro.tex ├── background.tex ├── additional_exp_varying_B.tex ├── ICML_poster.tex ├── algorithmic.sty ├── experiments.tex ├── fancyhdr.sty └── icml2018.sty ├── demo ├── .gitignore ├── run.sh ├── clear.sh ├── conf └── circuit │ └── run.pl ├── .gitattributes ├── MACE_util.h ├── .gitmodules ├── .gitignore ├── MACE_util.cpp ├── NLopt_wrapper.h ├── Config.h ├── NLopt_wrapper.cpp ├── README.md ├── CMakeLists.txt ├── Config.cpp ├── main.cpp └── MACE.h /paper/img/.gitignore: -------------------------------------------------------------------------------- 1 | *.pdf 2 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | work/ 2 | log 3 | *.log 4 | mace_bo 5 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * linguist-vendored 2 | *.cpp linguist-vendored=false 3 | -------------------------------------------------------------------------------- /demo/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ./clear.sh 3 | nohup mace_bo ./conf > log 2>&1 & 4 | -------------------------------------------------------------------------------- /demo/clear.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | rm -rvf *.log 3 | rm -rvf log err 4 | rm -rvf work/ 5 | -------------------------------------------------------------------------------- /paper/img/pf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alaya-in-Matrix/MACE/HEAD/paper/img/pf.jpg -------------------------------------------------------------------------------- /paper/icml2018.bst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alaya-in-Matrix/MACE/HEAD/paper/icml2018.bst -------------------------------------------------------------------------------- /paper/ICML_poster.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alaya-in-Matrix/MACE/HEAD/paper/ICML_poster.pdf -------------------------------------------------------------------------------- /paper/img/classE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alaya-in-Matrix/MACE/HEAD/paper/img/classE.png -------------------------------------------------------------------------------- /paper/img/sopam.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Alaya-in-Matrix/MACE/HEAD/paper/img/sopam.pdf -------------------------------------------------------------------------------- /paper/.gitignore: -------------------------------------------------------------------------------- 1 | # ignore file for the ICML manuscript 2 | 3 | *.aux 4 | *.bbl 5 | *.blg 6 | *.log 7 | *.out 8 | *.pdf 9 | ref/ 10 | -------------------------------------------------------------------------------- /MACE_util.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | void run_cmd(std::string); 6 | int run_cmd(std::vector); 7 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "MOO"] 2 | path = MOO 3 | url = git@github.com:Alaya-in-Matrix/MOO.git 4 | [submodule "GP"] 5 | path = GP 6 | url = git@github.com:Alaya-in-Matrix/GP.git 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore file for WAPI_MOBO project 2 | 3 | *.swp 4 | # build 5 | .build/ 6 | .ycm_extra_conf.py* 7 | __pycache__/ 8 | 9 | # Qt project 10 | CMakeLists.txt.user 11 | .qt-build 12 | -------------------------------------------------------------------------------- /MACE_util.cpp: -------------------------------------------------------------------------------- 1 | #include "MACE_util.h" 2 | #include 3 | using namespace std; 4 | 5 | void run_cmd(string cmd) 6 | { 7 | int ret = system(cmd.c_str()); 8 | if(ret != 0) 9 | { 10 | cerr << "Fail to execute cmd \"" << cmd << "\", exit code: " << ret; 11 | exit(ret); 12 | } 13 | } 14 | int run_cmd(vector cmds) 15 | { 16 | int ret; 17 | for(auto c : cmds) 18 | { 19 | ret = system(c.c_str()); 20 | if(ret != 0) 21 | break; 22 | } 23 | return ret; 24 | } 25 | -------------------------------------------------------------------------------- /paper/conclusion.tex: -------------------------------------------------------------------------------- 1 | \section{Conclusion} 2 | 3 | In this paper, a batch Bayesian optimization algorithm is proposed for the 4 | automation of analog circuit design. The parallelization is achieved via 5 | the multi-objective ensemble of acquisition functions. In each iteration, the 6 | candidate points are sampled from the Pareto front of multiple acquisition 7 | functions. We compared the proposed MACE algorithm using analytical benchmark 8 | functions and real-world circuits, it is shown that the MACE algorithm is 9 | competitive compared with the state-of-the-art methods listed in the paper. 10 | -------------------------------------------------------------------------------- /NLopt_wrapper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "Eigen/Dense" 3 | #include "nlopt.hpp" 4 | class NLopt_wrapper 5 | { 6 | public: 7 | typedef std::function func; 8 | NLopt_wrapper(nlopt::algorithm, size_t dim, double lb, double ub); 9 | 10 | void set_min_objective(func); 11 | void set_maxeval(size_t max_eval); 12 | void set_ftol_abs(double v); 13 | void set_ftol_rel(double v); 14 | void set_xtol_abs(double v); 15 | void set_xtol_rel(double v); 16 | void optimize(Eigen::VectorXd& sp, double& val); 17 | 18 | protected: 19 | nlopt::opt _opt; 20 | func _f; 21 | }; 22 | -------------------------------------------------------------------------------- /demo/conf: -------------------------------------------------------------------------------- 1 | workdir /home/alaya/gitrepos/ParallelBO/demo 2 | 3 | des_var x -10 10 4 | des_var y -10 10 5 | 6 | option max_eval 200 7 | option num_thread 4 # the batch size 8 | option num_init 4 # initial sampling 9 | 10 | # you must provide `num_spec` and set it to 1, this option is reserved for 11 | # multi-objective/constrained optimization where you will have more than one 12 | # objectives 13 | option num_spec 1 14 | 15 | # control variables controling the algorithm 16 | option use_sobol 0 17 | option noise_free 0 18 | 19 | 20 | # options for the DEMO 21 | option mo_record 0 22 | option mo_np 100 23 | option mo_gen 100 24 | option mo_f 0.5 25 | option mo_cr 0.3 26 | 27 | # optimization algorithm, support "mace" and "blcb" 28 | algo mace 29 | # algo blcb 30 | -------------------------------------------------------------------------------- /demo/circuit/run.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | use strict; 3 | use warnings; 4 | use 5.010; 5 | 6 | my %params; 7 | open my $ifh, "<", "param" or die "Can't read param:$!\n"; 8 | while(my $line = <$ifh>) 9 | { 10 | chomp($line); 11 | if($line =~ /\.param\s+(\w+)\s+=\s+(.*)/) 12 | { 13 | $params{$1} = $2+0; 14 | } 15 | } 16 | close $ifh; 17 | die "x does not exist" if(not exists $params{x}); 18 | die "y does not exist" if(not exists $params{y}); 19 | my $x = $params{x}-1; 20 | my $y = $params{y}-1; 21 | my $fom = (1-$x)**2 + 100 * ($y - $x**2)**2; 22 | 23 | open my $ofh, ">", "result.po" or die "Can't create result.po: $!\n"; 24 | say $ofh $fom; 25 | close $ofh; 26 | 27 | open my $rfh, ">>", "record" or die "Can't create record: $!\n"; 28 | say $rfh "$x $y $fom"; 29 | close $rfh; 30 | -------------------------------------------------------------------------------- /paper/makefile: -------------------------------------------------------------------------------- 1 | mainfile = paper 2 | suppfile = supp 3 | posterfile = ICML_poster 4 | PDF = ${mainfile}.pdf 5 | SUPP = ${suppfile}.pdf 6 | POSTER = ${posterfile}.pdf 7 | 8 | all : ${PDF} ${SUPP} ${POSTER} 9 | 10 | ${posterfile}.pdf: ${posterfile}.tex baposter.cls 11 | pdflatex $< 12 | 13 | ${mainfile}.pdf: *.tex ref.bib 14 | pdflatex ${mainfile}.tex 15 | - bibtex ${mainfile} 16 | pdflatex ${mainfile}.tex 17 | pdflatex ${mainfile}.tex 18 | 19 | ${suppfile}.pdf: *.tex ref.bib 20 | pdflatex ${suppfile}.tex 21 | - bibtex ${suppfile} 22 | pdflatex ${suppfile}.tex 23 | pdflatex ${suppfile}.tex 24 | 25 | tidy: 26 | rm -vf *.log *.aux \ 27 | *.cfg *.glo *.idx *.toc \ 28 | *.ilg *.ind *.out *.lof \ 29 | *.lot *.bbl *.blg *.gls *.cut *.hd \ 30 | *.dvi *.ps *.thm *.tgz *.zip *.rpi 31 | 32 | 33 | clean: tidy 34 | rm -f ${PDF} 35 | rm -f ${SUPP} 36 | rm -f ${POSTER} 37 | -------------------------------------------------------------------------------- /Config.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "MACE.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | // read configuration 9 | class Config 10 | { 11 | std::string _file_path; 12 | std::string _work_dir; 13 | Eigen::VectorXd _des_var_lb; 14 | Eigen::VectorXd _des_var_ub; 15 | std::vector _des_var_names; 16 | std::map _options; 17 | std::string _algo; 18 | public: 19 | explicit Config(std::string); 20 | void parse(); 21 | void print(); 22 | std::string work_dir() const; 23 | const decltype(_options)& options() const; 24 | MACE::Obj gen_obj(); 25 | MACE::Obj gen_obj(size_t num_threads); 26 | Eigen::VectorXd lb() const; 27 | Eigen::VectorXd ub() const; 28 | boost::optional lookup(std::string) const; 29 | std::string algo() const { return _algo; } 30 | }; 31 | -------------------------------------------------------------------------------- /paper/abstract.tex: -------------------------------------------------------------------------------- 1 | \begin{abstract} 2 | Bayesian optimization methods are promising for the optimization of black-box functions that are expensive to evaluate. In this paper, a novel batch Bayesian optimization approach is proposed. The parallelization is realized via a multi-objective ensemble of multiple 3 | acquisition functions. In each iteration, the multi-objective optimization of the multiple acquisition functions is performed to search for 4 | the Pareto front of the acquisition functions. The batch of inputs are then selected from the Pareto front. The Pareto front represents the best trade-off between the multiple acquisition functions. Such a policy for batch Bayesian optimization can significantly improve the efficiency of optimization. The proposed method is compared with several 5 | state-of-the-art batch Bayesian optimization algorithms using analytical 6 | benchmark functions and real-world analog integrated circuits. The experimental 7 | results show that the proposed method is competitive compared with the 8 | state-of-the-art algorithms. 9 | \end{abstract} 10 | -------------------------------------------------------------------------------- /NLopt_wrapper.cpp: -------------------------------------------------------------------------------- 1 | #include "NLopt_wrapper.h" 2 | #include "util.h" 3 | using namespace std; 4 | using namespace Eigen; 5 | NLopt_wrapper::NLopt_wrapper(nlopt::algorithm a, size_t d, double lb, double ub) 6 | : _opt(nlopt::opt(a, d)) 7 | { 8 | _opt.set_lower_bounds(lb); 9 | _opt.set_upper_bounds(ub); 10 | } 11 | void NLopt_wrapper::set_min_objective(NLopt_wrapper::func f) 12 | { 13 | _f = f; 14 | _opt.set_min_objective([](const vector& x, vector& grad, void* data) -> double { 15 | NLopt_wrapper* nlopt_ptr = reinterpret_cast(data); 16 | VectorXd vgrad; 17 | double val = nlopt_ptr->_f(convert(x), vgrad); 18 | grad = convert(vgrad); 19 | return val; 20 | }, this); 21 | } 22 | void NLopt_wrapper::set_maxeval(size_t v){_opt.set_maxeval(v);} 23 | void NLopt_wrapper::set_ftol_abs(double v){_opt.set_ftol_abs(v);} 24 | void NLopt_wrapper::set_ftol_rel(double v){_opt.set_ftol_rel(v);} 25 | void NLopt_wrapper::set_xtol_abs(double v){_opt.set_xtol_abs(v);} 26 | void NLopt_wrapper::set_xtol_rel(double v){_opt.set_xtol_rel(v);} 27 | void NLopt_wrapper::optimize(Eigen::VectorXd& sp, double& val) 28 | { 29 | vector stlsp = convert(sp); 30 | try 31 | { 32 | _opt.optimize(stlsp, val); 33 | sp = convert(stlsp); 34 | } 35 | catch(...) 36 | { 37 | VectorXd fake_g; 38 | sp = convert(stlsp); 39 | val = _f(sp, fake_g); 40 | throw; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # README 2 | 3 | ## About 4 | 5 | Parallel bayesian optimization via multi-objective acquisition ensemble 6 | 7 | ## Python version 8 | 9 | The code in this repo is used to run the experiments in the paper, 10 | I recently also implemented a python version that supports MCMC integration of 11 | the GP hyperparameters, the python version has less dependencies and is more 12 | user-friendly. The code is hosted [here](https://github.com/Alaya-in-Matrix/MACE_MCMC) 13 | 14 | ## Dependencies 15 | 16 | - Publicly available: 17 | - Cmake (for build and install) 18 | - Eigen 19 | - Boost 20 | - OpenMP 21 | - nlopt 22 | - gsl 23 | - Libraries written by me, used as git submodules: 24 | - [GP](https://github.com/Alaya-in-Matrix/GP) 25 | - [MVMO](https://github.com/Alaya-in-Matrix/MVMO) 26 | - [MOO](https://github.com/Alaya-in-Matrix/MOO) 27 | 28 | ## Build and install 29 | 30 | ```bash 31 | mkdir _build 32 | cd _build 33 | cmake .. -DCMAKE_BUILD_TYPE=release \ 34 | -DMYDEBUG=OFF \ 35 | -DBOOST_ROOT=/path/to/your/boost/library \ 36 | -DEigen3_DIR=/path/to/your/eigen/share/eigen3/cmake \ 37 | -DGSL_ROOT_DIR=/path/to/your/gsl \ 38 | -DNLOPT_PATH=/path/to/your/nlopt \ 39 | -DCMAKE_INSTALL_PREFIX=/path/you/want/to/install 40 | 41 | make 42 | make install 43 | ``` 44 | ## Run 45 | 46 | After successfully installed the MACE package, you should already have `mace_bo` in your path, you can go to `demo` and run the `run.sh` script 47 | 48 | - Configurations are written in `conf`, the first line `workdir` should be modified 49 | - The objective function is defined in `run.pl` 50 | - `run.pl` read the `param` file as design variables 51 | - `run.pl` write the objective value into `result.po` 52 | 53 | ## TODO 54 | 55 | - Use TOML as config 56 | - Constraint handling 57 | -------------------------------------------------------------------------------- /paper/algorithm.sty: -------------------------------------------------------------------------------- 1 | % ALGORITHM STYLE -- Released 8 April 1996 2 | % for LaTeX-2e 3 | % Copyright -- 1994 Peter Williams 4 | % E-mail Peter.Williams@dsto.defence.gov.au 5 | \NeedsTeXFormat{LaTeX2e} 6 | \ProvidesPackage{algorithm} 7 | \typeout{Document Style `algorithm' - floating environment} 8 | 9 | \RequirePackage{float} 10 | \RequirePackage{ifthen} 11 | \newcommand{\ALG@within}{nothing} 12 | \newboolean{ALG@within} 13 | \setboolean{ALG@within}{false} 14 | \newcommand{\ALG@floatstyle}{ruled} 15 | \newcommand{\ALG@name}{Algorithm} 16 | \newcommand{\listalgorithmname}{List of \ALG@name s} 17 | 18 | % Declare Options 19 | % first appearance 20 | \DeclareOption{plain}{ 21 | \renewcommand{\ALG@floatstyle}{plain} 22 | } 23 | \DeclareOption{ruled}{ 24 | \renewcommand{\ALG@floatstyle}{ruled} 25 | } 26 | \DeclareOption{boxed}{ 27 | \renewcommand{\ALG@floatstyle}{boxed} 28 | } 29 | % then numbering convention 30 | \DeclareOption{part}{ 31 | \renewcommand{\ALG@within}{part} 32 | \setboolean{ALG@within}{true} 33 | } 34 | \DeclareOption{chapter}{ 35 | \renewcommand{\ALG@within}{chapter} 36 | \setboolean{ALG@within}{true} 37 | } 38 | \DeclareOption{section}{ 39 | \renewcommand{\ALG@within}{section} 40 | \setboolean{ALG@within}{true} 41 | } 42 | \DeclareOption{subsection}{ 43 | \renewcommand{\ALG@within}{subsection} 44 | \setboolean{ALG@within}{true} 45 | } 46 | \DeclareOption{subsubsection}{ 47 | \renewcommand{\ALG@within}{subsubsection} 48 | \setboolean{ALG@within}{true} 49 | } 50 | \DeclareOption{nothing}{ 51 | \renewcommand{\ALG@within}{nothing} 52 | \setboolean{ALG@within}{true} 53 | } 54 | \DeclareOption*{\edef\ALG@name{\CurrentOption}} 55 | 56 | % ALGORITHM 57 | % 58 | \ProcessOptions 59 | \floatstyle{\ALG@floatstyle} 60 | \ifthenelse{\boolean{ALG@within}}{ 61 | \ifthenelse{\equal{\ALG@within}{part}} 62 | {\newfloat{algorithm}{htbp}{loa}[part]}{} 63 | \ifthenelse{\equal{\ALG@within}{chapter}} 64 | {\newfloat{algorithm}{htbp}{loa}[chapter]}{} 65 | \ifthenelse{\equal{\ALG@within}{section}} 66 | {\newfloat{algorithm}{htbp}{loa}[section]}{} 67 | \ifthenelse{\equal{\ALG@within}{subsection}} 68 | {\newfloat{algorithm}{htbp}{loa}[subsection]}{} 69 | \ifthenelse{\equal{\ALG@within}{subsubsection}} 70 | {\newfloat{algorithm}{htbp}{loa}[subsubsection]}{} 71 | \ifthenelse{\equal{\ALG@within}{nothing}} 72 | {\newfloat{algorithm}{htbp}{loa}}{} 73 | }{ 74 | \newfloat{algorithm}{htbp}{loa} 75 | } 76 | \floatname{algorithm}{\ALG@name} 77 | 78 | \newcommand{\listofalgorithms}{\listof{algorithm}{\listalgorithmname}} 79 | 80 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.2.1) 2 | project(ParallelBayesianOptimization) 3 | if(NOT CMAKE_BUILD_TYPE) 4 | set(CMAKE_BUILD_TYPE debug) 5 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g") 6 | endif() 7 | message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") 8 | 9 | 10 | # One warning from when compiling Eigen headers 11 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") 12 | 13 | add_subdirectory(MOO) 14 | add_subdirectory(GP) 15 | include_directories(MOO) 16 | include_directories(GP) 17 | include_directories(GP/MVMO) 18 | set(SRC main.cpp MACE_util.cpp MACE.cpp Config.cpp NLopt_wrapper.cpp) 19 | set(EXE mace_bo) 20 | add_executable(${EXE} ${SRC}) 21 | target_link_libraries(${EXE} moo) 22 | target_link_libraries(${EXE} GP) 23 | 24 | set_property(TARGET ${EXE} PROPERTY CXX_STANDARD 11) 25 | 26 | # Eigen library 27 | 28 | # debug macro 29 | option(MYDEBUG "Debug macro for optimizer" OFF) 30 | if(MYDEBUG) 31 | message(STATUS "Open debug marcro") 32 | add_definitions(-DMYDEBUG) 33 | if(DEFINED RAND_SEED) 34 | message(STATUS "Rand seed is ${RAND_SEED}") 35 | add_definitions(-DDEBUG_RAND_SEED=${RAND_SEED}) 36 | else() 37 | add_definitions(-DDEBUG_RAND_SEED=3) 38 | endif() 39 | else() 40 | message(STATUS "Close debug marcro") 41 | remove_definitions(-DMYDEBUG) 42 | remove_definitions(-DDEBUG_RAND_SEED) 43 | endif() 44 | 45 | # if(GP_PATH) 46 | # message(STATUS "GP_PATH: ${GP_PATH}") 47 | # include_directories("${GP_PATH}/inc/") 48 | # find_library(GP NAME GP PATHS ${GP_PATH}/lib) 49 | # if(GP) 50 | # target_link_libraries(${EXE} ${GP}) 51 | # else() 52 | # message("GP library not found in ${GP_PATH}") 53 | # endif() 54 | # else() 55 | # message(FATAL_ERROR "GP_PATH not specified") 56 | # endif() 57 | 58 | if(NLOPT_PATH) 59 | message(STATUS "NLOPT_PATH: ${NLOPT_PATH}") 60 | include_directories("${NLOPT_PATH}/include") 61 | find_library(NLOPT NAMES nlopt PATHS ${NLOPT_PATH}/lib NO_CMAKE_SYSTEM_PATH) 62 | else() 63 | find_library(NLOPT NAMES nlopt) 64 | endif() 65 | if(NLOPT) 66 | message(STATUS "Nlopt library: ${NLOPT}") 67 | target_link_libraries(${EXE} ${NLOPT}) 68 | else() 69 | message(FATAL_ERROR "NLOPT not found") 70 | endif() 71 | 72 | # https://eigen.tuxfamily.org/dox/TopicCMakeGuide.html 73 | find_package(Eigen3 3.3 REQUIRED NO_MODULE) 74 | include_directories(${EIGEN3_INCLUDE_DIR}) 75 | 76 | find_package(GSL 2.1 REQUIRED) 77 | if(GSL_FOUND) 78 | message(STATUS "GSL found, version ${GSL_VERSION}") 79 | include_directories(${GSL_INCLUDE_DIRS}) 80 | target_link_libraries(${EXE} ${GSL_LIBRARIES}) 81 | endif() 82 | 83 | find_package(OpenMP REQUIRED) 84 | if(OPENMP_FOUND) 85 | message(STATUS "OPENMP FOUND") 86 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") 87 | set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") 88 | # Disable OpenMP multi-threading for Eigen matrix operations 89 | add_definitions(-DEIGEN_DONT_PARALLELIZE) 90 | endif() 91 | 92 | ADD_DEFINITIONS(-DBOOST_ALL_DYN_LINK) 93 | find_package(Boost 1.63 COMPONENTS log log_setup thread system REQUIRED) 94 | if(Boost_FOUND) 95 | message(STATUS "boost inc dir: ${Boost_INCLUDE_DIR}") 96 | message(STATUS "boost lib dir: ${Boost_LIBRARY_DIRS}") 97 | include_directories(${Boost_INCLUDE_DIR}) 98 | target_link_libraries(${EXE} ${Boost_LIBRARIES}) 99 | endif(Boost_FOUND) 100 | 101 | 102 | message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") 103 | install(TARGETS ${EXE} 104 | RUNTIME DESTINATION bin 105 | ARCHIVE DESTINATION lib 106 | LIBRARY DESTINATION lib) 107 | install(FILES README.md 108 | DESTINATION doc 109 | PERMISSIONS OWNER_READ GROUP_READ) 110 | -------------------------------------------------------------------------------- /paper/mo_description.tex: -------------------------------------------------------------------------------- 1 | \section{DEMO: Differential Evolution for Multi-Objective Optimization} 2 | 3 | The DEMO (Differential Evolution for Multi-Objective, \citet{demo}) algorithm is used for the multi-objective optimization of acquisition functions, we briefly introduce the algorithm in this section. It should be noted that other multi-objective optimization algorithms can also be used for the proposed MACE algorithm. 4 | 5 | The DEMO algorithm follows the basic procedure of evolutionary algorithms. Firstly, a set of points are randomly sampled to form the initial population, at each iteration, random variations are added to parent population via mutation and crossover to generate the children population, the parent population and children population are compared to create the parent population for the next generation. During the evolution, the Pareto front is recorded. The DEMO algorithm is summarized in Algorithm~\ref{alg:DEMO}. 6 | 7 | \begin{algorithm}[h] 8 | \caption{DEMO} 9 | \label{alg:DEMO} 10 | \begin{algorithmic}[1] 11 | \STATE Randomly sample the $N$ points in the design space to form the initial population $P^1$ 12 | \FOR{t = 1, 2, \dots $G$~} 13 | \STATE $M^t$ = \texttt{mutation}($P^t$) 14 | \STATE $C^t$ = \texttt{crossover}($P^t$, $M^t$) 15 | \STATE $P^{t+1}$ = \texttt{selection}($P^t$, $C^t$) 16 | \ENDFOR 17 | \STATE Return the recorded Pareto front 18 | \end{algorithmic} 19 | \end{algorithm} 20 | 21 | % XXX: mutation 22 | At the $i$-th iteration, we denote the population as $P^i \in R^{N \times D}$, where $N$ is the number of population, and $D$ is the dimension of input variables. The mutated population $M^i \in R^{N \times D}$ is generated by 23 | \begin{equation} 24 | \label{eq:DEMO_mutation} 25 | M^i_j = P^i_{r1} + F \times (P^i_{r2} - P^i_{r3}),~j \in \{1 \dots NP\} 26 | \end{equation} 27 | where $M^i_j$ means the $j$-th row of $M^i$, while $P^i_{r1}$, $P^i_{r2}$ and $P^i_{r3}$ are the $\mathit{r1}$-th, $\mathit{r2}$-th and $\mathit{r3}$-th rows of $P^i$, the $r1$, $r2$ and $r3$ are three integers randomly chosen from $[1, N]$. The scaling factor $F \in (0, 1)$ is an algorithm parameter to control the mutation. 28 | 29 | After the mutation, crossover operations are performed to generated the children population $C^i \in R^{N \times D}$. For each element of $C^i$, two random numbers $r_r$ and $r_i$ are generated, $r_r$ is a real-valued number uniformly sampled from $(0, 1)$, $r_i$ is an integer number uniformly sampled from $[1, D]$, the element of $C^i$ is calculated by 30 | \begin{equation} 31 | \label{eq:DEMO_crossover} 32 | C^i_{jk} = \left\{ 33 | \begin{array}{lll} 34 | P^i_{jk} & & r_r < \mathit{CR} \text{ and } r_i \neq k \\ 35 | C^i_{jk} & & \text{otherwise}. 36 | \end{array} 37 | \right. 38 | \end{equation} 39 | where the crossover rate $\mathit{CR}$ is an algorithm parameter to control the crossover. 40 | 41 | Now that we have the parent population $P^i$ and the children population $C^i$, 42 | we perform selection to generate the new population $P^{i+1}$. Firstly, an 43 | empty archive is created, we perform pair-wise compairsion between parents and 44 | children, if one parent solution dominates its child solution, the parent 45 | solution is added into the archive; if the child solution dominates its parent, 46 | the child is added into the archive; if the parent and its child don't dominate 47 | each other, both the parent and the child are added into the archive. After 48 | the pair-wise compairsion, non-dominated sorting\cite{nsgaii} is 49 | performed to select $G$ solutions as the parent population of the next 50 | generation. The non-dominated sorting method defines a complete order between a 51 | group of solutions, details of the non-dominated sorting can be seen in 52 | \cite{nsgaii}. 53 | 54 | As has been mentioned, four algorithm parameters are to be set for the DEMO algorithm: the population size $N$, the number of generations $G$, the scaling factor $F$ and the crossover rate $\mathit{CR}$. We set $N = 100$, $G = 250$, $F = 0.5$ and $\mathit{CR} = 0.3$ for all the experiments performed in the paper. 55 | -------------------------------------------------------------------------------- /Config.cpp: -------------------------------------------------------------------------------- 1 | #include "Config.h" 2 | #include "util.h" 3 | #include "MACE_util.h" 4 | #include 5 | #include 6 | #include 7 | #include 8 | using namespace std; 9 | using namespace Eigen; 10 | Config::Config(string file_path) : _file_path(file_path) {} 11 | void Config::parse() 12 | { 13 | ifstream f; 14 | f.open(_file_path); 15 | MYASSERT(f.is_open() && !f.fail()); 16 | string line; 17 | _des_var_names.clear(); 18 | vector lbs; 19 | vector ubs; 20 | while (getline(f, line)) 21 | { 22 | string tok; 23 | stringstream ss(line); 24 | ss >> tok; 25 | if (tok == "workdir") 26 | { 27 | ss >> _work_dir; 28 | } 29 | else if (tok == "des_var") 30 | { 31 | string name; 32 | double lb, ub; 33 | ss >> name >> lb >> ub; 34 | if (ub < lb) throw std::runtime_error("ub > lb for line " + line); 35 | _des_var_names.push_back(name); 36 | lbs.push_back(lb); 37 | ubs.push_back(ub); 38 | } 39 | else if (tok == "option") 40 | { 41 | string k; 42 | double v; 43 | ss >> k >> v; 44 | _options[k] = v; 45 | } 46 | else if (tok == "algo") 47 | { 48 | ss >> _algo; 49 | } 50 | } 51 | MYASSERT(_des_var_names.size() == lbs.size()); 52 | MYASSERT(_des_var_names.size() == ubs.size()); 53 | _des_var_lb = convert(lbs); 54 | _des_var_ub = convert(ubs); 55 | f.close(); 56 | } 57 | string Config::work_dir() const { return _work_dir; } 58 | const map& Config::options() const { return _options; } 59 | VectorXd Config::lb() const { return _des_var_lb; } 60 | VectorXd Config::ub() const { return _des_var_ub; } 61 | MACE::Obj Config::gen_obj() 62 | { 63 | string cir_dir = _work_dir + "/circuit"; 64 | run_cmd("mkdir " + _work_dir + "/work/"); 65 | const size_t num_threads = omp_get_max_threads(); 66 | for(size_t i = 0; i < num_threads; ++i) 67 | run_cmd("cp -r " + cir_dir + " " + _work_dir + "/work/" + to_string(i)); 68 | MACE::Obj f = [&](const VectorXd& xs) -> VectorXd { 69 | // check range 70 | const size_t dim = _des_var_names.size(); 71 | const size_t num_spec = with_default(_options, "num_spec", 1); 72 | const string opt_dir = _work_dir + "/work/" + to_string(omp_get_thread_num()); 73 | MYASSERT((size_t)xs.rows() == dim); 74 | VectorXd sim_results(num_spec); 75 | 76 | ofstream param_f; 77 | string param_file = opt_dir + "/param"; 78 | param_f.exceptions(param_f.badbit | param_f.failbit); 79 | param_f << setprecision(18); 80 | param_f.open(param_file); 81 | for (size_t j = 0; j < dim; ++j) 82 | param_f << ".param " << _des_var_names[j] << " = " << xs(j) << endl; 83 | param_f.close(); 84 | const string cmd = "cd " + opt_dir + " && perl run.pl > output_info.log 2>&1"; 85 | int ret = system(cmd.c_str()); 86 | if (ret != 0) 87 | { 88 | cerr << "Fail to run cmd " << cmd << endl; 89 | exit(EXIT_FAILURE); 90 | } 91 | MatrixXd result = read_matrix(opt_dir + "/result.po"); 92 | MYASSERT(result.rows() == 1); 93 | MYASSERT((size_t)result.size() == num_spec); 94 | sim_results = result.transpose(); 95 | 96 | return sim_results; 97 | }; 98 | return f; 99 | } 100 | void Config::print() 101 | { 102 | cout << "Conf path: " << _file_path << endl; 103 | cout << "work dir: " << _work_dir << endl; 104 | for(size_t i = 0; i < _des_var_names.size(); ++i) 105 | { 106 | cout << _des_var_names[i] << ": " << _des_var_lb[i] << ", " << _des_var_ub[i] << endl; 107 | } 108 | for(auto p : _options) 109 | { 110 | cout << "Option " << p.first << " = " << p.second << endl; 111 | } 112 | } 113 | boost::optional Config::lookup(string name) const 114 | { 115 | auto find_result = _options.find(name); 116 | if(find_result == _options.end()) 117 | return boost::none; 118 | else 119 | return find_result->second; 120 | } 121 | -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | #include "util.h" 2 | #include "Config.h" 3 | #include "MACE.h" 4 | #include "MACE_util.h" 5 | #include "NLopt_wrapper.h" 6 | #include 7 | #include 8 | #include 9 | using namespace std; 10 | using namespace Eigen; 11 | int main(int arg_num, char** args) 12 | { 13 | // srand(rand_seed); 14 | srand(random_device{}()); 15 | 16 | if(arg_num < 2) 17 | { 18 | cerr << "Usage: mobo_wapi path/to/conf/file" << endl; 19 | return EXIT_FAILURE; 20 | } 21 | #ifdef MYDEBUG 22 | run_cmd("rm -rvf work"); 23 | #endif 24 | 25 | string conf_file(args[1]); 26 | 27 | Config conf(conf_file); 28 | conf.parse(); 29 | conf.print(); 30 | 31 | size_t num_spec = 0; 32 | 33 | try 34 | { 35 | num_spec = conf.lookup("num_spec").value(); 36 | } 37 | catch (const boost::bad_optional_access& e) 38 | { 39 | cerr << e.what() <<" You need to specify `num_spec` in configure file." << endl; 40 | return EXIT_FAILURE; 41 | } 42 | 43 | const size_t dim = conf.lb().size(); 44 | const size_t num_thread = conf.lookup("num_thread").value_or(1); 45 | const size_t max_eval = conf.lookup("max_eval").value_or(dim * 20); 46 | const size_t num_init = conf.lookup("num_init").value_or(1 + dim); 47 | const size_t tol_no_improvement = conf.lookup("tol_no_improvement").value_or(10); 48 | const double noise_lb = conf.lookup("noise_lb").value_or(1e-6); 49 | const double eval_fixed = conf.lookup("eval_fixed").value_or(max_eval); 50 | const bool mo_record = conf.lookup("mo_record").value_or(false); 51 | const double mo_f = conf.lookup("mo_f").value_or(0.5); 52 | const double mo_cr = conf.lookup("mo_cr").value_or(0.3); 53 | const size_t mo_gen = conf.lookup("mo_gen").value_or(250); 54 | const size_t mo_np = conf.lookup("mo_np").value_or(100); 55 | const size_t selection_strategy = conf.lookup("selection_strategy").value_or(0); 56 | const bool use_sobol = conf.lookup("use_sobol").value_or(false); 57 | const bool noise_free = conf.lookup("noise_free").value_or(false); 58 | const double upsilon = conf.lookup("upsilon").value_or(0.5); 59 | const double delta = conf.lookup("delta").value_or(0.05); 60 | const double EI_jitter = conf.lookup("EI_jitter").value_or(0.0); 61 | const double eps = conf.lookup("eps").value_or(1e-3); 62 | const bool force_select_hyp = conf.lookup("force_select_hyp").value_or(true); 63 | const bool posterior_ref = conf.lookup("posterior_ref").value_or(false); 64 | const string algo = conf.algo(); 65 | MACE::SelectStrategy ss; 66 | switch(selection_strategy) 67 | { 68 | case 0: 69 | ss = MACE::SelectStrategy::Random; 70 | break; 71 | case 1: 72 | ss = MACE::SelectStrategy::Greedy; 73 | break; 74 | case 2: 75 | ss = MACE::SelectStrategy::Extreme; 76 | break; 77 | default: 78 | cout << "Unknown selection strategy, 0 for random, 1 for greedy, 2 for extreme" << endl; 79 | exit(EXIT_FAILURE); 80 | } 81 | 82 | omp_set_num_threads(num_thread); 83 | 84 | MACE::Obj obj = conf.gen_obj(); 85 | 86 | MACE mace(obj, num_spec, conf.lb(), conf.ub()); 87 | // Optional algorithm settings 88 | mace.set_tol_no_improvement(tol_no_improvement); 89 | mace.set_eval_fixed(eval_fixed); 90 | mace.set_max_eval(max_eval); 91 | mace.set_init_num(num_init); 92 | mace.set_batch(num_thread); 93 | mace.set_mo_record(mo_record); 94 | mace.set_force_select_hyp(force_select_hyp); 95 | mace.set_posterior_ref(posterior_ref); 96 | mace.set_mo_f(mo_f); 97 | mace.set_mo_cr(mo_cr); 98 | mace.set_mo_gen(mo_gen); 99 | mace.set_mo_np(mo_np); 100 | mace.set_selection_strategy(ss); 101 | mace.set_use_sobol(use_sobol); 102 | mace.set_lcb_upsilon(upsilon); 103 | mace.set_lcb_delta(delta); 104 | mace.set_EI_jitter(EI_jitter); 105 | mace.set_eps(eps); 106 | if(not noise_free) 107 | mace.set_gp_noise_lower_bound(noise_lb); 108 | mace.set_noise_free(noise_free); 109 | mace.initialize(num_init); 110 | if(algo == "mace") 111 | mace.optimize(); 112 | else if(algo == "blcb") 113 | mace.blcb(); 114 | else 115 | { 116 | cerr << "Unknown algo: " << algo << endl; 117 | exit(EXIT_FAILURE); 118 | } 119 | cout << "Best x: " << mace.best_x().transpose() << endl; 120 | cout << "Best y: " << mace.best_y().transpose() << endl; 121 | return EXIT_SUCCESS; 122 | } 123 | -------------------------------------------------------------------------------- /paper/supp.tex: -------------------------------------------------------------------------------- 1 | %%%%%%%% ICML 2018 EXAMPLE LATEX SUBMISSION FILE %%%%%%%%%%%%%%%%% 2 | 3 | \documentclass{article} 4 | 5 | % Recommended, but optional, packages for figures and better typesetting: 6 | \usepackage{microtype} 7 | \usepackage{graphicx} 8 | \usepackage{subfigure} 9 | \usepackage{booktabs} % for professional tables 10 | 11 | % Added by wenlong lyu 12 | \usepackage{amsmath} 13 | \usepackage[plain]{fancyref} 14 | \usepackage{bm} 15 | \usepackage{todonotes} 16 | \usepackage{placeins} 17 | \usepackage{multirow} 18 | \usepackage{mathtools} 19 | 20 | % hyperref makes hyperlinks in the resulting PDF. 21 | % If your build breaks (sometimes temporarily if a hyperlink spans a page) 22 | % please comment out the following usepackage line and replace 23 | % \usepackage{icml2018} with \usepackage[nohyperref]{icml2018} above. 24 | \usepackage{hyperref} 25 | 26 | % Attempt to make hyperref and algorithmic work together better: 27 | \newcommand{\theHalgorithm}{\arabic{algorithm}} 28 | 29 | % % Use the following line for the initial blind version submitted for review: 30 | % \usepackage{icml2018} 31 | 32 | % If accepted, instead use the following line for the camera-ready submission: 33 | \usepackage[accepted]{icml2018} 34 | 35 | % The \icmltitle you define below is probably too long as a header. 36 | % Therefore, a short form for the running title is supplied here: 37 | \icmltitlerunning{Supplementary Materials} 38 | 39 | \begin{document} 40 | 41 | \twocolumn[ 42 | \icmltitle{Supplementary Materials} 43 | 44 | % It is OKAY to include author information, even for blind 45 | % submissions: the style file will automatically remove it for you 46 | % unless you've provided the [accepted] option to the icml2018 47 | % package. 48 | 49 | % List of affiliations: The first argument should be a (short) 50 | % identifier you will use later to specify author affiliations 51 | % Academic affiliations should list Department, University, City, Region, Country 52 | % Industry affiliations should list Company, City, Region, Country 53 | 54 | % You can specify symbols, otherwise they are numbered in order. 55 | % Ideally, you should not use this facility. Affiliations will be numbered 56 | % in order of appearance and this is the preferred way. 57 | % \icmlsetsymbol{equal}{*} 58 | 59 | % \begin{icmlauthorlist} 60 | % \icmlauthor{Wenlong Lyu}{fudan} 61 | % \icmlauthor{Fan Yang}{fudan} 62 | % \icmlauthor{Changhao Yan}{fudan} 63 | % \icmlauthor{Dian Zhou}{fudan,utd} 64 | % \icmlauthor{Xuan Zeng}{fudan} 65 | % % \icmlauthor{Aeiau Zzzz}{equal,to} 66 | % % \icmlauthor{Bauiu C.~Yyyy}{equal,to,goo} 67 | % % \icmlauthor{Cieua Vvvvv}{goo} 68 | % % \icmlauthor{Iaesut Saoeu}{ed} 69 | % % \icmlauthor{Fiuea Rrrr}{to} 70 | % % \icmlauthor{Tateu H.~Yasehe}{ed,to,goo} 71 | % % \icmlauthor{Aaoeu Iasoh}{goo} 72 | % % \icmlauthor{Buiui Eueu}{ed} 73 | % % \icmlauthor{Aeuia Zzzz}{ed} 74 | % % \icmlauthor{Bieea C.~Yyyy}{to,goo} 75 | % % \icmlauthor{Teoau Xxxx}{ed} 76 | % % \icmlauthor{Eee Pppp}{ed} 77 | % \end{icmlauthorlist} 78 | 79 | % % \icmlaffiliation{utd}{utdallas} 80 | % \icmlaffiliation{fudan}{State Key Lab of ASIC and System, Microelectronics Department, Fudan University, Shanghai, China} 81 | % \icmlaffiliation{utd}{Department of Electrical Engineering, University of Texas at Dallas, Richardson, TX, U.S.A} 82 | % % \icmlaffiliation{to}{Department of Computation, University of Torontoland, Torontoland, Canada} 83 | % % \icmlaffiliation{goo}{Googol ShallowMind, New London, Michigan, USA} 84 | % % \icmlaffiliation{ed}{School of Computation, University of Edenborrow, Edenborrow, United Kingdom} 85 | 86 | \icmlcorrespondingauthor{Xuan Zeng}{xzeng@fudan.edu.cn} 87 | % \icmlcorrespondingauthor{Eee Pppp}{ep@eden.co.uk} 88 | 89 | % You may provide any keywords that you 90 | % find helpful for describing your paper; these are used to populate 91 | % the "keywords" metadata in the PDF but will not be shown in the document 92 | \icmlkeywords{Bayesian Optimization, Automated analog circuit design} 93 | 94 | \vskip 0.3in 95 | ] 96 | 97 | % this must go after the closing bracket ] following \twocolumn[ ... 98 | 99 | % This command actually creates the footnote in the first column 100 | % listing the affiliations and the copyright notice. 101 | % The command takes one argument, which is text to display at the start of the footnote. 102 | % The \icmlEqualContribution command is standard text for equal contribution. 103 | % Remove it (just {}) if you do not need this facility. 104 | 105 | \input{mo_description} 106 | \input{additional_exp_varying_B} 107 | 108 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 109 | 110 | \bibliography{ref} 111 | \bibliographystyle{icml2018} 112 | 113 | \end{document} 114 | 115 | 116 | % This document was modified from the file originally made available by 117 | % Pat Langley and Andrea Danyluk for ICML-2K. This version was created 118 | % by Iain Murray in 2018. It was modified from a version from Dan Roy in 119 | % 2017, which was based on a version from Lise Getoor and Tobias 120 | % Scheffer, which was slightly modified from the 2010 version by 121 | % Thorsten Joachims & Johannes Fuernkranz, slightly modified from the 122 | % 2009 version by Kiri Wagstaff and Sam Roweis's 2008 version, which is 123 | % slightly modified from Prasad Tadepalli's 2007 version which is a 124 | % lightly changed version of the previous year's version by Andrew 125 | % Moore, which was in turn edited from those of Kristian Kersting and 126 | % Codrina Lauth. Alex Smola contributed to the algorithmic style files. 127 | -------------------------------------------------------------------------------- /paper/mace.tex: -------------------------------------------------------------------------------- 1 | \section{Proposed Batch Bayesian Optimization Algorithm} 2 | We will present the proposed batch Bayesian optimization algorithm in this section. 3 | 4 | \begin{figure*}[tp!] 5 | \centering 6 | \subfigure[True phase margin curve, GP predictions, and Pareto set]{\label{fig:PF_example_1}\includegraphics[width=0.49\textwidth]{./img/pm_gp_ps.eps}} 7 | ~ 8 | \subfigure[The LCB, EI, and PI functions and the Pareto front]{\label{fig:PF_example_2}\includegraphics[width=0.49\textwidth]{./img/pf.eps}} 9 | \caption{Illustration of the multi-objective optimization of acquisition functions} 10 | \label{fig:PF_example} 11 | \end{figure*} 12 | 13 | \subsection{Multi-objective Optimization}\label{sec:MOForumlation} 14 | 15 | Unlike single-objective optimization, there are multiple objectives to optimize in multi-objective optimization problems\cite{MO_overview}. The multi-objective optimization problem is formulated as 16 | \begin{equation} 17 | \label{eq:MOFormulation} 18 | \begin{aligned} 19 | & \text{minimize} & & f_1(\bm{x}),~\dots~,f_m(\bm{x}). 20 | \end{aligned} 21 | \end{equation} 22 | The multiple objectives to be optimized can be conflicting so that it is usually impossible to find a single solution that is the optimum of all objectives. The goal of multi-objective optimization algorithms is to approximate the \emph{Pareto front} of the objectives. A solution $\bm{x}_1$ is said to \emph{dominate} $\bm{x}_2$ if $\forall i \in \{1\dots m\},~f_i(\bm{x}_1) \le f_i(\bm{x}_2)$ and $\exists j \in \{1\dots m\}, f_j(\bm{x}_1) < f_j(\bm{x}_2)$. A design is \emph{Pareto-optimal} if it is not dominated by any other point in the design space and dominates at least one point. The whole set of the Pareto-optimal points in the design space is called the \emph{Pareto set}, and the set of Pareto-optimal points in the objective space is called the \emph{Pareto front}. It is often unlikely to get the whole Pareto front as there might be infinite points on the Paret front, multi-objective optimization algorithms try to find a set of evenly distributed solutions that approximate the true Pareto front. 23 | 24 | There exist many mature multi-objective optimization algorithms, like the non-dominated sorting based genetic algorithm (NSGA-II)~\cite{nsgaii}, and the multi-objective evolutionary algorithm based on decomposition (MOEA/D)~\cite{moead}. In this paper, the multi-objective optimization based on differential evolution (DEMO)~\cite{demo} is used to solve multi-objective optimization problems, but other multi-objective optimization algorithms can also be applied. 25 | 26 | \subsection{Batch Bayesian Optimization via Multi-objective Acquisition Function Ensemble} 27 | 28 | Each acquisition function represents a unique selection strategy, different acquisition functions may not agree with each other about where to sample the next point. For example, the value of LCB function always decreases as the $\sigma(\bm{x})$ increases. However, for the PI function, when $\sigma(\bm{x})$ increases, the value of PI would decrease when $\mu(\bm{x}) < \tau$, and increase when $\mu(\bm{x}) > \tau$. For the EI function, if the function is noiseless, the values of EI function at already sampled points would always be worse than the EI values at any unsampled locations, while this property does not hold for the LCB function. 29 | 30 | \begin{figure*}[!htb] 31 | \begin{center} 32 | \centerline{\includegraphics[width=1.0\linewidth]{./img/convplot.eps}} 33 | \caption{Optimization results of the benchmark functions} 34 | \label{fig:CovPlotBenchmark} 35 | \end{center} 36 | \vskip -0.15in 37 | \end{figure*} 38 | 39 | \begin{algorithm}[!htb] 40 | \caption{Multi-objective Acquisition Ensemble Algorithm} 41 | \label{alg:MACE} 42 | \begin{algorithmic}[1] 43 | \REQUIRE Number of initial sampling points $N_{init}$, number of iterations $N_{iter}$, batch size $B$. 44 | \STATE Randomly sample $N_{init}$ points in the design space 45 | \STATE Construct initial GP model 46 | \FOR{t = 1, 2, \dots, $N_{iter}$} 47 | \STATE Construct the LCB, EI and PI functions according to \eqref{eq:LCB} and \eqref{eq:PI_EI} 48 | \STATE Find the Pareto front of LCB, EI, PI functions using the DEMO algorithm 49 | \STATE Randomly sample $B$ points $\bm{x}_1, \dots, \bm{x}_B$ from the Pareto-optimal points 50 | \STATE Evaluate $\bm{x}_1, \dots, \bm{x}_B$ to get $y_1 = f(\bm{x}_1),~\dots~,y_B = f(\bm{x}_B)$ 51 | \STATE Update the GP model 52 | \ENDFOR 53 | \STATE \textbf{Return} best $f(\bm{x})$ recorded during iterations 54 | \end{algorithmic} 55 | \end{algorithm} 56 | 57 | 58 | With multi-objective optimization, the best trade-off between acquisition functions can be captured by the Pareto front of these acquisition functions. We can then sample on the Pareto front to obtain multiple candidate points for the objective function evaluations. 59 | 60 | The proposed MACE algorithm is described in Algorithm~\ref{alg:MACE}. In the proposed MACE algorithm, the LCB, EI, and PI acquisition functions are selected. Other acquisition functions like KG and PES can also be incorporated into the MACE framework. In each iteration, the following multi-objective optimization problem is constructed: 61 | \begin{equation} 62 | \label{eq:MO_LCB_EI_PI} 63 | \begin{aligned} 64 | & \text{minimize} & & \mathrm{LCB}(\bm{x}),~-\mathrm{EI}(\bm{x}),~-\mathrm{PI}(\bm{x}). 65 | \end{aligned} 66 | \end{equation} 67 | Then the DEMO multi-objective optimization algorithm~\cite{demo} is applied to solve the multi-objective problem in \eqref{eq:MO_LCB_EI_PI}. Once the Pareto front of LCB, EI and PI is obtained, the candidate points are then randomly sampled from the Pareto front. 68 | 69 | In Figure~\ref{fig:PF_example}, we illustrate the proposed MACE algorithm using an example of a real-world amplifier circuit. The optimization objective is to maximize the phase margin (PM) of the amplifier, so the FOM is defined as $\mathrm{FOM}(\bm{x}) = - \mathrm{PM}(\bm{x})$. The width of one of its transistor is the design variable. We sweep the width of the transistor and perform HSPICE simulations to get the FOM values. The curve of FOM values is plotted in Figure~\ref{fig:PF_example_1} (the blue line). Several points are randomly sampled from the FOM curve to train the GP model. The LCB, EI, PI functions and the Pareto front of the acquisition functions are plotted in Figure~\ref{fig:PF_example_2}. We can see from Figure~\ref{fig:PF_example_2} that the optimal locations of the three acquisition functions are different, while their best trade-off is captured by the Pareto front. The Pareto set that represents the best trade-off between the three acquisition functions is the interval $[43, 50.4]$, as plotted in Figure~\ref{fig:PF_example_1}. The candidate points for the next batch of evaluations are randomly sampled from the Pareto set. 70 | 71 | -------------------------------------------------------------------------------- /paper/paper.tex: -------------------------------------------------------------------------------- 1 | %%%%%%%% ICML 2018 EXAMPLE LATEX SUBMISSION FILE %%%%%%%%%%%%%%%%% 2 | 3 | \documentclass{article} 4 | 5 | % Recommended, but optional, packages for figures and better typesetting: 6 | \usepackage{microtype} 7 | \usepackage{graphicx} 8 | \usepackage{subfigure} 9 | \usepackage{booktabs} % for professional tables 10 | 11 | % Added by wenlong lyu 12 | \usepackage{amsmath} 13 | \usepackage[plain]{fancyref} 14 | \usepackage{bm} 15 | \usepackage{todonotes} 16 | \usepackage{placeins} 17 | \usepackage{multirow} 18 | 19 | % hyperref makes hyperlinks in the resulting PDF. 20 | % If your build breaks (sometimes temporarily if a hyperlink spans a page) 21 | % please comment out the following usepackage line and replace 22 | % \usepackage{icml2018} with \usepackage[nohyperref]{icml2018} above. 23 | \usepackage{hyperref} 24 | 25 | % Attempt to make hyperref and algorithmic work together better: 26 | \newcommand{\theHalgorithm}{\arabic{algorithm}} 27 | 28 | % % % Use the following line for the initial blind version submitted for review: 29 | % \usepackage{icml2018} 30 | 31 | % If accepted, instead use the following line for the camera-ready submission: 32 | \usepackage[accepted]{icml2018} 33 | 34 | % The \icmltitle you define below is probably too long as a header. 35 | % Therefore, a short form for the running title is supplied here: 36 | \icmltitlerunning{Batch Bayesian Optimization via Multi-objective Acquisition Ensemble for Automated Analog Circuit Design} 37 | 38 | \begin{document} 39 | 40 | \twocolumn[ 41 | \icmltitle{Batch Bayesian Optimization via Multi-objective Acquisition Ensemble for Automated Analog Circuit Design} 42 | 43 | % It is OKAY to include author information, even for blind 44 | % submissions: the style file will automatically remove it for you 45 | % unless you've provided the [accepted] option to the icml2018 46 | % package. 47 | 48 | % List of affiliations: The first argument should be a (short) 49 | % identifier you will use later to specify author affiliations 50 | % Academic affiliations should list Department, University, City, Region, Country 51 | % Industry affiliations should list Company, City, Region, Country 52 | 53 | % You can specify symbols, otherwise they are numbered in order. 54 | % Ideally, you should not use this facility. Affiliations will be numbered 55 | % in order of appearance and this is the preferred way. 56 | % \icmlsetsymbol{equal}{*} 57 | 58 | \begin{icmlauthorlist} 59 | \icmlauthor{Wenlong Lyu}{fudan} 60 | \icmlauthor{Fan Yang}{fudan} 61 | \icmlauthor{Changhao Yan}{fudan} 62 | \icmlauthor{Dian Zhou}{fudan,utd} 63 | \icmlauthor{Xuan Zeng}{fudan} 64 | % \icmlauthor{Aeiau Zzzz}{equal,to} 65 | % \icmlauthor{Bauiu C.~Yyyy}{equal,to,goo} 66 | % \icmlauthor{Cieua Vvvvv}{goo} 67 | % \icmlauthor{Iaesut Saoeu}{ed} 68 | % \icmlauthor{Fiuea Rrrr}{to} 69 | % \icmlauthor{Tateu H.~Yasehe}{ed,to,goo} 70 | % \icmlauthor{Aaoeu Iasoh}{goo} 71 | % \icmlauthor{Buiui Eueu}{ed} 72 | % \icmlauthor{Aeuia Zzzz}{ed} 73 | % \icmlauthor{Bieea C.~Yyyy}{to,goo} 74 | % \icmlauthor{Teoau Xxxx}{ed} 75 | % \icmlauthor{Eee Pppp}{ed} 76 | \end{icmlauthorlist} 77 | 78 | % \icmlaffiliation{utd}{utdallas} 79 | \icmlaffiliation{fudan}{State Key Lab of ASIC and System, School of Microelectronics, Fudan University, Shanghai, China} 80 | \icmlaffiliation{utd}{Department of Electrical Engineering, University of Texas at Dallas, Richardson, TX, U.S.A} 81 | % \icmlaffiliation{to}{Department of Computation, University of Torontoland, Torontoland, Canada} 82 | % \icmlaffiliation{goo}{Googol ShallowMind, New London, Michigan, USA} 83 | % \icmlaffiliation{ed}{School of Computation, University of Edenborrow, Edenborrow, United Kingdom} 84 | 85 | \icmlcorrespondingauthor{Fan Yang}{yangfan@fudan.edu.cn} 86 | \icmlcorrespondingauthor{Xuan Zeng}{xzeng@fudan.edu.cn} 87 | % \icmlcorrespondingauthor{Eee Pppp}{ep@eden.co.uk} 88 | 89 | % You may provide any keywords that you 90 | % find helpful for describing your paper; these are used to populate 91 | % the "keywords" metadata in the PDF but will not be shown in the document 92 | \icmlkeywords{Bayesian Optimization, Automated analog circuit design} 93 | 94 | \vskip 0.3in 95 | ] 96 | 97 | % this must go after the closing bracket ] following \twocolumn[ ... 98 | 99 | % This command actually creates the footnote in the first column 100 | % listing the affiliations and the copyright notice. 101 | % The command takes one argument, which is text to display at the start of the footnote. 102 | % The \icmlEqualContribution command is standard text for equal contribution. 103 | % Remove it (just {}) if you do not need this facility. 104 | 105 | \printAffiliationsAndNotice{} % leave blank if no need to mention equal contribution 106 | % \printAffiliationsAndNotice{\icmlEqualContribution} % otherwise use the standard text. 107 | 108 | 109 | \input{abstract} 110 | \input{intro} 111 | \input{background} 112 | \input{mace} 113 | \input{experiments} 114 | \input{conclusion} 115 | 116 | \section*{Acknowledgements} 117 | % This research was supported partly by the National Major Science and 118 | % Technology Special Project of China (2017ZX01028101-003), partly by National 119 | % Natural Science Foundation of China (NSFC) research projects 61774045, 120 | % 61574044, 61474026, 61574046, 61674042, and 61628402 and partly by the 121 | % Recruitment Program of Global Experts (the Thousand Talents Plan). 122 | 123 | This research was supported partly by the National Major Science and Technology Special Project of China (2017ZX01028101-003), partly by National Key Research and Development Program of China 2016YFB0201304, partly by National Natural Science Foundation of China (NSFC) research projects 61774045, 61574044, 61474026, 61574046, 61674042, and 61628402 and partly by the Recruitment Program of Global Experts (the Thousand Talents Plan). 124 | 125 | \FloatBarrier 126 | 127 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 128 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 129 | 130 | \bibliography{ref} 131 | \bibliographystyle{icml2018} 132 | 133 | 134 | \end{document} 135 | 136 | 137 | % This document was modified from the file originally made available by 138 | % Pat Langley and Andrea Danyluk for ICML-2K. This version was created 139 | % by Iain Murray in 2018. It was modified from a version from Dan Roy in 140 | % 2017, which was based on a version from Lise Getoor and Tobias 141 | % Scheffer, which was slightly modified from the 2010 version by 142 | % Thorsten Joachims & Johannes Fuernkranz, slightly modified from the 143 | % 2009 version by Kiri Wagstaff and Sam Roweis's 2008 version, which is 144 | % slightly modified from Prasad Tadepalli's 2007 version which is a 145 | % lightly changed version of the previous year's version by Andrew 146 | % Moore, which was in turn edited from those of Kristian Kersting and 147 | % Codrina Lauth. Alex Smola contributed to the algorithmic style files. 148 | -------------------------------------------------------------------------------- /paper/intro.tex: -------------------------------------------------------------------------------- 1 | \section{Introduction} 2 | 3 | % % TODO: more introduction to the importance of anlog IC sizing, as the reviewers may not have much knowledge of circuit design 4 | % 5 | The advancement of modern society is driven by the development of Integrated 6 | Circuits (IC). Unlike the digital circuits where the design flow is already 7 | highly automated, the automation of analog circuit design is still a 8 | challenging problem. 9 | 10 | Traditionally, the design parameters of analog circuits like widths and lengths of 11 | transistors are manually calculated by designers with their experience and the 12 | understanding of the design specifications. However, due to the progress of IC 13 | manufacture technology forecasted by Moore's law, the circuit devices become 14 | more and more complicated, and the parasitic effect of the circuits can no 15 | longer be ignored. On the other hand, the demands for high-performance, 16 | low-power analog circuits are increasing. It is much more difficult to 17 | meet the performance and time-to-market requirements with manual circuit design. 18 | Automated analog circuit design has thus attracted much research interest in 19 | the past decade~\cite{rutenbar2007hierarchical}. 20 | 21 | % TODO: Traditional methods using offline model and simulated based methods are 22 | % not good 23 | The analog circuit design automation problems can be formulated as optimization 24 | problems. The aim is to find the optimal design parameters that provide the 25 | best circuit performance, which can be represented by a figure of merit (FOM) 26 | real-valued function. Prior works about analog circuit optimization 27 | include offline model-based approaches 28 | ~\cite{colleran2003optimization,daems2003simulation,wang2014enabling} and 29 | simulation-based approaches. The offline model-based methods try to build 30 | global models of the FOM via manual calculation or regression with simulated 31 | data and then optimize the cheap-to-evaluate models. The problem with this 32 | approach is that the accurate models are usually hard to get. For example, 33 | in~\citet{wang2014enabling}, 100,000 randomly simulated points are used to train 34 | a sparse polynomial model for an amplifier circuit with ten design parameters. 35 | 36 | Simulation-based methods, instead, treat the performances of the circuits as black-box functions. The performances are obtained from circuit simulations. Global optimization 37 | algorithms are directly applied to the black-box functions. For 38 | simulation-based circuit optimization methods, meta-heuristic 39 | algorithms~\cite{phelps2000anaconda, liu2009analog} are widely used. Although 40 | these algorithms can explore the whole design space, they have relatively low 41 | convergence rate. When the circuit simulation takes a long time, both 42 | model-based and simulation-based approaches can be very time-consuming. 43 | 44 | % TODO: Bayesian optimization is a sequential algorithm, there is a need to 45 | % parallelize it 46 | 47 | In recent years, the Gaussian process (GP)~\cite{GPML} model has been 48 | introduced for the automated design of analog circuits to reduce the 49 | required number of circuit simulations. In~\citet{liu2014gaspad}, GP is combined 50 | with differential evolution algorithm. Recently, Bayesian optimization 51 | (BO)~\cite{shahriari2016taking} algorithm has also been applied for analog 52 | circuit optimization. In~\citet{lyu2017efficient}, Bayesian optimization 53 | algorithm is firstly introduced for the single- and multi-objective 54 | optimization of general analog circuits and has shown to be much more efficient 55 | compared with other simulation-based approaches. In~\citet{wang2017efficient}, 56 | Bayesian optimization algorithm is combined with adaptive Monte-Carlo 57 | sampling to optimize the yield of analog circuits and static random-access 58 | memory (SRAM). 59 | 60 | Bayesian optimization algorithm is a well-studied algorithm and has 61 | demonstrated to be promising for the automated design of analog circuits. 62 | However, the standard Bayesian optimization algorithm is sequential. It chooses 63 | only one point at each iteration by optimizing the acquisition function. It is 64 | often desirable to select a batch of points at each iteration. The sequential 65 | property of Bayesian optimization limits its further applications in multi-core computer systems. 66 | 67 | Bayesian optimization algorithm has been extended to enable batch 68 | selection. Some prior works, like the qEI \cite{qEI}, qKG \cite{wu2016parallel} 69 | and parallel predictive entropy search (PPES)~\cite{shah2015parallel} 70 | approaches, consider to search for the optimal batch selection for a specific 71 | acquisition function. These methods usually involve some approximations or 72 | Monte-Carlo sampling, and thus scale poorly as the batch size increases. Other 73 | works, including the simulation matching (SM)~\cite{azimi2010batch} method, the 74 | batch-UCB (BUCB, BLCB for minimization 75 | problems)~\cite{desautels2014parallelizing} method, the parallel UCB with pure 76 | exploration (GP-UCB-PE)~\cite{contal2013parallel} method, and the local 77 | penalization (LP)~\cite{gonzalez2016batch} method, adopted the \emph{greedy} 78 | strategies that select individual points until the batch is filled. 79 | 80 | % TODO: Beiefly introduce my algorithm 81 | All the batch Bayesian optimization algorithms mentioned above choose to use single acquisition function. 82 | And except for the SM method~\cite{azimi2010batch} and LP method~\cite{gonzalez2016batch} which can use arbitrary acquisition 83 | function, other parallelization methods rely on a specific acquisition 84 | function. The UCB acquisition function must be used for BUCB and GP-UCB-PE, and 85 | the knowledge gradient (KG) acquisition function must be used for the qKG algorithm. As is stated 86 | in~\citet{hoffman2011portfolio}, no single acquisition function can always 87 | outperform other acquisition functions. Relying on one acquisition function may 88 | result in poor performance. 89 | 90 | In this paper, we propose to parallelize Bayesian optimization algorithm 91 | via the Multi-objective ACquisition Ensemble (MACE). The proposed MACE method 92 | exploits the disagreement between different acquisition functions to enable 93 | batch selection. At each iteration, after the GP model is updated, multiple 94 | acquisition functions are selected. We then perform multi-objective 95 | optimization to find the \emph{Pareto front} (PF) of the acquisition functions. 96 | The PF represents the best trade-off between these acquisition functions. When 97 | batch evaluations are possible, we can sample multiple points on the PF to accelerate the optimization. 98 | 99 | The MACE algorithm is tested using several analytical benchmark functions and 100 | two real-world analog circuits, including an operational amplifier with ten 101 | design parameters and a class-E power amplifier with twelve design parameters. 102 | The BLCB method~\cite{desautels2014parallelizing}, local penalization method with expected improvement 103 | acquisition function (EI-LP)~\cite{gonzalez2016batch}, qEI \cite{qEI} and qKG \cite{wu2016parallel} methods are compared with 104 | MACE. The proposed MACE method achieved competitive performance when compared 105 | with the state-of-the-art algorithms listed in the paper. 106 | -------------------------------------------------------------------------------- /paper/background.tex: -------------------------------------------------------------------------------- 1 | \section{Background} 2 | 3 | In this section, we will present the problem formulation of analog circuit optimization, and review the background of Gaussian process regression and Bayesian optimization. 4 | 5 | \subsection{Problem Formulation} 6 | 7 | When designing integrated circuits, the designers have to decide what circuit 8 | topology to use and then set the corrsponding design parameters. In this work, 9 | we handle the scenarios where the topology of the analog circuit is fixed. This 10 | is practical as there are usually a lot of classical topologies for a given 11 | design task, so unlike digital circuits, choosing appropriate topology is 12 | relatively easy. 13 | 14 | Once the circuit topology is fixed, the designer has to choose the appropriate 15 | design parameters according to the specifications and the circuit device model. 16 | What we want to do is automatically searching for the optimal design 17 | parameters. This problem can then be formulated as a bound-constrained 18 | black-box optimization problem: 19 | \begin{equation} 20 | \label{eq:Formulation} 21 | \text{minimize}~\mathrm{FOM}(\bm{x}), 22 | \end{equation} 23 | where $\bm{x} \in \textrm{D}$ is the vector of design variables, 24 | $\mathrm{FOM}(\bm{x})$ is the objective constructed from the design 25 | specifications, the $\mathrm{FOM}(\bm{x})$ can be deterministric or noisy 26 | depending on the design specifications. Given the design parameters $\bm{x}$, 27 | the FOM value can be obtained by commercial circuit simulators like HSPICE or 28 | Spectre. 29 | 30 | \subsection{Gaussian Process Regression} 31 | 32 | % \textcolor{red}{ 33 | % TODO: 34 | % \begin{enumerate} 35 | % \item Noise 36 | % \item MLE learning 37 | % \end{enumerate} 38 | % } 39 | 40 | The objective function $\mathrm{FOM}(\bm{x})$ in \eqref{eq:Formulation} can be 41 | approximated by Gaussian process (GP) model~\cite{GPML}. The GP model is the 42 | most commonly used model for Bayesian optimization. The advantage of GP is that 43 | it provides a well-calibrated uncertainty of prediction. GP is characterized by 44 | a mean function $m(\bm{x})$ and a covariance function $k(\bm{x}, \bm{x'})$. In 45 | this work, we use squared-exponential ARD kernel~\cite{GPML}, and a constant 46 | mean function $m(\bm{x}) = \mu_0$ for all our experiments. By default, we 47 | assume the objective function evaluations are influenced by i.i.d. noise 48 | $\epsilon_t \sim N(0, \sigma_n^2)$ and set the noise level $\sigma_n^2$ as a 49 | hyperparameter. The introduction of the i.i.d noise also helps to improve the numerical stability. 50 | 51 | Denote the training set as $\{X, \bm{y}\}$ where $X = \{\bm{x}_1, \dots, \bm{x}_N\}$ and $\bm{y} = \{y_1, \dots, y_N\}$, given a new data point $\bm{x}$, the prediction of $f(\bm{x})$ is not a scalar value, but a predictive distribution 52 | \begin{equation} 53 | f(\bm{x}) \sim N(\mu(\bm{x}), 54 | \sigma^2(\bm{x})), 55 | \label{eq:GPRPred} 56 | \end{equation} 57 | where $\mu(\bm{x})$ and $\sigma^2(\bm{x})$ can be expressed as 58 | \begin{equation} 59 | \begin{array}{lll} 60 | \mu(\bm{x}) &=& \mu_0 + k(\bm{x},X)[K+\sigma_n^2I]^{-1}(\bm{y} - \mu_0) \\ 61 | \sigma^2(\bm{x}) &=& k(\bm{x}, \bm{x}) - k(\bm{x}, X)[K+\sigma_n^2I]^{-1}k(X, \bm{x}), 62 | \end{array} 63 | \label{eq:GPRPredEqNoisy} 64 | \end{equation} 65 | where $k(\bm{x}, X) = (k(\bm{x}, \bm{x}_1), \dots, k(\bm{x}, 66 | \bm{x}_N))^T$ and $k(X, \bm{x}) = k(\bm{x}, X)^T$. The 67 | $\mu(\bm{x})$ can be viewed as the prediction of the function value, while 68 | the $\sigma^2(\bm{x})$ is a measure of uncertainty of the prediction. 69 | 70 | \subsection{Bayesian Optimization} 71 | 72 | Bayesian optimization~\cite{shahriari2016taking} was proposed for the 73 | optimization of expensive black-box functions. It consists of two essential 74 | ingredients, i.e., the probabilistic surrogate models and the acquisition 75 | functions. The probabilistic surrogate models provide predictions with 76 | uncertainties. The acquisition functions make use of the predictive 77 | distribution to explore the state space. The procedure of Bayesian optimization 78 | is summarized in Algorithm~\ref{alg:BayesianOptAlgo}. 79 | 80 | 81 | \begin{algorithm} 82 | \caption{Bayesian Optimization} 83 | \label{alg:BayesianOptAlgo} 84 | \begin{algorithmic}[1] 85 | \REQUIRE Number of initial sampling points $N_{init}$, number of iterations $N_{iter}$ 86 | \STATE Randomly sample $N_{init}$ points in the design space 87 | \STATE Construct initial GP model 88 | \FOR{t = 1, 2, \dots, $N_{iter}$} 89 | \STATE Construct the acquisition function 90 | \STATE Find $\bm{x}_t$ that optimizes the acquisition function 91 | \STATE Sample $y_t = f(\bm{x}_t)$ 92 | \STATE Update probabilistic surrogate model 93 | \ENDFOR 94 | \STATE \textbf{Return} best $f(\bm{x})$ recorded during iterations 95 | \end{algorithmic} 96 | \end{algorithm} 97 | 98 | In Bayesian optimization described in Algorithm~\ref{alg:BayesianOptAlgo}, the acquisition function is used to balance the exploration and exploitation during the optimization. The acquisition function considers both the predictive value and the uncertainty. There are a lot of existing acquisition functions. Examples include the lower confidence bound (LCB), the probability of improvement (PI), and the expected improvement (EI). 99 | 100 | The LCB function is defined as follows: 101 | \begin{equation} 102 | \label{eq:LCB} 103 | \mathrm{LCB}(\bm{x}) = \mu(\bm{x}) - \kappa \sigma(\bm{x}), 104 | \end{equation} 105 | where the $\mu(\bm{x})$ and the $\sigma(\bm{x})$ are the predictive value and uncertainty of GP defined in \eqref{eq:GPRPredEqNoisy}, $\kappa$ is a parameter that balances the exploitation and exploration. 106 | 107 | Following the suggestion of~\cite{srinivas2010gaussian, brochu2010tutorial}, the $\kappa$ in \eqref{eq:LCB} is defined as: 108 | \begin{equation} 109 | \label{eq:LCBKappa} 110 | \begin{array}{lll} 111 | \kappa &=& \sqrt{\nu \tau_t} \\ 112 | \tau_t &=& 2 \log(t^{d/2+2} \pi^2 / 3 \delta), 113 | \end{array} 114 | \end{equation} 115 | where $t$ is the number of current iteration, $\nu$ and $\delta$ are two user-defined parameters. We fix $\nu = 0.5$ and $\delta = 0.05$ in this paper for the proposed MACE algorithm and our implementation of the BLCB algorithm. 116 | 117 | The PI and EI functions are defined as 118 | \begin{equation} 119 | \label{eq:PI_EI} 120 | \begin{array}{lll} 121 | \mathrm{PI}(\bm{x}) &=& \Phi(\lambda) \\ 122 | \mathrm{EI}(\bm{x}) &=& \sigma(\bm{x}) (\lambda \Phi(\lambda) + \phi(\lambda)) \\ 123 | \mathrm{\lambda} &=& \displaystyle \frac{\tau - \xi - \mu(\bm{x})}{\sigma(\bm{x})}, 124 | \end{array} 125 | \end{equation} 126 | where $\tau$ is the current best value objective value, and $\xi$ is a small positive jitter to improvement the ability of exploration. The $\Phi(.)$ and $\phi(.)$ functions are the CDF and PDF functions of normal distribution. In our implementation of the MACE algorithm, we fix $\xi$ = 1e-3. 127 | 128 | % TODO: discuss the different behaviours of LCB, EI, PI 129 | 130 | There are also other acquisition functions, like the knowledge gradient~\cite{scott2011correlated} function, predictive entropy search~\cite{hernandez2014predictive}, and the max-value entropy search\cite{wang2017max}. A portfolio of several acquisition functions is also possible~\cite{hoffman2011portfolio}. 131 | -------------------------------------------------------------------------------- /paper/additional_exp_varying_B.tex: -------------------------------------------------------------------------------- 1 | \section{Additional Experiments with Varied Batch Sizes} 2 | 3 | We performed additional experiments with varied batch sizes $B = 2$, $B = 3$ 4 | and $B = 5$, the results for the analytical benchmark functions are shown in \Fref{tab:result_analytical_b2}, 5 | \Fref{tab:result_analytical_b3} and \Fref{tab:result_analytical_b5}. The 6 | optimization results of the operational amplifier are listed in 7 | \Fref{tab:result_opamp_vary_B}, the optimization results of the class-E power 8 | amplifier are given in \Fref{tab:result_classE_vary_B}. With 9 | varied batch sizes, the proposed MACE method remain competitive compared with 10 | the state-of-the-art batch Bayesian optimization methods. 11 | 12 | \begin{table*}[!htb] 13 | \centering 14 | \caption{Statistics of the regrets of the benchmark functions with batch size $B=2$} 15 | \label{tab:result_analytical_b2} 16 | \begin{tabular}{lllllll} 17 | \toprule 18 | Algorithm & MACE & BLCB & EI-LP & QKG & QEI \\ 19 | \midrule 20 | Ackley & 1.15 $\pm$ 0.646 & 1.7 $\pm$ 0.85 & \textbf{0.507 $\pm$ 0.408} & 4.31 $\pm$ 1.81 & 3.07 $\pm$ 0.786 \\ 21 | Alpine1 & \textbf{1.38 $\pm$ 0.768} & 3.23 $\pm$ 1.03 & 1.55 $\pm$ 0.689 & 3.17 $\pm$ 0.749 & 2.4 $\pm$ 0.904 \\ 22 | Branin & \textbf{5.6e-6 $\pm$ 1.03e-5} & 1.86e-4 $\pm$ 2.65e-4 & 0.0257 $\pm$ 0.0395 & 0.21 $\pm$ 0.159 & 8.27e-4 $\pm$ 1.56e-3 \\ 23 | Eggholder & 116 $\pm$ 65.4 & 132 $\pm$ 66.2 & \textbf{82.7 $\pm$ 51.6} & 115 $\pm$ 78.3 & 104 $\pm$ 78.4 \\ 24 | Hartmann6 & \textbf{0.0479 $\pm$ 0.0584} & 0.0719 $\pm$ 0.0587 & 0.161 $\pm$ 0.301 & 0.257 $\pm$ 0.0823 & 0.178 $\pm$ 0.128 \\ 25 | Rosenbrock & \textbf{1.05e-3 $\pm$ 0.0011} & 5.56e-3 $\pm$ 9.28e-3 & 8.37 $\pm$ 5.63 & 9.41 $\pm$ 10.7 & 10.3 $\pm$ 8.52 \\ 26 | Ackley10D & \textbf{2.75 $\pm$ 0.497} & 3.13 $\pm$ 0.723 & 18.5 $\pm$ 1.02 & 18.4 $\pm$ 0.943 & 18.8 $\pm$ 0.608 \\ 27 | Rosenbrock10D & \textbf{223 $\pm$ 104} & 552 $\pm$ 223 & 1.1e+03 $\pm$ 496 & 957 $\pm$ 439 & 757 $\pm$ 405 \\ 28 | \bottomrule 29 | \end{tabular} 30 | \end{table*} 31 | 32 | \begin{table*}[!htb] 33 | \centering 34 | \caption{Statistics of the regrets of the benchmark functions with batch size $B=3$} 35 | \label{tab:result_analytical_b3} 36 | \begin{tabular}{lllllll} 37 | \toprule 38 | Algorithm & MACE & BLCB & EI-LP & QKG & QEI \\ 39 | \midrule 40 | Ackley & 1.37 $\pm$ 1.39 & 1.71 $\pm$ 1.02 & \textbf{0.216 $\pm$ 0.148} & 5.49 $\pm$ 1.94 & 2.34 $\pm$ 0.788 \\ 41 | Alpine1 & \textbf{1.03 $\pm$ 0.746} & 2.63 $\pm$ 1.2 & 1.1 $\pm$ 0.376 & 3.18 $\pm$ 0.225 & 2.25 $\pm$ 0.42 \\ 42 | Branin & \textbf{2.85e-5 $\pm$ 3.18e-5} & 8.14e-5 $\pm$ 1.27e-4 & 0.0344 $\pm$ 0.0183 & 0.247 $\pm$ 0.188 & 5.21e-5 $\pm$ 1.35e-4 \\ 43 | Eggholder & \textbf{65.3 $\pm$ 62.9} & 82.6 $\pm$ 32.2 & 65.9 $\pm$ 43.3 & 117 $\pm$ 79.2 & 81.7 $\pm$ 63.1 \\ 44 | Hartmann6 & \textbf{0.012 $\pm$ 0.0359} & 0.0477 $\pm$ 0.0584 & 0.0489 $\pm$ 0.0531 & 0.335 $\pm$ 0.188 & 0.189 $\pm$ 0.108 \\ 45 | Rosenbrock & \textbf{9.46e-4 $\pm$ 7.75e-4} & 0.00148 $\pm$ 0.00212 & 3.78 $\pm$ 3.4 & 4.28 $\pm$ 5.5 & 5.44 $\pm$ 4.21 \\ 46 | Ackley10D & 3.05 $\pm$ 0.682 & \textbf{3.05 $\pm$ 0.431} & 17.6 $\pm$ 3.53 & 18.5 $\pm$ 0.731 & 18.6 $\pm$ 0.438 \\ 47 | Rosenbrock10D & \textbf{208 $\pm$ 92.5} & 389 $\pm$ 187 & 653 $\pm$ 473 & 695 $\pm$ 307 & 953 $\pm$ 410 \\ 48 | \bottomrule 49 | \end{tabular} 50 | \end{table*} 51 | 52 | \begin{table*}[!htb] 53 | \centering 54 | \caption{Statistics of the regrets of the benchmark functions with batch size $B=5$} 55 | \label{tab:result_analytical_b5} 56 | \begin{tabular}{lllllll} 57 | \toprule 58 | Algorithm & MACE & BLCB & EI-LP & QKG & QEI \\ 59 | \midrule 60 | Ackley & 1.7 $\pm$ 1.02 & 1.38 $\pm$ 0.836 & \textbf{0.105 $\pm$ 0.0978} & 5.27 $\pm$ 1.38 & 2.16 $\pm$ 1.11 \\ 61 | Alpine1 & \textbf{0.654 $\pm$ 0.317} & 1.68 $\pm$ 1.26 & 0.766 $\pm$ 0.441 & 3.21 $\pm$ 0.497 & 2.05 $\pm$ 0.341 \\ 62 | Branin & \textbf{1.26e-5 $\pm$ 1.81e-5} & 2.99e-5 $\pm$ 3.42e-5 & 0.0144 $\pm$ 0.0154 & 0.163 $\pm$ 0.163 & 2.02e-5 $\pm$ 5.21e-5 \\ 63 | Eggholder & 74.1 $\pm$ 74.3 & 61.1 $\pm$ 33.5 & 63.5 $\pm$ 94.3 & 71 $\pm$ 29.4 & \textbf{49.1 $\pm$ 25.8} \\ 64 | Hartmann6 & 0.0477 $\pm$ 0.0584 & \textbf{0.0358 $\pm$ 0.0546} & 0.0552 $\pm$ 0.0546 & 0.47 $\pm$ 0.221 & 0.198 $\pm$ 0.105 \\ 65 | Rosenbrock & \textbf{5.48e-4 $\pm$ 8.12e-4} & 9.39e-4 $\pm$ 6.83e-4 & 2.72 $\pm$ 1.97 & 3.42 $\pm$ 4.8 & 6.69 $\pm$ 5.34 \\ 66 | Ackley10D & \textbf{2.63 $\pm$ 0.486} & 3.05 $\pm$ 0.319 & 15.7 $\pm$ 5.69 & 18.1 $\pm$ 0.476 & 18.1 $\pm$ 0.653 \\ 67 | Rosenbrock10D & \textbf{81.9 $\pm$ 22.9} & 348 $\pm$ 83.7 & 645 $\pm$ 470 & 893 $\pm$ 393 & 705 $\pm$ 314 \\ 68 | \bottomrule 69 | \end{tabular} 70 | \end{table*} 71 | 72 | \begin{table*}[!htb] 73 | \centering 74 | \caption{Optimization Results of the Operational Amplifier with $B = 2$, $B = 3$ annd $B = 5$} 75 | \label{tab:result_opamp_vary_B} 76 | \begin{tabular}{llll} 77 | \toprule 78 | Algorithm & MACE & BLCB & EI-LP \\ \midrule 79 | B=2 & \textbf{-689 $\pm$ 4.37} & -649 $\pm$ 28.8 & -627 $\pm$ 48.5 \\ 80 | B=3 & \textbf{-690 $\pm$ 0.518} & -672 $\pm$ 20.4 & -621 $\pm$ 45.2 \\ 81 | B=5 & \textbf{-690 $\pm$ 0.0251} & -684 $\pm$ 6.86 & -626 $\pm$ 49 \\ 82 | 83 | 84 | 85 | 86 | \bottomrule 87 | \end{tabular} 88 | \end{table*} 89 | 90 | 91 | \begin{table*}[!htb] 92 | \centering 93 | \caption{Optimization Results of the class-E Power Amplifier with $B = 2$, $B = 3$ annd $B = 5$} 94 | \label{tab:result_classE_vary_B} 95 | \begin{tabular}{llll} 96 | \toprule 97 | Algorithm & MACE & BLCB & EI-LP \\ 98 | \midrule 99 | B=2 & \textbf{-4.13 $\pm$ 0.207} & -4.01 $\pm$ 0.208 & -3.65 $\pm$ 0.312 \\ 100 | B=3 & \textbf{-4.45 $\pm$ 0.326} & -4.17 $\pm$ 0.163 & -3.87 $\pm$ 0.306 \\ 101 | B=5 & \textbf{-4.26 $\pm$ 0.18 } & -4.17 $\pm$ 0.111 & -4.18 $\pm$ 0.222 \\ 102 | \bottomrule 103 | \end{tabular} 104 | \end{table*} 105 | -------------------------------------------------------------------------------- /paper/ICML_poster.tex: -------------------------------------------------------------------------------- 1 | % \documentclass[landscape,a0paper,fontscale=0.292]{baposter} 2 | \documentclass[landscape,paperwidth=200cm, paperheight=120cm,fontscale=0.19]{baposter} 3 | 4 | \usepackage[vlined]{algorithm2e} 5 | \usepackage{times} 6 | \usepackage{calc} 7 | \usepackage{url} 8 | \usepackage{graphicx} 9 | \usepackage{amsmath} 10 | \usepackage{amssymb} 11 | \usepackage{relsize} 12 | \usepackage{multirow} 13 | \usepackage{booktabs} 14 | \usepackage{subfigure} 15 | \usepackage{bm} 16 | 17 | \usepackage{graphicx} 18 | \usepackage{multicol} 19 | \usepackage[T1]{fontenc} 20 | \usepackage{ae} 21 | 22 | 23 | 24 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 25 | %% Begin of Document 26 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 27 | \begin{document} 28 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 | %% Here starts the poster 30 | %%--------------------------------------------------------------------------- 31 | %% Format it to your taste with the options 32 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33 | \begin{poster}{ 34 | % Show grid to help with alignment 35 | grid=false, 36 | % Column spacing 37 | colspacing=0.7em, 38 | % Color style 39 | headerColorOne=cyan!20!white!90!black, 40 | borderColor=cyan!30!white!90!black, 41 | % Format of textbox 42 | textborder=faded, 43 | % Format of text header 44 | headerborder=open, 45 | headershape=roundedright, 46 | headershade=plain, 47 | background=none, 48 | bgColorOne=cyan!10!white, 49 | headerheight=0.14\textheight} 50 | % Eye Catcher 51 | { 52 | % \includegraphics[width=0.08\linewidth]{track_frame_00010_06} 53 | % \includegraphics[width=0.08\linewidth]{track_frame_00450_06} 54 | % \includegraphics[width=0.08\linewidth]{track_frame_04999_06} 55 | } 56 | % Title 57 | {Batch Bayesian Optimization via Multi-objective Acquisition Ensemble for Automated Analog Circuit Design} 58 | % Authors 59 | { 60 | Wenlong Lyu$^1$, Fan Yang$^1$, Changhao Yan$^1$, Dian Zhou$^{1, 2}$ and Xuan Zeng$^1$ \\ 61 | $^1$ \small State Key Lab of ASIC and System, School of Microelectronics, Fudan University, Shanghai, China \\ 62 | $^2$ \small Department of Electrical Engineering, University of Texas at Dallas, Richardson, TX, U.S.A 63 | } 64 | % University logo 65 | { 66 | % \begin{tabular}{r} 67 | % \includegraphics[height=0.12\textheight]{logo}\\ 68 | % \raisebox{0em}[0em][0em]{\includegraphics[height=0.03\textheight]{msrlogo}} 69 | % \end{tabular} 70 | } 71 | 72 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 73 | %%% Now define the boxes that make up the poster 74 | %%%--------------------------------------------------------------------------- 75 | %%% Each box has a name and can be placed absolutely or relatively. 76 | %%% The only inconvenience is that you can only specify a relative position 77 | %%% towards an already declared box. So if you have a box attached to the 78 | %%% bottom, one to the top and a third one which should be inbetween, you 79 | %%% have to specify the top and bottom boxes before you specify the middle 80 | %%% box. 81 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 82 | 83 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 84 | \headerbox{Motivation}{name=motivation,column=0,row=0,span=1}{ 85 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 86 | \begin{itemize} 87 | \item The design of analog integrated circuits heavily relys on designers' manual calculation, which can be difficult as the progress of Moore's law 88 | \item Circuit simulation can be viewed as black-box function that maps the design variables to the circuit performance, global optimization algorithms can be applied to optimize the circuits 89 | \item In our previous work, we applied Bayesian optimization for the efficient optimization of analog circuits 90 | \item Bayesian optimization needs to be paralleled to use available multi-core systems 91 | \end{itemize} 92 | } 93 | \headerbox{Bayesian Optimization}{name=BO,column=0,span=1, below=motivation}{ 94 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 95 | \begin{itemize} 96 | \item Gaussian process used as probabilistic model of the black-box function 97 | \item Acquisition functions are constructed and optimized to find promising design 98 | \item Many existing acquisition functions: EI, PI, LCB and so on, these acquisition fucntions may not agree with each other 99 | \end{itemize} 100 | } 101 | 102 | \headerbox{Multi-objective optimization}{name=MO,column=0,span=1, above=bottom, below=BO}{ 103 | Suppose we have $m$ objectives, the formulation of the problem is 104 | $$ 105 | \text{minimize} f_1(\bm{x}),\dots,f_m(\bm{x}) 106 | $$ 107 | 108 | For two designs \(\bm{x}_1\) and \(\bm{x}_2\), \(\bm{x}_1\) \textbf{domininates} \(\bm{x}_2\) if 109 | 110 | \begin{itemize} 111 | \item 112 | $\forall i \in 1 \dots m, f_i(\bm{x}_1) \le f_i(\bm{x}_2)$ 113 | \item 114 | $\exists i \in 1 \dots m, f_i(\bm{x}_1) < f_i(\bm{x}_2)$ 115 | \end{itemize} 116 | 117 | If a design is not domininated by any other design, it is said to be \textbf{Pareto-optimal}. All the Pareto-optimal points in the design space are the \textbf{Pareto set}. All the Pareto-optimal points in the objective space are the \textbf{Pareto front}. The goal of multi-objective is to find a set of evenly distributed points on the Pareto front 118 | } 119 | 120 | \headerbox{Multi-objective Acquisition Function Ensemble (MACE)}{name=proposed,column=1,span=2, row=0}{ 121 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 122 | \begin{itemize} 123 | \item At each iteration, train GP model and construct EI, PI and LCB acquisition functions 124 | \item Perform \textbf{multi-objective} optimization to find the Pareto front of the three acquisition functions 125 | \item Sample $B$ points from the Pareto front and evaluate them, $B$ is the batch size 126 | \end{itemize} 127 | } 128 | 129 | \headerbox{Multi-objective optimization of multiple acquisition functions}{name=MACE,column=1,below=proposed, span=2}{ 130 | \center{ 131 | \includegraphics[width=0.36\textwidth]{./img/pm_gp_ps.eps} 132 | ~ 133 | \includegraphics[width=0.36\textwidth]{./img/pf.eps} 134 | 135 | New points are selected from the Pareto set (the yellow points) of the acquisition functions 136 | } 137 | 138 | } 139 | 140 | 141 | \headerbox{Results of Benchmark Functions}{name=Benchmark,column=1,span=2, below=MACE, above=bottom}{ 142 | \center{ 143 | \includegraphics[width=0.82\linewidth]{./img/convplot.eps} 144 | } 145 | 146 | Dotted lines: optimization result with batch size $B$=1. Solid lines: optimization results with batch size $B$=4 147 | 148 | % \subfigure[]{\label{fig:PF_example_1}\includegraphics[width=0.49\textwidth]{./img/pm_gp_ps.eps}} 149 | % ~ 150 | % \subfigure[]{\label{fig:PF_example_2}\includegraphics[width=0.49\textwidth]{./img/pf.eps}} 151 | % \label{fig:PF_example} 152 | % \end{figure} 153 | 154 | % \caption{Optimization results of the benchmark functions} 155 | % \label{fig:CovPlotBenchmark} 156 | } 157 | 158 | \headerbox{Schematic of the OpAmp Circuit}{name=schopamp,column=3,span=1, row=0}{ 159 | \centerline{\includegraphics[width=0.60\linewidth]{./img/sopam.pdf}} 160 | } 161 | \headerbox{Results of the OpAmp circuit}{name=opamp,column=3,span=1, below=schopamp}{ 162 | \centerline{\includegraphics[width=0.60\linewidth]{./img/mean_DAC2014.eps}} 163 | } 164 | \headerbox{Schematic of the Power Amplifier}{name=schpa,column=3,span=1, below=opamp}{ 165 | \centerline{\includegraphics[width=0.60\linewidth]{./img/classE.eps}} 166 | } 167 | \headerbox{Results of the power amplifier}{name=PA,column=3,span=1, below=schpa}{ 168 | \centerline{\includegraphics[width=0.60\linewidth]{./img/ClassE_mean.eps}} 169 | } 170 | 171 | \end{poster} 172 | % 173 | \end{document} 174 | -------------------------------------------------------------------------------- /MACE.h: -------------------------------------------------------------------------------- 1 | // MACE means "Multi-objective ACquisition Ensemble" 2 | #pragma once 3 | #include "def.h" 4 | #include "GP.h" 5 | #include "MOO.h" 6 | #include "NLopt_wrapper.h" 7 | #include 8 | #include 9 | #include 10 | class MACE 11 | { 12 | public: 13 | typedef std::function Obj; 14 | enum SelectStrategy 15 | { 16 | Random = 0, 17 | Greedy, 18 | Extreme 19 | }; 20 | MACE(Obj f, size_t num_spec, const Eigen::VectorXd& lb, const Eigen::VectorXd& ub, 21 | std::string log_name = "mace.log"); 22 | ~MACE(); 23 | void initialize(const Eigen::MatrixXd& dbx, const Eigen::MatrixXd& dby); 24 | void initialize(size_t); 25 | void initialize(std::string xfile, std::string yfile); 26 | 27 | void set_init_num(size_t); 28 | void set_max_eval(size_t); 29 | void set_force_select_hyp(bool); 30 | void set_tol_no_improvement(size_t); 31 | void set_eval_fixed(size_t); 32 | void set_seed(size_t); 33 | void set_gp_noise_lower_bound(double); 34 | void set_mo_record(bool); 35 | void set_mo_gen(size_t); 36 | void set_mo_np(size_t); 37 | void set_mo_f(double); 38 | void set_mo_cr(double); 39 | void set_batch(size_t); 40 | void set_selection_strategy(SelectStrategy ss){_ss = ss;} 41 | void set_use_sobol(bool flag){_use_sobol = flag;} 42 | void set_noise_free(bool flag){_noise_free = flag;} 43 | void set_lcb_upsilon(double u) {_upsilon = u; } 44 | void set_lcb_delta(double d) {_delta = d; } 45 | void set_EI_jitter(double j) {_EI_jitter = j; } 46 | void set_eps(double e) { _eps = e; } 47 | void set_posterior_ref(bool f) { _posterior_ref = f; } 48 | 49 | Eigen::VectorXd best_x() const; 50 | Eigen::VectorXd best_y() const; 51 | 52 | void optimize_one_step(); // one iteration of BO, so that BO could be used as a plugin of other application 53 | void optimize(); // bayesian optimization 54 | void blcb(); // one iteration of BLCB 55 | Eigen::MatrixXd blcb_one_step(); // one iteration of BLCB 56 | 57 | private: 58 | Obj _func; 59 | 60 | protected: 61 | const Eigen::VectorXd _lb; 62 | const Eigen::VectorXd _ub; 63 | const double _scaled_lb; 64 | const double _scaled_ub; 65 | Eigen::VectorXd _a; 66 | Eigen::VectorXd _b; 67 | std::string _log_name; 68 | 69 | // config 70 | const size_t _num_spec; 71 | const size_t _dim; 72 | double _noise_lvl = 1e-3; 73 | size_t _num_init = 2; 74 | size_t _max_eval = 100; 75 | size_t _batch_size = 1; 76 | bool _force_select_hyp = false; 77 | bool _posterior_ref = false; 78 | size_t _tol_no_improvement = 10; 79 | size_t _eval_fixed = 100; // after _eval_fixed evaluations, only train GP when _tol_no_improvement is reached 80 | bool _mo_record = false; 81 | size_t _mo_gen = 250; 82 | size_t _mo_np = 100; 83 | double _mo_f = 0.5; 84 | double _mo_cr = 0.3; 85 | double _seed = std::random_device{}(); 86 | bool _noise_free = false; 87 | bool _use_sobol = false; // use sobol for initial sampling 88 | SelectStrategy _ss = SelectStrategy::Random; 89 | // bool _use_extreme = true; // when selecting points on PF, firstly select the point with extreme value, if batch = 90 | // // 1, select the point with best EI, if batch = 2, select points with best EI and best 91 | // // LCB 92 | 93 | // inner state 94 | GP* _gp = nullptr; 95 | size_t _eval_counter = 0; 96 | size_t _no_improve_counter = 0; 97 | bool _have_feas = false; 98 | double _delta = 0.1; 99 | double _upsilon = 0.2; 100 | double _EI_jitter = 0; // EI_jitter to make EI-based search more explorative 101 | double _kappa = 1.0; 102 | double _eps = 1e-3; 103 | Eigen::MatrixXd _nlz; // negative log likelihood of the GP model on training data 104 | Eigen::MatrixXd _hyps; 105 | Eigen::VectorXd _best_x; 106 | Eigen::VectorXd _best_y; 107 | Eigen::VectorXd _best_posterior_x; // best solution of GP posterior mean 108 | Eigen::VectorXd _best_posterior_y; 109 | Eigen::MatrixXd _eval_x; 110 | Eigen::MatrixXd _eval_y; 111 | std::mt19937_64 _engine = std::mt19937_64(_seed); 112 | std::vector _acq_pool{"log_lcb_improv_transf", "log_ei", "pi_transf"}; 113 | 114 | // inner functions 115 | Eigen::MatrixXd _set_random(size_t num); // random sampling in [_scaled_lb, _scaled_lbub] 116 | Eigen::MatrixXd _doe(size_t num); // design of experiments via sobol quasi-random 117 | void _train_GP(); 118 | 119 | Eigen::MatrixXd _rescale(const Eigen::MatrixXd& xs) const noexcept; // scale x from [scaled_lb, scaled_ub] to [lb, ub] 120 | Eigen::MatrixXd _unscale(const Eigen::MatrixXd& xs) const noexcept; // scale x from [lb, ub] to [scaled_lb, scaled_ub] 121 | 122 | double _violation(const Eigen::VectorXd& v) const; 123 | bool _better(const Eigen::VectorXd& v1, const Eigen::VectorXd& v2) const; 124 | bool _is_feas(const Eigen::VectorXd& v) const; 125 | 126 | void _init_boost_log() const; 127 | 128 | size_t _find_best(const Eigen::MatrixXd& dby) const; 129 | std::vector _seq_idx(size_t) const; 130 | std::vector _pick_from_seq(size_t, size_t); 131 | Eigen::MatrixXd _slice_matrix(const Eigen::MatrixXd&, const std::vector&) const; 132 | void _moo_config(MOO&) const; 133 | void _print_log(); 134 | 135 | Eigen::MatrixXd _run_func(const Eigen::MatrixXd&); 136 | 137 | // acquisition functions 138 | double _pf(const Eigen::VectorXd&) const; 139 | double _pf(const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 140 | double _log_pf(const Eigen::VectorXd&) const; 141 | double _log_pf(const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 142 | double _ei(const Eigen::VectorXd&) const; 143 | double _ei(const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 144 | double _log_ei(const Eigen::VectorXd&) const; 145 | double _log_ei(const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 146 | double _lcb_improv(const Eigen::VectorXd&) const; // tau - lcb 147 | double _lcb_improv(const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 148 | double _lcb_improv_transf(const Eigen::VectorXd&) const; // transform lcb - tau from [-inf, inf] to [-inf, 0] 149 | double _lcb_improv_transf(const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 150 | double _log_lcb_improv_transf(const Eigen::VectorXd&) const; 151 | double _log_lcb_improv_transf(const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 152 | double _pi_transf(const Eigen::VectorXd&) const; 153 | double _pi_transf(const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 154 | double _s2(const Eigen::VectorXd& ) const; 155 | double _s2(const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 156 | double _acq(std::string name, const Eigen::VectorXd&) const; 157 | double _acq(std::string name, const Eigen::VectorXd&, Eigen::VectorXd& grad) const; 158 | 159 | 160 | Eigen::VectorXd _msp(NLopt_wrapper::func f, const Eigen::MatrixXd& sp, nlopt::algorithm=nlopt::LD_SLSQP, size_t max_eval = 100); 161 | Eigen::MatrixXd _set_anchor(); 162 | Eigen::MatrixXd _select_candidate(const Eigen::MatrixXd&, const Eigen::MatrixXd&); 163 | Eigen::MatrixXd _select_candidate_random(const Eigen::MatrixXd&, const Eigen::MatrixXd&); 164 | Eigen::MatrixXd _select_candidate_greedy(const Eigen::MatrixXd&, const Eigen::MatrixXd&); 165 | Eigen::MatrixXd _select_candidate_extreme(const Eigen::MatrixXd&, const Eigen::MatrixXd&); 166 | double _get_tau(size_t spec_idx) const; 167 | void _set_kappa(); 168 | bool _duplication_checking(const Eigen::VectorXd& x) const; 169 | bool _duplication_checking(const Eigen::VectorXd& x, const Eigen::MatrixXd& ref) const; 170 | Eigen::MatrixXd _adjust_x(const Eigen::MatrixXd& x); 171 | Eigen::MatrixXd _adaptive_sampling(); 172 | void _set_best_posterior_mean(); 173 | }; 174 | -------------------------------------------------------------------------------- /paper/algorithmic.sty: -------------------------------------------------------------------------------- 1 | % ALGORITHMIC STYLE -- Released 8 APRIL 1996 2 | % for LaTeX version 2e 3 | % Copyright -- 1994 Peter Williams 4 | % E-mail PeterWilliams@dsto.defence.gov.au 5 | % 6 | % Modified by Alex Smola (08/2000) 7 | % E-mail Alex.Smola@anu.edu.au 8 | % 9 | \NeedsTeXFormat{LaTeX2e} 10 | \ProvidesPackage{algorithmic} 11 | \typeout{Document Style `algorithmic' - environment} 12 | % 13 | \RequirePackage{ifthen} 14 | \RequirePackage{calc} 15 | \newboolean{ALC@noend} 16 | \setboolean{ALC@noend}{false} 17 | \newcounter{ALC@line} 18 | \newcounter{ALC@rem} 19 | \newlength{\ALC@tlm} 20 | % 21 | \DeclareOption{noend}{\setboolean{ALC@noend}{true}} 22 | % 23 | \ProcessOptions 24 | % 25 | % ALGORITHMIC 26 | \newcommand{\algorithmicrequire}{\textbf{Require:}} 27 | \newcommand{\algorithmicensure}{\textbf{Ensure:}} 28 | \newcommand{\algorithmiccomment}[1]{\{#1\}} 29 | \newcommand{\algorithmicend}{\textbf{end}} 30 | \newcommand{\algorithmicif}{\textbf{if}} 31 | \newcommand{\algorithmicthen}{\textbf{then}} 32 | \newcommand{\algorithmicelse}{\textbf{else}} 33 | \newcommand{\algorithmicelsif}{\algorithmicelse\ \algorithmicif} 34 | \newcommand{\algorithmicendif}{\algorithmicend\ \algorithmicif} 35 | \newcommand{\algorithmicfor}{\textbf{for}} 36 | \newcommand{\algorithmicforall}{\textbf{for all}} 37 | \newcommand{\algorithmicdo}{\textbf{do}} 38 | \newcommand{\algorithmicendfor}{\algorithmicend\ \algorithmicfor} 39 | \newcommand{\algorithmicwhile}{\textbf{while}} 40 | \newcommand{\algorithmicendwhile}{\algorithmicend\ \algorithmicwhile} 41 | \newcommand{\algorithmicloop}{\textbf{loop}} 42 | \newcommand{\algorithmicendloop}{\algorithmicend\ \algorithmicloop} 43 | \newcommand{\algorithmicrepeat}{\textbf{repeat}} 44 | \newcommand{\algorithmicuntil}{\textbf{until}} 45 | 46 | %changed by alex smola 47 | \newcommand{\algorithmicinput}{\textbf{input}} 48 | \newcommand{\algorithmicoutput}{\textbf{output}} 49 | \newcommand{\algorithmicset}{\textbf{set}} 50 | \newcommand{\algorithmictrue}{\textbf{true}} 51 | \newcommand{\algorithmicfalse}{\textbf{false}} 52 | \newcommand{\algorithmicand}{\textbf{and\ }} 53 | \newcommand{\algorithmicor}{\textbf{or\ }} 54 | \newcommand{\algorithmicfunction}{\textbf{function}} 55 | \newcommand{\algorithmicendfunction}{\algorithmicend\ \algorithmicfunction} 56 | \newcommand{\algorithmicmain}{\textbf{main}} 57 | \newcommand{\algorithmicendmain}{\algorithmicend\ \algorithmicmain} 58 | %end changed by alex smola 59 | 60 | \def\ALC@item[#1]{% 61 | \if@noparitem \@donoparitem 62 | \else \if@inlabel \indent \par \fi 63 | \ifhmode \unskip\unskip \par \fi 64 | \if@newlist \if@nobreak \@nbitem \else 65 | \addpenalty\@beginparpenalty 66 | \addvspace\@topsep \addvspace{-\parskip}\fi 67 | \else \addpenalty\@itempenalty \addvspace\itemsep 68 | \fi 69 | \global\@inlabeltrue 70 | \fi 71 | \everypar{\global\@minipagefalse\global\@newlistfalse 72 | \if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels 73 | \penalty\z@ \fi 74 | \everypar{}}\global\@nobreakfalse 75 | \if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi 76 | \sbox\@tempboxa{\makelabel{#1}}% 77 | \global\setbox\@labels 78 | \hbox{\unhbox\@labels \hskip \itemindent 79 | \hskip -\labelwidth \hskip -\ALC@tlm 80 | \ifdim \wd\@tempboxa >\labelwidth 81 | \box\@tempboxa 82 | \else \hbox to\labelwidth {\unhbox\@tempboxa}\fi 83 | \hskip \ALC@tlm}\ignorespaces} 84 | % 85 | \newenvironment{algorithmic}[1][0]{ 86 | \let\@item\ALC@item 87 | \newcommand{\ALC@lno}{% 88 | \ifthenelse{\equal{\arabic{ALC@rem}}{0}} 89 | {{\footnotesize \arabic{ALC@line}:}}{}% 90 | } 91 | \let\@listii\@listi 92 | \let\@listiii\@listi 93 | \let\@listiv\@listi 94 | \let\@listv\@listi 95 | \let\@listvi\@listi 96 | \let\@listvii\@listi 97 | \newenvironment{ALC@g}{ 98 | \begin{list}{\ALC@lno}{ \itemsep\z@ \itemindent\z@ 99 | \listparindent\z@ \rightmargin\z@ 100 | \topsep\z@ \partopsep\z@ \parskip\z@\parsep\z@ 101 | \leftmargin 1em 102 | \addtolength{\ALC@tlm}{\leftmargin} 103 | } 104 | } 105 | {\end{list}} 106 | \newcommand{\ALC@it}{\addtocounter{ALC@line}{1}\addtocounter{ALC@rem}{1}\ifthenelse{\equal{\arabic{ALC@rem}}{#1}}{\setcounter{ALC@rem}{0}}{}\item} 107 | \newcommand{\ALC@com}[1]{\ifthenelse{\equal{##1}{default}}% 108 | {}{\ \algorithmiccomment{##1}}} 109 | \newcommand{\REQUIRE}{\item[\algorithmicrequire]} 110 | \newcommand{\ENSURE}{\item[\algorithmicensure]} 111 | \newcommand{\STATE}{\ALC@it} 112 | \newcommand{\COMMENT}[1]{\algorithmiccomment{##1}} 113 | %changes by alex smola 114 | \newcommand{\INPUT}{\item[\algorithmicinput]} 115 | \newcommand{\OUTPUT}{\item[\algorithmicoutput]} 116 | \newcommand{\SET}{\item[\algorithmicset]} 117 | % \newcommand{\TRUE}{\algorithmictrue} 118 | % \newcommand{\FALSE}{\algorithmicfalse} 119 | \newcommand{\AND}{\algorithmicand} 120 | \newcommand{\OR}{\algorithmicor} 121 | \newenvironment{ALC@func}{\begin{ALC@g}}{\end{ALC@g}} 122 | \newenvironment{ALC@main}{\begin{ALC@g}}{\end{ALC@g}} 123 | %end changes by alex smola 124 | \newenvironment{ALC@if}{\begin{ALC@g}}{\end{ALC@g}} 125 | \newenvironment{ALC@for}{\begin{ALC@g}}{\end{ALC@g}} 126 | \newenvironment{ALC@whl}{\begin{ALC@g}}{\end{ALC@g}} 127 | \newenvironment{ALC@loop}{\begin{ALC@g}}{\end{ALC@g}} 128 | \newenvironment{ALC@rpt}{\begin{ALC@g}}{\end{ALC@g}} 129 | \renewcommand{\\}{\@centercr} 130 | \newcommand{\IF}[2][default]{\ALC@it\algorithmicif\ ##2\ \algorithmicthen% 131 | \ALC@com{##1}\begin{ALC@if}} 132 | \newcommand{\SHORTIF}[2]{\ALC@it\algorithmicif\ ##1\ 133 | \algorithmicthen\ {##2}} 134 | \newcommand{\ELSE}[1][default]{\end{ALC@if}\ALC@it\algorithmicelse% 135 | \ALC@com{##1}\begin{ALC@if}} 136 | \newcommand{\ELSIF}[2][default]% 137 | {\end{ALC@if}\ALC@it\algorithmicelsif\ ##2\ \algorithmicthen% 138 | \ALC@com{##1}\begin{ALC@if}} 139 | \newcommand{\FOR}[2][default]{\ALC@it\algorithmicfor\ ##2\ \algorithmicdo% 140 | \ALC@com{##1}\begin{ALC@for}} 141 | \newcommand{\FORALL}[2][default]{\ALC@it\algorithmicforall\ ##2\ % 142 | \algorithmicdo% 143 | \ALC@com{##1}\begin{ALC@for}} 144 | \newcommand{\SHORTFORALL}[2]{\ALC@it\algorithmicforall\ ##1\ % 145 | \algorithmicdo\ {##2}} 146 | \newcommand{\WHILE}[2][default]{\ALC@it\algorithmicwhile\ ##2\ % 147 | \algorithmicdo% 148 | \ALC@com{##1}\begin{ALC@whl}} 149 | \newcommand{\LOOP}[1][default]{\ALC@it\algorithmicloop% 150 | \ALC@com{##1}\begin{ALC@loop}} 151 | %changed by alex smola 152 | \newcommand{\FUNCTION}[2][default]{\ALC@it\algorithmicfunction\ ##2\ % 153 | \ALC@com{##1}\begin{ALC@func}} 154 | \newcommand{\MAIN}[2][default]{\ALC@it\algorithmicmain\ ##2\ % 155 | \ALC@com{##1}\begin{ALC@main}} 156 | %end changed by alex smola 157 | \newcommand{\REPEAT}[1][default]{\ALC@it\algorithmicrepeat% 158 | \ALC@com{##1}\begin{ALC@rpt}} 159 | \newcommand{\UNTIL}[1]{\end{ALC@rpt}\ALC@it\algorithmicuntil\ ##1} 160 | \ifthenelse{\boolean{ALC@noend}}{ 161 | \newcommand{\ENDIF}{\end{ALC@if}} 162 | \newcommand{\ENDFOR}{\end{ALC@for}} 163 | \newcommand{\ENDWHILE}{\end{ALC@whl}} 164 | \newcommand{\ENDLOOP}{\end{ALC@loop}} 165 | \newcommand{\ENDFUNCTION}{\end{ALC@func}} 166 | \newcommand{\ENDMAIN}{\end{ALC@main}} 167 | }{ 168 | \newcommand{\ENDIF}{\end{ALC@if}\ALC@it\algorithmicendif} 169 | \newcommand{\ENDFOR}{\end{ALC@for}\ALC@it\algorithmicendfor} 170 | \newcommand{\ENDWHILE}{\end{ALC@whl}\ALC@it\algorithmicendwhile} 171 | \newcommand{\ENDLOOP}{\end{ALC@loop}\ALC@it\algorithmicendloop} 172 | \newcommand{\ENDFUNCTION}{\end{ALC@func}\ALC@it\algorithmicendfunction} 173 | \newcommand{\ENDMAIN}{\end{ALC@main}\ALC@it\algorithmicendmain} 174 | } 175 | \renewcommand{\@toodeep}{} 176 | \begin{list}{\ALC@lno}{\setcounter{ALC@line}{0}\setcounter{ALC@rem}{0}% 177 | \itemsep\z@ \itemindent\z@ \listparindent\z@% 178 | \partopsep\z@ \parskip\z@ \parsep\z@% 179 | \labelsep 0.5em \topsep 0.2em% 180 | \ifthenelse{\equal{#1}{0}} 181 | {\labelwidth 0.5em } 182 | {\labelwidth 1.2em } 183 | \leftmargin\labelwidth \addtolength{\leftmargin}{\labelsep} 184 | \ALC@tlm\labelsep 185 | } 186 | } 187 | {\end{list}} 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /paper/experiments.tex: -------------------------------------------------------------------------------- 1 | \section{Experimental Results} 2 | 3 | The proposed MACE algorithm\footnote{Available at https://github.com/Alaya-in-Matrix/MACE} was tested using eight benchmark functions and two 4 | real-world analog circuits. Four state-of-the-art parallel Bayesian optimization 5 | methods were compared, including the BLCB 6 | algorithm~\cite{desautels2014parallelizing}, the local penalization method with 7 | EI acquisition function (EI-LP)~\cite{gonzalez2016batch}, the qEI and qKG 8 | methods~\cite{qEI,wu2016parallel}. \footnote{We implemented the BLCB algorithm as 9 | the available open source implementations only allow discrete input. For the 10 | EI-LP method, the code is downloaded from 11 | https://github.com/SheffieldML/GPyOpt. The code for qEI and qKG is downloaded 12 | from https://github.com/wujian16/Cornell-MOE.} 13 | 14 | For the MACE, BLCB, and EI-LP method, the ARD squared-exponential kernel is 15 | used and the GP models are fitted by maximum likelihood estimations (MLE); for 16 | the qKG and qEI methods, the ARD Matern52 kernels are used, and the GP 17 | hyperparameters are integrated via MCMC sampling. The Matern52 kernel and MCMC 18 | integration are the default strategies of the qKG and qEI implementations and 19 | it is unclear in the documentation about how to change the GP settings. 20 | 21 | 22 | \subsection{Benchmark Problems} 23 | 24 | We tested the MACE algorithm and other parallel BO methods using eight commonly used benchmark 25 | functions, as summarized in Table~\ref{tab:summaryanalygical}. 26 | 27 | \begin{table}[!htb] 28 | \centering 29 | \caption{Summary of the analytical benchmark functions} 30 | \label{tab:summaryanalygical} 31 | \begin{tabular}{llllllll} 32 | \toprule 33 | Function & Dimension & Search domain \\ \midrule 34 | Branin & 2 & $[-5, 10]\times[0, 15]$ \\ 35 | Alpine1 & 5 & $[-10, 10]^5$ \\ 36 | Hartmann6 & 6 & $[0, 1]^6$ \\ 37 | Eggholder & 2 & $[-512, 512]^2$ \\ 38 | Ackley2 & 2 & $[-32, 32]^2$ \\ 39 | Ackley10 & 10 & $[-32, 32]^{10}$ \\ 40 | Rosenbrock2 & 2 & $[-5, 10]^2$ \\ 41 | Rosenbrock10 & 10 & $[-20, 20]^{10}$ \\ 42 | \bottomrule 43 | \end{tabular} 44 | \end{table} 45 | 46 | 47 | For all functions except the two 10D functions, we set the number of initial 48 | random sampling to $N_{init} = 20$ and the number of iterations to $N_{iter} = 49 | 45$. Batch size is set to $B = 4$, the total number of function evaluations is 50 | $N_{init} + B \times N_{iter}$. For the 10D Ackley and 10D Rosenbrock functions, we set 51 | $N_{init} = 100$ and $N_{iter} = 175$. The experiments were repeated ten 52 | times to average the random fluctuations. 53 | 54 | We also ran the MACE algorithm in sequential mode and compared with the EI and LCB 55 | acquisition functions. The sequential EI and LCB based Bayesian optimization 56 | are implemented by setting the batch size $B = 1$ for EI-LP and BLCB 57 | respectively. 58 | 59 | The mean convergence plots of the tested algorithms on the benchmark functions 60 | are given in Figure~\ref{fig:CovPlotBenchmark}, the statistics of the final 61 | regrets are listed in Table~\ref{tab:result_analytical}. As can be seen in 62 | Figure~\ref{fig:CovPlotBenchmark} and Table~\ref{tab:result_analytical}, when 63 | running in sequential mode, the MACE algorithm is competitive with the LCB and 64 | EI acquisition functions. The sequential MACE (MACE-1) algorithm gave better 65 | performances than the sequential EI (EI-1) and sequential LCB (LCB-1) 66 | algorithms in the Eggholder, Branin, Hartmann6, Ackley10, and Rosenbrock10 67 | functions. Also, the parallel MACE (MACE-4) gave the best performances among 68 | all the tested algorithms for six out of the eight benchmark functions, and has 69 | shown dramatic speedup compared to the sequential MACE. We also performed 70 | additional experiments with varied batch sizes, the detail of those 71 | experimental results can be seen in the supplementary materials. We report the 72 | time spent on the ten-dimensional Rosenbrock function optimization with $B = 4$ as a measure 73 | of the algorithm overhead, for the ten-dimensional Rosenbrock function, it took 74 | MACE about 11 hours to finish all the $N_{iter} = 175$ iterations, the BLCB algorithm took about 75 | five hours, for the EI-LP algorithm, it took only one hour to finish the optimization. The overheads for qEI and qKG are much larger, it took 76 | more than two days for qKG and qEI to finish the optimization of the ten-dimensional Rosenbrock function. 77 | 78 | \begin{table*}[!htb] 79 | \centering 80 | \caption{Statistics of the regrets of the benchmark functions} 81 | \label{tab:result_analytical} 82 | \begin{tabular}{lllllllllll} 83 | \toprule 84 | & Eggholder & Branin & Alpine1 & Hartmann6 \\ \midrule 85 | MACE-1 & 87.65$\pm$75.83 & 1.05e-5$\pm$1.31e-5 & 2.66305$\pm$1.05844 & 0.0646869$\pm$0.0621189 \\ 86 | LCB-1 & 153.9$\pm$112.8 & 6.86e-5$\pm$1.13e-4 & 5.66812$\pm$1.76973 & 0.125565$\pm$0.122684 \\ 87 | EI-1 & 172.8$\pm$132.2 & 1.62e-2$\pm$1.63e-2 & 2.46061$\pm$1.56079 & 0.110561$\pm$0.146809 \\ 88 | MACE-4 & 46.38$\pm$40.89 & \textbf{4.62e-6$\pm$6.64e-6} & \textbf{0.903805$\pm$0.835209} & \textbf{0.0275738$\pm$0.052254} \\ 89 | BLCB-4 & 56.86$\pm$35.91 & 4.32e-5$\pm$6.33e-5 & 1.8843$\pm$0.938873 & 0.06447$\pm$0.0621176 \\ 90 | EI-LP-4 & \textbf{44.68$\pm$56.45} & 2.11e-2$\pm$1.84e-2 & 1.0059$\pm$0.456865 & 0.0540446$\pm$0.0558557 \\ 91 | qKG-4 & 106.4$\pm$67.64 & 2.65e-1$\pm$2.70e-1 & 3.01513$\pm$1.13414 & 0.47134$\pm$0.18939 \\ 92 | qEI-4 & 72.13$\pm$52.08 & 3.29e-4$\pm$1.14e-3 & 2.7074$\pm$1.05145 & 0.186088$\pm$0.116323 \\ 93 | \hline 94 | & Ackley2 & Rosenbrock2 & Ackley10 & Rosenbrock10 \\ \midrule 95 | MACE-1 & 1.71474$\pm$1.12154 & 0.026173$\pm$0.051189 & 3.1348$\pm$0.447874 & 499.697$\pm$300.899 \\ 96 | LCB-1 & 1.624$\pm$0.926437 & 0.0201124$\pm$0.0205367 & 3.14797$\pm$0.519164 & 517.944$\pm$288.955 \\ 97 | EI-1 & 1.0136$\pm$0.985858 & 13.5508$\pm$9.52734 & 18.8006$\pm$0.652136 & 1367.08$\pm$637.507 \\ 98 | MACE-4 & 1.07906$\pm$0.886466 & \textbf{0.00095416$\pm$0.00093729} & \textbf{2.56439$\pm$0.535488} & \textbf{158.116$\pm$50.0024} \\ 99 | BLCB-4 & 1.40051$\pm$1.02849 & 0.00191986$\pm$0.00180895 & 3.27543$\pm$0.735501 & 406.819$\pm$127.351 \\ 100 | EI-LP-4 & \textbf{0.284265$\pm$0.24634} & 2.73645$\pm$2.05923 & 18.2682$\pm$0.608564 & 721.351$\pm$327.365 \\ 101 | qKG-4 & 5.59394$\pm$1.80595 & 5.03976$\pm$3.72014 & 18.197$\pm$0.764103 & 705.112$\pm$412.762 \\ 102 | qEI-4 & 2.87373$\pm$1.02405 & 10.1881$\pm$15.0432 & 18.3686$\pm$0.501869 & 655.208$\pm$340.954 \\ 103 | \bottomrule 104 | \end{tabular} 105 | \end{table*} 106 | 107 | 108 | % when running with batch size $B = 4$, the 109 | % MACE algorithm gives the best performance for six out of the eight benchmarks. 110 | % For the 2D Ackley function, EI-LP is the best algorithm, while for the 111 | % Eggholder function, the MACE, BLCB, and EI-LP have quite similar performance. 112 | % Compare the batch MACE and the sequential MACE, the speedup is also dramatic. 113 | 114 | \subsection{Operational Amplifier} 115 | 116 | %TODO: Introduce the importance of OpAmp and PA 117 | 118 | The operational amplifier~\cite{wang2014enabling} shown in 119 | Figure~\ref{fig:schDAC2014} is used to test Bayesian optimization algorithms. The circuit is designed 120 | using the 180nm process. It has 10 design parameters, including the lengths 121 | and widths of transistors, the resistance of the resistors and the capacitance of the 122 | capacitors. The circuit is simulated using the commercial HSPICE circuit simulator. 123 | 124 | \begin{figure}[!htb] 125 | \begin{center} 126 | \centerline{\includegraphics[width=\columnwidth]{./img/sopam.pdf}} 127 | \caption{Schematic of the operational amplifier} 128 | \label{fig:schDAC2014} 129 | \end{center} 130 | \vskip -0.2in 131 | \end{figure} 132 | 133 | We want to maximize the gain, unit gain frequency (UGF) and the phase margin (PM) for this amplifier. The Figure of Merit $FOM$ is constructed as 134 | $$ 135 | \mathit{FOM} = -1.2 \times \mathit{gain} - 10 \times \mathit{UGF} - 1.6 \times \mathit{PM}. 136 | $$ 137 | 138 | For this circuit, we compared the MACE algorithm with the BLCB and EI-LP 139 | algorithms. The qKG and qEI are not compared as the computation of qEI and qKG 140 | acquisition functions become very slow for the ten-dimensional functions. 141 | 142 | \begin{figure}[!htb] 143 | \vskip 0.2in 144 | \begin{center} 145 | \centerline{\includegraphics[width=\columnwidth]{./img/mean_DAC2014.eps}} 146 | \caption{Optimization results of the operational amplifier} 147 | \label{fig:resDAC2014} 148 | \end{center} 149 | \vskip -0.2in 150 | \end{figure} 151 | 152 | 153 | We run the algorithms in sequential mode and batch mode. For the batch mode, 154 | the batch size is set to $B = 4$. The number of initial random sampling is set to 155 | $N_{init} = 100$, and the number of iterations is set to $N_{iter} = 100$. 156 | 157 | 158 | \begin{table}[!htb] 159 | \centering 160 | \caption{Optimization results of the operational amplifier} 161 | \label{tab:result_opamp} 162 | \begin{tabular}{llll} 163 | \toprule 164 | Algorithm & Results \\ \midrule 165 | MACE-1 & -678.174$\pm$21.7445 \\ 166 | LCB-1 & -607.583$\pm$51.9786 \\ 167 | EI-1 & -532.555$\pm$66.942 \\ 168 | MACE-4 & \textbf{-690.3$\pm$0.104963} \\ 169 | BLCB-4 & -665.442$\pm$23.066 \\ 170 | EI-LP-4 & -636.675$\pm$35.7359 \\ 171 | \bottomrule 172 | \end{tabular} 173 | \end{table} 174 | 175 | 176 | The mean convergence plot for the sequential and batch runs are given in 177 | Figure~\ref{fig:resDAC2014}. The mean and standard deviation of the final 178 | optimized FOM values are listed in Table~\ref{tab:result_opamp}. As can be 179 | seen, on average, the batch MACE algorithm had the fastest convergence rate 180 | compared with the sequential MACE algorithm and other parallel algorithms. It 181 | should also be noted that the final optimized FOM values given by MACE-4 have 182 | very small deviation (0.105) compared with other algorithms. 183 | 184 | % The mean convergence plot for the sequential and batch runs are shown in 185 | % Figure~\ref{fig:resDAC2014}. As can be seen, the MACE algorithm gave better 186 | % solution compared with other algorithms, the sequential MACE algorithm found 187 | % better solution than BLCB and EI-LP with batch size $B = 4$, which showed that 188 | % the multi-objective acquisition ensemble is more robust than relying on single 189 | % acquisition function; compared with the sequential MACE algorithm, the MACE 190 | % algorithm with batch size $B = 4$ showed considerable speedup. 191 | 192 | 193 | \begin{figure}[!htb] 194 | \begin{center} 195 | \centerline{\includegraphics[width=\columnwidth]{./img/classE.eps}} 196 | \caption{Schematic of the power amplifier} 197 | \label{fig:schPA} 198 | \end{center} 199 | \vskip -0.15in 200 | \end{figure} 201 | 202 | \subsection{Class-E Power Amplifier} 203 | 204 | 205 | The class-E power amplifier shown in Figure~\ref{fig:schPA} is used to test Bayesian optimization algorithms. The 206 | circuit is designed using the 180nm process with 12 design parameters, the 207 | circuit is simulated by the commercial HSPICE circuit simulator to get its performances. 208 | 209 | 210 | 211 | For this power amplifier, we aim to maximize the power added efficiency (PAE) and the output power (Pout), the Figure of Merit $FOM$ is constructed as 212 | $$ 213 | \mathit{FOM} = -3 \times \mathit{PAE} - \mathit{Pout}. 214 | $$ 215 | 216 | The MACE, BLCB, and EI-LP algorithms were tested in both sequential and batch 217 | modes. The number of initial sampling is $N_{init} = 100$. The number of 218 | iterations is $N_{iter} = 100$. The batch size is set to $B = 4$. The total 219 | number of HSPICE simulations is 500 for each batch run and 200 for each 220 | sequential run. 221 | 222 | \begin{figure}[!htb] 223 | \begin{center} 224 | \centerline{\includegraphics[width=\columnwidth]{./img/ClassE_mean.eps}} 225 | \caption{Optimization results of the class-E power amplifier} 226 | \label{fig:resClassE} 227 | \end{center} 228 | \vskip -0.2in 229 | \end{figure} 230 | 231 | 232 | The optimization results of the class-E power amplifier are given in 233 | Figure~\ref{fig:resClassE} and Table~\ref{tab:result_PA}. We can see that the 234 | MACE outperformed the BLCB and EI-LP in both sequential and batch mode. For the 235 | batch runs, the MACE converges fastest among the three algorithms, while the 236 | sequential MACE (MACE-1) has comparable performance as the batch EI-LP 237 | (EI-LP-4) method. 238 | 239 | \begin{table}[!htb] 240 | \centering 241 | \caption{Optimization results of the power amplifier} 242 | \vskip 0.15in 243 | \label{tab:result_PA} 244 | \begin{tabular}{llll} 245 | \toprule 246 | Algorithm & Results \\ \midrule 247 | MACE-1 & -4.08608$\pm$0.296647 \\ 248 | LCB-1 & -3.78533$\pm$0.335532 \\ 249 | EI-1 & -3.36407$\pm$0.307489 \\ 250 | MACE-4 & \textbf{-4.31762$\pm$0.347026} \\ 251 | BLCB-4 & -4.20266$\pm$0.211102 \\ 252 | EI-LP-4 & -4.07233$\pm$0.244436 \\ 253 | \bottomrule 254 | \end{tabular} 255 | \vskip -0.1in 256 | \end{table} 257 | -------------------------------------------------------------------------------- /paper/fancyhdr.sty: -------------------------------------------------------------------------------- 1 | % fancyhdr.sty version 3.2 2 | % Fancy headers and footers for LaTeX. 3 | % Piet van Oostrum, 4 | % Dept of Computer and Information Sciences, University of Utrecht, 5 | % Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands 6 | % Telephone: +31 30 2532180. Email: piet@cs.uu.nl 7 | % ======================================================================== 8 | % LICENCE: 9 | % This file may be distributed under the terms of the LaTeX Project Public 10 | % License, as described in lppl.txt in the base LaTeX distribution. 11 | % Either version 1 or, at your option, any later version. 12 | % ======================================================================== 13 | % MODIFICATION HISTORY: 14 | % Sep 16, 1994 15 | % version 1.4: Correction for use with \reversemargin 16 | % Sep 29, 1994: 17 | % version 1.5: Added the \iftopfloat, \ifbotfloat and \iffloatpage commands 18 | % Oct 4, 1994: 19 | % version 1.6: Reset single spacing in headers/footers for use with 20 | % setspace.sty or doublespace.sty 21 | % Oct 4, 1994: 22 | % version 1.7: changed \let\@mkboth\markboth to 23 | % \def\@mkboth{\protect\markboth} to make it more robust 24 | % Dec 5, 1994: 25 | % version 1.8: corrections for amsbook/amsart: define \@chapapp and (more 26 | % importantly) use the \chapter/sectionmark definitions from ps@headings if 27 | % they exist (which should be true for all standard classes). 28 | % May 31, 1995: 29 | % version 1.9: The proposed \renewcommand{\headrulewidth}{\iffloatpage... 30 | % construction in the doc did not work properly with the fancyplain style. 31 | % June 1, 1995: 32 | % version 1.91: The definition of \@mkboth wasn't restored on subsequent 33 | % \pagestyle{fancy}'s. 34 | % June 1, 1995: 35 | % version 1.92: The sequence \pagestyle{fancyplain} \pagestyle{plain} 36 | % \pagestyle{fancy} would erroneously select the plain version. 37 | % June 1, 1995: 38 | % version 1.93: \fancypagestyle command added. 39 | % Dec 11, 1995: 40 | % version 1.94: suggested by Conrad Hughes 41 | % CJCH, Dec 11, 1995: added \footruleskip to allow control over footrule 42 | % position (old hardcoded value of .3\normalbaselineskip is far too high 43 | % when used with very small footer fonts). 44 | % Jan 31, 1996: 45 | % version 1.95: call \@normalsize in the reset code if that is defined, 46 | % otherwise \normalsize. 47 | % this is to solve a problem with ucthesis.cls, as this doesn't 48 | % define \@currsize. Unfortunately for latex209 calling \normalsize doesn't 49 | % work as this is optimized to do very little, so there \@normalsize should 50 | % be called. Hopefully this code works for all versions of LaTeX known to 51 | % mankind. 52 | % April 25, 1996: 53 | % version 1.96: initialize \headwidth to a magic (negative) value to catch 54 | % most common cases that people change it before calling \pagestyle{fancy}. 55 | % Note it can't be initialized when reading in this file, because 56 | % \textwidth could be changed afterwards. This is quite probable. 57 | % We also switch to \MakeUppercase rather than \uppercase and introduce a 58 | % \nouppercase command for use in headers. and footers. 59 | % May 3, 1996: 60 | % version 1.97: Two changes: 61 | % 1. Undo the change in version 1.8 (using the pagestyle{headings} defaults 62 | % for the chapter and section marks. The current version of amsbook and 63 | % amsart classes don't seem to need them anymore. Moreover the standard 64 | % latex classes don't use \markboth if twoside isn't selected, and this is 65 | % confusing as \leftmark doesn't work as expected. 66 | % 2. include a call to \ps@empty in ps@@fancy. This is to solve a problem 67 | % in the amsbook and amsart classes, that make global changes to \topskip, 68 | % which are reset in \ps@empty. Hopefully this doesn't break other things. 69 | % May 7, 1996: 70 | % version 1.98: 71 | % Added % after the line \def\nouppercase 72 | % May 7, 1996: 73 | % version 1.99: This is the alpha version of fancyhdr 2.0 74 | % Introduced the new commands \fancyhead, \fancyfoot, and \fancyhf. 75 | % Changed \headrulewidth, \footrulewidth, \footruleskip to 76 | % macros rather than length parameters, In this way they can be 77 | % conditionalized and they don't consume length registers. There is no need 78 | % to have them as length registers unless you want to do calculations with 79 | % them, which is unlikely. Note that this may make some uses of them 80 | % incompatible (i.e. if you have a file that uses \setlength or \xxxx=) 81 | % May 10, 1996: 82 | % version 1.99a: 83 | % Added a few more % signs 84 | % May 10, 1996: 85 | % version 1.99b: 86 | % Changed the syntax of \f@nfor to be resistent to catcode changes of := 87 | % Removed the [1] from the defs of \lhead etc. because the parameter is 88 | % consumed by the \@[xy]lhead etc. macros. 89 | % June 24, 1997: 90 | % version 1.99c: 91 | % corrected \nouppercase to also include the protected form of \MakeUppercase 92 | % \global added to manipulation of \headwidth. 93 | % \iffootnote command added. 94 | % Some comments added about \@fancyhead and \@fancyfoot. 95 | % Aug 24, 1998 96 | % version 1.99d 97 | % Changed the default \ps@empty to \ps@@empty in order to allow 98 | % \fancypagestyle{empty} redefinition. 99 | % Oct 11, 2000 100 | % version 2.0 101 | % Added LPPL license clause. 102 | % 103 | % A check for \headheight is added. An errormessage is given (once) if the 104 | % header is too large. Empty headers don't generate the error even if 105 | % \headheight is very small or even 0pt. 106 | % Warning added for the use of 'E' option when twoside option is not used. 107 | % In this case the 'E' fields will never be used. 108 | % 109 | % Mar 10, 2002 110 | % version 2.1beta 111 | % New command: \fancyhfoffset[place]{length} 112 | % defines offsets to be applied to the header/footer to let it stick into 113 | % the margins (if length > 0). 114 | % place is like in fancyhead, except that only E,O,L,R can be used. 115 | % This replaces the old calculation based on \headwidth and the marginpar 116 | % area. 117 | % \headwidth will be dynamically calculated in the headers/footers when 118 | % this is used. 119 | % 120 | % Mar 26, 2002 121 | % version 2.1beta2 122 | % \fancyhfoffset now also takes h,f as possible letters in the argument to 123 | % allow the header and footer widths to be different. 124 | % New commands \fancyheadoffset and \fancyfootoffset added comparable to 125 | % \fancyhead and \fancyfoot. 126 | % Errormessages and warnings have been made more informative. 127 | % 128 | % Dec 9, 2002 129 | % version 2.1 130 | % The defaults for \footrulewidth, \plainheadrulewidth and 131 | % \plainfootrulewidth are changed from \z@skip to 0pt. In this way when 132 | % someone inadvertantly uses \setlength to change any of these, the value 133 | % of \z@skip will not be changed, rather an errormessage will be given. 134 | 135 | % March 3, 2004 136 | % Release of version 3.0 137 | 138 | % Oct 7, 2004 139 | % version 3.1 140 | % Added '\endlinechar=13' to \fancy@reset to prevent problems with 141 | % includegraphics in header when verbatiminput is active. 142 | 143 | % March 22, 2005 144 | % version 3.2 145 | % reset \everypar (the real one) in \fancy@reset because spanish.ldf does 146 | % strange things with \everypar between << and >>. 147 | 148 | \def\ifancy@mpty#1{\def\temp@a{#1}\ifx\temp@a\@empty} 149 | 150 | \def\fancy@def#1#2{\ifancy@mpty{#2}\fancy@gbl\def#1{\leavevmode}\else 151 | \fancy@gbl\def#1{#2\strut}\fi} 152 | 153 | \let\fancy@gbl\global 154 | 155 | \def\@fancyerrmsg#1{% 156 | \ifx\PackageError\undefined 157 | \errmessage{#1}\else 158 | \PackageError{Fancyhdr}{#1}{}\fi} 159 | \def\@fancywarning#1{% 160 | \ifx\PackageWarning\undefined 161 | \errmessage{#1}\else 162 | \PackageWarning{Fancyhdr}{#1}{}\fi} 163 | 164 | % Usage: \@forc \var{charstring}{command to be executed for each char} 165 | % This is similar to LaTeX's \@tfor, but expands the charstring. 166 | 167 | \def\@forc#1#2#3{\expandafter\f@rc\expandafter#1\expandafter{#2}{#3}} 168 | \def\f@rc#1#2#3{\def\temp@ty{#2}\ifx\@empty\temp@ty\else 169 | \f@@rc#1#2\f@@rc{#3}\fi} 170 | \def\f@@rc#1#2#3\f@@rc#4{\def#1{#2}#4\f@rc#1{#3}{#4}} 171 | 172 | % Usage: \f@nfor\name:=list\do{body} 173 | % Like LaTeX's \@for but an empty list is treated as a list with an empty 174 | % element 175 | 176 | \newcommand{\f@nfor}[3]{\edef\@fortmp{#2}% 177 | \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}} 178 | 179 | % Usage: \def@ult \cs{defaults}{argument} 180 | % sets \cs to the characters from defaults appearing in argument 181 | % or defaults if it would be empty. All characters are lowercased. 182 | 183 | \newcommand\def@ult[3]{% 184 | \edef\temp@a{\lowercase{\edef\noexpand\temp@a{#3}}}\temp@a 185 | \def#1{}% 186 | \@forc\tmpf@ra{#2}% 187 | {\expandafter\if@in\tmpf@ra\temp@a{\edef#1{#1\tmpf@ra}}{}}% 188 | \ifx\@empty#1\def#1{#2}\fi} 189 | % 190 | % \if@in 191 | % 192 | \newcommand{\if@in}[4]{% 193 | \edef\temp@a{#2}\def\temp@b##1#1##2\temp@b{\def\temp@b{##1}}% 194 | \expandafter\temp@b#2#1\temp@b\ifx\temp@a\temp@b #4\else #3\fi} 195 | 196 | \newcommand{\fancyhead}{\@ifnextchar[{\f@ncyhf\fancyhead h}% 197 | {\f@ncyhf\fancyhead h[]}} 198 | \newcommand{\fancyfoot}{\@ifnextchar[{\f@ncyhf\fancyfoot f}% 199 | {\f@ncyhf\fancyfoot f[]}} 200 | \newcommand{\fancyhf}{\@ifnextchar[{\f@ncyhf\fancyhf{}}% 201 | {\f@ncyhf\fancyhf{}[]}} 202 | 203 | % New commands for offsets added 204 | 205 | \newcommand{\fancyheadoffset}{\@ifnextchar[{\f@ncyhfoffs\fancyheadoffset h}% 206 | {\f@ncyhfoffs\fancyheadoffset h[]}} 207 | \newcommand{\fancyfootoffset}{\@ifnextchar[{\f@ncyhfoffs\fancyfootoffset f}% 208 | {\f@ncyhfoffs\fancyfootoffset f[]}} 209 | \newcommand{\fancyhfoffset}{\@ifnextchar[{\f@ncyhfoffs\fancyhfoffset{}}% 210 | {\f@ncyhfoffs\fancyhfoffset{}[]}} 211 | 212 | % The header and footer fields are stored in command sequences with 213 | % names of the form: \f@ncy with for [eo], from [lcr] 214 | % and from [hf]. 215 | 216 | \def\f@ncyhf#1#2[#3]#4{% 217 | \def\temp@c{}% 218 | \@forc\tmpf@ra{#3}% 219 | {\expandafter\if@in\tmpf@ra{eolcrhf,EOLCRHF}% 220 | {}{\edef\temp@c{\temp@c\tmpf@ra}}}% 221 | \ifx\@empty\temp@c\else 222 | \@fancyerrmsg{Illegal char `\temp@c' in \string#1 argument: 223 | [#3]}% 224 | \fi 225 | \f@nfor\temp@c{#3}% 226 | {\def@ult\f@@@eo{eo}\temp@c 227 | \if@twoside\else 228 | \if\f@@@eo e\@fancywarning 229 | {\string#1's `E' option without twoside option is useless}\fi\fi 230 | \def@ult\f@@@lcr{lcr}\temp@c 231 | \def@ult\f@@@hf{hf}{#2\temp@c}% 232 | \@forc\f@@eo\f@@@eo 233 | {\@forc\f@@lcr\f@@@lcr 234 | {\@forc\f@@hf\f@@@hf 235 | {\expandafter\fancy@def\csname 236 | f@ncy\f@@eo\f@@lcr\f@@hf\endcsname 237 | {#4}}}}}} 238 | 239 | \def\f@ncyhfoffs#1#2[#3]#4{% 240 | \def\temp@c{}% 241 | \@forc\tmpf@ra{#3}% 242 | {\expandafter\if@in\tmpf@ra{eolrhf,EOLRHF}% 243 | {}{\edef\temp@c{\temp@c\tmpf@ra}}}% 244 | \ifx\@empty\temp@c\else 245 | \@fancyerrmsg{Illegal char `\temp@c' in \string#1 argument: 246 | [#3]}% 247 | \fi 248 | \f@nfor\temp@c{#3}% 249 | {\def@ult\f@@@eo{eo}\temp@c 250 | \if@twoside\else 251 | \if\f@@@eo e\@fancywarning 252 | {\string#1's `E' option without twoside option is useless}\fi\fi 253 | \def@ult\f@@@lcr{lr}\temp@c 254 | \def@ult\f@@@hf{hf}{#2\temp@c}% 255 | \@forc\f@@eo\f@@@eo 256 | {\@forc\f@@lcr\f@@@lcr 257 | {\@forc\f@@hf\f@@@hf 258 | {\expandafter\setlength\csname 259 | f@ncyO@\f@@eo\f@@lcr\f@@hf\endcsname 260 | {#4}}}}}% 261 | \fancy@setoffs} 262 | 263 | % Fancyheadings version 1 commands. These are more or less deprecated, 264 | % but they continue to work. 265 | 266 | \newcommand{\lhead}{\@ifnextchar[{\@xlhead}{\@ylhead}} 267 | \def\@xlhead[#1]#2{\fancy@def\f@ncyelh{#1}\fancy@def\f@ncyolh{#2}} 268 | \def\@ylhead#1{\fancy@def\f@ncyelh{#1}\fancy@def\f@ncyolh{#1}} 269 | 270 | \newcommand{\chead}{\@ifnextchar[{\@xchead}{\@ychead}} 271 | \def\@xchead[#1]#2{\fancy@def\f@ncyech{#1}\fancy@def\f@ncyoch{#2}} 272 | \def\@ychead#1{\fancy@def\f@ncyech{#1}\fancy@def\f@ncyoch{#1}} 273 | 274 | \newcommand{\rhead}{\@ifnextchar[{\@xrhead}{\@yrhead}} 275 | \def\@xrhead[#1]#2{\fancy@def\f@ncyerh{#1}\fancy@def\f@ncyorh{#2}} 276 | \def\@yrhead#1{\fancy@def\f@ncyerh{#1}\fancy@def\f@ncyorh{#1}} 277 | 278 | \newcommand{\lfoot}{\@ifnextchar[{\@xlfoot}{\@ylfoot}} 279 | \def\@xlfoot[#1]#2{\fancy@def\f@ncyelf{#1}\fancy@def\f@ncyolf{#2}} 280 | \def\@ylfoot#1{\fancy@def\f@ncyelf{#1}\fancy@def\f@ncyolf{#1}} 281 | 282 | \newcommand{\cfoot}{\@ifnextchar[{\@xcfoot}{\@ycfoot}} 283 | \def\@xcfoot[#1]#2{\fancy@def\f@ncyecf{#1}\fancy@def\f@ncyocf{#2}} 284 | \def\@ycfoot#1{\fancy@def\f@ncyecf{#1}\fancy@def\f@ncyocf{#1}} 285 | 286 | \newcommand{\rfoot}{\@ifnextchar[{\@xrfoot}{\@yrfoot}} 287 | \def\@xrfoot[#1]#2{\fancy@def\f@ncyerf{#1}\fancy@def\f@ncyorf{#2}} 288 | \def\@yrfoot#1{\fancy@def\f@ncyerf{#1}\fancy@def\f@ncyorf{#1}} 289 | 290 | \newlength{\fancy@headwidth} 291 | \let\headwidth\fancy@headwidth 292 | \newlength{\f@ncyO@elh} 293 | \newlength{\f@ncyO@erh} 294 | \newlength{\f@ncyO@olh} 295 | \newlength{\f@ncyO@orh} 296 | \newlength{\f@ncyO@elf} 297 | \newlength{\f@ncyO@erf} 298 | \newlength{\f@ncyO@olf} 299 | \newlength{\f@ncyO@orf} 300 | \newcommand{\headrulewidth}{0.4pt} 301 | \newcommand{\footrulewidth}{0pt} 302 | \newcommand{\footruleskip}{.3\normalbaselineskip} 303 | 304 | % Fancyplain stuff shouldn't be used anymore (rather 305 | % \fancypagestyle{plain} should be used), but it must be present for 306 | % compatibility reasons. 307 | 308 | \newcommand{\plainheadrulewidth}{0pt} 309 | \newcommand{\plainfootrulewidth}{0pt} 310 | \newif\if@fancyplain \@fancyplainfalse 311 | \def\fancyplain#1#2{\if@fancyplain#1\else#2\fi} 312 | 313 | \headwidth=-123456789sp %magic constant 314 | 315 | % Command to reset various things in the headers: 316 | % a.o. single spacing (taken from setspace.sty) 317 | % and the catcode of ^^M (so that epsf files in the header work if a 318 | % verbatim crosses a page boundary) 319 | % It also defines a \nouppercase command that disables \uppercase and 320 | % \Makeuppercase. It can only be used in the headers and footers. 321 | \let\fnch@everypar\everypar% save real \everypar because of spanish.ldf 322 | \def\fancy@reset{\fnch@everypar{}\restorecr\endlinechar=13 323 | \def\baselinestretch{1}% 324 | \def\nouppercase##1{{\let\uppercase\relax\let\MakeUppercase\relax 325 | \expandafter\let\csname MakeUppercase \endcsname\relax##1}}% 326 | \ifx\undefined\@newbaseline% NFSS not present; 2.09 or 2e 327 | \ifx\@normalsize\undefined \normalsize % for ucthesis.cls 328 | \else \@normalsize \fi 329 | \else% NFSS (2.09) present 330 | \@newbaseline% 331 | \fi} 332 | 333 | % Initialization of the head and foot text. 334 | 335 | % The default values still contain \fancyplain for compatibility. 336 | \fancyhf{} % clear all 337 | % lefthead empty on ``plain'' pages, \rightmark on even, \leftmark on odd pages 338 | % evenhead empty on ``plain'' pages, \leftmark on even, \rightmark on odd pages 339 | \if@twoside 340 | \fancyhead[el,or]{\fancyplain{}{\sl\rightmark}} 341 | \fancyhead[er,ol]{\fancyplain{}{\sl\leftmark}} 342 | \else 343 | \fancyhead[l]{\fancyplain{}{\sl\rightmark}} 344 | \fancyhead[r]{\fancyplain{}{\sl\leftmark}} 345 | \fi 346 | \fancyfoot[c]{\rm\thepage} % page number 347 | 348 | % Use box 0 as a temp box and dimen 0 as temp dimen. 349 | % This can be done, because this code will always 350 | % be used inside another box, and therefore the changes are local. 351 | 352 | \def\@fancyvbox#1#2{\setbox0\vbox{#2}\ifdim\ht0>#1\@fancywarning 353 | {\string#1 is too small (\the#1): ^^J Make it at least \the\ht0.^^J 354 | We now make it that large for the rest of the document.^^J 355 | This may cause the page layout to be inconsistent, however\@gobble}% 356 | \dimen0=#1\global\setlength{#1}{\ht0}\ht0=\dimen0\fi 357 | \box0} 358 | 359 | % Put together a header or footer given the left, center and 360 | % right text, fillers at left and right and a rule. 361 | % The \lap commands put the text into an hbox of zero size, 362 | % so overlapping text does not generate an errormessage. 363 | % These macros have 5 parameters: 364 | % 1. LEFTSIDE BEARING % This determines at which side the header will stick 365 | % out. When \fancyhfoffset is used this calculates \headwidth, otherwise 366 | % it is \hss or \relax (after expansion). 367 | % 2. \f@ncyolh, \f@ncyelh, \f@ncyolf or \f@ncyelf. This is the left component. 368 | % 3. \f@ncyoch, \f@ncyech, \f@ncyocf or \f@ncyecf. This is the middle comp. 369 | % 4. \f@ncyorh, \f@ncyerh, \f@ncyorf or \f@ncyerf. This is the right component. 370 | % 5. RIGHTSIDE BEARING. This is always \relax or \hss (after expansion). 371 | 372 | \def\@fancyhead#1#2#3#4#5{#1\hbox to\headwidth{\fancy@reset 373 | \@fancyvbox\headheight{\hbox 374 | {\rlap{\parbox[b]{\headwidth}{\raggedright#2}}\hfill 375 | \parbox[b]{\headwidth}{\centering#3}\hfill 376 | \llap{\parbox[b]{\headwidth}{\raggedleft#4}}}\headrule}}#5} 377 | 378 | \def\@fancyfoot#1#2#3#4#5{#1\hbox to\headwidth{\fancy@reset 379 | \@fancyvbox\footskip{\footrule 380 | \hbox{\rlap{\parbox[t]{\headwidth}{\raggedright#2}}\hfill 381 | \parbox[t]{\headwidth}{\centering#3}\hfill 382 | \llap{\parbox[t]{\headwidth}{\raggedleft#4}}}}}#5} 383 | 384 | \def\headrule{{\if@fancyplain\let\headrulewidth\plainheadrulewidth\fi 385 | \hrule\@height\headrulewidth\@width\headwidth \vskip-\headrulewidth}} 386 | 387 | \def\footrule{{\if@fancyplain\let\footrulewidth\plainfootrulewidth\fi 388 | \vskip-\footruleskip\vskip-\footrulewidth 389 | \hrule\@width\headwidth\@height\footrulewidth\vskip\footruleskip}} 390 | 391 | \def\ps@fancy{% 392 | \@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}%for amsbook 393 | % 394 | % Define \MakeUppercase for old LaTeXen. 395 | % Note: we used \def rather than \let, so that \let\uppercase\relax (from 396 | % the version 1 documentation) will still work. 397 | % 398 | \@ifundefined{MakeUppercase}{\def\MakeUppercase{\uppercase}}{}% 399 | \@ifundefined{chapter}{\def\sectionmark##1{\markboth 400 | {\MakeUppercase{\ifnum \c@secnumdepth>\z@ 401 | \thesection\hskip 1em\relax \fi ##1}}{}}% 402 | \def\subsectionmark##1{\markright {\ifnum \c@secnumdepth >\@ne 403 | \thesubsection\hskip 1em\relax \fi ##1}}}% 404 | {\def\chaptermark##1{\markboth {\MakeUppercase{\ifnum \c@secnumdepth>\m@ne 405 | \@chapapp\ \thechapter. \ \fi ##1}}{}}% 406 | \def\sectionmark##1{\markright{\MakeUppercase{\ifnum \c@secnumdepth >\z@ 407 | \thesection. \ \fi ##1}}}}% 408 | %\csname ps@headings\endcsname % use \ps@headings defaults if they exist 409 | \ps@@fancy 410 | \gdef\ps@fancy{\@fancyplainfalse\ps@@fancy}% 411 | % Initialize \headwidth if the user didn't 412 | % 413 | \ifdim\headwidth<0sp 414 | % 415 | % This catches the case that \headwidth hasn't been initialized and the 416 | % case that the user added something to \headwidth in the expectation that 417 | % it was initialized to \textwidth. We compensate this now. This loses if 418 | % the user intended to multiply it by a factor. But that case is more 419 | % likely done by saying something like \headwidth=1.2\textwidth. 420 | % The doc says you have to change \headwidth after the first call to 421 | % \pagestyle{fancy}. This code is just to catch the most common cases were 422 | % that requirement is violated. 423 | % 424 | \global\advance\headwidth123456789sp\global\advance\headwidth\textwidth 425 | \fi} 426 | \def\ps@fancyplain{\ps@fancy \let\ps@plain\ps@plain@fancy} 427 | \def\ps@plain@fancy{\@fancyplaintrue\ps@@fancy} 428 | \let\ps@@empty\ps@empty 429 | \def\ps@@fancy{% 430 | \ps@@empty % This is for amsbook/amsart, which do strange things with \topskip 431 | \def\@mkboth{\protect\markboth}% 432 | \def\@oddhead{\@fancyhead\fancy@Oolh\f@ncyolh\f@ncyoch\f@ncyorh\fancy@Oorh}% 433 | \def\@oddfoot{\@fancyfoot\fancy@Oolf\f@ncyolf\f@ncyocf\f@ncyorf\fancy@Oorf}% 434 | \def\@evenhead{\@fancyhead\fancy@Oelh\f@ncyelh\f@ncyech\f@ncyerh\fancy@Oerh}% 435 | \def\@evenfoot{\@fancyfoot\fancy@Oelf\f@ncyelf\f@ncyecf\f@ncyerf\fancy@Oerf}% 436 | } 437 | % Default definitions for compatibility mode: 438 | % These cause the header/footer to take the defined \headwidth as width 439 | % And to shift in the direction of the marginpar area 440 | 441 | \def\fancy@Oolh{\if@reversemargin\hss\else\relax\fi} 442 | \def\fancy@Oorh{\if@reversemargin\relax\else\hss\fi} 443 | \let\fancy@Oelh\fancy@Oorh 444 | \let\fancy@Oerh\fancy@Oolh 445 | 446 | \let\fancy@Oolf\fancy@Oolh 447 | \let\fancy@Oorf\fancy@Oorh 448 | \let\fancy@Oelf\fancy@Oelh 449 | \let\fancy@Oerf\fancy@Oerh 450 | 451 | % New definitions for the use of \fancyhfoffset 452 | % These calculate the \headwidth from \textwidth and the specified offsets. 453 | 454 | \def\fancy@offsolh{\headwidth=\textwidth\advance\headwidth\f@ncyO@olh 455 | \advance\headwidth\f@ncyO@orh\hskip-\f@ncyO@olh} 456 | \def\fancy@offselh{\headwidth=\textwidth\advance\headwidth\f@ncyO@elh 457 | \advance\headwidth\f@ncyO@erh\hskip-\f@ncyO@elh} 458 | 459 | \def\fancy@offsolf{\headwidth=\textwidth\advance\headwidth\f@ncyO@olf 460 | \advance\headwidth\f@ncyO@orf\hskip-\f@ncyO@olf} 461 | \def\fancy@offself{\headwidth=\textwidth\advance\headwidth\f@ncyO@elf 462 | \advance\headwidth\f@ncyO@erf\hskip-\f@ncyO@elf} 463 | 464 | \def\fancy@setoffs{% 465 | % Just in case \let\headwidth\textwidth was used 466 | \fancy@gbl\let\headwidth\fancy@headwidth 467 | \fancy@gbl\let\fancy@Oolh\fancy@offsolh 468 | \fancy@gbl\let\fancy@Oelh\fancy@offselh 469 | \fancy@gbl\let\fancy@Oorh\hss 470 | \fancy@gbl\let\fancy@Oerh\hss 471 | \fancy@gbl\let\fancy@Oolf\fancy@offsolf 472 | \fancy@gbl\let\fancy@Oelf\fancy@offself 473 | \fancy@gbl\let\fancy@Oorf\hss 474 | \fancy@gbl\let\fancy@Oerf\hss} 475 | 476 | \newif\iffootnote 477 | \let\latex@makecol\@makecol 478 | \def\@makecol{\ifvoid\footins\footnotetrue\else\footnotefalse\fi 479 | \let\topfloat\@toplist\let\botfloat\@botlist\latex@makecol} 480 | \def\iftopfloat#1#2{\ifx\topfloat\empty #2\else #1\fi} 481 | \def\ifbotfloat#1#2{\ifx\botfloat\empty #2\else #1\fi} 482 | \def\iffloatpage#1#2{\if@fcolmade #1\else #2\fi} 483 | 484 | \newcommand{\fancypagestyle}[2]{% 485 | \@namedef{ps@#1}{\let\fancy@gbl\relax#2\relax\ps@fancy}} 486 | -------------------------------------------------------------------------------- /paper/icml2018.sty: -------------------------------------------------------------------------------- 1 | % File: icml2018.sty (LaTeX style file for ICML-2018, version of 2017-10-28) 2 | 3 | % This file contains the LaTeX formatting parameters for a two-column 4 | % conference proceedings that is 8.5 inches wide by 11 inches high. 5 | % 6 | % Modified by Iain Murray 2018: changed years, location. Remove affiliation notes when anonymous. 7 | % Move times dependency from .tex to .sty so fewer people delete it. 8 | % 9 | % Modified by Daniel Roy 2017: changed byline to use footnotes for affiliations, and removed emails 10 | % 11 | % Modified by Percy Liang 12/2/2013: changed the year, location from the previous template for ICML 2014 12 | 13 | % Modified by Fei Sha 9/2/2013: changed the year, location form the previous template for ICML 2013 14 | % 15 | % Modified by Fei Sha 4/24/2013: (1) remove the extra whitespace after the first author's email address (in %the camera-ready version) (2) change the Proceeding ... of ICML 2010 to 2014 so PDF's metadata will show up % correctly 16 | % 17 | % Modified by Sanjoy Dasgupta, 2013: changed years, location 18 | % 19 | % Modified by Francesco Figari, 2012: changed years, location 20 | % 21 | % Modified by Christoph Sawade and Tobias Scheffer, 2011: added line 22 | % numbers, changed years 23 | % 24 | % Modified by Hal Daume III, 2010: changed years, added hyperlinks 25 | % 26 | % Modified by Kiri Wagstaff, 2009: changed years 27 | % 28 | % Modified by Sam Roweis, 2008: changed years 29 | % 30 | % Modified by Ricardo Silva, 2007: update of the ifpdf verification 31 | % 32 | % Modified by Prasad Tadepalli and Andrew Moore, merely changing years. 33 | % 34 | % Modified by Kristian Kersting, 2005, based on Jennifer Dy's 2004 version 35 | % - running title. If the original title is to long or is breaking a line, 36 | % use \icmltitlerunning{...} in the preamble to supply a shorter form. 37 | % Added fancyhdr package to get a running head. 38 | % - Updated to store the page size because pdflatex does compile the 39 | % page size into the pdf. 40 | % 41 | % Hacked by Terran Lane, 2003: 42 | % - Updated to use LaTeX2e style file conventions (ProvidesPackage, 43 | % etc.) 44 | % - Added an ``appearing in'' block at the base of the first column 45 | % (thus keeping the ``appearing in'' note out of the bottom margin 46 | % where the printer should strip in the page numbers). 47 | % - Added a package option [accepted] that selects between the ``Under 48 | % review'' notice (default, when no option is specified) and the 49 | % ``Appearing in'' notice (for use when the paper has been accepted 50 | % and will appear). 51 | % 52 | % Originally created as: ml2k.sty (LaTeX style file for ICML-2000) 53 | % by P. Langley (12/23/99) 54 | 55 | %%%%%%%%%%%%%%%%%%%% 56 | %% This version of the style file supports both a ``review'' version 57 | %% and a ``final/accepted'' version. The difference is only in the 58 | %% text that appears in the note at the bottom of the first column of 59 | %% the first page. The default behavior is to print a note to the 60 | %% effect that the paper is under review and don't distribute it. The 61 | %% final/accepted version prints an ``Appearing in'' note. To get the 62 | %% latter behavior, in the calling file change the ``usepackage'' line 63 | %% from: 64 | %% \usepackage{icml2018} 65 | %% to 66 | %% \usepackage[accepted]{icml2018} 67 | %%%%%%%%%%%%%%%%%%%% 68 | 69 | \NeedsTeXFormat{LaTeX2e} 70 | \ProvidesPackage{icml2018}[2018/01/01 v2.0 ICML Conference Style File] 71 | 72 | % Before 2018, \usepackage{times} was in the example TeX, but inevitably 73 | % not everybody did it. 74 | \RequirePackage{times} 75 | 76 | % Use fancyhdr package 77 | \RequirePackage{fancyhdr} 78 | \RequirePackage{color} 79 | \RequirePackage{algorithm} 80 | \RequirePackage{algorithmic} 81 | \RequirePackage{natbib} 82 | \RequirePackage{eso-pic} % used by \AddToShipoutPicture 83 | \RequirePackage{forloop} 84 | 85 | %%%%%%%% Options 86 | \DeclareOption{accepted}{% 87 | \renewcommand{\Notice@String}{\ICML@appearing} 88 | \gdef\isaccepted{1} 89 | } 90 | \DeclareOption{nohyperref}{% 91 | \gdef\nohyperref{1} 92 | } 93 | 94 | \ifdefined\nohyperref\else\ifdefined\hypersetup 95 | \definecolor{mydarkblue}{rgb}{0,0.08,0.45} 96 | \hypersetup{ % 97 | pdftitle={}, 98 | pdfauthor={}, 99 | pdfsubject={Proceedings of the International Conference on Machine Learning 2018}, 100 | pdfkeywords={}, 101 | pdfborder=0 0 0, 102 | pdfpagemode=UseNone, 103 | colorlinks=true, 104 | linkcolor=mydarkblue, 105 | citecolor=mydarkblue, 106 | filecolor=mydarkblue, 107 | urlcolor=mydarkblue, 108 | pdfview=FitH} 109 | 110 | \ifdefined\isaccepted \else 111 | \hypersetup{pdfauthor={Anonymous Submission}} 112 | \fi 113 | \fi\fi 114 | 115 | %%%%%%%%%%%%%%%%%%%% 116 | % This string is printed at the bottom of the page for the 117 | % final/accepted version of the ``appearing in'' note. Modify it to 118 | % change that text. 119 | %%%%%%%%%%%%%%%%%%%% 120 | \newcommand{\ICML@appearing}{\textit{Proceedings of the 121 | $\mathit{35}^{th}$ International Conference on Machine Learning}, 122 | Stockholm, Sweden, PMLR 80, 2018. 123 | Copyright 2018 by the author(s).} 124 | 125 | %%%%%%%%%%%%%%%%%%%% 126 | % This string is printed at the bottom of the page for the draft/under 127 | % review version of the ``appearing in'' note. Modify it to change 128 | % that text. 129 | %%%%%%%%%%%%%%%%%%%% 130 | \newcommand{\Notice@String}{Preliminary work. Under review by the 131 | International Conference on Machine Learning (ICML)\@. Do not distribute.} 132 | 133 | % Cause the declared options to actually be parsed and activated 134 | \ProcessOptions\relax 135 | 136 | % Uncomment the following for debugging. It will cause LaTeX to dump 137 | % the version of the ``appearing in'' string that will actually appear 138 | % in the document. 139 | %\typeout{>> Notice string='\Notice@String'} 140 | 141 | % Change citation commands to be more like old ICML styles 142 | \newcommand{\yrcite}[1]{\citeyearpar{#1}} 143 | \renewcommand{\cite}[1]{\citep{#1}} 144 | 145 | 146 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 147 | % to ensure the letter format is used. pdflatex does compile the 148 | % page size into the pdf. This is done using \pdfpagewidth and 149 | % \pdfpageheight. As Latex does not know this directives, we first 150 | % check whether pdflatex or latex is used. 151 | % 152 | % Kristian Kersting 2005 153 | % 154 | % in order to account for the more recent use of pdfetex as the default 155 | % compiler, I have changed the pdf verification. 156 | % 157 | % Ricardo Silva 2007 158 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 159 | 160 | \paperwidth=8.5in 161 | \paperheight=11in 162 | 163 | % old PDFLaTex verification, circa 2005 164 | % 165 | %\newif\ifpdf\ifx\pdfoutput\undefined 166 | % \pdffalse % we are not running PDFLaTeX 167 | %\else 168 | % \pdfoutput=1 % we are running PDFLaTeX 169 | % \pdftrue 170 | %\fi 171 | 172 | \newif\ifpdf %adapted from ifpdf.sty 173 | \ifx\pdfoutput\undefined 174 | \else 175 | \ifx\pdfoutput\relax 176 | \else 177 | \ifcase\pdfoutput 178 | \else 179 | \pdftrue 180 | \fi 181 | \fi 182 | \fi 183 | 184 | \ifpdf 185 | % \pdfpagewidth=\paperwidth 186 | % \pdfpageheight=\paperheight 187 | \setlength{\pdfpagewidth}{8.5in} 188 | \setlength{\pdfpageheight}{11in} 189 | \fi 190 | 191 | % Physical page layout 192 | 193 | \evensidemargin -0.23in 194 | \oddsidemargin -0.23in 195 | \setlength\textheight{9.0in} 196 | \setlength\textwidth{6.75in} 197 | \setlength\columnsep{0.25in} 198 | \setlength\headheight{10pt} 199 | \setlength\headsep{10pt} 200 | \addtolength{\topmargin}{-20pt} 201 | \addtolength{\topmargin}{-0.29in} 202 | 203 | % Historically many authors tried to include packages like geometry or fullpage, 204 | % which change the page layout. It either makes the proceedings inconsistent, or 205 | % wastes organizers' time chasing authors. So let's nip these problems in the 206 | % bud here. -- Iain Murray 2018. 207 | %\RequirePackage{printlen} 208 | \AtBeginDocument{% 209 | % To get the numbers below, include printlen package above and see lengths like this: 210 | %\printlength\oddsidemargin\\ 211 | %\printlength\headheight\\ 212 | %\printlength\textheight\\ 213 | %\printlength\marginparsep\\ 214 | %\printlength\footskip\\ 215 | %\printlength\hoffset\\ 216 | %\printlength\paperwidth\\ 217 | %\printlength\topmargin\\ 218 | %\printlength\headsep\\ 219 | %\printlength\textwidth\\ 220 | %\printlength\marginparwidth\\ 221 | %\printlength\marginparpush\\ 222 | %\printlength\voffset\\ 223 | %\printlength\paperheight\\ 224 | % 225 | \newif\ifmarginsmessedwith 226 | \marginsmessedwithfalse 227 | \ifdim\oddsidemargin=-16.62178pt \else oddsidemargin has been altered.\\ \marginsmessedwithtrue\fi 228 | \ifdim\headheight=10.0pt \else headheight has been altered.\\ \marginsmessedwithtrue\fi 229 | \ifdim\textheight=650.43pt \else textheight has been altered.\\ \marginsmessedwithtrue\fi 230 | \ifdim\marginparsep=11.0pt \else marginparsep has been altered.\\ \marginsmessedwithtrue\fi 231 | \ifdim\footskip=0.0pt \else footskip has been altered.\\ \marginsmessedwithtrue\fi 232 | \ifdim\hoffset=0.0pt \else hoffset has been altered.\\ \marginsmessedwithtrue\fi 233 | \ifdim\paperwidth=614.295pt \else paperwidth has been altered.\\ \marginsmessedwithtrue\fi 234 | \ifdim\topmargin=-24.95781pt \else topmargin has been altered.\\ \marginsmessedwithtrue\fi 235 | \ifdim\headsep=10.0pt \else headsep has been altered.\\ \marginsmessedwithtrue\fi 236 | \ifdim\textwidth=487.8225pt \else textwidth has been altered.\\ \marginsmessedwithtrue\fi 237 | \ifdim\marginparwidth=65.0pt \else marginparwidth has been altered.\\ \marginsmessedwithtrue\fi 238 | \ifdim\marginparpush=5.0pt \else marginparpush has been altered.\\ \marginsmessedwithtrue\fi 239 | \ifdim\voffset=0.0pt \else voffset has been altered.\\ \marginsmessedwithtrue\fi 240 | \ifdim\paperheight=794.96999pt \else paperheight has been altered.\\ \marginsmessedwithtrue\fi 241 | \ifmarginsmessedwith 242 | 243 | \textbf{\large \em The page layout violates the ICML style.} 244 | 245 | Please do not change the page layout, or include packages like geometry, 246 | savetrees, or fullpage, which change it for you. 247 | 248 | We're not able to reliably undo arbitrary changes to the style. Please remove 249 | the offending package(s), or layout-changing commands and try again. 250 | 251 | \fi} 252 | 253 | 254 | %% The following is adapted from code in the acmconf.sty conference 255 | %% style file. The constants in it are somewhat magical, and appear 256 | %% to work well with the two-column format on US letter paper that 257 | %% ICML uses, but will break if you change that layout, or if you use 258 | %% a longer block of text for the copyright notice string. Fiddle with 259 | %% them if necessary to get the block to fit/look right. 260 | %% 261 | %% -- Terran Lane, 2003 262 | %% 263 | %% The following comments are included verbatim from acmconf.sty: 264 | %% 265 | %%% This section (written by KBT) handles the 1" box in the lower left 266 | %%% corner of the left column of the first page by creating a picture, 267 | %%% and inserting the predefined string at the bottom (with a negative 268 | %%% displacement to offset the space allocated for a non-existent 269 | %%% caption). 270 | %%% 271 | \def\ftype@copyrightbox{8} 272 | \def\@copyrightspace{ 273 | % Create a float object positioned at the bottom of the column. Note 274 | % that because of the mystical nature of floats, this has to be called 275 | % before the first column is populated with text (e.g., from the title 276 | % or abstract blocks). Otherwise, the text will force the float to 277 | % the next column. -- TDRL. 278 | \@float{copyrightbox}[b] 279 | \begin{center} 280 | \setlength{\unitlength}{1pc} 281 | \begin{picture}(20,1.5) 282 | % Create a line separating the main text from the note block. 283 | % 4.818pc==0.8in. 284 | \put(0,2.5){\line(1,0){4.818}} 285 | % Insert the text string itself. Note that the string has to be 286 | % enclosed in a parbox -- the \put call needs a box object to 287 | % position. Without the parbox, the text gets splattered across the 288 | % bottom of the page semi-randomly. The 19.75pc distance seems to be 289 | % the width of the column, though I can't find an appropriate distance 290 | % variable to substitute here. -- TDRL. 291 | \put(0,0){\parbox[b]{19.75pc}{\small \Notice@String}} 292 | \end{picture} 293 | \end{center} 294 | \end@float} 295 | 296 | % Note: A few Latex versions need the next line instead of the former. 297 | % \addtolength{\topmargin}{0.3in} 298 | % \setlength\footheight{0pt} 299 | \setlength\footskip{0pt} 300 | %\pagestyle{empty} 301 | \flushbottom \twocolumn 302 | \sloppy 303 | 304 | % Clear out the addcontentsline command 305 | \def\addcontentsline#1#2#3{} 306 | 307 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 308 | %%% commands for formatting paper title, author names, and addresses. 309 | 310 | %%start%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 311 | %%%%%% title as running head -- Kristian Kersting 2005 %%%%%%%%%%%%% 312 | 313 | 314 | %\makeatletter 315 | %\newtoks\mytoksa 316 | %\newtoks\mytoksb 317 | %\newcommand\addtomylist[2]{% 318 | % \mytoksa\expandafter{#1}% 319 | % \mytoksb{#2}% 320 | % \edef#1{\the\mytoksa\the\mytoksb}% 321 | %} 322 | %\makeatother 323 | 324 | % box to check the size of the running head 325 | \newbox\titrun 326 | 327 | % general page style 328 | \pagestyle{fancy} 329 | \fancyhf{} 330 | \fancyhead{} 331 | \fancyfoot{} 332 | % set the width of the head rule to 1 point 333 | \renewcommand{\headrulewidth}{1pt} 334 | 335 | % definition to set the head as running head in the preamble 336 | \def\icmltitlerunning#1{\gdef\@icmltitlerunning{#1}} 337 | 338 | % main definition adapting \icmltitle from 2004 339 | \long\def\icmltitle#1{% 340 | 341 | %check whether @icmltitlerunning exists 342 | % if not \icmltitle is used as running head 343 | \ifx\undefined\@icmltitlerunning% 344 | \gdef\@icmltitlerunning{#1} 345 | \fi 346 | 347 | %add it to pdf information 348 | \ifdefined\nohyperref\else\ifdefined\hypersetup 349 | \hypersetup{pdftitle={#1}} 350 | \fi\fi 351 | 352 | %get the dimension of the running title 353 | \global\setbox\titrun=\vbox{\small\bf\@icmltitlerunning} 354 | 355 | % error flag 356 | \gdef\@runningtitleerror{0} 357 | 358 | % running title too long 359 | \ifdim\wd\titrun>\textwidth% 360 | {\gdef\@runningtitleerror{1}}% 361 | % running title breaks a line 362 | \else\ifdim\ht\titrun>6.25pt 363 | {\gdef\@runningtitleerror{2}}% 364 | \fi 365 | \fi 366 | 367 | % if there is somthing wrong with the running title 368 | \ifnum\@runningtitleerror>0 369 | \typeout{}% 370 | \typeout{}% 371 | \typeout{*******************************************************}% 372 | \typeout{Title exceeds size limitations for running head.}% 373 | \typeout{Please supply a shorter form for the running head} 374 | \typeout{with \string\icmltitlerunning{...}\space prior to \string\begin{document}}% 375 | \typeout{*******************************************************}% 376 | \typeout{}% 377 | \typeout{}% 378 | % set default running title 379 | \chead{\small\bf Title Suppressed Due to Excessive Size}% 380 | \else 381 | % 'everything' fine, set provided running title 382 | \chead{\small\bf\@icmltitlerunning}% 383 | \fi 384 | 385 | % no running title on the first page of the paper 386 | \thispagestyle{empty} 387 | 388 | %%%%%%%%%%%%%%%%%%%% Kristian Kersting %%%%%%%%%%%%%%%%%%%%%%%%% 389 | %end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 390 | 391 | {\center\baselineskip 18pt 392 | \toptitlebar{\Large\bf #1}\bottomtitlebar} 393 | } 394 | 395 | 396 | \gdef\icmlfullauthorlist{} 397 | \newcommand\addstringtofullauthorlist{\g@addto@macro\icmlfullauthorlist} 398 | \newcommand\addtofullauthorlist[1]{% 399 | \ifdefined\icmlanyauthors% 400 | \addstringtofullauthorlist{, #1}% 401 | \else% 402 | \addstringtofullauthorlist{#1}% 403 | \gdef\icmlanyauthors{1}% 404 | \fi% 405 | \ifdefined\nohyperref\else\ifdefined\hypersetup% 406 | \hypersetup{pdfauthor=\icmlfullauthorlist}% 407 | \fi\fi} 408 | 409 | 410 | \def\toptitlebar{\hrule height1pt \vskip .25in} 411 | \def\bottomtitlebar{\vskip .22in \hrule height1pt \vskip .3in} 412 | 413 | \newenvironment{icmlauthorlist}{% 414 | \setlength\topsep{0pt} 415 | \setlength\parskip{0pt} 416 | \begin{center} 417 | }{% 418 | \end{center} 419 | } 420 | 421 | \newcounter{@affiliationcounter} 422 | \newcommand{\@pa}[1]{% 423 | % ``#1'' 424 | \ifcsname the@affil#1\endcsname 425 | % do nothing 426 | \else 427 | \ifcsname @icmlsymbol#1\endcsname 428 | % nothing 429 | \else 430 | \stepcounter{@affiliationcounter}% 431 | \newcounter{@affil#1}% 432 | \setcounter{@affil#1}{\value{@affiliationcounter}}% 433 | \fi 434 | \fi% 435 | \ifcsname @icmlsymbol#1\endcsname 436 | \textsuperscript{\csname @icmlsymbol#1\endcsname\,}% 437 | \else 438 | %\expandafter\footnotemark[\arabic{@affil#1}\,]% 439 | \textsuperscript{\arabic{@affil#1}\,}% 440 | \fi 441 | } 442 | 443 | %\newcommand{\icmlauthor}[2]{% 444 | %\addtofullauthorlist{#1}% 445 | %#1\@for\theaffil:=#2\do{\pa{\theaffil}}% 446 | %} 447 | \newcommand{\icmlauthor}[2]{% 448 | \ifdefined\isaccepted 449 | \mbox{\bf #1}\,\@for\theaffil:=#2\do{\@pa{\theaffil}} \addtofullauthorlist{#1}% 450 | \else 451 | \ifdefined\@icmlfirsttime 452 | \else 453 | \gdef\@icmlfirsttime{1} 454 | \mbox{\bf Anonymous Authors}\@pa{@anon} \addtofullauthorlist{Anonymous Authors} 455 | \fi 456 | \fi 457 | } 458 | 459 | \newcommand{\icmlsetsymbol}[2]{% 460 | \expandafter\gdef\csname @icmlsymbol#1\endcsname{#2} 461 | } 462 | 463 | 464 | \newcommand{\icmlaffiliation}[2]{% 465 | \ifdefined\isaccepted 466 | \ifcsname the@affil#1\endcsname 467 | \expandafter\gdef\csname @affilname\csname the@affil#1\endcsname\endcsname{#2}% 468 | \else 469 | {\bf AUTHORERR: Error in use of \textbackslash{}icmlaffiliation command. Label ``#1'' not mentioned in some \textbackslash{}icmlauthor\{author name\}\{labels here\} command beforehand. } 470 | \typeout{}% 471 | \typeout{}% 472 | \typeout{*******************************************************}% 473 | \typeout{Affiliation label undefined. }% 474 | \typeout{Make sure \string\icmlaffiliation\space follows } 475 | \typeout{all of \string\icmlauthor\space commands}% 476 | \typeout{*******************************************************}% 477 | \typeout{}% 478 | \typeout{}% 479 | \fi 480 | \else % \isaccepted 481 | % can be called multiple times... it's idempotent 482 | \expandafter\gdef\csname @affilname1\endcsname{Anonymous Institution, Anonymous City, Anonymous Region, Anonymous Country} 483 | \fi 484 | } 485 | 486 | \newcommand{\icmlcorrespondingauthor}[2]{ 487 | \ifdefined\isaccepted 488 | \ifdefined\icmlcorrespondingauthor@text 489 | \g@addto@macro\icmlcorrespondingauthor@text{, #1 \textless{}#2\textgreater{}} 490 | \else 491 | \gdef\icmlcorrespondingauthor@text{#1 \textless{}#2\textgreater{}} 492 | \fi 493 | \else 494 | \gdef\icmlcorrespondingauthor@text{Anonymous Author \textless{}anon.email@domain.com\textgreater{}} 495 | \fi 496 | } 497 | 498 | \newcommand{\icmlEqualContribution}{\textsuperscript{*}Equal contribution } 499 | 500 | \newcounter{@affilnum} 501 | \newcommand{\printAffiliationsAndNotice}[1]{% 502 | \stepcounter{@affiliationcounter}% 503 | {\let\thefootnote\relax\footnotetext{\hspace*{-\footnotesep}\ifdefined\isaccepted #1\fi% 504 | \forloop{@affilnum}{1}{\value{@affilnum} < \value{@affiliationcounter}}{ 505 | \textsuperscript{\arabic{@affilnum}}\ifcsname @affilname\the@affilnum\endcsname% 506 | \csname @affilname\the@affilnum\endcsname% 507 | \else 508 | {\bf AUTHORERR: Missing \textbackslash{}icmlaffiliation.} 509 | \fi 510 | }. 511 | \ifdefined\icmlcorrespondingauthor@text 512 | Correspondence to: \icmlcorrespondingauthor@text. 513 | \else 514 | {\bf AUTHORERR: Missing \textbackslash{}icmlcorrespondingauthor.} 515 | \fi 516 | 517 | \ \\ 518 | \Notice@String 519 | } 520 | } 521 | } 522 | 523 | %\makeatother 524 | 525 | \long\def\icmladdress#1{% 526 | {\bf The \textbackslash{}icmladdress command is no longer used. See the example\_paper PDF .tex for usage of \textbackslash{}icmlauther and \textbackslash{}icmlaffiliation.} 527 | } 528 | 529 | %% keywords as first class citizens 530 | \def\icmlkeywords#1{% 531 | % \ifdefined\isaccepted \else 532 | % \par {\bf Keywords:} #1% 533 | % \fi 534 | % \ifdefined\nohyperref\else\ifdefined\hypersetup 535 | % \hypersetup{pdfkeywords={#1}} 536 | % \fi\fi 537 | % \ifdefined\isaccepted \else 538 | % \par {\bf Keywords:} #1% 539 | % \fi 540 | \ifdefined\nohyperref\else\ifdefined\hypersetup 541 | \hypersetup{pdfkeywords={#1}} 542 | \fi\fi 543 | } 544 | 545 | % modification to natbib citations 546 | \setcitestyle{authoryear,round,citesep={;},aysep={,},yysep={;}} 547 | 548 | % Redefinition of the abstract environment. 549 | \renewenvironment{abstract} 550 | {% 551 | % Insert the ``appearing in'' copyright notice. 552 | %\@copyrightspace 553 | \centerline{\large\bf Abstract} 554 | \vspace{-0.12in}\begin{quote}} 555 | {\par\end{quote}\vskip 0.12in} 556 | 557 | % numbered section headings with different treatment of numbers 558 | 559 | \def\@startsection#1#2#3#4#5#6{\if@noskipsec \leavevmode \fi 560 | \par \@tempskipa #4\relax 561 | \@afterindenttrue 562 | % Altered the following line to indent a section's first paragraph. 563 | % \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse\fi 564 | \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \fi 565 | \if@nobreak \everypar{}\else 566 | \addpenalty{\@secpenalty}\addvspace{\@tempskipa}\fi \@ifstar 567 | {\@ssect{#3}{#4}{#5}{#6}}{\@dblarg{\@sict{#1}{#2}{#3}{#4}{#5}{#6}}}} 568 | 569 | \def\@sict#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth 570 | \def\@svsec{}\else 571 | \refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname}\fi 572 | \@tempskipa #5\relax 573 | \ifdim \@tempskipa>\z@ 574 | \begingroup #6\relax 575 | \@hangfrom{\hskip #3\relax\@svsec.~}{\interlinepenalty \@M #8\par} 576 | \endgroup 577 | \csname #1mark\endcsname{#7}\addcontentsline 578 | {toc}{#1}{\ifnum #2>\c@secnumdepth \else 579 | \protect\numberline{\csname the#1\endcsname}\fi 580 | #7}\else 581 | \def\@svsechd{#6\hskip #3\@svsec #8\csname #1mark\endcsname 582 | {#7}\addcontentsline 583 | {toc}{#1}{\ifnum #2>\c@secnumdepth \else 584 | \protect\numberline{\csname the#1\endcsname}\fi 585 | #7}}\fi 586 | \@xsect{#5}} 587 | 588 | \def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth 589 | \def\@svsec{}\else 590 | \refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname\hskip 0.4em }\fi 591 | \@tempskipa #5\relax 592 | \ifdim \@tempskipa>\z@ 593 | \begingroup #6\relax 594 | \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par} 595 | \endgroup 596 | \csname #1mark\endcsname{#7}\addcontentsline 597 | {toc}{#1}{\ifnum #2>\c@secnumdepth \else 598 | \protect\numberline{\csname the#1\endcsname}\fi 599 | #7}\else 600 | \def\@svsechd{#6\hskip #3\@svsec #8\csname #1mark\endcsname 601 | {#7}\addcontentsline 602 | {toc}{#1}{\ifnum #2>\c@secnumdepth \else 603 | \protect\numberline{\csname the#1\endcsname}\fi 604 | #7}}\fi 605 | \@xsect{#5}} 606 | 607 | % section headings with less space above and below them 608 | \def\thesection {\arabic{section}} 609 | \def\thesubsection {\thesection.\arabic{subsection}} 610 | \def\section{\@startsection{section}{1}{\z@}{-0.12in}{0.02in} 611 | {\large\bf\raggedright}} 612 | \def\subsection{\@startsection{subsection}{2}{\z@}{-0.10in}{0.01in} 613 | {\normalsize\bf\raggedright}} 614 | \def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-0.08in}{0.01in} 615 | {\normalsize\sc\raggedright}} 616 | \def\paragraph{\@startsection{paragraph}{4}{\z@}{1.5ex plus 617 | 0.5ex minus .2ex}{-1em}{\normalsize\bf}} 618 | \def\subparagraph{\@startsection{subparagraph}{5}{\z@}{1.5ex plus 619 | 0.5ex minus .2ex}{-1em}{\normalsize\bf}} 620 | 621 | % Footnotes 622 | \footnotesep 6.65pt % 623 | \skip\footins 9pt 624 | \def\footnoterule{\kern-3pt \hrule width 0.8in \kern 2.6pt } 625 | \setcounter{footnote}{0} 626 | 627 | % Lists and paragraphs 628 | \parindent 0pt 629 | \topsep 4pt plus 1pt minus 2pt 630 | \partopsep 1pt plus 0.5pt minus 0.5pt 631 | \itemsep 2pt plus 1pt minus 0.5pt 632 | \parsep 2pt plus 1pt minus 0.5pt 633 | \parskip 6pt 634 | 635 | \leftmargin 2em \leftmargini\leftmargin \leftmarginii 2em 636 | \leftmarginiii 1.5em \leftmarginiv 1.0em \leftmarginv .5em 637 | \leftmarginvi .5em 638 | \labelwidth\leftmargini\advance\labelwidth-\labelsep \labelsep 5pt 639 | 640 | \def\@listi{\leftmargin\leftmargini} 641 | \def\@listii{\leftmargin\leftmarginii 642 | \labelwidth\leftmarginii\advance\labelwidth-\labelsep 643 | \topsep 2pt plus 1pt minus 0.5pt 644 | \parsep 1pt plus 0.5pt minus 0.5pt 645 | \itemsep \parsep} 646 | \def\@listiii{\leftmargin\leftmarginiii 647 | \labelwidth\leftmarginiii\advance\labelwidth-\labelsep 648 | \topsep 1pt plus 0.5pt minus 0.5pt 649 | \parsep \z@ \partopsep 0.5pt plus 0pt minus 0.5pt 650 | \itemsep \topsep} 651 | \def\@listiv{\leftmargin\leftmarginiv 652 | \labelwidth\leftmarginiv\advance\labelwidth-\labelsep} 653 | \def\@listv{\leftmargin\leftmarginv 654 | \labelwidth\leftmarginv\advance\labelwidth-\labelsep} 655 | \def\@listvi{\leftmargin\leftmarginvi 656 | \labelwidth\leftmarginvi\advance\labelwidth-\labelsep} 657 | 658 | \abovedisplayskip 7pt plus2pt minus5pt% 659 | \belowdisplayskip \abovedisplayskip 660 | \abovedisplayshortskip 0pt plus3pt% 661 | \belowdisplayshortskip 4pt plus3pt minus3pt% 662 | 663 | % Less leading in most fonts (due to the narrow columns) 664 | % The choices were between 1-pt and 1.5-pt leading 665 | \def\@normalsize{\@setsize\normalsize{11pt}\xpt\@xpt} 666 | \def\small{\@setsize\small{10pt}\ixpt\@ixpt} 667 | \def\footnotesize{\@setsize\footnotesize{10pt}\ixpt\@ixpt} 668 | \def\scriptsize{\@setsize\scriptsize{8pt}\viipt\@viipt} 669 | \def\tiny{\@setsize\tiny{7pt}\vipt\@vipt} 670 | \def\large{\@setsize\large{14pt}\xiipt\@xiipt} 671 | \def\Large{\@setsize\Large{16pt}\xivpt\@xivpt} 672 | \def\LARGE{\@setsize\LARGE{20pt}\xviipt\@xviipt} 673 | \def\huge{\@setsize\huge{23pt}\xxpt\@xxpt} 674 | \def\Huge{\@setsize\Huge{28pt}\xxvpt\@xxvpt} 675 | 676 | % Revised formatting for figure captions and table titles. 677 | \newsavebox\newcaptionbox\newdimen\newcaptionboxwid 678 | 679 | \long\def\@makecaption#1#2{ 680 | \vskip 10pt 681 | \baselineskip 11pt 682 | \setbox\@tempboxa\hbox{#1. #2} 683 | \ifdim \wd\@tempboxa >\hsize 684 | \sbox{\newcaptionbox}{\small\sl #1.~} 685 | \newcaptionboxwid=\wd\newcaptionbox 686 | \usebox\newcaptionbox {\footnotesize #2} 687 | % \usebox\newcaptionbox {\small #2} 688 | \else 689 | \centerline{{\small\sl #1.} {\small #2}} 690 | \fi} 691 | 692 | \def\fnum@figure{Figure \thefigure} 693 | \def\fnum@table{Table \thetable} 694 | 695 | % Strut macros for skipping spaces above and below text in tables. 696 | \def\abovestrut#1{\rule[0in]{0in}{#1}\ignorespaces} 697 | \def\belowstrut#1{\rule[-#1]{0in}{#1}\ignorespaces} 698 | 699 | \def\abovespace{\abovestrut{0.20in}} 700 | \def\aroundspace{\abovestrut{0.20in}\belowstrut{0.10in}} 701 | \def\belowspace{\belowstrut{0.10in}} 702 | 703 | % Various personal itemization commands. 704 | \def\texitem#1{\par\noindent\hangindent 12pt 705 | \hbox to 12pt {\hss #1 ~}\ignorespaces} 706 | \def\icmlitem{\texitem{$\bullet$}} 707 | 708 | % To comment out multiple lines of text. 709 | \long\def\comment#1{} 710 | 711 | 712 | 713 | 714 | %% Line counter (not in final version). Adapted from NIPS style file by Christoph Sawade 715 | 716 | % Vertical Ruler 717 | % This code is, largely, from the CVPR 2010 conference style file 718 | % ----- define vruler 719 | \makeatletter 720 | \newbox\icmlrulerbox 721 | \newcount\icmlrulercount 722 | \newdimen\icmlruleroffset 723 | \newdimen\cv@lineheight 724 | \newdimen\cv@boxheight 725 | \newbox\cv@tmpbox 726 | \newcount\cv@refno 727 | \newcount\cv@tot 728 | % NUMBER with left flushed zeros \fillzeros[] 729 | \newcount\cv@tmpc@ \newcount\cv@tmpc 730 | \def\fillzeros[#1]#2{\cv@tmpc@=#2\relax\ifnum\cv@tmpc@<0\cv@tmpc@=-\cv@tmpc@\fi 731 | \cv@tmpc=1 % 732 | \loop\ifnum\cv@tmpc@<10 \else \divide\cv@tmpc@ by 10 \advance\cv@tmpc by 1 \fi 733 | \ifnum\cv@tmpc@=10\relax\cv@tmpc@=11\relax\fi \ifnum\cv@tmpc@>10 \repeat 734 | \ifnum#2<0\advance\cv@tmpc1\relax-\fi 735 | \loop\ifnum\cv@tmpc<#1\relax0\advance\cv@tmpc1\relax\fi \ifnum\cv@tmpc<#1 \repeat 736 | \cv@tmpc@=#2\relax\ifnum\cv@tmpc@<0\cv@tmpc@=-\cv@tmpc@\fi \relax\the\cv@tmpc@}% 737 | % \makevruler[][][][][] 738 | \def\makevruler[#1][#2][#3][#4][#5]{ 739 | \begingroup\offinterlineskip 740 | \textheight=#5\vbadness=10000\vfuzz=120ex\overfullrule=0pt% 741 | \global\setbox\icmlrulerbox=\vbox to \textheight{% 742 | { 743 | \parskip=0pt\hfuzz=150em\cv@boxheight=\textheight 744 | \cv@lineheight=#1\global\icmlrulercount=#2% 745 | \cv@tot\cv@boxheight\divide\cv@tot\cv@lineheight\advance\cv@tot2% 746 | \cv@refno1\vskip-\cv@lineheight\vskip1ex% 747 | \loop\setbox\cv@tmpbox=\hbox to0cm{ % side margin 748 | \hfil {\hfil\fillzeros[#4]\icmlrulercount} 749 | }% 750 | \ht\cv@tmpbox\cv@lineheight\dp\cv@tmpbox0pt\box\cv@tmpbox\break 751 | \advance\cv@refno1\global\advance\icmlrulercount#3\relax 752 | \ifnum\cv@refno<\cv@tot\repeat 753 | } 754 | } 755 | \endgroup 756 | }% 757 | \makeatother 758 | % ----- end of vruler 759 | 760 | 761 | % \makevruler[][][][][] 762 | \def\icmlruler#1{\makevruler[12pt][#1][1][3][\textheight]\usebox{\icmlrulerbox}} 763 | \AddToShipoutPicture{% 764 | \icmlruleroffset=\textheight 765 | \advance\icmlruleroffset by 5.2pt % top margin 766 | \color[rgb]{.7,.7,.7} 767 | \ifdefined\isaccepted \else 768 | \AtTextUpperLeft{% 769 | \put(\LenToUnit{-35pt},\LenToUnit{-\icmlruleroffset}){%left ruler 770 | \icmlruler{\icmlrulercount}} 771 | % \put(\LenToUnit{1.04\textwidth},\LenToUnit{-\icmlruleroffset}){%right ruler 772 | % \icmlruler{\icmlrulercount}} 773 | } 774 | \fi 775 | } 776 | \endinput 777 | -------------------------------------------------------------------------------- /paper/img/branin.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-3.0 EPSF-3.0 2 | %%Creator: (MATLAB, The Mathworks, Inc. Version 8.6.0.267246 \(R2015b\). Operating System: Linux) 3 | %%Title: /home/alaya/gitrepos/ParallelBO/paper/ref/Benchmarks/branin.eps 4 | %%CreationDate: 2018-01-31T20:57:35 5 | %%Pages: (atend) 6 | %%BoundingBox: 0 0 420 315 7 | %%LanguageLevel: 2 8 | %%EndComments 9 | %%BeginProlog 10 | %%BeginResource: procset (Apache XML Graphics Std ProcSet) 1.2 0 11 | %%Version: 1.2 0 12 | %%Copyright: (Copyright 2001-2003,2010 The Apache Software Foundation. License terms: http://www.apache.org/licenses/LICENSE-2.0) 13 | /bd{bind def}bind def 14 | /ld{load def}bd 15 | /GR/grestore ld 16 | /M/moveto ld 17 | /LJ/setlinejoin ld 18 | /C/curveto ld 19 | /f/fill ld 20 | /LW/setlinewidth ld 21 | /GC/setgray ld 22 | /t/show ld 23 | /N/newpath ld 24 | /CT/concat ld 25 | /cp/closepath ld 26 | /S/stroke ld 27 | /L/lineto ld 28 | /CC/setcmykcolor ld 29 | /A/ashow ld 30 | /GS/gsave ld 31 | /RC/setrgbcolor ld 32 | /RM/rmoveto ld 33 | /ML/setmiterlimit ld 34 | /re {4 2 roll M 35 | 1 index 0 rlineto 36 | 0 exch rlineto 37 | neg 0 rlineto 38 | cp } bd 39 | /_ctm matrix def 40 | /_tm matrix def 41 | /BT { _ctm currentmatrix pop matrix _tm copy pop 0 0 moveto } bd 42 | /ET { _ctm setmatrix } bd 43 | /iTm { _ctm setmatrix _tm concat } bd 44 | /Tm { _tm astore pop iTm 0 0 moveto } bd 45 | /ux 0.0 def 46 | /uy 0.0 def 47 | /F { 48 | /Tp exch def 49 | /Tf exch def 50 | Tf findfont Tp scalefont setfont 51 | /cf Tf def /cs Tp def 52 | } bd 53 | /ULS {currentpoint /uy exch def /ux exch def} bd 54 | /ULE { 55 | /Tcx currentpoint pop def 56 | gsave 57 | newpath 58 | cf findfont cs scalefont dup 59 | /FontMatrix get 0 get /Ts exch def /FontInfo get dup 60 | /UnderlinePosition get Ts mul /To exch def 61 | /UnderlineThickness get Ts mul /Tt exch def 62 | ux uy To add moveto Tcx uy To add lineto 63 | Tt setlinewidth stroke 64 | grestore 65 | } bd 66 | /OLE { 67 | /Tcx currentpoint pop def 68 | gsave 69 | newpath 70 | cf findfont cs scalefont dup 71 | /FontMatrix get 0 get /Ts exch def /FontInfo get dup 72 | /UnderlinePosition get Ts mul /To exch def 73 | /UnderlineThickness get Ts mul /Tt exch def 74 | ux uy To add cs add moveto Tcx uy To add cs add lineto 75 | Tt setlinewidth stroke 76 | grestore 77 | } bd 78 | /SOE { 79 | /Tcx currentpoint pop def 80 | gsave 81 | newpath 82 | cf findfont cs scalefont dup 83 | /FontMatrix get 0 get /Ts exch def /FontInfo get dup 84 | /UnderlinePosition get Ts mul /To exch def 85 | /UnderlineThickness get Ts mul /Tt exch def 86 | ux uy To add cs 10 mul 26 idiv add moveto Tcx uy To add cs 10 mul 26 idiv add lineto 87 | Tt setlinewidth stroke 88 | grestore 89 | } bd 90 | /QT { 91 | /Y22 exch store 92 | /X22 exch store 93 | /Y21 exch store 94 | /X21 exch store 95 | currentpoint 96 | /Y21 load 2 mul add 3 div exch 97 | /X21 load 2 mul add 3 div exch 98 | /X21 load 2 mul /X22 load add 3 div 99 | /Y21 load 2 mul /Y22 load add 3 div 100 | /X22 load /Y22 load curveto 101 | } bd 102 | /SSPD { 103 | dup length /d exch dict def 104 | { 105 | /v exch def 106 | /k exch def 107 | currentpagedevice k known { 108 | /cpdv currentpagedevice k get def 109 | v cpdv ne { 110 | /upd false def 111 | /nullv v type /nulltype eq def 112 | /nullcpdv cpdv type /nulltype eq def 113 | nullv nullcpdv or 114 | { 115 | /upd true def 116 | } { 117 | /sametype v type cpdv type eq def 118 | sametype { 119 | v type /arraytype eq { 120 | /vlen v length def 121 | /cpdvlen cpdv length def 122 | vlen cpdvlen eq { 123 | 0 1 vlen 1 sub { 124 | /i exch def 125 | /obj v i get def 126 | /cpdobj cpdv i get def 127 | obj cpdobj ne { 128 | /upd true def 129 | exit 130 | } if 131 | } for 132 | } { 133 | /upd true def 134 | } ifelse 135 | } { 136 | v type /dicttype eq { 137 | v { 138 | /dv exch def 139 | /dk exch def 140 | /cpddv cpdv dk get def 141 | dv cpddv ne { 142 | /upd true def 143 | exit 144 | } if 145 | } forall 146 | } { 147 | /upd true def 148 | } ifelse 149 | } ifelse 150 | } if 151 | } ifelse 152 | upd true eq { 153 | d k v put 154 | } if 155 | } if 156 | } if 157 | } forall 158 | d length 0 gt { 159 | d setpagedevice 160 | } if 161 | } bd 162 | %%EndResource 163 | %%BeginResource: procset (Apache XML Graphics EPS ProcSet) 1.0 0 164 | %%Version: 1.0 0 165 | %%Copyright: (Copyright 2002-2003 The Apache Software Foundation. License terms: http://www.apache.org/licenses/LICENSE-2.0) 166 | /BeginEPSF { %def 167 | /b4_Inc_state save def % Save state for cleanup 168 | /dict_count countdictstack def % Count objects on dict stack 169 | /op_count count 1 sub def % Count objects on operand stack 170 | userdict begin % Push userdict on dict stack 171 | /showpage { } def % Redefine showpage, { } = null proc 172 | 0 setgray 0 setlinecap % Prepare graphics state 173 | 1 setlinewidth 0 setlinejoin 174 | 10 setmiterlimit [ ] 0 setdash newpath 175 | /languagelevel where % If level not equal to 1 then 176 | {pop languagelevel % set strokeadjust and 177 | 1 ne % overprint to their defaults. 178 | {false setstrokeadjust false setoverprint 179 | } if 180 | } if 181 | } bd 182 | /EndEPSF { %def 183 | count op_count sub {pop} repeat % Clean up stacks 184 | countdictstack dict_count sub {end} repeat 185 | b4_Inc_state restore 186 | } bd 187 | %%EndResource 188 | %FOPBeginFontDict 189 | %%IncludeResource: font Courier-Bold 190 | %%IncludeResource: font Helvetica 191 | %%IncludeResource: font Courier-BoldOblique 192 | %%IncludeResource: font Courier-Oblique 193 | %%IncludeResource: font Times-Roman 194 | %%IncludeResource: font Helvetica-BoldOblique 195 | %%IncludeResource: font Helvetica-Bold 196 | %%IncludeResource: font Helvetica-Oblique 197 | %%IncludeResource: font Times-BoldItalic 198 | %%IncludeResource: font Courier 199 | %%IncludeResource: font Times-Italic 200 | %%IncludeResource: font Times-Bold 201 | %%IncludeResource: font Symbol 202 | %%IncludeResource: font ZapfDingbats 203 | %FOPEndFontDict 204 | %%BeginResource: encoding WinAnsiEncoding 205 | /WinAnsiEncoding [ 206 | /.notdef /.notdef /.notdef /.notdef /.notdef 207 | /.notdef /.notdef /.notdef /.notdef /.notdef 208 | /.notdef /.notdef /.notdef /.notdef /.notdef 209 | /.notdef /.notdef /.notdef /.notdef /.notdef 210 | /.notdef /.notdef /.notdef /.notdef /.notdef 211 | /.notdef /.notdef /.notdef /.notdef /.notdef 212 | /.notdef /.notdef /space /exclam /quotedbl 213 | /numbersign /dollar /percent /ampersand /quotesingle 214 | /parenleft /parenright /asterisk /plus /comma 215 | /hyphen /period /slash /zero /one 216 | /two /three /four /five /six 217 | /seven /eight /nine /colon /semicolon 218 | /less /equal /greater /question /at 219 | /A /B /C /D /E 220 | /F /G /H /I /J 221 | /K /L /M /N /O 222 | /P /Q /R /S /T 223 | /U /V /W /X /Y 224 | /Z /bracketleft /backslash /bracketright /asciicircum 225 | /underscore /quoteleft /a /b /c 226 | /d /e /f /g /h 227 | /i /j /k /l /m 228 | /n /o /p /q /r 229 | /s /t /u /v /w 230 | /x /y /z /braceleft /bar 231 | /braceright /asciitilde /bullet /Euro /bullet 232 | /quotesinglbase /florin /quotedblbase /ellipsis /dagger 233 | /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft 234 | /OE /bullet /Zcaron /bullet /bullet 235 | /quoteleft /quoteright /quotedblleft /quotedblright /bullet 236 | /endash /emdash /asciitilde /trademark /scaron 237 | /guilsinglright /oe /bullet /zcaron /Ydieresis 238 | /space /exclamdown /cent /sterling /currency 239 | /yen /brokenbar /section /dieresis /copyright 240 | /ordfeminine /guillemotleft /logicalnot /sfthyphen /registered 241 | /macron /degree /plusminus /twosuperior /threesuperior 242 | /acute /mu /paragraph /middot /cedilla 243 | /onesuperior /ordmasculine /guillemotright /onequarter /onehalf 244 | /threequarters /questiondown /Agrave /Aacute /Acircumflex 245 | /Atilde /Adieresis /Aring /AE /Ccedilla 246 | /Egrave /Eacute /Ecircumflex /Edieresis /Igrave 247 | /Iacute /Icircumflex /Idieresis /Eth /Ntilde 248 | /Ograve /Oacute /Ocircumflex /Otilde /Odieresis 249 | /multiply /Oslash /Ugrave /Uacute /Ucircumflex 250 | /Udieresis /Yacute /Thorn /germandbls /agrave 251 | /aacute /acircumflex /atilde /adieresis /aring 252 | /ae /ccedilla /egrave /eacute /ecircumflex 253 | /edieresis /igrave /iacute /icircumflex /idieresis 254 | /eth /ntilde /ograve /oacute /ocircumflex 255 | /otilde /odieresis /divide /oslash /ugrave 256 | /uacute /ucircumflex /udieresis /yacute /thorn 257 | /ydieresis 258 | ] def 259 | %%EndResource 260 | %FOPBeginFontReencode 261 | /Courier-Bold findfont 262 | dup length dict begin 263 | {1 index /FID ne {def} {pop pop} ifelse} forall 264 | /Encoding WinAnsiEncoding def 265 | currentdict 266 | end 267 | /Courier-Bold exch definefont pop 268 | /Helvetica findfont 269 | dup length dict begin 270 | {1 index /FID ne {def} {pop pop} ifelse} forall 271 | /Encoding WinAnsiEncoding def 272 | currentdict 273 | end 274 | /Helvetica exch definefont pop 275 | /Courier-BoldOblique findfont 276 | dup length dict begin 277 | {1 index /FID ne {def} {pop pop} ifelse} forall 278 | /Encoding WinAnsiEncoding def 279 | currentdict 280 | end 281 | /Courier-BoldOblique exch definefont pop 282 | /Courier-Oblique findfont 283 | dup length dict begin 284 | {1 index /FID ne {def} {pop pop} ifelse} forall 285 | /Encoding WinAnsiEncoding def 286 | currentdict 287 | end 288 | /Courier-Oblique exch definefont pop 289 | /Times-Roman findfont 290 | dup length dict begin 291 | {1 index /FID ne {def} {pop pop} ifelse} forall 292 | /Encoding WinAnsiEncoding def 293 | currentdict 294 | end 295 | /Times-Roman exch definefont pop 296 | /Helvetica-BoldOblique findfont 297 | dup length dict begin 298 | {1 index /FID ne {def} {pop pop} ifelse} forall 299 | /Encoding WinAnsiEncoding def 300 | currentdict 301 | end 302 | /Helvetica-BoldOblique exch definefont pop 303 | /Helvetica-Bold findfont 304 | dup length dict begin 305 | {1 index /FID ne {def} {pop pop} ifelse} forall 306 | /Encoding WinAnsiEncoding def 307 | currentdict 308 | end 309 | /Helvetica-Bold exch definefont pop 310 | /Helvetica-Oblique findfont 311 | dup length dict begin 312 | {1 index /FID ne {def} {pop pop} ifelse} forall 313 | /Encoding WinAnsiEncoding def 314 | currentdict 315 | end 316 | /Helvetica-Oblique exch definefont pop 317 | /Times-BoldItalic findfont 318 | dup length dict begin 319 | {1 index /FID ne {def} {pop pop} ifelse} forall 320 | /Encoding WinAnsiEncoding def 321 | currentdict 322 | end 323 | /Times-BoldItalic exch definefont pop 324 | /Courier findfont 325 | dup length dict begin 326 | {1 index /FID ne {def} {pop pop} ifelse} forall 327 | /Encoding WinAnsiEncoding def 328 | currentdict 329 | end 330 | /Courier exch definefont pop 331 | /Times-Italic findfont 332 | dup length dict begin 333 | {1 index /FID ne {def} {pop pop} ifelse} forall 334 | /Encoding WinAnsiEncoding def 335 | currentdict 336 | end 337 | /Times-Italic exch definefont pop 338 | /Times-Bold findfont 339 | dup length dict begin 340 | {1 index /FID ne {def} {pop pop} ifelse} forall 341 | /Encoding WinAnsiEncoding def 342 | currentdict 343 | end 344 | /Times-Bold exch definefont pop 345 | %FOPEndFontReencode 346 | %%EndProlog 347 | %%Page: 1 1 348 | %%PageBoundingBox: 0 0 420 315 349 | %%BeginPageSetup 350 | [1 0 0 -1 0 315] CT 351 | %%EndPageSetup 352 | GS 353 | [0.75 0 0 0.75 0 0] CT 354 | 1 GC 355 | N 356 | 0 0 560 420 re 357 | f 358 | GR 359 | GS 360 | [0.75 0 0 0.75 0 0] CT 361 | 1 GC 362 | N 363 | 0 0 560 420 re 364 | f 365 | GR 366 | GS 367 | [0.75 0 0 0.75 0 0] CT 368 | 1 GC 369 | N 370 | 73 374 M 371 | 507 374 L 372 | 507 31 L 373 | 73 31 L 374 | cp 375 | f 376 | GR 377 | GS 378 | [0.75 0 0 0.75 0 0] CT 379 | 0.873 GC 380 | 1 LJ 381 | 0.667 LW 382 | N 383 | 112.455 374 M 384 | 112.455 31 L 385 | S 386 | GR 387 | GS 388 | [0.75 0 0 0.75 0 0] CT 389 | 0.873 GC 390 | 1 LJ 391 | 0.667 LW 392 | N 393 | 161.773 374 M 394 | 161.773 31 L 395 | S 396 | GR 397 | GS 398 | [0.75 0 0 0.75 0 0] CT 399 | 0.873 GC 400 | 1 LJ 401 | 0.667 LW 402 | N 403 | 211.091 374 M 404 | 211.091 31 L 405 | S 406 | GR 407 | GS 408 | [0.75 0 0 0.75 0 0] CT 409 | 0.873 GC 410 | 1 LJ 411 | 0.667 LW 412 | N 413 | 260.409 374 M 414 | 260.409 31 L 415 | S 416 | GR 417 | GS 418 | [0.75 0 0 0.75 0 0] CT 419 | 0.873 GC 420 | 1 LJ 421 | 0.667 LW 422 | N 423 | 309.727 374 M 424 | 309.727 31 L 425 | S 426 | GR 427 | GS 428 | [0.75 0 0 0.75 0 0] CT 429 | 0.873 GC 430 | 1 LJ 431 | 0.667 LW 432 | N 433 | 359.045 374 M 434 | 359.045 31 L 435 | S 436 | GR 437 | GS 438 | [0.75 0 0 0.75 0 0] CT 439 | 0.873 GC 440 | 1 LJ 441 | 0.667 LW 442 | N 443 | 408.364 374 M 444 | 408.364 31 L 445 | S 446 | GR 447 | GS 448 | [0.75 0 0 0.75 0 0] CT 449 | 0.873 GC 450 | 1 LJ 451 | 0.667 LW 452 | N 453 | 457.682 374 M 454 | 457.682 31 L 455 | S 456 | GR 457 | GS 458 | [0.75 0 0 0.75 0 0] CT 459 | 0.873 GC 460 | 1 LJ 461 | 0.667 LW 462 | N 463 | 507 374 M 464 | 507 31 L 465 | S 466 | GR 467 | GS 468 | [0.75 0 0 0.75 0 0] CT 469 | 0.873 GC 470 | 1 LJ 471 | 0.667 LW 472 | N 473 | 507 359.048 M 474 | 73 359.048 L 475 | S 476 | GR 477 | GS 478 | [0.75 0 0 0.75 0 0] CT 479 | 0.873 GC 480 | 1 LJ 481 | 0.667 LW 482 | N 483 | 507 285.83 M 484 | 73 285.83 L 485 | S 486 | GR 487 | GS 488 | [0.75 0 0 0.75 0 0] CT 489 | 0.873 GC 490 | 1 LJ 491 | 0.667 LW 492 | N 493 | 507 212.612 M 494 | 73 212.612 L 495 | S 496 | GR 497 | GS 498 | [0.75 0 0 0.75 0 0] CT 499 | 0.873 GC 500 | 1 LJ 501 | 0.667 LW 502 | N 503 | 507 139.394 M 504 | 73 139.394 L 505 | S 506 | GR 507 | GS 508 | [0.75 0 0 0.75 0 0] CT 509 | 0.873 GC 510 | 1 LJ 511 | 0.667 LW 512 | N 513 | 507 66.175 M 514 | 73 66.175 L 515 | S 516 | GR 517 | GS 518 | [0.75 0 0 0.75 0 0] CT 519 | 0.149 GC 520 | 2 setlinecap 521 | 1 LJ 522 | 0.667 LW 523 | N 524 | 73 374 M 525 | 507 374 L 526 | S 527 | GR 528 | GS 529 | [0.75 0 0 0.75 0 0] CT 530 | 0.149 GC 531 | 2 setlinecap 532 | 1 LJ 533 | 0.667 LW 534 | N 535 | 73 31 M 536 | 507 31 L 537 | S 538 | GR 539 | GS 540 | [0.75 0 0 0.75 0 0] CT 541 | 0.149 GC 542 | 2 setlinecap 543 | 1 LJ 544 | 0.667 LW 545 | N 546 | 112.455 374 M 547 | 112.455 369.66 L 548 | S 549 | GR 550 | GS 551 | [0.75 0 0 0.75 0 0] CT 552 | 0.149 GC 553 | 2 setlinecap 554 | 1 LJ 555 | 0.667 LW 556 | N 557 | 161.773 374 M 558 | 161.773 369.66 L 559 | S 560 | GR 561 | GS 562 | [0.75 0 0 0.75 0 0] CT 563 | 0.149 GC 564 | 2 setlinecap 565 | 1 LJ 566 | 0.667 LW 567 | N 568 | 211.091 374 M 569 | 211.091 369.66 L 570 | S 571 | GR 572 | GS 573 | [0.75 0 0 0.75 0 0] CT 574 | 0.149 GC 575 | 2 setlinecap 576 | 1 LJ 577 | 0.667 LW 578 | N 579 | 260.409 374 M 580 | 260.409 369.66 L 581 | S 582 | GR 583 | GS 584 | [0.75 0 0 0.75 0 0] CT 585 | 0.149 GC 586 | 2 setlinecap 587 | 1 LJ 588 | 0.667 LW 589 | N 590 | 309.727 374 M 591 | 309.727 369.66 L 592 | S 593 | GR 594 | GS 595 | [0.75 0 0 0.75 0 0] CT 596 | 0.149 GC 597 | 2 setlinecap 598 | 1 LJ 599 | 0.667 LW 600 | N 601 | 359.045 374 M 602 | 359.045 369.66 L 603 | S 604 | GR 605 | GS 606 | [0.75 0 0 0.75 0 0] CT 607 | 0.149 GC 608 | 2 setlinecap 609 | 1 LJ 610 | 0.667 LW 611 | N 612 | 408.364 374 M 613 | 408.364 369.66 L 614 | S 615 | GR 616 | GS 617 | [0.75 0 0 0.75 0 0] CT 618 | 0.149 GC 619 | 2 setlinecap 620 | 1 LJ 621 | 0.667 LW 622 | N 623 | 457.682 374 M 624 | 457.682 369.66 L 625 | S 626 | GR 627 | GS 628 | [0.75 0 0 0.75 0 0] CT 629 | 0.149 GC 630 | 2 setlinecap 631 | 1 LJ 632 | 0.667 LW 633 | N 634 | 507 374 M 635 | 507 369.66 L 636 | S 637 | GR 638 | GS 639 | [0.75 0 0 0.75 0 0] CT 640 | 0.149 GC 641 | 2 setlinecap 642 | 1 LJ 643 | 0.667 LW 644 | N 645 | 112.455 31 M 646 | 112.455 35.34 L 647 | S 648 | GR 649 | GS 650 | [0.75 0 0 0.75 0 0] CT 651 | 0.149 GC 652 | 2 setlinecap 653 | 1 LJ 654 | 0.667 LW 655 | N 656 | 161.773 31 M 657 | 161.773 35.34 L 658 | S 659 | GR 660 | GS 661 | [0.75 0 0 0.75 0 0] CT 662 | 0.149 GC 663 | 2 setlinecap 664 | 1 LJ 665 | 0.667 LW 666 | N 667 | 211.091 31 M 668 | 211.091 35.34 L 669 | S 670 | GR 671 | GS 672 | [0.75 0 0 0.75 0 0] CT 673 | 0.149 GC 674 | 2 setlinecap 675 | 1 LJ 676 | 0.667 LW 677 | N 678 | 260.409 31 M 679 | 260.409 35.34 L 680 | S 681 | GR 682 | GS 683 | [0.75 0 0 0.75 0 0] CT 684 | 0.149 GC 685 | 2 setlinecap 686 | 1 LJ 687 | 0.667 LW 688 | N 689 | 309.727 31 M 690 | 309.727 35.34 L 691 | S 692 | GR 693 | GS 694 | [0.75 0 0 0.75 0 0] CT 695 | 0.149 GC 696 | 2 setlinecap 697 | 1 LJ 698 | 0.667 LW 699 | N 700 | 359.045 31 M 701 | 359.045 35.34 L 702 | S 703 | GR 704 | GS 705 | [0.75 0 0 0.75 0 0] CT 706 | 0.149 GC 707 | 2 setlinecap 708 | 1 LJ 709 | 0.667 LW 710 | N 711 | 408.364 31 M 712 | 408.364 35.34 L 713 | S 714 | GR 715 | GS 716 | [0.75 0 0 0.75 0 0] CT 717 | 0.149 GC 718 | 2 setlinecap 719 | 1 LJ 720 | 0.667 LW 721 | N 722 | 457.682 31 M 723 | 457.682 35.34 L 724 | S 725 | GR 726 | GS 727 | [0.75 0 0 0.75 0 0] CT 728 | 0.149 GC 729 | 2 setlinecap 730 | 1 LJ 731 | 0.667 LW 732 | N 733 | 507 31 M 734 | 507 35.34 L 735 | S 736 | GR 737 | GS 738 | [0.75 0 0 0.75 84.34091 284.50001] CT 739 | 0.149 GC 740 | /Helvetica 13 F 741 | GS 742 | [1 0 0 1 0 0] CT 743 | -4.5 13 moveto 744 | 1 -1 scale 745 | (5) t 746 | GR 747 | GR 748 | GS 749 | [0.75 0 0 0.75 121.32954 284.50001] CT 750 | 0.149 GC 751 | /Helvetica 13 F 752 | GS 753 | [1 0 0 1 0 0] CT 754 | -8.5 13 moveto 755 | 1 -1 scale 756 | (10) t 757 | GR 758 | GR 759 | GS 760 | [0.75 0 0 0.75 158.31818 284.50001] CT 761 | 0.149 GC 762 | /Helvetica 13 F 763 | GS 764 | [1 0 0 1 0 0] CT 765 | -8.5 13 moveto 766 | 1 -1 scale 767 | (15) t 768 | GR 769 | GR 770 | GS 771 | [0.75 0 0 0.75 195.30682 284.50001] CT 772 | 0.149 GC 773 | /Helvetica 13 F 774 | GS 775 | [1 0 0 1 0 0] CT 776 | -8.5 13 moveto 777 | 1 -1 scale 778 | (20) t 779 | GR 780 | GR 781 | GS 782 | [0.75 0 0 0.75 232.29545 284.50001] CT 783 | 0.149 GC 784 | /Helvetica 13 F 785 | GS 786 | [1 0 0 1 0 0] CT 787 | -8.5 13 moveto 788 | 1 -1 scale 789 | (25) t 790 | GR 791 | GR 792 | GS 793 | [0.75 0 0 0.75 269.28408 284.50001] CT 794 | 0.149 GC 795 | /Helvetica 13 F 796 | GS 797 | [1 0 0 1 0 0] CT 798 | -8.5 13 moveto 799 | 1 -1 scale 800 | (30) t 801 | GR 802 | GR 803 | GS 804 | [0.75 0 0 0.75 306.27274 284.50001] CT 805 | 0.149 GC 806 | /Helvetica 13 F 807 | GS 808 | [1 0 0 1 0 0] CT 809 | -8.5 13 moveto 810 | 1 -1 scale 811 | (35) t 812 | GR 813 | GR 814 | GS 815 | [0.75 0 0 0.75 343.26137 284.50001] CT 816 | 0.149 GC 817 | /Helvetica 13 F 818 | GS 819 | [1 0 0 1 0 0] CT 820 | -8.5 13 moveto 821 | 1 -1 scale 822 | (40) t 823 | GR 824 | GR 825 | GS 826 | [0.75 0 0 0.75 380.25 284.50001] CT 827 | 0.149 GC 828 | /Helvetica 13 F 829 | GS 830 | [1 0 0 1 0 0] CT 831 | -8.5 13 moveto 832 | 1 -1 scale 833 | (45) t 834 | GR 835 | GR 836 | GS 837 | [0.75 0 0 0.75 217.50016 298.24999] CT 838 | 0.149 GC 839 | /Helvetica 15 F 840 | GS 841 | [1 0 0 1 0 0] CT 842 | -13 14 moveto 843 | 1 -1 scale 844 | (iter) t 845 | GR 846 | GR 847 | GS 848 | [0.75 0 0 0.75 0 0] CT 849 | 0.149 GC 850 | 2 setlinecap 851 | 1 LJ 852 | 0.667 LW 853 | N 854 | 73 374 M 855 | 73 31 L 856 | S 857 | GR 858 | GS 859 | [0.75 0 0 0.75 0 0] CT 860 | 0.149 GC 861 | 2 setlinecap 862 | 1 LJ 863 | 0.667 LW 864 | N 865 | 507 374 M 866 | 507 31 L 867 | S 868 | GR 869 | GS 870 | [0.75 0 0 0.75 0 0] CT 871 | 0.149 GC 872 | 2 setlinecap 873 | 1 LJ 874 | 0.667 LW 875 | N 876 | 73 359.048 M 877 | 77.34 359.048 L 878 | S 879 | GR 880 | GS 881 | [0.75 0 0 0.75 0 0] CT 882 | 0.149 GC 883 | 2 setlinecap 884 | 1 LJ 885 | 0.667 LW 886 | N 887 | 73 285.83 M 888 | 77.34 285.83 L 889 | S 890 | GR 891 | GS 892 | [0.75 0 0 0.75 0 0] CT 893 | 0.149 GC 894 | 2 setlinecap 895 | 1 LJ 896 | 0.667 LW 897 | N 898 | 73 212.612 M 899 | 77.34 212.612 L 900 | S 901 | GR 902 | GS 903 | [0.75 0 0 0.75 0 0] CT 904 | 0.149 GC 905 | 2 setlinecap 906 | 1 LJ 907 | 0.667 LW 908 | N 909 | 73 139.394 M 910 | 77.34 139.394 L 911 | S 912 | GR 913 | GS 914 | [0.75 0 0 0.75 0 0] CT 915 | 0.149 GC 916 | 2 setlinecap 917 | 1 LJ 918 | 0.667 LW 919 | N 920 | 73 66.175 M 921 | 77.34 66.175 L 922 | S 923 | GR 924 | GS 925 | [0.75 0 0 0.75 0 0] CT 926 | 0.149 GC 927 | 2 setlinecap 928 | 1 LJ 929 | 0.667 LW 930 | N 931 | 507 359.048 M 932 | 502.66 359.048 L 933 | S 934 | GR 935 | GS 936 | [0.75 0 0 0.75 0 0] CT 937 | 0.149 GC 938 | 2 setlinecap 939 | 1 LJ 940 | 0.667 LW 941 | N 942 | 507 285.83 M 943 | 502.66 285.83 L 944 | S 945 | GR 946 | GS 947 | [0.75 0 0 0.75 0 0] CT 948 | 0.149 GC 949 | 2 setlinecap 950 | 1 LJ 951 | 0.667 LW 952 | N 953 | 507 212.612 M 954 | 502.66 212.612 L 955 | S 956 | GR 957 | GS 958 | [0.75 0 0 0.75 0 0] CT 959 | 0.149 GC 960 | 2 setlinecap 961 | 1 LJ 962 | 0.667 LW 963 | N 964 | 507 139.394 M 965 | 502.66 139.394 L 966 | S 967 | GR 968 | GS 969 | [0.75 0 0 0.75 0 0] CT 970 | 0.149 GC 971 | 2 setlinecap 972 | 1 LJ 973 | 0.667 LW 974 | N 975 | 507 66.175 M 976 | 502.66 66.175 L 977 | S 978 | GR 979 | GS 980 | [0.75 0 0 0.75 50.75 269.28573] CT 981 | 0.149 GC 982 | /Helvetica 13 F 983 | GS 984 | [1 0 0 1 0 0] CT 985 | -21 4.5 moveto 986 | 1 -1 scale 987 | (0.5) t 988 | GR 989 | GR 990 | GS 991 | [0.75 0 0 0.75 50.75 214.37222] CT 992 | 0.149 GC 993 | /Helvetica 13 F 994 | GS 995 | [1 0 0 1 0 0] CT 996 | -9 4.5 moveto 997 | 1 -1 scale 998 | (1) t 999 | GR 1000 | GR 1001 | GS 1002 | [0.75 0 0 0.75 50.75 159.45868] CT 1003 | 0.149 GC 1004 | /Helvetica 13 F 1005 | GS 1006 | [1 0 0 1 0 0] CT 1007 | -21 4.5 moveto 1008 | 1 -1 scale 1009 | (1.5) t 1010 | GR 1011 | GR 1012 | GS 1013 | [0.75 0 0 0.75 50.75 104.54515] CT 1014 | 0.149 GC 1015 | /Helvetica 13 F 1016 | GS 1017 | [1 0 0 1 0 0] CT 1018 | -9 4.5 moveto 1019 | 1 -1 scale 1020 | (2) t 1021 | GR 1022 | GR 1023 | GS 1024 | [0.75 0 0 0.75 50.75 49.63162] CT 1025 | 0.149 GC 1026 | /Helvetica 13 F 1027 | GS 1028 | [1 0 0 1 0 0] CT 1029 | -21 4.5 moveto 1030 | 1 -1 scale 1031 | (2.5) t 1032 | GR 1033 | GR 1034 | GS 1035 | [0 -0.75 0.75 0 32 151.87487] CT 1036 | 0.149 GC 1037 | /Helvetica 15 F 1038 | GS 1039 | [1 0 0 1 0 0] CT 1040 | -21.5 -4 moveto 1041 | 1 -1 scale 1042 | (Value) t 1043 | GR 1044 | GR 1045 | GS 1046 | [0.75 0 0 0.75 217.50021 21.18751] CT 1047 | /Helvetica-Bold 15 F 1048 | GS 1049 | [1 0 0 1 0 0] CT 1050 | -27.5 -4 moveto 1051 | 1 -1 scale 1052 | (branin) t 1053 | GR 1054 | GR 1055 | GS 1056 | [0.75 0 0 0.75 0 0] CT 1057 | 0 0.447 0.741 RC 1058 | [8 3 2 3] 0 setdash 1059 | 2 LJ 1060 | 0.667 LW 1061 | N 1062 | 73 277.425 M 1063 | 82.864 302.787 L 1064 | 92.727 326.322 L 1065 | 102.591 357.222 L 1066 | 112.455 363.022 L 1067 | 122.318 367.781 L 1068 | 132.182 368.585 L 1069 | 142.045 370.773 L 1070 | 151.909 373.267 L 1071 | 161.773 373.636 L 1072 | 171.636 373.854 L 1073 | 181.5 373.884 L 1074 | 191.364 373.946 L 1075 | 201.227 373.96 L 1076 | 211.091 373.961 L 1077 | 220.955 373.965 L 1078 | 230.818 373.995 L 1079 | 240.682 373.997 L 1080 | 250.545 373.997 L 1081 | 260.409 373.999 L 1082 | 270.273 373.999 L 1083 | 280.136 373.999 L 1084 | 290 373.999 L 1085 | 299.864 373.999 L 1086 | 309.727 373.999 L 1087 | 319.591 373.999 L 1088 | 329.455 373.999 L 1089 | 339.318 373.999 L 1090 | 349.182 373.999 L 1091 | 359.045 373.999 L 1092 | 368.909 373.999 L 1093 | 378.773 373.999 L 1094 | 388.636 373.999 L 1095 | 398.5 373.999 L 1096 | 408.364 373.999 L 1097 | 418.227 373.999 L 1098 | 428.091 373.999 L 1099 | 437.955 373.999 L 1100 | 447.818 373.999 L 1101 | 457.682 373.999 L 1102 | 467.545 373.999 L 1103 | 477.409 373.999 L 1104 | 487.273 373.999 L 1105 | 497.136 373.999 L 1106 | 507 373.999 L 1107 | S 1108 | GR 1109 | GS 1110 | [0.75 0 0 0.75 0 0] CT 1111 | 0.851 0.325 0.098 RC 1112 | [8 3 2 3] 0 setdash 1113 | 2 LJ 1114 | 0.667 LW 1115 | N 1116 | 73 106.018 M 1117 | 82.864 110.318 L 1118 | 92.727 176.998 L 1119 | 102.591 291.693 L 1120 | 112.455 327.291 L 1121 | 122.318 347.645 L 1122 | 132.182 352.639 L 1123 | 142.045 369.029 L 1124 | 151.909 370.847 L 1125 | 161.773 371.786 L 1126 | 171.636 372.242 L 1127 | 181.5 373.798 L 1128 | 191.364 373.966 L 1129 | 201.227 373.991 L 1130 | 211.091 373.991 L 1131 | 220.955 373.991 L 1132 | 230.818 373.991 L 1133 | 240.682 373.991 L 1134 | 250.545 373.991 L 1135 | 260.409 373.991 L 1136 | 270.273 373.991 L 1137 | 280.136 373.991 L 1138 | 290 373.991 L 1139 | 299.864 373.991 L 1140 | 309.727 373.991 L 1141 | 319.591 373.991 L 1142 | 329.455 373.991 L 1143 | 339.318 373.991 L 1144 | 349.182 373.991 L 1145 | 359.045 373.991 L 1146 | 368.909 373.991 L 1147 | 378.773 373.991 L 1148 | 388.636 373.991 L 1149 | 398.5 373.991 L 1150 | 408.364 373.991 L 1151 | 418.227 373.991 L 1152 | 428.091 373.991 L 1153 | 437.955 373.991 L 1154 | 447.818 373.991 L 1155 | 457.682 373.991 L 1156 | 467.545 373.991 L 1157 | 477.409 373.991 L 1158 | 487.273 373.991 L 1159 | 497.136 373.991 L 1160 | 507 373.991 L 1161 | S 1162 | GR 1163 | GS 1164 | [0.75 0 0 0.75 0 0] CT 1165 | 0.929 0.694 0.125 RC 1166 | [8 3 2 3] 0 setdash 1167 | 2 LJ 1168 | 0.667 LW 1169 | N 1170 | 73 31 M 1171 | 82.864 142.387 L 1172 | 92.727 283.19 L 1173 | 102.591 347.255 L 1174 | 112.455 358.883 L 1175 | 122.318 362.475 L 1176 | 132.182 367.301 L 1177 | 142.045 368.091 L 1178 | 151.909 368.091 L 1179 | 161.773 369.634 L 1180 | 171.636 370.433 L 1181 | 181.5 370.625 L 1182 | 191.364 370.748 L 1183 | 201.227 370.748 L 1184 | 211.091 370.748 L 1185 | 220.955 371.188 L 1186 | 230.818 371.188 L 1187 | 240.682 371.188 L 1188 | 250.545 371.188 L 1189 | 260.409 371.188 L 1190 | 270.273 371.188 L 1191 | 280.136 371.188 L 1192 | 290 371.188 L 1193 | 299.864 371.188 L 1194 | 309.727 371.63 L 1195 | 319.591 371.63 L 1196 | 329.455 371.63 L 1197 | 339.318 371.63 L 1198 | 349.182 371.63 L 1199 | 359.045 371.63 L 1200 | 368.909 371.63 L 1201 | 378.773 371.63 L 1202 | 388.636 371.63 L 1203 | 398.5 371.63 L 1204 | 408.364 371.63 L 1205 | 418.227 371.63 L 1206 | 428.091 371.63 L 1207 | 437.955 371.63 L 1208 | 447.818 371.63 L 1209 | 457.682 371.63 L 1210 | 467.545 371.63 L 1211 | 477.409 371.63 L 1212 | 487.273 371.63 L 1213 | 497.136 371.63 L 1214 | 507 371.63 L 1215 | S 1216 | GR 1217 | GS 1218 | [0.75 0 0 0.75 0 0] CT 1219 | 0.494 0.184 0.557 RC 1220 | 1 LJ 1221 | 0.667 LW 1222 | N 1223 | 73 304.959 M 1224 | 82.864 361.235 L 1225 | 92.727 371.287 L 1226 | 102.591 373.538 L 1227 | 112.455 373.708 L 1228 | 122.318 373.962 L 1229 | 132.182 373.991 L 1230 | 142.045 373.994 L 1231 | 151.909 374 L 1232 | 161.773 374 L 1233 | 171.636 374 L 1234 | 181.5 374 L 1235 | 191.364 374 L 1236 | 201.227 374 L 1237 | 211.091 374 L 1238 | 220.955 374 L 1239 | 230.818 374 L 1240 | 240.682 374 L 1241 | 250.545 374 L 1242 | 260.409 374 L 1243 | 270.273 374 L 1244 | 280.136 374 L 1245 | 290 374 L 1246 | 299.864 374 L 1247 | 309.727 374 L 1248 | 319.591 374 L 1249 | 329.455 374 L 1250 | 339.318 374 L 1251 | 349.182 374 L 1252 | 359.045 374 L 1253 | 368.909 374 L 1254 | 378.773 374 L 1255 | 388.636 374 L 1256 | 398.5 374 L 1257 | 408.364 374 L 1258 | 418.227 374 L 1259 | 428.091 374 L 1260 | 437.955 374 L 1261 | 447.818 374 L 1262 | 457.682 374 L 1263 | 467.545 374 L 1264 | 477.409 374 L 1265 | 487.273 374 L 1266 | 497.136 374 L 1267 | 507 374 L 1268 | S 1269 | GR 1270 | GS 1271 | [0.75 0 0 0.75 0 0] CT 1272 | 0.467 0.675 0.188 RC 1273 | 1 LJ 1274 | 0.667 LW 1275 | N 1276 | 73 187.252 M 1277 | 82.864 345.722 L 1278 | 92.727 373.15 L 1279 | 102.591 373.965 L 1280 | 112.455 373.987 L 1281 | 122.318 373.988 L 1282 | 132.182 373.988 L 1283 | 142.045 373.994 L 1284 | 151.909 373.994 L 1285 | 161.773 373.994 L 1286 | 171.636 373.994 L 1287 | 181.5 373.994 L 1288 | 191.364 373.994 L 1289 | 201.227 373.994 L 1290 | 211.091 373.994 L 1291 | 220.955 373.994 L 1292 | 230.818 373.994 L 1293 | 240.682 373.994 L 1294 | 250.545 373.994 L 1295 | 260.409 373.994 L 1296 | 270.273 373.994 L 1297 | 280.136 373.994 L 1298 | 290 373.994 L 1299 | 299.864 373.994 L 1300 | 309.727 373.994 L 1301 | 319.591 373.994 L 1302 | 329.455 373.994 L 1303 | 339.318 373.994 L 1304 | 349.182 373.994 L 1305 | 359.045 373.994 L 1306 | 368.909 373.994 L 1307 | 378.773 373.994 L 1308 | 388.636 373.994 L 1309 | 398.5 373.994 L 1310 | 408.364 373.994 L 1311 | 418.227 373.994 L 1312 | 428.091 373.994 L 1313 | 437.955 373.994 L 1314 | 447.818 373.994 L 1315 | 457.682 373.994 L 1316 | 467.545 373.994 L 1317 | 477.409 373.994 L 1318 | 487.273 373.994 L 1319 | 497.136 373.994 L 1320 | 507 373.994 L 1321 | S 1322 | GR 1323 | GS 1324 | [0.75 0 0 0.75 0 0] CT 1325 | 0.302 0.745 0.933 RC 1326 | 1 LJ 1327 | 0.667 LW 1328 | N 1329 | 73 141.656 M 1330 | 82.864 345.586 L 1331 | 92.727 364.806 L 1332 | 102.591 370.779 L 1333 | 112.455 370.779 L 1334 | 122.318 370.779 L 1335 | 132.182 370.779 L 1336 | 142.045 370.779 L 1337 | 151.909 370.779 L 1338 | 161.773 370.779 L 1339 | 171.636 370.779 L 1340 | 181.5 370.779 L 1341 | 191.364 370.779 L 1342 | 201.227 370.779 L 1343 | 211.091 370.779 L 1344 | 220.955 370.779 L 1345 | 230.818 370.779 L 1346 | 240.682 370.779 L 1347 | 250.545 370.779 L 1348 | 260.409 370.779 L 1349 | 270.273 370.779 L 1350 | 280.136 370.779 L 1351 | 290 370.779 L 1352 | 299.864 370.779 L 1353 | 309.727 370.779 L 1354 | 319.591 370.779 L 1355 | 329.455 370.779 L 1356 | 339.318 370.779 L 1357 | 349.182 370.779 L 1358 | 359.045 370.779 L 1359 | 368.909 370.779 L 1360 | 378.773 370.779 L 1361 | 388.636 370.779 L 1362 | 398.5 370.779 L 1363 | 408.364 370.779 L 1364 | 418.227 370.779 L 1365 | 428.091 370.779 L 1366 | 437.955 370.779 L 1367 | 447.818 370.779 L 1368 | 457.682 370.779 L 1369 | 467.545 370.779 L 1370 | 477.409 370.779 L 1371 | 487.273 370.779 L 1372 | 497.136 370.779 L 1373 | 507 370.779 L 1374 | S 1375 | GR 1376 | GS 1377 | [0.75 0 0 0.75 0 0] CT 1378 | 0.635 0.078 0.184 RC 1379 | 1 LJ 1380 | 0.667 LW 1381 | N 1382 | 73 65.602 M 1383 | 82.864 130.961 L 1384 | 92.727 178.126 L 1385 | 102.591 202.972 L 1386 | 112.455 218.215 L 1387 | 122.318 241.111 L 1388 | 132.182 243.819 L 1389 | 142.045 249.589 L 1390 | 151.909 274.73 L 1391 | 161.773 274.73 L 1392 | 171.636 274.73 L 1393 | 181.5 274.73 L 1394 | 191.364 288.833 L 1395 | 201.227 288.992 L 1396 | 211.091 304.168 L 1397 | 220.955 317.347 L 1398 | 230.818 317.347 L 1399 | 240.682 317.347 L 1400 | 250.545 317.347 L 1401 | 260.409 317.347 L 1402 | 270.273 318.959 L 1403 | 280.136 318.959 L 1404 | 290 318.959 L 1405 | 299.864 318.959 L 1406 | 309.727 318.959 L 1407 | 319.591 318.959 L 1408 | 329.455 318.959 L 1409 | 339.318 318.959 L 1410 | 349.182 318.959 L 1411 | 359.045 318.959 L 1412 | 368.909 318.959 L 1413 | 378.773 318.959 L 1414 | 388.636 318.959 L 1415 | 398.5 318.959 L 1416 | 408.364 326.426 L 1417 | 418.227 327.846 L 1418 | 428.091 327.846 L 1419 | 437.955 327.846 L 1420 | 447.818 328.027 L 1421 | 457.682 328.027 L 1422 | 467.545 328.027 L 1423 | 477.409 328.027 L 1424 | 487.273 330.203 L 1425 | 497.136 335.187 L 1426 | 507 335.187 L 1427 | S 1428 | GR 1429 | GS 1430 | [0.75 0 0 0.75 0 0] CT 1431 | 0 0.447 0.741 RC 1432 | 1 LJ 1433 | 0.667 LW 1434 | N 1435 | 73 200.971 M 1436 | 82.864 340.788 L 1437 | 92.727 359.025 L 1438 | 102.591 371.259 L 1439 | 112.455 373.175 L 1440 | 122.318 373.327 L 1441 | 132.182 373.547 L 1442 | 142.045 373.547 L 1443 | 151.909 373.549 L 1444 | 161.773 373.901 L 1445 | 171.636 373.901 L 1446 | 181.5 373.901 L 1447 | 191.364 373.901 L 1448 | 201.227 373.901 L 1449 | 211.091 373.901 L 1450 | 220.955 373.901 L 1451 | 230.818 373.901 L 1452 | 240.682 373.907 L 1453 | 250.545 373.909 L 1454 | 260.409 373.909 L 1455 | 270.273 373.909 L 1456 | 280.136 373.909 L 1457 | 290 373.91 L 1458 | 299.864 373.91 L 1459 | 309.727 373.91 L 1460 | 319.591 373.91 L 1461 | 329.455 373.925 L 1462 | 339.318 373.925 L 1463 | 349.182 373.926 L 1464 | 359.045 373.926 L 1465 | 368.909 373.926 L 1466 | 378.773 373.933 L 1467 | 388.636 373.933 L 1468 | 398.5 373.933 L 1469 | 408.364 373.933 L 1470 | 418.227 373.933 L 1471 | 428.091 373.933 L 1472 | 437.955 373.933 L 1473 | 447.818 373.933 L 1474 | 457.682 373.933 L 1475 | 467.545 373.933 L 1476 | 477.409 373.933 L 1477 | 487.273 373.949 L 1478 | 497.136 373.953 L 1479 | 507 373.953 L 1480 | S 1481 | GR 1482 | GS 1483 | [0.75 0 0 0.75 0 0] CT 1484 | 1 GC 1485 | N 1486 | 391 174 M 1487 | 391 44 L 1488 | 494 44 L 1489 | 494 174 L 1490 | cp 1491 | f 1492 | GR 1493 | GS 1494 | [0.75 0 0 0.75 332.25 40.625] CT 1495 | /Helvetica 12 F 1496 | GS 1497 | [1 0 0 1 0 0] CT 1498 | 0 4.5 moveto 1499 | 1 -1 scale 1500 | (MACE-1) t 1501 | GR 1502 | GR 1503 | GS 1504 | [0.75 0 0 0.75 0 0] CT 1505 | 0 0.447 0.741 RC 1506 | [8 3 2 3] 0 setdash 1507 | 2 LJ 1508 | 0.667 LW 1509 | N 1510 | 399 54.167 M 1511 | 439 54.167 L 1512 | S 1513 | GR 1514 | GS 1515 | [0.75 0 0 0.75 332.25 52.375] CT 1516 | /Helvetica 12 F 1517 | GS 1518 | [1 0 0 1 0 0] CT 1519 | 0 4.5 moveto 1520 | 1 -1 scale 1521 | (LCB) t 1522 | GR 1523 | GR 1524 | GS 1525 | [0.75 0 0 0.75 0 0] CT 1526 | 0.851 0.325 0.098 RC 1527 | [8 3 2 3] 0 setdash 1528 | 2 LJ 1529 | 0.667 LW 1530 | N 1531 | 399 69.833 M 1532 | 439 69.833 L 1533 | S 1534 | GR 1535 | GS 1536 | [0.75 0 0 0.75 332.25 64.125] CT 1537 | /Helvetica 12 F 1538 | GS 1539 | [1 0 0 1 0 0] CT 1540 | 0 4.5 moveto 1541 | 1 -1 scale 1542 | (EI) t 1543 | GR 1544 | GR 1545 | GS 1546 | [0.75 0 0 0.75 0 0] CT 1547 | 0.929 0.694 0.125 RC 1548 | [8 3 2 3] 0 setdash 1549 | 2 LJ 1550 | 0.667 LW 1551 | N 1552 | 399 85.5 M 1553 | 439 85.5 L 1554 | S 1555 | GR 1556 | GS 1557 | [0.75 0 0 0.75 332.25 75.875] CT 1558 | /Helvetica 12 F 1559 | GS 1560 | [1 0 0 1 0 0] CT 1561 | 0 4.5 moveto 1562 | 1 -1 scale 1563 | (MACE-4) t 1564 | GR 1565 | GR 1566 | GS 1567 | [0.75 0 0 0.75 0 0] CT 1568 | 0.494 0.184 0.557 RC 1569 | 1 LJ 1570 | 0.667 LW 1571 | N 1572 | 399 101.167 M 1573 | 439 101.167 L 1574 | S 1575 | GR 1576 | GS 1577 | [0.75 0 0 0.75 332.25 87.625] CT 1578 | /Helvetica 12 F 1579 | GS 1580 | [1 0 0 1 0 0] CT 1581 | 0 4.5 moveto 1582 | 1 -1 scale 1583 | (BLCB) t 1584 | GR 1585 | GR 1586 | GS 1587 | [0.75 0 0 0.75 0 0] CT 1588 | 0.467 0.675 0.188 RC 1589 | 1 LJ 1590 | 0.667 LW 1591 | N 1592 | 399 116.833 M 1593 | 439 116.833 L 1594 | S 1595 | GR 1596 | GS 1597 | [0.75 0 0 0.75 332.25 99.375] CT 1598 | /Helvetica 12 F 1599 | GS 1600 | [1 0 0 1 0 0] CT 1601 | 0 4.5 moveto 1602 | 1 -1 scale 1603 | (EI-LP) t 1604 | GR 1605 | GR 1606 | GS 1607 | [0.75 0 0 0.75 0 0] CT 1608 | 0.302 0.745 0.933 RC 1609 | 1 LJ 1610 | 0.667 LW 1611 | N 1612 | 399 132.5 M 1613 | 439 132.5 L 1614 | S 1615 | GR 1616 | GS 1617 | [0.75 0 0 0.75 332.25 111.125] CT 1618 | /Helvetica 12 F 1619 | GS 1620 | [1 0 0 1 0 0] CT 1621 | 0 4.5 moveto 1622 | 1 -1 scale 1623 | (qKG) t 1624 | GR 1625 | GR 1626 | GS 1627 | [0.75 0 0 0.75 0 0] CT 1628 | 0.635 0.078 0.184 RC 1629 | 1 LJ 1630 | 0.667 LW 1631 | N 1632 | 399 148.167 M 1633 | 439 148.167 L 1634 | S 1635 | GR 1636 | GS 1637 | [0.75 0 0 0.75 332.25 122.875] CT 1638 | /Helvetica 12 F 1639 | GS 1640 | [1 0 0 1 0 0] CT 1641 | 0 4.5 moveto 1642 | 1 -1 scale 1643 | (qEI) t 1644 | GR 1645 | GR 1646 | GS 1647 | [0.75 0 0 0.75 0 0] CT 1648 | 0 0.447 0.741 RC 1649 | 1 LJ 1650 | 0.667 LW 1651 | N 1652 | 399 163.833 M 1653 | 439 163.833 L 1654 | S 1655 | GR 1656 | GS 1657 | [0.75 0 0 0.75 0 0] CT 1658 | 0.149 GC 1659 | 10.0 ML 1660 | 0.667 LW 1661 | N 1662 | 391 174 M 1663 | 391 44 L 1664 | 494 44 L 1665 | 494 174 L 1666 | cp 1667 | S 1668 | GR 1669 | %%Trailer 1670 | %%Pages: 1 1671 | %%EOF 1672 | --------------------------------------------------------------------------------