Passed
Pull Request — master (#34)
by Grega
01:18
created

Runner.__exportToXls()   B

Complexity

Conditions 4

Size

Total Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
dl 0
loc 28
rs 8.5806
c 0
b 0
f 0
1
from __future__ import print_function  # for backward compatibility purpose
2
3
import os
4
import logging
5
import json
6
import datetime
7
import xlsxwriter
0 ignored issues
show
introduced by
Unable to import 'xlsxwriter'
Loading history...
8
from NiaPy import algorithms, benchmarks
9
10
__all__ = ['algorithms', 'benchmarks']
11
__project__ = 'NiaPy'
12
__version__ = '0.0.0'
13
14
VERSION = "{0} v{1}".format(__project__, __version__)
15
16
logging.basicConfig()
17
logger = logging.getLogger('NiaPy')
18
logger.setLevel('INFO')
19
20
21
class Runner(object):
22
    # pylint: disable=too-many-instance-attributes, too-many-locals
23
    def __init__(self, D, NP, nFES, nRuns, useAlgorithms, useBenchmarks,
24
                 A=0.5, r=0.5, Qmin=0.0, Qmax=2.0, F=0.5, CR=0.9, alpha=0.5,
25
                 betamin=0.2, gamma=1.0, p=0.5):
26
        self.D = D
27
        self.NP = NP
28
        self.nFES = nFES
29
        self.nRuns = nRuns
30
        self.useAlgorithms = useAlgorithms
31
        self.useBenchmarks = useBenchmarks
32
        self.A = A
33
        self.r = r
34
        self.Qmin = Qmin
35
        self.Qmax = Qmax
36
        self.F = F
37
        self.CR = CR
38
        self.alpha = alpha
39
        self.betamin = betamin
40
        self.gamma = gamma
41
        self.p = p
42
        self.results = {}
43
44
    def __algorithmFactory(self, name, benchmark):
45
        bench = benchmarks.utility.Utility().get_benchmark(benchmark)
46
        algorithm = None
47
48
        if name == 'BatAlgorithm':
49
            algorithm = algorithms.basic.BatAlgorithm(
50
                self.D, self.NP, self.nFES, self.A, self.r, self.Qmin, self.Qmax, bench)
51
        elif name == 'DifferentialEvolutionAlgorithm':
52
            algorithm = algorithms.basic.DifferentialEvolutionAlgorithm(
53
                self.D, self.NP, self.nFES, self.F, self.CR, bench)
54
        elif name == 'FireflyAlgorithm':
55
            algorithm = algorithms.basic.FireflyAlgorithm(
56
                self.D, self.NP, self.nFES, self.alpha, self.betamin, self.gamma, bench)
57
        elif name == 'FlowerPollinationAlgorithm':
58
            algorithm = algorithms.basic.FlowerPollinationAlgorithm(
59
                self.D, self.NP, self.nFES, self.p, bench)
60
        elif name == 'GreyWolfOptimizer':
61
            algorithm = algorithms.basic.GreyWolfOptimizer(
62
                self.D, self.NP, self.nFES, bench)
63
        elif name == 'ArtificialBeeColonyAlgorithm':
64
            algorithm = algorithms.basic.ArtificialBeeColonyAlgorithm(self.D, self.NP, self.nFES, bench)
65
        elif name == 'HybridBatAlgorithm':
66
            algorithm = algorithms.modified.HybridBatAlgorithm(
67
                self.D, self.NP, self.nFES, self.A, self.r, self.F, self.CR, self.Qmin, self.Qmax, bench)
68
        else:
69
            raise TypeError('Passed benchmark is not defined!')
70
71
        return algorithm
72
73
    @classmethod
74
    def __createExportDir(cls):
75
        if not os.path.exists('export'):
76
            os.makedirs('export')
77
78
    @classmethod
79
    def __generateExportName(cls, extension):
80
        return 'export/' + str(datetime.datetime.now()) + '.' + extension
81
82
    def __exportToLog(self):
83
        print(self.results)
84
85
    def __exportToJson(self):
86
        self.__createExportDir()
87
        with open(self.__generateExportName('json'), 'w') as outFile:
88
            json.dump(self.results, outFile)
89
            logger.info('Export to JSON completed!')
90
91
    def __exportToXls(self):
92
        workbook = xlsxwriter.Workbook(self.__generateExportName('xlsx'))
93
        worksheet = workbook.add_worksheet()
94
95
        row = 0
96
        col = 0
97
        nRuns = 0
98
99
        for alg in self.results:
100
            worksheet.write(row, col, alg)
101
            col += 1
102
103
            for bench in self.results[alg]:
104
                worksheet.write(row, col, bench)
105
106
                nRuns = len(self.results[alg][bench])
107
108
                for i in range(len(self.results[alg][bench])):
109
                    row += 1
110
                    worksheet.write(row, col, self.results[alg][bench][i])
111
112
                row -= len(self.results[alg][bench])  # jump back up
113
                col += 1
114
115
            row += 1 + nRuns  # jump down to row after previous results
116
            col -= 1 + len(self.results[alg])
117
118
        logger.info('Export to XLSX completed!')
119
120
    def __exportToLatex(self):
121
        # TODO: implement export to Latex
122
        pass
123
124
    def run(self, export='log', verbose=False):
125
        for alg in self.useAlgorithms:
126
            self.results[alg] = {}
127
            if verbose:
128
                logger.info('Running %s...', alg)
129
            for bench in self.useBenchmarks:
130
                benchName = ''
131
                # check if passed benchmark is class
132
                if not isinstance(bench, ''.__class__):
133
                    # set class name as benchmark name
134
                    benchName = str(type(bench).__name__)
135
                else:
136
                    benchName = bench
137
138
                if verbose:
139
                    logger.info('Running %s algorithm on %s benchmark...', alg, benchName)
140
141
                self.results[alg][benchName] = []
142
143
                for _i in range(self.nRuns):
144
                    algorithm = self.__algorithmFactory(alg, bench)
145
                    self.results[alg][benchName].append(algorithm.run())
146
147
            if verbose:
148
                logger.info('---------------------------------------------------')
149
150
        if export == 'log':
151
            self.__exportToLog()
152
        elif export == 'json':
153
            self.__exportToJson()
154
        elif export == 'xlsx':
155
            self.__exportToXls()
156
        elif export == 'latex':
157
            self.__exportToLatex()
158
        else:
159
            raise TypeError('Passed export type is not supported!')
160
161
        return self.results
162