1 /**
2  *
3  *   Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(_at_LIP6) & Christophe GONZALES(_at_AMU)
4  *   info_at_agrum_dot_org
5  *
6  *  This library is free software: you can redistribute it and/or modify
7  *  it under the terms of the GNU Lesser General Public License as published by
8  *  the Free Software Foundation, either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public License
17  *  along with this library.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 
22 /**
23  * @file
24  * @brief Headers of the MultiDimBijArray class.
25  *
26  * @author Pierre-Henri WUILLEMIN(_at_LIP6) & Christophe GONZALES(_at_AMU)
27  * @author Lionel TORTI
28  */
29 
30 #ifndef GUM_MULTIDIMBIJARRAY_H
31 #define GUM_MULTIDIMBIJARRAY_H
32 
33 #include <initializer_list>
34 
35 #include <agrum/tools/core/bijection.h>
36 
37 #include <agrum/tools/multidim/implementations/multiDimArray.h>
38 #include <agrum/tools/multidim/implementations/multiDimWithOffset.h>
39 
40 namespace gum {
41 
42   /**
43    * @class MultiDimBijArray
44    * @headerfile multiDimBijArray.h <agrum/tools/multidim/multiDimBijArray.h>
45    * @ingroup multidim_group
46    *
47    * @brief Decorator of a MultiDimArray, using a bijection over the variables.
48    *
49    * @tparam GUM_SCALAR The type of scaler stored in this multidimensional
50    * table.
51    */
52   template < typename GUM_SCALAR >
53   class MultiDimBijArray: public MultiDimWithOffset< GUM_SCALAR > {
54     public:
55     using VarBijection = Bijection< const DiscreteVariable*, const DiscreteVariable* >;
56 
57     // =========================================================================
58     /// @name Constructors / Destructors
59     // =========================================================================
60     /// @{
61 
62     /**
63      * @brief Class constructor.
64      *
65      * @param bijection The bijection between variables in array and variable
66      * in this.
67      * @param array The MultiDimArray decorated by this MultiDimBijArray.
68      */
69     MultiDimBijArray(const VarBijection& bijection, const MultiDimArray< GUM_SCALAR >& array);
70 
71     /**
72      * @brief Class constructor.
73      *
74      * @param bijection The bijection between variables in array and variable
75      * in this.
76      * @param array The MultiDimBijArray decorated by this MultiDimBijArray.
77      */
78     MultiDimBijArray(const VarBijection& bijection, const MultiDimBijArray< GUM_SCALAR >& array);
79 
80     /**
81      * @brief Copy constructor.
82      *
83      * The newly created matrix contains the same variables and the same values
84      * as from, but no instantiation is associated to it.
85      *
86      * @param from The MultiDimBijArray to copy.
87      */
88     MultiDimBijArray(const MultiDimBijArray< GUM_SCALAR >& from);
89 
90     /**
91      * @brief Class destructor.
92      */
93     virtual ~MultiDimBijArray();
94 
95     /// @}
96     // ========================================================================
97     /// @name Modifiers -- will raise OperationNotAllowed exceptions
98     // ========================================================================
99     /// @{
100     /**
101      * @warning This will raise an exception: read only structure.
102      * @throw OperationNotAllowed Raised since you can't change a readonly
103      * structure.
104      */
105     MultiDimBijArray< GUM_SCALAR >& operator=(const MultiDimBijArray< GUM_SCALAR >& from);
106 
107     /**
108      * @warning This will raise an exception: read only structure.
109      * @throw OperationNotAllowed Raised since you can't change a readonly
110      * structure.
111      */
112     virtual void set(const Instantiation& i, const GUM_SCALAR& value) const;
113 
114     /**
115      * This will raise an exception: you can't change the variables in a
116      * MultiDimBijArray.
117      * @param v The variable not added.
118      * @throw OperationNotAllowed You can't add variable in a MultiDimBijArray.
119      */
120     virtual void add(const DiscreteVariable& v);
121 
122     /**
123      * This will raise an exception: you can't change the variables in a
124      * MultiDimBijArray.
125      * @param v The variable not added.
126      * @throw OperationNotAllowed You can't add variable in a MultiDimBijArray.
127      */
128     virtual void erase(const DiscreteVariable& v);
129 
130     /**
131      * This will raise an exception: you can't change the data
132      * @param d the value changed
133      * @throw OperationNotAllowed You can't change data.
134      */
135     virtual void fill(const GUM_SCALAR& d) const;
136 
137     /**
138      * This will raise an exception: you can't change the variables in a
139      * MultiDimBijArray.
140      * @param v The variable not added.
141      * @throw OperationNotAllowed You can't add variable in a MultiDimBijArray.
142      */
143     virtual void populate(const std::vector< GUM_SCALAR >& v) const;
144 
145     /**
146      * This will raise an exception: you can't change the variables in a
147      * MultiDimBijArray.
148      * @param l The variable not added.
149      * @throw OperationNotAllowed You can't add variable in a MultiDimBijArray.
150      */
151     virtual void populate(std::initializer_list< GUM_SCALAR > l) const;
152 
153     /// @}
154     // ========================================================================
155     /// @name Inherited methods
156     // ========================================================================
157     /// @{
158 
159     virtual const std::string& name() const;
160 
161     virtual GUM_SCALAR get(const Instantiation& i) const;
162 
163     virtual Size realSize() const;
164 
165     virtual MultiDimBijArray< GUM_SCALAR >* newFactory() const;
166 
167     /// @}
168 
169     protected:
170     virtual GUM_SCALAR& get_(const Instantiation& i) const;
171 
172     virtual void commitMultipleChanges_();
173 
174     virtual void replace_(const DiscreteVariable* x, const DiscreteVariable* y);
175 
176     private:
177     /// The true data.
178     const MultiDimArray< GUM_SCALAR >& _array_;
179 
180     /// The class name.
181     std::string _name_;
182   };
183 
184 
185 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
186   extern template class MultiDimBijArray< double >;
187 #endif
188 
189 }   // namespace gum
190 
191 #include <agrum/tools/multidim/implementations/multiDimBijArray_tpl.h>
192 
193 #endif   // GUM_MULTIDIMBIJARRAY_H
194