Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
FunctionOneScalarVariable.cs
1using System.Collections.Generic;
2using System.Numerics;
3using System.Threading.Tasks;
8
9namespace Waher.Script.Model
10{
15 {
25 {
26 }
27
35 {
36 if (Argument.IsScalar)
37 {
38 object Obj = Argument.AssociatedObjectValue;
39
40 if (Obj is double d)
41 return this.EvaluateScalar(d, Variables);
42
43 if (Obj is Complex z)
44 return this.EvaluateScalar(z, Variables);
45
46 if (Obj is bool b)
47 return this.EvaluateScalar(b, Variables);
48
49 if (Obj is string s)
50 return this.EvaluateScalar(s, Variables);
51
53 return this.EvaluateScalar(Measurement, Variables);
54
55 if (Argument.AssociatedObjectValue is IPhysicalQuantity PhysicalQuantity)
56 return this.EvaluateScalar(PhysicalQuantity.ToPhysicalQuantity(), Variables);
57
58 return this.EvaluateScalar(Argument, Variables);
59 }
60 else
61 {
62 if (Argument is IVector Vector)
63 {
64 LinkedList<IElement> Elements = new LinkedList<IElement>();
65 int i, c = Vector.Dimension;
66
67 if (Vector is DoubleVector dv)
68 {
69 double[] v = dv.Values;
70 for (i = 0; i < c; i++)
71 Elements.AddLast(this.EvaluateScalar(v[i], Variables));
72 }
73 else if (Vector is ComplexVector cv)
74 {
75 Complex[] v = cv.Values;
76 for (i = 0; i < c; i++)
77 Elements.AddLast(this.EvaluateScalar(v[i], Variables));
78 }
79 else if (Vector is BooleanVector bv)
80 {
81 bool[] v = bv.Values;
82 for (i = 0; i < c; i++)
83 Elements.AddLast(this.EvaluateScalar(v[i], Variables));
84 }
85 else
86 {
87 foreach (IElement E in Vector.ChildElements)
88 Elements.AddLast(this.Evaluate(E, Variables));
89 }
90
91 return Argument.Encapsulate(Elements, this);
92 }
93 else
94 {
95 LinkedList<IElement> Elements = new LinkedList<IElement>();
96
97 foreach (IElement E in Argument.ChildElements)
98 Elements.AddLast(this.Evaluate(E, Variables));
99
100 return Argument.Encapsulate(Elements, this);
101 }
102 }
103 }
104
112 {
113 object Value = Argument.AssociatedObjectValue;
114
115 if (Expression.TryConvert(Value, out string s))
116 return this.EvaluateScalar(s, Variables);
117 else if (Expression.TryConvert(Value, out double d))
118 return this.EvaluateScalar(d, Variables);
119 else if (Expression.TryConvert(Value, out bool b))
120 return this.EvaluateScalar(b, Variables);
121 else if (Expression.TryConvert(Value, out Complex z))
122 return this.EvaluateScalar(z, Variables);
123 else if (Expression.TryConvert(Value, out Integer i))
124 return this.EvaluateScalar((double)i.Value, Variables);
125 else if (Expression.TryConvert(Value, out RationalNumber q))
126 return this.EvaluateScalar(q.ToDouble(), Variables);
127 else
128 throw new ScriptRuntimeException("Type of scalar not supported.", this);
129 }
130
138 {
139 throw new ScriptRuntimeException("Double-valued arguments not supported.", this);
140 }
141
149 {
150 throw new ScriptRuntimeException("Complex-valued arguments not supported.", this);
151 }
152
160 {
161 throw new ScriptRuntimeException("Boolean-valued arguments not supported.", this);
162 }
163
171 {
172 throw new ScriptRuntimeException("String-valued arguments not supported.", this);
173 }
174
182 {
183 return this.EvaluateScalar(Argument.Magnitude, Variables);
184 }
185
193 {
194 return this.EvaluateScalar(Argument.Magnitude, Variables);
195 }
196
203 public override async Task<IElement> EvaluateAsync(IElement Argument, Variables Variables)
204 {
205 if (Argument.IsScalar)
206 {
207 object Obj = Argument.AssociatedObjectValue;
208
209 if (Obj is double d)
210 return await this.EvaluateScalarAsync(d, Variables);
211
212 if (Obj is Complex z)
213 return await this.EvaluateScalarAsync(z, Variables);
214
215 if (Obj is bool b)
216 return await this.EvaluateScalarAsync(b, Variables);
217
218 if (Obj is string s)
219 return await this.EvaluateScalarAsync(s, Variables);
220
222 return await this.EvaluateScalarAsync(Measurement, Variables);
223
224 if (Argument.AssociatedObjectValue is IPhysicalQuantity PhysicalQuantity)
225 return await this.EvaluateScalarAsync(PhysicalQuantity.ToPhysicalQuantity(), Variables);
226
227 return await this.EvaluateScalarAsync(Argument, Variables);
228 }
229 else
230 {
231 if (Argument is IVector Vector)
232 {
233 LinkedList<IElement> Elements = new LinkedList<IElement>();
234 int i, c = Vector.Dimension;
235
236 if (Vector is DoubleVector dv)
237 {
238 double[] v = dv.Values;
239 for (i = 0; i < c; i++)
240 Elements.AddLast(await this.EvaluateScalarAsync(v[i], Variables));
241 }
242 else if (Vector is ComplexVector cv)
243 {
244 Complex[] v = cv.Values;
245 for (i = 0; i < c; i++)
246 Elements.AddLast(await this .EvaluateScalarAsync(v[i], Variables));
247 }
248 else if (Vector is BooleanVector bv)
249 {
250 bool[] v = bv.Values;
251 for (i = 0; i < c; i++)
252 Elements.AddLast(await this .EvaluateScalarAsync(v[i], Variables));
253 }
254 else
255 {
256 foreach (IElement E in Vector.ChildElements)
257 Elements.AddLast(await this.EvaluateAsync(E, Variables));
258 }
259
260 return Argument.Encapsulate(Elements, this);
261 }
262 else
263 {
264 LinkedList<IElement> Elements = new LinkedList<IElement>();
265
266 foreach (IElement E in Argument.ChildElements)
267 Elements.AddLast(await this.EvaluateAsync(E, Variables));
268
269 return Argument.Encapsulate(Elements, this);
270 }
271 }
272 }
273
281 {
282 object Value = Argument.AssociatedObjectValue;
283
284 if (Expression.TryConvert(Value, out string s))
285 return this.EvaluateScalarAsync(s, Variables);
286 else if (Expression.TryConvert(Value, out double d))
287 return this.EvaluateScalarAsync(d, Variables);
288 else if (Expression.TryConvert(Value, out bool b))
289 return this.EvaluateScalarAsync(b, Variables);
290 else if (Expression.TryConvert(Value, out Complex z))
291 return this.EvaluateScalarAsync(z, Variables);
292 else if (Expression.TryConvert(Value, out Integer i))
293 return this.EvaluateScalarAsync((double)i.Value, Variables);
294 else if (Expression.TryConvert(Value, out RationalNumber q))
295 return this.EvaluateScalarAsync(q.ToDouble(), Variables);
296 else
297 throw new ScriptRuntimeException("Type of scalar not supported.", this);
298 }
299
306 public virtual Task<IElement> EvaluateScalarAsync(double Argument, Variables Variables)
307 {
308 return Task.FromResult(this.EvaluateScalar(Argument, Variables));
309 }
310
317 public virtual Task<IElement> EvaluateScalarAsync(Complex Argument, Variables Variables)
318 {
319 return Task.FromResult(this.EvaluateScalar(Argument, Variables));
320 }
321
328 public virtual Task<IElement> EvaluateScalarAsync(bool Argument, Variables Variables)
329 {
330 return Task.FromResult(this.EvaluateScalar(Argument, Variables));
331 }
332
339 public virtual Task<IElement> EvaluateScalarAsync(string Argument, Variables Variables)
340 {
341 return Task.FromResult(this.EvaluateScalar(Argument, Variables));
342 }
343
351 {
352 return Task.FromResult(this.EvaluateScalar(Argument, Variables));
353 }
354
362 {
363 return Task.FromResult(this.EvaluateScalar(Argument, Variables));
364 }
365
366 }
367}
Class managing a script expression.
Definition: Expression.cs:39
static bool TryConvert(object Value, Type DesiredType, out object Result)
Tries to convert an object Value to an object of type DesiredType .
Definition: Expression.cs:5268
Base class for funcions of one scalar variable.
override IElement Evaluate(IElement Argument, Variables Variables)
Evaluates the function.
virtual IElement EvaluateScalar(IElement Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual Task< IElement > EvaluateScalarAsync(Complex Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual IElement EvaluateScalar(Measurement Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual Task< IElement > EvaluateScalarAsync(double Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual IElement EvaluateScalar(PhysicalQuantity Argument, Variables Variables)
Evaluates the function on a scalar argument.
override async Task< IElement > EvaluateAsync(IElement Argument, Variables Variables)
Evaluates the function.
virtual Task< IElement > EvaluateScalarAsync(IElement Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual Task< IElement > EvaluateScalarAsync(bool Argument, Variables Variables)
Evaluates the function on a scalar argument.
FunctionOneScalarVariable(ScriptNode Argument, int Start, int Length, Expression Expression)
Base class for funcions of one scalar variable.
virtual IElement EvaluateScalar(double Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual Task< IElement > EvaluateScalarAsync(Measurement Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual IElement EvaluateScalar(Complex Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual Task< IElement > EvaluateScalarAsync(string Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual IElement EvaluateScalar(bool Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual Task< IElement > EvaluateScalarAsync(PhysicalQuantity Argument, Variables Variables)
Evaluates the function on a scalar argument.
virtual IElement EvaluateScalar(string Argument, Variables Variables)
Evaluates the function on a scalar argument.
Base class for funcions of one variable.
ScriptNode Argument
Function argument.
Base class for all nodes in a parsed script tree.
Definition: ScriptNode.cs:69
int Length
Length of expression covered by node.
Definition: ScriptNode.cs:101
int Start
Start position in script expression.
Definition: ScriptNode.cs:92
Integer-valued number.
Definition: Integer.cs:13
Collection of variables.
Definition: Variables.cs:25
Basic interface for all types of elements.
Definition: IElement.cs:20
ICollection< IElement > ChildElements
An enumeration of child elements. If the element is a scalar, this property will return null.
Definition: IElement.cs:49
Basic interface for vectors.
Definition: IVector.cs:9
Interface for objects that can be represented as a physical quantity.