Passed
Push — master ( a1ec63...23bff1 )
by Grega
02:04 queued 01:00
created

Runner   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Importance

Changes 13
Bugs 4 Features 4
Metric Value
c 13
b 4
f 4
dl 0
loc 92
rs 10
wmc 20

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 22 1
D __algorithmFactory() 0 26 8
F run() 0 32 9
A __exportToJson() 0 3 1
A __exportToLog() 0 2 1
1
from __future__ import print_function
2
3
import logging
4
from NiaPy import algorithms, benchmarks
5
6
__all__ = ['algorithms', 'benchmarks']
7
__project__ = 'NiaPy'
8
__version__ = '0.0.0'
9
10
VERSION = "{0} v{1}".format(__project__, __version__)
11
12
logging.basicConfig()
13
logger = logging.getLogger('NiaPy')
14
logger.setLevel('INFO')
15
16
17
class Runner(object):
18
    # pylint: disable=too-many-instance-attributes, too-many-locals
19
    def __init__(self, D, NP, nFES, nRuns, useAlgorithms, useBenchmarks,
20
                 A=0.5, r=0.5, Qmin=0.0, Qmax=2.0, F=0.5, CR=0.9, alpha=0.5,
21
                 betamin=0.2, gamma=1.0, p=0.5, Lower=-5, Upper=5):
22
        self.D = D
23
        self.NP = NP
24
        self.nFES = nFES
25
        self.nRuns = nRuns
26
        self.useAlgorithms = useAlgorithms
27
        self.useBenchmarks = useBenchmarks
28
        self.A = A
29
        self.r = r
30
        self.Qmin = Qmin
31
        self.Qmax = Qmax
32
        self.F = F
33
        self.CR = CR
34
        self.alpha = alpha
35
        self.betamin = betamin
36
        self.gamma = gamma
37
        self.p = p
38
        self.Lower = Lower
39
        self.Upper = Upper
40
        self.results = {}
41
42
    # pylint: disable=too-many-return-statements
43
    def __algorithmFactory(self, name, benchmark):
44
        bench = benchmarks.utility.Utility().get_benchmark(
45
            benchmark, self.Lower, self.Upper)
46
47
        if name == 'BatAlgorithm':
48
            return algorithms.basic.BatAlgorithm(
49
                self.D, self.NP, self.nFES, self.A, self.r, self.Qmin, self.Qmax, bench)
50
        elif name == 'DifferentialEvolutionAlgorithm':
51
            return algorithms.basic.DifferentialEvolutionAlgorithm(
52
                self.D, self.NP, self.nFES, self.F, self.CR, bench)
53
        elif name == 'FireflyAlgorithm':
54
            return algorithms.basic.FireflyAlgorithm(
55
                self.D, self.NP, self.nFES, self.alpha, self.betamin, self.gamma, bench)
56
        elif name == 'FlowerPollinationAlgorithm':
57
            return algorithms.basic.FlowerPollinationAlgorithm(
58
                self.D, self.NP, self.nFES, self.p, bench)
59
        elif name == 'GreyWolfOptimizer':
60
            return algorithms.basic.GreyWolfOptimizer(
61
                self.D, self.NP, self.nFES, bench)
62
        elif name == 'ArtificialBeeColonyAlgorithm':
63
            return algorithms.basic.ArtificialBeeColonyAlgorithm(self.D, self.NP, self.nFES, bench)
64
        elif name == 'HybridBatAlgorithm':
65
            return algorithms.modified.HybridBatAlgorithm(
66
                self.D, self.NP, self.nFES, self.A, self.r, self.F, self.CR, self.Qmin, self.Qmax, bench)
67
        else:
68
            raise TypeError('Passed benchmark is not defined!')
69
70
    def __exportToLog(self):
71
        print(self.results)
72
73
    def __exportToJson(self):
74
        # TODO: implement export to JSON
75
        pass
76
77
    def run(self, export='log'):
78
        for alg in self.useAlgorithms:
79
            self.results[alg] = {}
80
            for bench in self.useBenchmarks:
81
                benchName = ''
82
                # check if passed benchmark is class
83
                if not isinstance(bench, ''.__class__):
84
                    # set class name as benchmark name
85
                    benchName = str(type(bench).__name__)
86
                else:
87
                    benchName = bench
88
89
                self.results[alg][benchName] = []
90
91
                for _i in range(self.nRuns):
92
                    algorithm = self.__algorithmFactory(alg, bench)
93
                    self.results[alg][benchName].append(algorithm.run())
94
95
        if export == 'log':
96
            self.__exportToLog()
97
        elif export == 'json':
98
            self.__exportToJson()
99
        elif export == 'xls':
100
            # TODO: implement export to xls
101
            pass
102
        elif export == 'latex':
103
            # TODO: implement export to latex
104
            pass
105
        else:
106
            raise TypeError('Passed export type is not supported!')
107
108
        return self.results
109