RSchwieger / Classifier-construction-in-Boolean-Networks-using-algebraic-methods

1 stars 1 forks source link

suggestion: command line tool for classifiers #5

Open hklarner opened 3 years ago

hklarner commented 3 years ago

Hi @RSchwieger,

die Beispiele example1.py und so weiter sind ja per Hand erstellt. Ich möchte ein paar weitere Case Studies machen und würde die Gleichungen gerne aus einer BNET Datei automatisch erzeugen.

Beispiel: BNET Datei:

Erk,  Erk & Mek | Mek & Raf
Mek,  Erk | Mek & Raf
Raf,  !Erk | !Raf

Dann könnten wir ein CLI schreiben, z.b. classy.py, was in etwa so funktioniert:

python3 classy.py --bnet example.bnet --classifier "Erk & Mek"

Macht das Sinn?

In den Beispiel Dateien werden die Gleichungen über Variablen definiert, die SAGE anscheinend den globals angehängt hat. Diese Zeilen hier meine ich: https://github.com/RSchwieger/Classifier-construction-in-Boolean-Networks-using-algebraic-methods/blob/ca38f737a272f9c6e425e53f7f7ae4eef3cd4a17/example1.py#L15-L17

Ich habe versucht herauszufinden, ob ich diese BooleanPolynomials auch über Strings initialisieren kann, also etwa:

f1 = BooleanPolynomial("1+x6*x11+x3*x30 ")

aber so einen Konstruktor habe ich nicht gefunden. Dann bleibt mir nur noch Python's exec, oder?

R = BooleanPolynomialRing(names=["a", "b", "c"], order=TermOrder("lex"))
R.inject_variables()

exec("f1 = 1+a*b*(b+c)")
print(f1)

Das funktioniert. D.h. ich kann Variablen über Strings erzeugen. Jetzt fehlt nur noch der Schritt aus einem Boolschen Ausdruck ein Boolsches Polynom zu erzeugen. Denn die Zeilen in der BNET Datei sind ja keine Polynome. Hast Du da eine Idee?

SAGE bietet folgende Objekte:

BooleanFormulas kann ich mit Strings initialisieren:

import sage.logic.propcalc as propcalc
f = propcalc.formula("Erk & Mek | Mek & Raf")

Und aus BooleanFunctions kann ich Polynome machen, siehe algebraic_normal_form():

from sage.crypto.boolean_function import BooleanFunction
f = BooleanFunction([0,1,1,0,1,0,1,1])
f.algebraic_normal_form()

> x0*x1*x2 + x0 + x1*x2 + x1 + x2

Ich habe noch keinen Weg gefunden einer BooleanFormula eine BooleanFunction zu machen. Hast Du eine Idee für diesen Schritt BooleanFormula -> BooleanPolynomial oder gibt es sogar einen alternativen Ansatz ohne diese Objekte?

RSchwieger commented 3 years ago

Hallo, ja das ist eine gute Idee. Das Problem ist, dass die Datenstrukturen, die sage verwendet teilweise nicht miteinander kompatibel sind. "BooleanPolynomial" ist ein Wrapper von https://github.com/BRiAl/BRiAl. Sage.logic.propcalc ist damit meines Wissens nicht direkt kompatibel. Man muss also noch einen Weg finden, dass zu konvertieren.

RSchwieger commented 3 years ago

BRial/Polybori verwendet eine spezielle Datenstruktur (eine Art von BDDs) zur Repraesentation der Polynome. Das erschwert die Konvertierung. Evtl. koennte man example.py direkt generieren mit der Loesung, die du vorgeschlagen hast. Aber das ist dann mehr ein Workaround.

hklarner commented 3 years ago

Bin den einzigen Weg gegangen, den ich finden konnte.

Ergebnis: wir haben ein CLI mit dem man BNET Dateien zusammen mit einem Classifier String an deinen Code übergeben kann. Aufrufen mit:

python3 classy.py --bnet n7s3.bnet --classifier "v4 & !v6"
hklarner commented 3 years ago

@RSchwieger sollte das übrigens nicht --phenotype anstatt von --classifier heißen? Also auch hier:

https://github.com/RSchwieger/Classifier-construction-in-Boolean-Networks-using-algebraic-methods/blob/c79a4e26a3993644f25ae214e8c96e2c1f13bbb1/example1.py#L48