Skip to content

Commit 84d491a

Browse files
committed
#489 - Add basic simplification rules for Power and Temperature units.
1 parent bedf784 commit 84d491a

File tree

12 files changed

+248
-287
lines changed

12 files changed

+248
-287
lines changed

xFunc.Maths/Analyzers/Simplifier.cs

+44-4
Original file line numberDiff line numberDiff line change
@@ -178,13 +178,28 @@ public override IExpression Analyze(Add exp)
178178
// const + const
179179
(Number left, Number right)
180180
=> new Number(left.Value + right.Value),
181+
181182
(Number left, Angle right)
182183
=> (left.Value + right.Value).AsExpression(),
183184
(Angle left, Number right)
184185
=> (left.Value + right.Value).AsExpression(),
185186
(Angle left, Angle right)
186187
=> (left.Value + right.Value).AsExpression(),
187188

189+
(Number left, Power right)
190+
=> (left.Value + right.Value).AsExpression(),
191+
(Power left, Number right)
192+
=> (left.Value + right.Value).AsExpression(),
193+
(Power left, Power right)
194+
=> (left.Value + right.Value).AsExpression(),
195+
196+
(Number left, Temperature right)
197+
=> (left.Value + right.Value).AsExpression(),
198+
(Temperature left, Number right)
199+
=> (left.Value + right.Value).AsExpression(),
200+
(Temperature left, Temperature right)
201+
=> (left.Value + right.Value).AsExpression(),
202+
188203
// x + x
189204
(Variable left, Variable right) when left.Name == right.Name
190205
=> new Mul(Number.Two, left),
@@ -292,11 +307,12 @@ public override IExpression Analyze(Div exp)
292307
// const / const
293308
(Number left, Number right)
294309
=> new Number(left.Value / right.Value),
295-
(Number left, Angle right)
296-
=> (left.Value / right.Value).AsExpression(),
310+
297311
(Angle left, Number right)
298312
=> (left.Value / right.Value).AsExpression(),
299-
(Angle left, Angle right)
313+
(Power left, Number right)
314+
=> (left.Value / right.Value).AsExpression(),
315+
(Temperature left, Number right)
300316
=> (left.Value / right.Value).AsExpression(),
301317

302318
// x / x
@@ -474,11 +490,20 @@ public override IExpression Analyze(Mul exp)
474490
// const * const
475491
(Number left, Number right)
476492
=> new Number(left.Value * right.Value),
493+
477494
(Number left, Angle right)
478495
=> (left.Value * right.Value).AsExpression(),
479496
(Angle left, Number right)
480497
=> (left.Value * right.Value).AsExpression(),
481-
(Angle left, Angle right)
498+
499+
(Number left, Power right)
500+
=> (left.Value * right.Value).AsExpression(),
501+
(Power left, Number right)
502+
=> (left.Value * right.Value).AsExpression(),
503+
504+
(Number left, Temperature right)
505+
=> (left.Value * right.Value).AsExpression(),
506+
(Temperature left, Number right)
482507
=> (left.Value * right.Value).AsExpression(),
483508

484509
// x * -y
@@ -700,13 +725,28 @@ public override IExpression Analyze(Sub exp)
700725
// const - const
701726
(Number left, Number right)
702727
=> new Number(left.Value - right.Value),
728+
703729
(Number left, Angle right)
704730
=> (left.Value - right.Value).AsExpression(),
705731
(Angle left, Number right)
706732
=> (left.Value - right.Value).AsExpression(),
707733
(Angle left, Angle right)
708734
=> (left.Value - right.Value).AsExpression(),
709735

736+
(Number left, Power right)
737+
=> (left.Value - right.Value).AsExpression(),
738+
(Power left, Number right)
739+
=> (left.Value - right.Value).AsExpression(),
740+
(Power left, Power right)
741+
=> (left.Value - right.Value).AsExpression(),
742+
743+
(Number left, Temperature right)
744+
=> (left.Value - right.Value).AsExpression(),
745+
(Temperature left, Number right)
746+
=> (left.Value - right.Value).AsExpression(),
747+
(Temperature left, Temperature right)
748+
=> (left.Value - right.Value).AsExpression(),
749+
710750
// x + x
711751
(Variable left, Variable right) when left.Name == right.Name
712752
=> Number.Zero,

