[PYTHON] Reactive Extensions üben

Versuchen Sie die folgende Blockdiagrammberechnung mit reaktiven Erweiterungen (diese Berechnung selbst hat keine Bedeutung).

fig.png

Vorbereitung

Dieses Mal werde ich es mit Python versuchen. Installieren Sie zunächst die Python-Version von Reactive Extensions.

Terminal


pip install Rx

Darstellung des Blockdiagramms in JSON

Beschreiben Sie das Platzierungsmodul und die Verkabelung des Blockdiagramms in JSON.

test.json


{
    "modules": [
        {"name":"add1", "module_type":"add", "inputs":["sin1", "const1"]},
        {"name":"add2", "module_type":"add", "inputs":["mul1", "div1"]},
        {"name":"mul1", "module_type":"mul", "inputs":["sub1", "add1"]},
        {"name":"sub1", "module_type":"sub", "inputs":["sin1", "cos1"]},
        {"name":"div1", "module_type":"div", "inputs":["cos1", "const2"]},
        {"name":"sin1", "module_type":"sin", "inputs":["const1"]},
        {"name":"cos1", "module_type":"cos", "inputs":["add1"]},
        {"name":"out1", "module_type":"out", "inputs":["add2"]},
        {"name":"const1", "module_type":"const", "value":1.0},
        {"name":"const2", "module_type":"const", "value":2.0}
    ]
}

Implementierung

Die Modulerstellung, die Modulverdrahtung, die Einstellung des konstanten Werts und die Anzeige der Berechnungsergebnisse werden durchgeführt.

test.py


# -*- coding: utf-8 -*-
from rx.subjects import Subject
import json, operator, math

if __name__ == '__main__':
    #Lesen Sie JSON
    with open('test.json') as f:
        j = json.load(f)

    #Modulerstellung
    modules = { m['name']:Subject() for m in j['modules'] }

    #Modulverkabelung
    for m in filter(lambda m: m['module_type'] != 'const', j['modules']):
        module_type = m['module_type'];
        self_name = m['name']
        input_names = m['inputs']
        if   module_type == 'add':
            modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.add) \
                .subscribe(modules[ self_name ].on_next)
        elif module_type == 'sub':
            modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.sub) \
                .subscribe(modules[ self_name ].on_next)
        elif module_type == 'mul':
            modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.mul) \
                .subscribe(modules[ self_name ].on_next)
        elif module_type == 'div':
            modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.truediv) \
                .subscribe(modules[ self_name ].on_next)
        elif module_type == 'sin':
            modules[ input_names[0] ].select(math.sin).subscribe(modules[ self_name ].on_next)
        elif module_type == 'cos':
            modules[ input_names[0] ].select(math.cos).subscribe(modules[ self_name ].on_next)
        elif module_type == 'tan':
            modules[ input_names[0] ].select(math.tan).subscribe(modules[ self_name ].on_next)
        elif module_type == 'out':
            modules[ input_names[0] ].subscribe(print) #Anzeige der Berechnungsergebnisse

    #Stellen Sie einen konstanten Wert ein
    for m in filter(lambda m: m['module_type'] == 'const', j['modules']):
        self_name = m['name']
        value = m['value']
        modules[ self_name ].on_next(value)

Ergebnis


1.9082290502110406

Quelle

ReactiveExtensions Ich werde die diesmal verwendete Klassen- und Erweiterungsmethode erläutern.

Subject Das Fach ist eine Klasse, die sowohl Beobachter (Beobachter) als auch Beobachtbar (Beobachter) hat. Verwenden Sie den Namen als Schlüssel, um das Wörterbuch für die spätere Verwendung in der Verkabelung zu erstellen.

Auszug


#Modulerstellung
modules = { m['name']:Subject() for m in j['modules'] }

Select Eine Single-Term-Operation empfängt (abonniert) den berechneten Wert von select und sendet ihn an das nächste Modul (on_next).

Auszug


modules[ input_names[0] ].select(math.sin).subscribe(modules[ self_name ].on_next)

Zip Bei der Binomialoperation wird der berechnete Wert empfangen (abonnieren) und an das nächste Modul (on_next) gesendet, nachdem die beiden Eingabewerte ausgerichtet wurden.

Auszug


modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.add) \
    .subscribe(modules[ self_name ].on_next)

Bestätigung

Ich werde es nur für den Fall überprüfen.

test_check.py


# -*- coding: utf-8 -*-
import math
if __name__ == '__main__':
    sin1 = math.sin(1.0)
    add1 = sin1+1.0
    cos1 = math.cos(add1)
    sub1 = sin1-cos1
    mul1 = sub1*add1
    div1 = cos1/2.0
    add2 = mul1+div1
    out = add2
    print(out)

Ergebnis


1.9082290502110406

Ich habs gemacht

Recommended Posts

Reactive Extensions üben
[Python] Mit RxPY (3.0.1) gelernte reaktive Erweiterungen [Rx]
Numpy-Übung 1
Linux-Praxis
Übe Pytorch