2

我现在正在从事的项目需要一些声明性的方式来定义一堆实验的设置。

到目前为止,我已经找到了这样的解决方案。有一些数据结构使用 JSON 公开默认设置:

{
    "trustRatio": 0.7,
    "filter.coefA": 0,
    "filter.coefB": 1,
    "filter.coefC": 2,
    "filter.coefD": 3
}

然后要设置一个实验,我们必须指定在运行实验时将更改哪个字段。现在我这样做:

{
    "path": "filter.coefA",
    "values": [0, 1, 2, 3, 4, 5]
}

或者

{
    "path": "filter.coefA",
    "min": 0
    "max": 5,
    "step": 1
}

然后我将默认设置和“渐变”设置都实例化为字典,并使用“路径”键创建一堆实验设置,使用默认设置作为样板,将值作为实验里程碑。

该解决方案可以使用我正在使用的 Python 或 CSharp 轻松实现,但它不是最好的,因为我分别存储默认和“渐变”设置。另一件事是我不能使用这样的层次结构:

{
    "trustRatio": 0.7,
    "filter":
    {
        "coefA": 0,
        "coefB": 1,
        "coefC": 2,
        "coefD": 3
    }
}

因为字典在 Python 和 CSharp 中实现此解决方案时施加的约束。

有谁知道是否有任何 Python 或 CSharp(或至少其他 CLR 兼容语言,如 FSharp)工具可以通过在现场声明“梯度”来获得一系列实验设置,如下所示:

{
    "trustRatio": 0.7,
    "filter":
    {
        "coefA": [0, 1, 2, 3, 4, 5],
        "coefB": 1,
        "coefC": 2,
        "coefD": 3
    }
}

?

4

2 回答 2

0

在 Python 中,有几个用于克隆字典结构的内置方法:dict.copy() 和copy.deepcopy() Deepcopy 将处理多维字典到任何深度,AFAIK。所以你可以: -

>>> gradient = {
...    "trustRatio": 0.7,
...    "filter":
...    {
...        "coefA": [0, 1, 2, 3, 4, 5],
...        "coefB": 1,
...        "coefC": 2,
...        "coefD": 3
...    }
... }
>>>
>>> gradient2 = gradient.copy()
>>> print gradient2
{'filter': {'coefD': 3, 'coefA': [0, 1, 2, 3, 4, 5], 'coefB': 1, 'coefC': 2}, 'trustRatio': 0.7}
>>> import copy
>>> print copy.deepcopy( gradient )
{'filter': {'coefD': 3, 'coefA': [0, 1, 2, 3, 4, 5], 'coefB': 1, 'coefC': 2}, 'trustRatio': 0.7}
>>> gradient.copy() == copy.deepcopy( gradient ) == gradient
True
于 2012-05-13T18:52:32.013 回答
0

经过网络搜索后,我已经为这个问题实现了自己的解决方案。它正是我想做的。它的描述可以在这里找到。和 CSharp 源代码以及这里的一些示例。

于 2012-05-23T00:29:21.013 回答