xFunc.Maths/Analyzers/TypeAnalyzers/TypeAnalyzer.cs

+6-15
Original file line numberDiff line numberDiff line change
@@ -435,19 +435,13 @@ public virtual ResultTypes Analyze(Div exp)
435435

436436
(ResultTypes.Number, ResultTypes.Number) => ResultTypes.Number,
437437

438-
(ResultTypes.Number, ResultTypes.AngleNumber) or
439-
(ResultTypes.AngleNumber, ResultTypes.Number) or
440-
(ResultTypes.AngleNumber, ResultTypes.AngleNumber)
438+
(ResultTypes.AngleNumber, ResultTypes.Number)
441439
=> ResultTypes.AngleNumber,
442440

443-
(ResultTypes.Number, ResultTypes.PowerNumber) or
444-
(ResultTypes.PowerNumber, ResultTypes.Number) or
445-
(ResultTypes.PowerNumber, ResultTypes.PowerNumber)
441+
(ResultTypes.PowerNumber, ResultTypes.Number)
446442
=> ResultTypes.PowerNumber,
447443

448-
(ResultTypes.Number, ResultTypes.TemperatureNumber) or
449-
(ResultTypes.TemperatureNumber, ResultTypes.Number) or
450-
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
444+
(ResultTypes.TemperatureNumber, ResultTypes.Number)
451445
=> ResultTypes.TemperatureNumber,
452446

453447
(ResultTypes.Number, ResultTypes.ComplexNumber) or
@@ -705,18 +699,15 @@ public virtual ResultTypes Analyze(Mul exp)
705699
(ResultTypes.Number, ResultTypes.Number) => ResultTypes.Number,
706700

707701
(ResultTypes.Number, ResultTypes.AngleNumber) or
708-
(ResultTypes.AngleNumber, ResultTypes.Number) or
709-
(ResultTypes.AngleNumber, ResultTypes.AngleNumber)
702+
(ResultTypes.AngleNumber, ResultTypes.Number)
710703
=> ResultTypes.AngleNumber,
711704

712705
(ResultTypes.Number, ResultTypes.PowerNumber) or
713-
(ResultTypes.PowerNumber, ResultTypes.Number) or
714-
(ResultTypes.PowerNumber, ResultTypes.PowerNumber)
706+
(ResultTypes.PowerNumber, ResultTypes.Number)
715707
=> ResultTypes.PowerNumber,
716708

717709
(ResultTypes.Number, ResultTypes.TemperatureNumber) or
718-
(ResultTypes.TemperatureNumber, ResultTypes.Number) or
719-
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
710+
(ResultTypes.TemperatureNumber, ResultTypes.Number)
720711
=> ResultTypes.TemperatureNumber,
721712

722713
(ResultTypes.Number, ResultTypes.ComplexNumber) or

xFunc.Maths/Expressions/Div.cs

