summaryrefslogtreecommitdiff
path: root/fuzzylite/fl/term/PiShape.h
blob: 24e98ede9582e9774d7d1cd1a38dd5f08d370350 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 fuzzylite (R), a fuzzy logic control library in C++.
 Copyright (C) 2010-2017 FuzzyLite Limited. All rights reserved.
 Author: Juan Rada-Vilela, Ph.D. <jcrada@fuzzylite.com>

 This file is part of fuzzylite.

 fuzzylite is free software: you can redistribute it and/or modify it under
 the terms of the FuzzyLite License included with the software.

 You should have received a copy of the FuzzyLite License along with
 fuzzylite. If not, see <http://www.fuzzylite.com/license/>.

 fuzzylite is a registered trademark of FuzzyLite Limited.
 */

#ifndef FL_PISHAPE_H
#define FL_PISHAPE_H

#include "fl/term/Term.h"

namespace fl {

    /**
      The PiShape class is an extended Term that represents the Pi-shaped curve
      membership function.

      @image html piShape.svg

      @author Juan Rada-Vilela, Ph.D.
      @see Term
      @see Variable
      @since 4.0
     */
    class FL_API PiShape : public Term {
    private:
        scalar _bottomLeft;
        scalar _topLeft;
        scalar _topRight;
        scalar _bottomRight;

    public:
        explicit PiShape(const std::string& name = "",
                scalar bottomLeft = fl::nan,
                scalar topLeft = fl::nan,
                scalar topRight = fl::nan,
                scalar bottomRight = fl::nan,
                scalar height = 1.0);
        virtual ~PiShape() FL_IOVERRIDE;
        FL_DEFAULT_COPY_AND_MOVE(PiShape)

        virtual std::string className() const FL_IOVERRIDE;
        /**
          Returns the parameters of the term
          @return `"bottomLeft topLeft topRight bottomRight [height]"`
         */
        virtual std::string parameters() const FL_IOVERRIDE;
        /**
          Configures the term with the parameters
          @param parameters as `"bottomLeft topLeft topRight bottomRight
          [height]"`
         */
        virtual void configure(const std::string& parameters) FL_IOVERRIDE;

        virtual Complexity complexity() const FL_IOVERRIDE;
        /**
          Computes the membership function evaluated at @f$x@f$
          @param x
          @return @f$\begin{cases}
          0h & \mbox{if $x \leq b_l$}\cr
          2h \left((x - b_l) / (t_l-b_l)\right)^2 & \mbox{if $x \leq 0.5(a+b)$}\cr
          h (1 - 2 \left((x - t_l) / (t_l-b_l)\right)^2) & \mbox{if $ x < t_l$}\cr
          h & \mbox{if $x \leq t_r$}\cr
          h (1 - 2\left((x - t_r) / (b_r - t_r)\right)^2) & \mbox{if $x \leq 0.5(t_r + b_r)$}\cr
          2h \left((x - b_r) / (b_r-t_r)\right)^2 & \mbox{if $x < b_r$} \cr
          0h & \mbox{otherwise}
          \end{cases}@f$

          where @f$h@f$ is the height of the Term,
                @f$b_l@f$ is the bottom left of the PiShape,
                @f$t_l@f$ is the top left of the PiShape,
                @f$t_r@f$ is the top right of the PiShape
                @f$b_r@f$ is the bottom right of the PiShape,
         */
        virtual scalar membership(scalar x) const FL_IOVERRIDE;

        /**
          Sets the bottom-left value of the curve
          @param bottomLeft is the bottom-left value of the curve
         */
        virtual void setBottomLeft(scalar bottomLeft);
        /**
          Gets the bottom-left value of the curve
          @return the bottom-left value of the curve
         */
        virtual scalar getBottomLeft() const;

        /**
          Sets the top-left value of the curve
          @param topLeft is the top-left value of the curve
         */
        virtual void setTopLeft(scalar topLeft);
        /**
          Gets the top-left value of the curve
          @return the top-left value of the curve
         */
        virtual scalar getTopLeft() const;

        /**
          Sets the top-right value of the curve
          @param topRight is the top-right value of the curve
         */
        virtual void setTopRight(scalar topRight);
        /**
          Gets the top-right value of the curve
          @return the top-right value of the curve
         */
        virtual scalar getTopRight() const;

        /**
          Sets the bottom-right value of the curve
          @param bottomRight is the bottom-right value of the curve
         */
        virtual void setBottomRight(scalar bottomRight);
        /**
          Gets the bottom-right value of the curve
          @return the bottom-right value of the curve
         */
        virtual scalar getBottomRight() const;

        virtual PiShape* clone() const FL_IOVERRIDE;

        static Term* constructor();
    };
}
#endif  /* FL_PISHAPE_H */