summaryrefslogtreecommitdiff
path: root/fuzzylite/fl/term/Binary.h
blob: c22a9e1f7958287c4df47c87c262adfa7f06b02c (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
/*
 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_BINARY_H
#define FL_BINARY_H

#include "fl/term/Term.h"

namespace fl {

    /**
      The Binary class is an edge Term that represents the binary membership
      function.

      @image html binary.svg

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

        /**
         Direction is an enumerator that indicates the direction of the
         edge.
         */
        enum Direction {
            /** `(_|)` increases to the right (infinity)*/
            Positive,
            /** `(--)` direction is NaN */
            Undefined,
            /** `(|_)` increases to the left (-infinity)*/
            Negative
        };

        explicit Binary(const std::string& name = "", scalar start = fl::nan,
                scalar direction = fl::nan, scalar height = 1.0);
        virtual ~Binary() FL_IOVERRIDE;
        FL_DEFAULT_COPY_AND_MOVE(Binary)

        virtual std::string className() const FL_IOVERRIDE;
        /**
          Returns the parameters of the term
          @return `"start direction [height]"`
         */
        virtual std::string parameters() const FL_IOVERRIDE;
        /**
          Configures the term with the parameters
          @param parameters as `"start direction [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}
          1h & \mbox{if $ \left(s < d \vedge x \in [s, d)\right) \wedge
          \left( s > d \vedge x \in (d, s] \right) $} \cr
          0h & \mbox{otherwise}
          \end{cases}@f$

          where @f$h@f$ is the height of the Term,
                @f$s@f$ is the start of the Binary edge,
                @f$d@f$ is the direction of the Binary edge.
         */
        virtual scalar membership(scalar x) const FL_IOVERRIDE;

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

        /**
          Sets the direction of the binary edge.

          @f$\begin{cases}
          \text{Positive} & \mbox{if $ d > s $}\cr
          \text{Negative} & \mbox{if $ d < s $}\cr
          \mbox{\tt NaN} & \mbox{otherwise}
          \end{cases}
          @f$

          where @f$d@f$ is the given direction, and
                @f$s@f$ is the start of the Binary edge

          @param direction is the direction of the binary edge
         */
        virtual void setDirection(scalar direction);
        /**
          Gets the direction of the binary edge
          @return the direction of the binary edge
         */
        virtual scalar getDirection() const;

        /**
          Gets the Direction of the binary edge as an enumerator
          @return the Direction of the binary edge as an enumerator
         */
        virtual Direction direction() const;

        virtual Binary* clone() const FL_IOVERRIDE;

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