-8
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,9 @@ public override object Execute(ExpressionParameters? parameters)
4141
{
4242
(NumberValue left, NumberValue right) => left / right,
4343

44-
(NumberValue left, AngleValue right) => left / right,
4544
(AngleValue left, NumberValue right) => left / right,
46-
(AngleValue left, AngleValue right) => left / right,
47-
48-
(NumberValue left, PowerValue right) => left / right,
4945
(PowerValue left, NumberValue right) => left / right,
50-
(PowerValue left, PowerValue right) => left / right,
51-
52-
(NumberValue left, TemperatureValue right) => left / right,
5346
(TemperatureValue left, NumberValue right) => left / right,
54-
(TemperatureValue left, TemperatureValue right) => left / right,
5547

5648
(NumberValue left, Complex right) => left / right,
5749
(Complex left, NumberValue right) => left / right,

xFunc.Maths/Expressions/Mul.cs

-3
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,12 @@ public override object Execute(ExpressionParameters? parameters)
4444

4545
(NumberValue left, AngleValue right) => left * right,
4646
(AngleValue left, NumberValue right) => left * right,
47-
(AngleValue left, AngleValue right) => left * right,
4847

4948
(NumberValue left, PowerValue right) => left * right,
5049
(PowerValue left, NumberValue right) => left * right,
51-
(PowerValue left, PowerValue right) => left * right,
5250

5351
(NumberValue left, TemperatureValue right) => left * right,
5452
(TemperatureValue left, NumberValue right) => left * right,
55-
(TemperatureValue left, TemperatureValue right) => left * right,
5653

5754
(NumberValue left, Complex right) => left * right,
5855
(Complex left, NumberValue right) => left * right,

xFunc.Tests/Analyzers/SimplifierTests/AddSimplifierTest.cs

+72
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,78 @@ public void AddTwoAngles()
7777
SimplifyTest(add, expected);
7878
}
7979

80+
[Fact(DisplayName = "10 + 10 W")]
81+
public void AddNumberAndPower()
82+
{
83+
var add = new Add(
84+
new Number(10),
85+
PowerValue.Watt(10).AsExpression()
86+
);
87+
var expected = PowerValue.Watt(20).AsExpression();
88+
89+
SimplifyTest(add, expected);
90+
}
91+
92+
[Fact(DisplayName = "10 W + 10")]
93+
public void AddPowerAndNumber()
94+
{
95+
var add = new Add(
96+
PowerValue.Watt(10).AsExpression(),
97+
new Number(10)
98+
);
99+
var expected = PowerValue.Watt(20).AsExpression();
100+
101+
SimplifyTest(add, expected);
102+
}
103+
104+
[Fact(DisplayName = "10 W + 10 kW")]
105+
public void AddTwoPowers()
106+
{
107+
var add = new Add(
108+
PowerValue.Watt(10).AsExpression(),
109+
PowerValue.Kilowatt(10).AsExpression()
110+
);
111+
var expected = PowerValue.Watt(10010).AsExpression();
112+
113+
SimplifyTest(add, expected);
114+
}
115+
116+
[Fact(DisplayName = "10 + 10 C°")]
117+
public void AddNumberAndTemperature()
118+
{
119+
var add = new Add(
120+
new Number(10),
121+
TemperatureValue.Celsius(10).AsExpression()
122+
);
123+
var expected = TemperatureValue.Celsius(20).AsExpression();
124+
125+
SimplifyTest(add, expected);
126+
}
127+
128+
[Fact(DisplayName = "10 C° + 10")]
129+
public void AddTemperatureAndNumber()
130+
{
131+
var add = new Add(
132+
TemperatureValue.Celsius(10).AsExpression(),
133+
new Number(10)
134+
);
135+
var expected = TemperatureValue.Celsius(20).AsExpression();
136+
137+
SimplifyTest(add, expected);
138+
}
139+
140+
[Fact(DisplayName = "10 C° + 10 K")]
141+
public void AddTwoTemperatures()
142+
{
143+
var add = new Add(
144+
TemperatureValue.Celsius(10).AsExpression(),
145+
TemperatureValue.Kelvin(10).AsExpression()
146+
);
147+
var expected = TemperatureValue.Celsius(10 - 263.15).AsExpression();
148+
149+
SimplifyTest(add, expected);
150+
}
151+
80152
[Fact(DisplayName = "-x + 2")]
81153
public void AddFirstUnaryMinus()
82154
{

xFunc.Tests/Analyzers/SimplifierTests/DivSimplifierTest.cs

+13-13
Original file line numberDiff line numberDiff line change
@@ -49,38 +49,38 @@ public void DivTwoNumbers()
4949
SimplifyTest(div, expected);
5050
}
5151

