-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathSimpleHarness.Module.cs
More file actions
64 lines (54 loc) · 2.27 KB
/
SimpleHarness.Module.cs
File metadata and controls
64 lines (54 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System.Collections.Generic;
using Microsoft.Rexl;
using Microsoft.Rexl.Code;
using Microsoft.Rexl.Private;
using Microsoft.Rexl.Sink;
namespace Microsoft.Rexl.Harness;
// This partial handles module related functionality.
partial class SimpleHarnessBase
{
/// <summary>
/// Optimize the given measure in the given module.
/// REVIEW: This is a temporary hack. Optimization should really use a task.
/// </summary>
protected virtual RuntimeModule Optimize(int id, RuntimeModule modSrc, DName measure, bool isMax, DName solver)
{
if (modSrc is null)
return null;
modSrc.Bnd.NameToIndex.TryGetValue(measure, out int imsr).Verify();
Validation.Assert(modSrc.Bnd.Symbols[imsr].IsMeasureSym);
if (!TryOptimizeMip(isMax, modSrc, imsr, solver, out var score, out var symValues))
return null;
// REVIEW: Is there a good way that doesn't use reflection?
var typeRec = modSrc.Bnd.TypeRec;
var fact = _codeGen.TypeManager.CreateRecordFactory(typeRec);
var bldr = fact.Create().Open(partial: true);
var names = new HashSet<DName>();
foreach (var pair in symValues)
{
names.Add(pair.name).Verify();
if (pair.value is null)
continue;
var setter = fact.GetFieldSetter(pair.name, out _, out var stFld);
Validation.Assert(stFld.IsAssignableFrom(pair.value.GetType()));
setter(bldr, pair.value);
}
var rec = bldr.Close();
var modDst = modSrc.UpdateRaw(rec, names);
return modDst;
}
protected virtual bool TryOptimizeMip(bool isMax, RuntimeModule modSrc, int imsr, DName solver,
out double score, out List<(DName name, object value)> symValues)
{
Validation.AssertValue(modSrc);
Validation.AssertIndex(imsr, modSrc.Bnd.Symbols.Length);
Validation.Assert(modSrc.Bnd.Symbols[imsr].IsMeasureSym);
var strSolver = solver.IsValid ? solver.Value : "<default>";
Sink.PostDiagnostic(DiagSource.Solver, MessageDiag.Error(ErrorStrings.ErrSolverUnkown_Name, strSolver));
score = double.NaN;
symValues = null;
return false;
}
}