Skip to content

Commit 17653c4

Browse files
refactor IParameter class (dotnet#1349)
1 parent 44403a4 commit 17653c4

File tree

11 files changed

+274
-176
lines changed

11 files changed

+274
-176
lines changed

SearchSpace/src/Microsoft.ML.ModelBuilder.SearchSpace/Converter/ParameterConverter.cs

+16-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System;
66
using System.Collections.Generic;
7+
using System.Linq;
78
using System.Text;
89
using Newtonsoft.Json;
910
using Newtonsoft.Json.Converters;
@@ -30,21 +31,31 @@ internal class ParameterConverter : JsonConverter
3031

3132
public override bool CanConvert(Type objectType)
3233
{
33-
return objectType == typeof(Parameter);
34+
return objectType == typeof(IParameter);
3435
}
3536

3637
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
3738
{
3839

3940
var jtoken = JToken.ReadFrom(reader);
40-
return new Parameter(jtoken);
41+
return jtoken.Type switch
42+
{
43+
JTokenType.Object => Parameter.CreateNestedParameter(jtoken.ToObject<Dictionary<string, IParameter>>().ToArray()),
44+
JTokenType.String => Parameter.FromString(jtoken.ToObject<string>()),
45+
JTokenType.Float => Parameter.FromDouble(jtoken.ToObject<double>()),
46+
JTokenType.Boolean => Parameter.FromBool(jtoken.ToObject<bool>()),
47+
JTokenType.Integer => Parameter.FromInt(jtoken.ToObject<int>()),
48+
JTokenType.Array => Parameter.FromIEnumerable((JArray)jtoken),
49+
JTokenType.Null => null,
50+
_ => throw new ArgumentException($"Unsupported jtoken type {jtoken.Type}"),
51+
};
4152
}
4253

4354
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
4455
{
45-
var param = (Parameter)value;
46-
var json = JsonConvert.SerializeObject(param.Value, settings);
47-
writer.WriteRawValue(json);
56+
var param = (IParameter)value;
57+
var s = JsonSerializer.Create(settings);
58+
s.Serialize(writer, param.Value);
4859
}
4960
}
5061
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// <copyright file="Parameter.cs" company="Microsoft">
2+
// Copyright (c) Microsoft. All rights reserved.
3+
// </copyright>
4+
5+
using System.Collections.Generic;
6+
using Microsoft.ML.ModelBuilder.SearchSpace.Converter;
7+
using Newtonsoft.Json;
8+
9+
namespace Microsoft.ML.ModelBuilder.SearchSpace
10+
{
11+
public enum ParameterType
12+
{
13+
Integer = 0,
14+
Float = 1,
15+
Bool = 2,
16+
String = 3,
17+
Object = 4,
18+
Array = 5,
19+
}
20+
21+
[JsonConverter(typeof(ParameterConverter))]
22+
public interface IParameter : IDictionary<string, IParameter>
23+
{
24+
ParameterType ParameterType { get; }
25+
26+
object Value { get; }
27+
28+
T AsType<T>();
29+
}
30+
}

SearchSpace/src/Microsoft.ML.ModelBuilder.SearchSpace/Option/ChoiceOption.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public ChoiceOption(string[] choices, string? defaultChoice)
3232
{
3333
if (defaultChoice != null)
3434
{
35-
this.Default = this.MappingToFeatureSpace(new Parameter(defaultChoice));
35+
this.Default = this.MappingToFeatureSpace(Parameter.FromString(defaultChoice));
3636
}
3737
}
3838

@@ -42,7 +42,7 @@ public ChoiceOption(string[] choices, string? defaultChoice)
4242

4343
public override int?[] Step => new int?[] { this.Choices.Length };
4444

45-
public override double[] MappingToFeatureSpace(Parameter param)
45+
public override double[] MappingToFeatureSpace(IParameter param)
4646
{
4747
if(this.FeatureSpaceDim == 0)
4848
{
@@ -53,19 +53,19 @@ public override double[] MappingToFeatureSpace(Parameter param)
5353
var x = Array.BinarySearch(this.Choices, value);
5454
Contract.Requires(x != -1, $"{value} not contains");
5555

56-
return this.option.MappingToFeatureSpace(new Parameter(x));
56+
return this.option.MappingToFeatureSpace(Parameter.FromInt(x));
5757
}
5858

59-
public override Parameter SampleFromFeatureSpace(double[] values)
59+
public override IParameter SampleFromFeatureSpace(double[] values)
6060
{
6161
Contract.Requires(values.Length >= 0, "values length must be greater than 0");
6262
if (values.Length == 0)
6363
{
64-
return new Parameter(this.Choices[0]);
64+
return Parameter.FromObject(this.Choices[0]);
6565
}
6666

6767
var param = this.option.SampleFromFeatureSpace(values);
68-
return new Parameter(this.Choices[param.AsType<int>()]);
68+
return Parameter.FromObject(this.Choices[param.AsType<int>()]);
6969
}
7070
}
7171
}

SearchSpace/src/Microsoft.ML.ModelBuilder.SearchSpace/Option/OptionBase.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ public abstract class OptionBase
1616
/// mapping value to [0, 1) uniform distribution.
1717
/// </summary>
1818
/// <returns>mapping value in [0,1).</returns>
19-
public abstract double[] MappingToFeatureSpace(Parameter value);
19+
public abstract double[] MappingToFeatureSpace(IParameter value);
2020