52-
[Fact(DisplayName = "90 / 2 deg")]
53-
public void DivNumberAngle()
52+
[Fact(DisplayName = "90 deg / 2")]
53+
public void DivAngleNumber()
5454
{
5555
var div = new Div(
56-
new Number(90),
57-
AngleValue.Degree(2).AsExpression()
56+
AngleValue.Degree(90).AsExpression(),
57+
new Number(2)
5858
);
5959
var expected = AngleValue.Degree(45).AsExpression();
6060

6161
SimplifyTest(div, expected);
6262
}
6363

64-
[Fact(DisplayName = "90 deg / 2")]
65-
public void DivAngleNumber()
64+
[Fact(DisplayName = "90 W / 2")]
65+
public void DivPowerByNumber()
6666
{
6767
var div = new Div(
68-
AngleValue.Degree(90).AsExpression(),
68+
PowerValue.Watt(90).AsExpression(),
6969
new Number(2)
7070
);
71-
var expected = AngleValue.Degree(45).AsExpression();
71+
var expected = PowerValue.Watt(45).AsExpression();
7272

7373
SimplifyTest(div, expected);
7474
}
7575

76-
[Fact(DisplayName = "2 rad / 90 deg")]
77-
public void DivTwoAngles()
76+
[Fact(DisplayName = "90 C° / 2")]
77+
public void DivTemperatureByNumber()
7878
{
7979
var div = new Div(
80-
AngleValue.Radian(2).AsExpression(),
81-
AngleValue.Degree(90).AsExpression()
80+
PowerValue.Watt(90).AsExpression(),
81+
new Number(2)
8282
);
83-
var expected = AngleValue.Degree(114.59155902616465 / 90).AsExpression();
83+
var expected = PowerValue.Watt(45).AsExpression();
8484

8585
SimplifyTest(div, expected);
8686
}

xFunc.Tests/Analyzers/SimplifierTests/MulSimplifierTest.cs

+41-5
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,50 @@ public void MulAngleNumber()
101101
SimplifyTest(mul, expected);
102102
}
103103

104-
[Fact(DisplayName = "2 rad * 90 deg")]
105-
public void MulTwoAngles()
104+
[Fact(DisplayName = "10 * 2 W")]
105+
public void MulNumberByPower()
106106
{
107107
var mul = new Mul(
108-
AngleValue.Radian(2).AsExpression(),
109-
AngleValue.Degree(90).AsExpression()
108+
new Number(10),
109+
PowerValue.Watt(2).AsExpression()
110110
);
111-
var expected = AngleValue.Degree(114.59155902616465 * 90).AsExpression();
111+
var expected = PowerValue.Watt(20).AsExpression();
112+
113+
SimplifyTest(mul, expected);
114+
}
115+
116+
[Fact(DisplayName = "2 W * 10")]
117+
public void MulPowerByNumber()
118+
{
119+
var mul = new Mul(
120+
PowerValue.Watt(2).AsExpression(),
121+
new Number(10)
122+
);
123+
var expected = PowerValue.Watt(20).AsExpression();
124+
125+
SimplifyTest(mul, expected);
126+
}
127+
128+
[Fact(DisplayName = "10 * 2 C°")]
129+
public void MulNumberByTemperature()
130+
{
131+
var mul = new Mul(
132+
new Number(10),
133+
TemperatureValue.Celsius(2).AsExpression()
134+
);
135+
var expected = TemperatureValue.Celsius(20).AsExpression();
136+
137+
SimplifyTest(mul, expected);
138+
}
139+
140+
[Fact(DisplayName = "2 C° * 10")]
141+
public void MulTemperatureByNumber()
142+
{
143+
var mul = new Mul(
144+
TemperatureValue.Celsius(2).AsExpression(),
145+
new Number(10)
146+
);
147+
var expected = TemperatureValue.Celsius(20).AsExpression();
112148

113149
SimplifyTest(mul, expected);
114150
}

0 commit comments

Comments
 (0)