hyper_volume.hpp 4.4 KB
Newer Older
1
2
3
4
//| Copyright Inria May 2015
//| This project has received funding from the European Research Council (ERC) under
//| the European Union's Horizon 2020 research and innovation programme (grant
//| agreement No 637972) - see http://www.resibots.eu
5
//|
6
7
8
//| Contributor(s):
//|   - Jean-Baptiste Mouret (jean-baptiste.mouret@inria.fr)
//|   - Antoine Cully (antoinecully@gmail.com)
9
//|   - Konstantinos Chatzilygeroudis (konstantinos.chatzilygeroudis@inria.fr)
10
11
//|   - Federico Allocati (fede.allocati@gmail.com)
//|   - Vaios Papaspyros (b.papaspyros@gmail.com)
Konstantinos Chatzilygeroudis's avatar
Konstantinos Chatzilygeroudis committed
12
//|   - Roberto Rama (bertoski@gmail.com)
13
//|
14
15
16
17
18
//| This software is a computer library whose purpose is to optimize continuous,
//| black-box functions. It mainly implements Gaussian processes and Bayesian
//| optimization.
//| Main repository: http://github.com/resibots/limbo
//| Documentation: http://www.resibots.eu/limbo
19
//|
20
21
22
23
24
//| This software is governed by the CeCILL-C license under French law and
//| abiding by the rules of distribution of free software.  You can  use,
//| modify and/ or redistribute the software under the terms of the CeCILL-C
//| license as circulated by CEA, CNRS and INRIA at the following URL
//| "http://www.cecill.info".
25
//|
26
27
28
29
30
//| As a counterpart to the access to the source code and  rights to copy,
//| modify and redistribute granted by the license, users are provided only
//| with a limited warranty  and the software's author,  the holder of the
//| economic rights,  and the successive licensors  have only  limited
//| liability.
31
//|
32
33
34
35
36
37
38
39
40
41
//| In this respect, the user's attention is drawn to the risks associated
//| with loading,  using,  modifying and/or developing or reproducing the
//| software by the user in light of its specific status of free software,
//| that may mean  that it is complicated to manipulate,  and  that  also
//| therefore means  that it is reserved for developers  and  experienced
//| professionals having in-depth computer knowledge. Users are therefore
//| encouraged to load and test the software's suitability as regards their
//| requirements in conditions enabling the security of their systems and/or
//| data to be ensured and,  more generally, to use and operate it in the
//| same conditions as regards security.
42
//|
43
44
//| The fact that you are presently reading this means that you have had
//| knowledge of the CeCILL-C license and that you accept its terms.
45
//|
46
47
48
49
#ifndef LIMBO_STAT_HYPER_VOLUME_HPP
#define LIMBO_STAT_HYPER_VOLUME_HPP

#include <hv/hypervol.h>
50
51
#include <limbo/experimental/tools/pareto.hpp>
#include <limbo/stat/stat_base.hpp>
52
53

namespace limbo {
54
55
56
57
58
59
60
    namespace experimental {
        namespace stat {
            namespace defaults {
                struct stat_hyper_volume {
                    BO_PARAM_ARRAY(double, ref, 10, 10);
                };
            }
61

62
63
64
            template <typename Params>
            struct HyperVolume : public limbo::stat::StatBase<Params> {
                template <typename BO, typename AggregatorFunction>
65
                void operator()(const BO& bo, const AggregatorFunction&)
66
67
68
69
70
71
                {
                    if (bo.observations().empty())
                        return;
                    if (!bo.stats_enabled())
                        return;
                    // convert the data to C arrays
72
                    double** data = new double*[bo.observations().size()];
73
74
75
76
77
78
79
80
81
82
                    for (size_t i = 0; i < bo.observations().size(); ++i) {
                        size_t dim = bo.observations()[i].size();
                        data[i] = new double[dim];
                        for (size_t k = 0; k < dim; ++k)
                            data[i][k] = bo.observations()[i](k) + Params::stat_hyper_volume::ref(k);
                    }
                    // call the hypervolume by Zitzler
                    int noObjectives = bo.observations()[0].size();
                    int redSizeFront1 = FilterNondominatedSet(data, bo.observations().size(), noObjectives);
                    double hv = CalculateHypervolume(data, redSizeFront1, noObjectives);
83

84
85
86
87
88
89
90
91
92
93
94
                    // write
                    this->_create_log_file(bo, "hypervolume.dat");
                    (*this->_log_file) << bo.current_iteration() << "\t" << hv << std::endl;

                    // free data
                    for (size_t i = 0; i < bo.observations().size(); ++i)
                        delete[] data[i];
                    delete[] data;
                }
            };
        }
95
96
97
98
    }
}

#endif