2121
/// <summary>
2222
/// sample from [0,1) uniform distribution.
2323
/// </summary>
2424
/// <param name="value">value to sample.</param>
2525
/// <returns>sampled value.</returns>
26-
public abstract Parameter SampleFromFeatureSpace(double[] values);
26+
public abstract IParameter SampleFromFeatureSpace(double[] values);
2727

2828
/// <summary>
2929
/// the dimension of feature space, which is equal to the output length of <see cref="SampleFromFeatureSpace(double[])"/>.

SearchSpace/src/Microsoft.ML.ModelBuilder.SearchSpace/Option/UniformNumericOption.cs

+17-16
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public UniformNumericOption(double min, double max, bool logBase = false)
3131

3232
public override int?[] Step => new int?[] { null };
3333

34-
public override double[] MappingToFeatureSpace(Parameter param)
34+
public override double[] MappingToFeatureSpace(IParameter param)
3535
{
3636
var x = param.AsType<double>();
3737
Contract.Requires(x <= this.Max && x >= this.Min, $"{x} is not within [{this.Min}, {this.Max}]");
@@ -49,20 +49,21 @@ public override double[] MappingToFeatureSpace(Parameter param)
4949
}
5050
}
5151

52-
public override Parameter SampleFromFeatureSpace(double[] values)
52+
public override IParameter SampleFromFeatureSpace(double[] values)
5353
{
5454
Contract.Requires(values.Length == 1, "values length must be 1");
5555
var value = values[0];
5656
Contract.Requires(value <= 1 && value >= 0, $"{value} must be between [0,1]");
5757

5858
if (this.LogBase)
5959
{
60-
var order = Math.Log(this.Min) + Math.Log(this.Max / this.Min) * value;
61-
return new Parameter(Math.Exp(order));
60+
var order = Math.Pow(this.Max / this.Min, value);
61+
var res = this.Min * order;
62+
return Parameter.FromDouble(res);
6263
}
6364
else
6465
{
65-
return new Parameter((this.Min + (this.Max - this.Min) * value));
66+
return Parameter.FromDouble((this.Min + (this.Max - this.Min) * value));
6667
}
6768
}
6869
}
@@ -74,7 +75,7 @@ public UniformDoubleOption(double min, double max, bool logBase = false, double?
7475
{
7576
if (defaultValue != null)
7677
{
77-
this.Default = this.MappingToFeatureSpace(new Parameter(defaultValue));
78+
this.Default = this.MappingToFeatureSpace(Parameter.FromDouble(defaultValue.Value));
7879
}
7980
}
8081
}
@@ -86,22 +87,22 @@ public UniformSingleOption(float min, float max, bool logBase = false, float? de
8687
{
8788
if (defaultValue != null)
8889
{
89-
this.Default = this.MappingToFeatureSpace(new Parameter(defaultValue));
90+
this.Default = this.MappingToFeatureSpace(Parameter.FromFloat(defaultValue.Value));
9091
}
9192
}
9293

93-
public override double[] MappingToFeatureSpace(Parameter param)
94+
public override double[] MappingToFeatureSpace(IParameter param)
9495
{
9596
var singleValue = param.AsType<float>();
9697
var doubleValue = Convert.ToDouble(singleValue);
97-
return base.MappingToFeatureSpace(new Parameter(doubleValue));
98+
return base.MappingToFeatureSpace(Parameter.FromDouble(doubleValue));
9899
}
99100

100-
public override Parameter SampleFromFeatureSpace(double[] values)
101+
public override IParameter SampleFromFeatureSpace(double[] values)
101102
{
102103
var doubleValue = base.SampleFromFeatureSpace(values).AsType<double>();
103104
var singleValue = Convert.ToSingle(doubleValue);
104-
return new Parameter(singleValue);
105+
return Parameter.FromFloat(singleValue);
105106
}
106107
}
107108

@@ -112,23 +113,23 @@ public UniformIntOption(int min, int max, bool logBase = false, int? defaultValu
112113
{
113114
if (defaultValue != null)
114115
{
115-
this.Default = this.MappingToFeatureSpace(new Parameter(defaultValue));
116+
this.Default = this.MappingToFeatureSpace(Parameter.FromInt(defaultValue.Value));
116117
}
117118
}
118119

119-
public override Parameter SampleFromFeatureSpace(double[] values)
120+
public override IParameter SampleFromFeatureSpace(double[] values)
120121
{
121122
var param = base.SampleFromFeatureSpace(values);
122123
var intValue = Convert.ToInt32(Math.Floor(param.AsType<double>() + 1e-6));
123124

124-
return new Parameter(intValue);
125+
return Parameter.FromInt(intValue);
125126
}
126127

127-
public override double[] MappingToFeatureSpace(Parameter param)
128+
public override double[] MappingToFeatureSpace(IParameter param)
128129
{
129130
var value = param.AsType<int>();
130131
var valueAsDouble = Convert.ToDouble(value);
131-
return base.MappingToFeatureSpace(new Parameter(valueAsDouble));
132+
return base.MappingToFeatureSpace(Parameter.FromDouble(valueAsDouble));
132133
}
133134
}
134135
}

0 commit comments

Comments
 (0)