libperiodicfunctions.cpp
1 /********************************************************************************
2  * Neural Network Framework. *
3  * Copyright (C) 2005-2011 Gianluca Massera <emmegian@yahoo.it> *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the Free Software *
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
18  ********************************************************************************/
19 
20 #include "libperiodicfunctions.h"
21 #include "mathutils.h"
22 #include <cmath>
23 
24 namespace farsa {
25 
26 PeriodicFunction::PeriodicFunction( double phase, double span, double amplitude )
27  : OutputFunction() {
28  this->phase = phase;
29  this->span = span;
30  this->amplitude = amplitude;
31 }
32 
34 {
35  phase = 0.0;
36  QString str = params.getValue(prefix + "phase");
37  if (!str.isEmpty()) {
38  bool ok;
39  phase = str.toDouble(&ok);
40  if (!ok) {
41  phase = 0.0;
42  }
43  }
44 
45  span = 1.0;
46  str = params.getValue(prefix + "span");
47  if (!str.isEmpty()) {
48  bool ok;
49  span = str.toDouble(&ok);
50  if (!ok) {
51  span = 1.0;
52  }
53  }
54 
55  amplitude = 1.0;
56  str = params.getValue(prefix + "amplitude");
57  if (!str.isEmpty()) {
58  bool ok;
59  amplitude = str.toDouble(&ok);
60  if (!ok) {
61  amplitude = 1.0;
62  }
63  }
64 }
65 
66 void PeriodicFunction::save(ConfigurationParameters& params, QString prefix)
67 {
68  // Here we call startObjectParameters even if this is an abstract class
69  // because it creates the group
70  params.startObjectParameters(prefix, "PeriodicFunction", this);
71  params.createParameter(prefix, "phase", QString::number(phase));
72  params.createParameter(prefix, "span", QString::number(span));
73  params.createParameter(prefix, "amplitude", QString::number(amplitude));
74 }
75 
76 SawtoothFunction::SawtoothFunction( double phase, double span, double amplitude )
77  : PeriodicFunction(phase,span,amplitude) {
78 }
79 
80 void SawtoothFunction::apply( DoubleVector& inputs, DoubleVector& outputs ) {
81  // --- out <- 2.0*( (x-c)/a-floor((x-c)/a+0.5) )
82  for( int i=0; i<(int)inputs.size(); i++ ) {
83  outputs[i] = amplitude*( (inputs[i]-phase)/span-floor((inputs[i]-phase)/span+0.5) );
84  }
85 }
86 
88 {
89  // Calling parent function
90  PeriodicFunction::configure(params, prefix);
91 }
92 
93 void SawtoothFunction::save(ConfigurationParameters& params, QString prefix)
94 {
95  // Calling parent function
96  PeriodicFunction::save(params, prefix);
97  // Now saving our parameters
98  params.startObjectParameters(prefix, "SawtoothFunction", this);
99 }
100 
101 TriangleFunction::TriangleFunction( double phase, double span, double amplitude )
102  : PeriodicFunction(phase,span,amplitude) {
103 }
104 
105 void TriangleFunction::apply( DoubleVector& inputs, DoubleVector& outputs ) {
106  // --- out <- 2.0*( (x-c)/a-floor((x-c)/a+0.5) )
107  for( int i=0; i<inputs.size(); i++ ) {
108  double sawtooth = (inputs[i]-phase)/span-floor((inputs[i]-phase)/span+0.5);
109  outputs[i] = amplitude*( 1.0 - fabs( sawtooth ) );
110  }
111 }
112 
114 {
115  // Calling parent function
116  PeriodicFunction::configure(params, prefix);
117 }
118 
119 void TriangleFunction::save(ConfigurationParameters& params, QString prefix)
120 {
121  // Calling parent function
122  PeriodicFunction::save(params, prefix);
123  // Now saving our parameters
124  params.startObjectParameters(prefix, "TriangleFunction", this);
125 }
126 
127 SinFunction::SinFunction( double phase, double span, double amplitude )
128  : PeriodicFunction(phase,span,amplitude) {
129 }
130 
132  return 2.0*PI_GRECO/span;
133 }
134 
135 void SinFunction::apply( DoubleVector& inputs, DoubleVector& outputs ) {
136  for( int i=0; i<(int)inputs.size(); i++ ) {
137  outputs[i] = amplitude*sin(2.0*PI_GRECO*(inputs[i]/span)-PI_GRECO*phase);
138  }
139 }
140 
141 void SinFunction::configure(ConfigurationParameters& params, QString prefix)
142 {
143  // Calling parent function
144  PeriodicFunction::configure(params, prefix);
145 }
146 
147 void SinFunction::save(ConfigurationParameters& params, QString prefix)
148 {
149  // Now calling parent function
150  PeriodicFunction::save(params, prefix);
151  // Now saving our parameters
152  params.startObjectParameters(prefix, "SinFunction", this);
153 }
154 
155 PseudoGaussFunction::PseudoGaussFunction( double phase, double span, double amplitude )
156  : PeriodicFunction(phase,span,amplitude) {
157 }
158 
159 void PseudoGaussFunction::apply( DoubleVector& inputs, DoubleVector& outputs ) {
160  for( int i=0; i<inputs.size(); i++ ) {
161  outputs[i] = 0.5*amplitude*( sin( 2.0*PI_GRECO*((inputs[i]-phase)/span+0.25) ) + 1.0 );
162  }
163 }
164 
166 {
167  // Calling parent function
168  PeriodicFunction::configure(params, prefix);
169 }
170 
172 {
173  // Now calling parent function
174  PeriodicFunction::save(params, prefix);
175  // Now saving our parameters
176  params.startObjectParameters(prefix, "PseudoGaussFunction", this);
177 }
178 
179 }
180 
virtual void save(ConfigurationParameters &params, QString prefix)
Save the actual status of parameters into the ConfigurationParameters object passed.
Library of Periodic OutputFunction.
OutputFunction Class.
PeriodicFunction(double phase=0.0, double span=1.0, double amplitude=1.0)
Construct.
TriangleFunction(double phase=0.0, double span=1.0, double amplitude=1.0)
Construct.
virtual void apply(DoubleVector &inputs, DoubleVector &outputs)
Implement the Triangle function.
PseudoGaussFunction(double phase=0.0, double span=1.0, double amplitude=1.0)
Construct.
virtual void configure(ConfigurationParameters &params, QString prefix)
Configures the object using a ConfigurationParameters object.
virtual void configure(ConfigurationParameters &params, QString prefix)
Configures the object using a ConfigurationParameters object.
virtual void save(ConfigurationParameters &params, QString prefix)
Save the actual status of parameters into the ConfigurationParameters object passed.
virtual void apply(DoubleVector &inputs, DoubleVector &outputs)
Implement the Triangle function.
virtual void configure(ConfigurationParameters &params, QString prefix)
Configures the object using a ConfigurationParameters object.
double frequency()
Return the frequency of the sinusoidal wave.
SawtoothFunction(double phase=0.0, double span=1.0, double amplitude=1.0)
Construct.
virtual void save(ConfigurationParameters &params, QString prefix)
Save the actual status of parameters into the ConfigurationParameters object passed.
SinFunction(double phase=0.0, double span=1.0, double amplitude=1.0)
Construct.
bool startObjectParameters(QString groupPath, QString typeName, ParameterSettable *object)
virtual void save(ConfigurationParameters &params, QString prefix)
Save the actual status of parameters into the ConfigurationParameters object passed.
QString getValue(QString path, bool alsoMatchParents=false) const
virtual void configure(ConfigurationParameters &params, QString prefix)
Configures the object using a ConfigurationParameters object.
virtual void save(ConfigurationParameters &params, QString prefix)
Save the actual status of parameters into the ConfigurationParameters object passed.
virtual void apply(DoubleVector &inputs, DoubleVector &outputs)
Implement the Sin function.
virtual void configure(ConfigurationParameters &params, QString prefix)
Configures the object using a ConfigurationParameters object.
virtual void apply(DoubleVector &inputs, DoubleVector &outputs)
Implement the Sawtooth function.
void createParameter(QString groupPath, QString parameter)