summaryrefslogtreecommitdiff
path: root/fuzzylite/fl/term/Ramp.h
blob: dc493018774d6f9ec74195ae49bf1428333a960e (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
/*
 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_RAMP_H
#define FL_RAMP_H

#include "fl/term/Term.h"

namespace fl {

    /**
      The Ramp class is an edge Term that represents the ramp membership
      function.

      @image html ramp.svg

      @author Juan Rada-Vilela, Ph.D.
      @see Term
      @see Variable
      @since 4.0
     */
    class FL_API Ramp : public Term {
    private:
        scalar _start, _end;

    public:

        /**
          Direction is an enumerator that indicates the direction of the ramp.
         */
        enum Direction {
            /** `(_/)` increases to the right */ Positive,
            /** `(--)` slope is zero */ Zero,
            /** `(\\_)` increases to the left */ Negative
        };
        explicit Ramp(const std::string& name = "",
                scalar start = fl::nan,
                scalar end = fl::nan,
                scalar height = 1.0);
        virtual ~Ramp() FL_IOVERRIDE;
        FL_DEFAULT_COPY_AND_MOVE(Ramp)

        virtual std::string className() const FL_IOVERRIDE;
        /**
          Returns the parameters of the term
          @return `"start end [height]"`
         */
        virtual std::string parameters() const FL_IOVERRIDE;
        /**
          Configures the term with the parameters
          @param parameters as `"start end [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 = e$}\cr

          \begin{cases}
          0h & \mbox{if $x \leq s$}\cr
          1h & \mbox{if $x \geq e$}\cr
          h (x - s) / (e - s) & \mbox{otherwise}\cr
          \end{cases} & \mbox{if $s < e$}\cr

          \begin{cases}
          0h & \mbox{if $x \geq s$}\cr
          1h & \mbox{if $x \leq e$}\cr
          h (s - x) / (s - e) & \mbox{otherwise}
          \end{cases} & \mbox{if $s > e$}\cr
          \end{cases}@f$

          where @f$h@f$ is the height of the Term,
                @f$s@f$ is the start of the Ramp,
                @f$e@f$ is the end of the Ramp
         */
        virtual scalar membership(scalar x) const FL_IOVERRIDE;

        virtual scalar tsukamoto(scalar activationDegree,
                scalar minimum, scalar maximum) const FL_IOVERRIDE;

        virtual bool isMonotonic() const FL_IOVERRIDE;

        /**
          Sets the start of the ramp
          @param start is the start of the ramp
         */
        virtual void setStart(scalar start);
        /**
          Gets the start of the ramp
          @return the start of the ramp
         */
        virtual scalar getStart() const;

        /**
          Sets the end of the ramp
          @param end is the end of the ramp
         */
        virtual void setEnd(scalar end);
        /**
          Gets the end of the ramp
          @return the end of the ramp
         */
        virtual scalar getEnd() const;

        /**
          Returns the direction of the ramp
          @return the direction of the ramp
         */
        virtual Direction direction() const;

        virtual Ramp* clone() const FL_IOVERRIDE;

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