Skip to content

Commit 6de8bd2

Browse files
authored
Merge pull request #54 from cbovar/Develop
ConvNetSharp.Flow
2 parents f6e17e0 + 3409551 commit 6de8bd2

134 files changed

Lines changed: 6382 additions & 307 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ConvNetSharp.2015.sln

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio 15
4-
VisualStudioVersion = 15.0.26430.13
4+
VisualStudioVersion = 15.0.26430.14
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demos", "Demos", "{52D65A64-6583-4C2B-A41B-009A739CCC80}"
77
EndProject
@@ -29,6 +29,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MnitsDemo.GPU.2015", "Examp
2929
EndProject
3030
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvNetSharp.Performance.Tests.2015", "src\ConvNetSharp.Performance.Tests\ConvNetSharp.Performance.Tests.2015.csproj", "{857A7B91-A10B-484D-9164-0850734A4583}"
3131
EndProject
32+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MnistDemo.Flow.GPU.2015", "Examples\MnistDemo.Flow.GPU\MnistDemo.Flow.GPU.2015.csproj", "{2DBFF0A4-0CB2-4B50-9695-BB37A5A5BCA2}"
33+
EndProject
34+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvNetSharp.Flow.2015", "src\ConvNetSharp.Flow\ConvNetSharp.Flow.2015.csproj", "{9854F171-8272-49E4-A0BB-C9BFA70C30D3}"
35+
EndProject
36+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvNetSharp.Flow.Tests.2015", "src\ConvNetSharp.Flow.Tests\ConvNetSharp.Flow.Tests.2015.csproj", "{1FB5C620-2078-4B4C-A829-41C4B6855079}"
37+
EndProject
38+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvNetSharp.Utils.2015", "src\ConvNetSharp.Utils\ConvNetSharp.Utils.2015.csproj", "{64DB0F34-099A-41F8-A9D5-E58DD66A1276}"
39+
EndProject
40+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlowDemo.2015", "Examples\FlowDemo\FlowDemo.2015.csproj", "{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}"
41+
EndProject
3242
Global
3343
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3444
Debug|Any CPU = Debug|Any CPU
@@ -83,6 +93,26 @@ Global
8393
{857A7B91-A10B-484D-9164-0850734A4583}.Debug|Any CPU.Build.0 = Debug|Any CPU
8494
{857A7B91-A10B-484D-9164-0850734A4583}.Release|Any CPU.ActiveCfg = Release|Any CPU
8595
{857A7B91-A10B-484D-9164-0850734A4583}.Release|Any CPU.Build.0 = Release|Any CPU
96+
{2DBFF0A4-0CB2-4B50-9695-BB37A5A5BCA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
97+
{2DBFF0A4-0CB2-4B50-9695-BB37A5A5BCA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
98+
{2DBFF0A4-0CB2-4B50-9695-BB37A5A5BCA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
99+
{2DBFF0A4-0CB2-4B50-9695-BB37A5A5BCA2}.Release|Any CPU.Build.0 = Release|Any CPU
100+
{9854F171-8272-49E4-A0BB-C9BFA70C30D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
101+
{9854F171-8272-49E4-A0BB-C9BFA70C30D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
102+
{9854F171-8272-49E4-A0BB-C9BFA70C30D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
103+
{9854F171-8272-49E4-A0BB-C9BFA70C30D3}.Release|Any CPU.Build.0 = Release|Any CPU
104+
{1FB5C620-2078-4B4C-A829-41C4B6855079}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
105+
{1FB5C620-2078-4B4C-A829-41C4B6855079}.Debug|Any CPU.Build.0 = Debug|Any CPU
106+
{1FB5C620-2078-4B4C-A829-41C4B6855079}.Release|Any CPU.ActiveCfg = Release|Any CPU
107+
{1FB5C620-2078-4B4C-A829-41C4B6855079}.Release|Any CPU.Build.0 = Release|Any CPU
108+
{64DB0F34-099A-41F8-A9D5-E58DD66A1276}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
109+
{64DB0F34-099A-41F8-A9D5-E58DD66A1276}.Debug|Any CPU.Build.0 = Debug|Any CPU
110+
{64DB0F34-099A-41F8-A9D5-E58DD66A1276}.Release|Any CPU.ActiveCfg = Release|Any CPU
111+
{64DB0F34-099A-41F8-A9D5-E58DD66A1276}.Release|Any CPU.Build.0 = Release|Any CPU
112+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
113+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
114+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
115+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}.Release|Any CPU.Build.0 = Release|Any CPU
86116
EndGlobalSection
87117
GlobalSection(SolutionProperties) = preSolution
88118
HideSolutionNode = FALSE
@@ -93,5 +123,7 @@ Global
93123
{5F1A2B64-4E3E-44B9-B63E-21D3EB075859} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
94124
{C113E052-9096-45A6-82BC-DD82C5001CE5} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
95125
{A8B66B25-6CE8-4B01-A622-D37D4A0029D0} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
126+
{2DBFF0A4-0CB2-4B50-9695-BB37A5A5BCA2} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
127+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
96128
EndGlobalSection
97129
EndGlobal

ConvNetSharp.sln

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio 15
4-
VisualStudioVersion = 15.0.26430.13
4+
VisualStudioVersion = 15.0.26430.14
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demos", "Demos", "{52D65A64-6583-4C2B-A41B-009A739CCC80}"
77
EndProject
@@ -29,6 +29,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MnitsDemo.GPU", "Examples\M
2929
EndProject
3030
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvNetSharp.Performance.Tests", "src\ConvNetSharp.Performance.Tests\ConvNetSharp.Performance.Tests.csproj", "{857A7B91-A10B-484D-9164-0850734A4583}"
3131
EndProject
32+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MnistDemo.Flow.GPU", "Examples\MnistDemo.Flow.GPU\MnistDemo.Flow.GPU.csproj", "{01773087-8E8F-400E-AE7E-891D9764003D}"
33+
EndProject
34+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConvNetSharp.Flow", "src\ConvNetSharp.Flow\ConvNetSharp.Flow.csproj", "{54F7C4CA-B059-46DF-A766-E08515060393}"
35+
EndProject
36+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvNetSharp.Flow.Tests", "src\ConvNetSharp.Flow.Tests\ConvNetSharp.Flow.Tests.csproj", "{172EE640-933C-45C2-9F5F-E55CAF37062E}"
37+
EndProject
38+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvNetSharp.Utils", "src\ConvNetSharp.Utils\ConvNetSharp.Utils.csproj", "{64DB0F34-099A-41F8-A9D5-E58DD66A1276}"
39+
EndProject
40+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlowDemo", "Examples\FlowDemo\FlowDemo.csproj", "{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}"
41+
EndProject
3242
Global
3343
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3444
Debug|Any CPU = Debug|Any CPU
@@ -83,6 +93,26 @@ Global
8393
{857A7B91-A10B-484D-9164-0850734A4583}.Debug|Any CPU.Build.0 = Debug|Any CPU
8494
{857A7B91-A10B-484D-9164-0850734A4583}.Release|Any CPU.ActiveCfg = Release|Any CPU
8595
{857A7B91-A10B-484D-9164-0850734A4583}.Release|Any CPU.Build.0 = Release|Any CPU
96+
{01773087-8E8F-400E-AE7E-891D9764003D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
97+
{01773087-8E8F-400E-AE7E-891D9764003D}.Debug|Any CPU.Build.0 = Debug|Any CPU
98+
{01773087-8E8F-400E-AE7E-891D9764003D}.Release|Any CPU.ActiveCfg = Release|Any CPU
99+
{01773087-8E8F-400E-AE7E-891D9764003D}.Release|Any CPU.Build.0 = Release|Any CPU
100+
{54F7C4CA-B059-46DF-A766-E08515060393}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
101+
{54F7C4CA-B059-46DF-A766-E08515060393}.Debug|Any CPU.Build.0 = Debug|Any CPU
102+
{54F7C4CA-B059-46DF-A766-E08515060393}.Release|Any CPU.ActiveCfg = Release|Any CPU
103+
{54F7C4CA-B059-46DF-A766-E08515060393}.Release|Any CPU.Build.0 = Release|Any CPU
104+
{172EE640-933C-45C2-9F5F-E55CAF37062E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
105+
{172EE640-933C-45C2-9F5F-E55CAF37062E}.Debug|Any CPU.Build.0 = Debug|Any CPU
106+
{172EE640-933C-45C2-9F5F-E55CAF37062E}.Release|Any CPU.ActiveCfg = Release|Any CPU
107+
{172EE640-933C-45C2-9F5F-E55CAF37062E}.Release|Any CPU.Build.0 = Release|Any CPU
108+
{64DB0F34-099A-41F8-A9D5-E58DD66A1276}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
109+
{64DB0F34-099A-41F8-A9D5-E58DD66A1276}.Debug|Any CPU.Build.0 = Debug|Any CPU
110+
{64DB0F34-099A-41F8-A9D5-E58DD66A1276}.Release|Any CPU.ActiveCfg = Release|Any CPU
111+
{64DB0F34-099A-41F8-A9D5-E58DD66A1276}.Release|Any CPU.Build.0 = Release|Any CPU
112+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
113+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
114+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
115+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D}.Release|Any CPU.Build.0 = Release|Any CPU
86116
EndGlobalSection
87117
GlobalSection(SolutionProperties) = preSolution
88118
HideSolutionNode = FALSE
@@ -93,5 +123,7 @@ Global
93123
{47ECFF06-58BF-4396-874F-C66AC552705B} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
94124
{CD073D54-06AC-46E2-BC9C-BB03BC98EC14} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
95125
{1C5D92A1-272A-4545-BE0D-B4F836861E04} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
126+
{01773087-8E8F-400E-AE7E-891D9764003D} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
127+
{4DAFB991-F930-4E9C-9E87-CB22F526EE8D} = {52D65A64-6583-4C2B-A41B-009A739CCC80}
96128
EndGlobalSection
97129
EndGlobal

Examples/Classify2DDemo/App.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<startup>
4-
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
4+
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
55
</startup>
66
</configuration>

Examples/Classify2DDemo/Classify2DDemo.2015.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<OutputType>Exe</OutputType>
99
<RootNamespace>Classify2DDemo</RootNamespace>
1010
<AssemblyName>Classify2DDemo</AssemblyName>
11-
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
11+
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
1212
<FileAlignment>512</FileAlignment>
1313
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
1414
<TargetFrameworkProfile />

Examples/Classify2DDemo/Program.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,9 @@ private static void Classify2DDemo()
7676
private static void Classify2DUpdate(int n, List<double[]> data, TrainerBase<double> trainer, List<int> labels)
7777
{
7878
var avloss = 0.0;
79-
var netx = new Volume(new double[2 * n], new Shape(1, 1, 2, n));
80-
var hotLabels = new Volume(new double[2 * n], new Shape(1, 1, 2, n));
79+
80+
var netx = BuilderInstance.Volume.SameAs(new Shape(1, 1, 2, n));
81+
var hotLabels = BuilderInstance.Volume.SameAs(new Shape(1, 1, 2, n));
8182

8283
for (var ix = 0; ix < n; ix++)
8384
{
@@ -94,7 +95,7 @@ private static void Classify2DUpdate(int n, List<double[]> data, TrainerBase<dou
9495
}
9596

9697
avloss /= 50.0;
97-
Console.WriteLine("Loss:" + avloss);
98+
Console.WriteLine(" Loss:" + avloss);
9899
}
99100

100101
private static void Main(string[] args)

Examples/FlowDemo/App.config

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<configuration>
3+
<startup>
4+
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
5+
</startup>
6+
</configuration>
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Windows;
4+
using ConvNetSharp.Flow;
5+
using ConvNetSharp.Flow.Layers;
6+
using ConvNetSharp.Flow.Training;
7+
using ConvNetSharp.Utils.GraphVisualizer;
8+
using ConvNetSharp.Volume;
9+
using ConvNetSharp.Volume.Double;
10+
11+
namespace FlowDemo
12+
{
13+
internal static class NetExampleSingle
14+
{
15+
private static int k;
16+
17+
public static void Classify2DDemo()
18+
{
19+
var net = new Net<double>();
20+
net.AddLayer(new InputLayer<double>());
21+
net.AddLayer(new FullyConnLayer<double>(6));
22+
net.AddLayer(new TanhLayer<double>());
23+
net.AddLayer(new FullyConnLayer<double>(2));
24+
net.AddLayer(new TanhLayer<double>());
25+
net.AddLayer(new FullyConnLayer<double>(2));
26+
net.AddLayer(new SoftmaxLayer<double>());
27+
28+
// Data
29+
var data = new List<double[]>();
30+
var labels = new List<int>();
31+
data.Add(new[] { -0.4326, 1.1909 });
32+
labels.Add(1);
33+
data.Add(new[] { 3.0, 4.0 });
34+
labels.Add(1);
35+
data.Add(new[] { 0.1253, -0.0376 });
36+
labels.Add(1);
37+
data.Add(new[] { 0.2877, 0.3273 });
38+
labels.Add(1);
39+
data.Add(new[] { -1.1465, 0.1746 });
40+
labels.Add(1);
41+
data.Add(new[] { 1.8133, 1.0139 });
42+
labels.Add(0);
43+
data.Add(new[] { 2.7258, 1.0668 });
44+
labels.Add(0);
45+
data.Add(new[] { 1.4117, 0.5593 });
46+
labels.Add(0);
47+
data.Add(new[] { 4.1832, 0.3044 });
48+
labels.Add(0);
49+
data.Add(new[] { 1.8636, 0.1677 });
50+
labels.Add(0);
51+
data.Add(new[] { 0.5, 3.2 });
52+
labels.Add(1);
53+
data.Add(new[] { 0.8, 3.2 });
54+
labels.Add(1);
55+
data.Add(new[] { 1.0, -2.2 });
56+
labels.Add(1);
57+
var n = labels.Count;
58+
59+
var trainer = new SgdTrainer<double>(net, 0.01);
60+
61+
do
62+
{
63+
Classify2DUpdate(n, data, trainer, labels);
64+
} while (!Console.KeyAvailable);
65+
66+
// Display graph
67+
var vm = new ViewModel<double>(net.Cost);
68+
var app = new Application();
69+
app.Run(new GraphControl { DataContext = vm });
70+
}
71+
72+
private static void Classify2DUpdate(int n, List<double[]> data, TrainerBase<double> trainer, List<int> labels)
73+
{
74+
var avloss = 0.0;
75+
var netx = BuilderInstance.Volume.SameAs(new Shape(1, 1, 2, n));
76+
var hotLabels = BuilderInstance.Volume.SameAs(new Shape(1, 1, 2, n));
77+
78+
for (var ix = 0; ix < n; ix++)
79+
{
80+
hotLabels.Set(0, 0, labels[ix], ix, 1.0);
81+
82+
netx.Set(0, 0, 0, ix, data[ix][0]);
83+
netx.Set(0, 0, 1, ix, data[ix][1]);
84+
}
85+
86+
for (var iters = 0; iters < 50; iters++)
87+
{
88+
trainer.Train(netx, hotLabels);
89+
avloss += trainer.Loss;
90+
}
91+
92+
avloss /= 50.0;
93+
Console.WriteLine(k++ + " Loss:" + avloss);
94+
}
95+
}
96+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Windows;
5+
using ConvNetSharp.Flow;
6+
using ConvNetSharp.Flow.Training;
7+
using ConvNetSharp.Utils.GraphVisualizer;
8+
using ConvNetSharp.Volume;
9+
10+
namespace FlowDemo
11+
{
12+
internal static class ExampleCpuDouble
13+
{
14+
/// <summary>
15+
/// Solves y = x * W + b (CPU double version)
16+
/// for y = 1 and x = -2
17+
/// </summary>
18+
public static void Example1()
19+
{
20+
var cns = ConvNetSharp<double>.Instance;
21+
22+
// Graph creation
23+
var x = cns.PlaceHolder("x");
24+
var y = cns.PlaceHolder("y");
25+
26+
var W = cns.Variable(1.0, "W");
27+
var b = cns.Variable(2.0, "b");
28+
29+
var fun = x * W + b;
30+
31+
var cost = (fun - y) * (fun - y);
32+
33+
var optimizer = new GradientDescentOptimizer<double>(learningRate: 0.01);
34+
35+
using (var session = new Session<double>())
36+
{
37+
session.Differentiate(cost); // computes dCost/dW at every node of the graph
38+
39+
double currentCost;
40+
do
41+
{
42+
var dico = new Dictionary<string, Volume<double>> { { "x", -2.0 }, { "y", 1.0f } };
43+
44+
currentCost = session.Run(cost, dico);
45+
Console.WriteLine($"cost: {currentCost}");
46+
47+
var result = session.Run(fun, dico);
48+
session.Run(optimizer, dico);
49+
} while (currentCost > 1e-5);
50+
}
51+
52+
double finalW = W.Result;
53+
double finalb = b.Result;
54+
Console.WriteLine($"fun = x * {finalW} + {finalb}");
55+
Console.ReadLine();
56+
}
57+
58+
public static void Example2()
59+
{
60+
var cns = ConvNetSharp<double>.Instance;
61+
62+
// Graph creation
63+
var x = cns.PlaceHolder("x");
64+
var y = cns.PlaceHolder("y");
65+
66+
var b = cns.Variable(2.0, "b");
67+
68+
var fun = x + b;
69+
70+
var cost = (y - fun) * (y - fun);
71+
72+
var optimizer = new GradientDescentOptimizer<double>(learningRate: 0.01);
73+
74+
using (var session = new Session<double>())
75+
{
76+
session.Differentiate(cost); // computes dCost/dW at every node of the graph
77+
78+
double currentCost;
79+
do
80+
{
81+
var xx = BuilderInstance<double>.Volume.SameAs(new[] { -2.0, -3.0, -10.0 }, new Shape(1, 1, 1, 3));
82+
var yy = BuilderInstance<double>.Volume.SameAs(new[] { -5.0, -6.0, -13.0 }, new Shape(1, 1, 1, 3));
83+
84+
var dico = new Dictionary<string, Volume<double>> { { "x", xx }, { "y", yy } };
85+
86+
currentCost = Math.Abs(session.Run(cost, dico).ToArray().Sum());
87+
Console.WriteLine($"cost: {currentCost}");
88+
89+
var result = session.Run(fun, dico);
90+
session.Run(optimizer, dico);
91+
} while (currentCost > 1e-5);
92+
}
93+
94+
// Display derivate at b
95+
var vm = new ViewModel<double>(b.Derivate);
96+
var app = new Application();
97+
app.Run(new GraphControl { DataContext = vm });
98+
99+
double finalb = b.Result;
100+
Console.WriteLine($"fun = x + {finalb}");
101+
Console.ReadLine();
102+
}
103+
}
104+
}

0 commit comments

Comments
 (0)