C++Guns – RoboBlog blogging the bot

30.03.2017

C++ Guns - FVCRTTPPP

Filed under: Allgemein — Tags: — Thomas @ 11:03

Die Idee ist von Stephen C. Dewhurst [1] die Abkürzung von mir

FVCRTTPPP - Fancy Variadic Curiously Recurring Template Template Parameter Pack Pattern

Praxisbeispiel:


using FVCRTTPPPScalar = Scalar<int, Ctr, Eq, Rel, Stream>; ! A countable, equal compareable, relational-able, streamable, scalar integer type.
FVCRTTPPPScalar x = 0;

[1] http://stevedewhurst.com/once_weakly/once-weakly20170328/once-weakly20170328.pdf

29.03.2017

Biologie++ - RNA Folding with Four-Russians Speedup

Filed under: Allgemein — Tags: — Thomas @ 12:03

Der normale dynamic programing Zuker Algorithmus von Faltungen von Sequenzen hat eine Laufzeit von O(n^4), mit zuätzlichen Cache noch O(n^3). Mit der allgemeinen Four-Russians Speedup Methode für dynamic programing Algorithmen ist eine Laufzeit von O(n^3/log n) möglich. Für kleines n also absolut irrelevant. Für großes n halbiert, oder drittelt sogar die Laufzeit. Was dann aber immer noch unheimlich zu lange ist.
Aber was ist die Idee dahinter?
Als erstes wird festgestellt, dass es nicht möglich ist, die Four-Russians Technik auf die klassische Implementation des Zuker anzuwenden. Da die Auswertungsreihenfolge der Matrizen nicht passt. Also wird die Reihenfolge erst mal umgestellt. Erst kommt eine Schleife die nicht von der derzeitigen Spalte j in der Matrix abhängt. Und dann kommt eine 3fach Schleife die abhängt.
In der innersten Schleife findet nun die Optimierung statt. Die Schleife sieht so aus:

S(i,j)=max( S(i,j), S(i,k-1)+S(k,j) )

Für fixes i,j iteriert nur k von i+1 zu j-1. Die Idee ist nun, Indizes zu Gruppe der Größe q zusammen zu fassen. So dass die innerste Schleife nur noch n/q oft läuft.
Nun ja wenn sie meinen. Um das Maximum zu ermitteln, muss man so oder so jeden Wert in der Matrix in diesem Bereich anfassen. Wie die das verhindern wollen, das lese ich aus dem Paper nicht raus.
Zeitverschwendung.

[1] A Simple, Practical and Complete Time Algorithm for RNA Folding Using the Four-Russians Speedup - Yelena Frid and Dan Gusfield

27.03.2017

Biologie++ - Silver Assembly

Filed under: Allgemein — Tags: — Thomas @ 14:03

Im Glas rekombinationsmthoden haben eine Einschritt Erstellung von großen DNA Sequenezen
von mehreren einzelnen ermöglicht. Obwohl synthetische biologische Schaltungen im Prinzip
auf der selben Art erstellt werden können, enthalten sie normalerweise sich wiederholende Sequenzteile,
wie promoters und terminator, die bei der Recombination stören.
Wir benutzen ein Computer gestützten Ansatz um biologische, synthetische inaktive unique nucleotide
sequences (UNSes) zu designen, die das genaue Erstellen erleichtern.
Wichtig: unsere designten UNSes machen es möglich Teile zu assemblieren die wiederholende
terminator und insulator Sequenzen enthalten. Und damit isolierte, funktionale genetische Schaltungen
in Bakterien und Säugetierzellen zu erstellen.
...

In vitro recombination methods have enabled one-
step construction of large DNA sequences from
multiple parts. Although synthetic biological
circuits can in principle be assembled in the same
fashion, they typically contain repeated sequence
elements such as standard promoters and termin-
ators that interfere with homologous recombination.
Here we use a computational approach to design
synthetic, biologically inactive unique nucleotide
sequences (UNSes) that facilitate accurate ordered
assembly. Importantly, our designed UNSes make it
possible to assemble parts with repeated terminator
and insulator sequences, and thereby create
insulated functional genetic circuits in bacteria and
mammalian cells. Using UNS-guided assembly to construct
repeating promoter-gene-terminator parts, we systematically varied gene expression to
optimize production of a deoxychromoviridans bio-
synthetic pathway in Escherichia coli. We then used
this system to construct complex eukaryotic AND-
logic gates for genomic integration into embryonic
stem cells. Construction was performed by using
a standardized series of UNS-bearing BioBrick-
compatible vectors, which enable modular assembly
and facilitate reuse of individual parts. UNS-guided
isothermal assembly is broadly applicable to the
construction and optimization of genetic circuits
and particularly those requiring tight insulation,
such as complex biosynthetic pathways, sensors,
counters and logic gates.

[1] Rapid construction of insulated genetic circuits via synthetic sequence-guided isothermal assembly. Silver et al.

25.03.2017

Garten - Rasen gesät

Filed under: Allgemein — Tags: — Thomas @ 17:03

Hoffentlich grünt es bald.

Rasensamen - hoffentlich nicht zu viele

Rasensamen - hoffentlich nicht zu viele

So sieht er aus. Der Garten vorne am Haus. Ein paar kahle Stellen und eigentlich nichts besonderes. Hinten trage ich gerade die verwurzelte, kieshaltige Oberflächenerde ab. Hoffentlich wird es was.

Kahle Flecken

Kahle Flecken

Die ersten Solarblumen sind gewachsen. Strecken sich der Sonne entgegen, welche sich, aus irgendeinem Grund, in meinem Garten, immer aus einer anderen Richtung zeigt.

Solarblume (Winterling)

Solarblume (Winterling)

C++ Guns - Dangling Reference II

Filed under: Allgemein — Tags: — Thomas @ 01:03

Für die, die es immer noch nicht kapiert haben: Hier noch ein einfachereres Beispiel. Temporäre Objekte, alles klar? Speichert keine Referenzen, es gibt kein Grund das zu tun. Sonst schießt ich euch in den Fuß. In jede Zehe einzeln.


bool alive = true;

struct Foo {
  Foo() { }
  ~Foo() { alive = false; }
};

struct Bar {
  const Foo& dangling;
  
  Bar(const Foo& foo) : dangling(foo) { }
  
  void func() {
    if(alive) {
      cout << "dangling is okay\n";
    } else {
      cout << "dangling is dangling\n";
    }
  }
};

int main() {
  Bar bar{Foo{}};
  bar.func();
  return 0;
}

23.03.2017

Gleiswendel - Theoretische Gedanken II

Filed under: Allgemein — Tags: — Thomas @ 15:03

Ein paar Gedanken kamen noch.
Ich glaube die angesetzte Durchfahrtshöhe ist zu gering. Wenn noch eine Lage Kork (h=5mm) zur Schalldämmung verbaut wird, tendiere ich doch ehr zu einem noch breiteren Kreis. Eine Schalldämmung ist für mich ein Muss. Es dröhnen die Loks ja doch stark, gerade in kleinen Räumen. Intersannt ist auch die Idee, statt dem Kreis ein Oval zu nehmen. Das bietet einige Vorteile. Zu einem kann die Steigung auf geraden Strecken höher sein, zum anderen kann der normale Kreis verbaut werden. Statt ihn mit kleinen geraden Gleisstücken aufzuweiten. So kann der Gleiswendel mit einer Tiefe von 90cm und einer Breite von z.B. 1.8m gleichzeitig als normaler großer Arbeitstisch fungieren. Nur bekommt man die eignen Füße nicht drunter.

Dünne Sperrholzplatten die als viertel Kreis ausgeschnitten werden, sollte doch gut sein. Dazu insgesamt 16 dicke (12mm) Gewindestangen die vertikal rund herum angeordnet werden. Acht außen und acht innen. Auf die Gewindestangen können Muttern geschraubt werden, welche wiederrum die Sperrholzplatten halten. So kann die Steigung durch drehen der Mutter eingestellt werden. Ein Problem ist, wie man die einzelnen Platten untereinander und an die Muttern verbindet. Zusätzliche Sperrholzplatten würde die Durchfahrtshöhe vergrößern. Aber ich denke anders geht es nicht sinnvoll.

Antwort auf eine alte Frage

Filed under: Allgemein — Tags: , — Thomas @ 08:03

Heute morgen in der Bahn war ich entzückt, denn es ergab sich eine Antwort auf eine Frage die mir irgendwann während der Abi Zeit kam.
Jetzt muss ich mich erst einmal zurück erinnern. Ich hatte damals den Roboter gebaut, dem eigentlich dieser Blog gewidmet ist. Es muss so 2006 gewesen sein, als mir folgende Frage aufkam:
Gegeben sei ein Roboter, der in der Welt herum fahren kann. Aber die Sensorische Bestückung ist sehr schwach. Der Roboter kann nur grob erkennen, wenn vor ihm eine Wand ist. Jetzt fährt also der Roboter los, hat noch keine Wand bisher "gesehen", und weiß sonst auch überhaupt nichts über die Umgebung. Und jetzt detektieren die Sensoren eine Wand. Der Roboter kann nicht drüber fahren. Es ist nicht zu erkennen wie hoch sie ist. Es ist auch nicht zu erkennen wie lange sie sich nach rechts oder links erstreckt. Was soll der Roboter tun? Nach rechts drehen, nach links? Zurück fahren? In eine beliebige Richtung drehen und dann weiter fahren? Kann der Roboter das von sich aus überhaupt entscheiden? Oder soll er einfach stehen bleiben und warten bis die Mauer verschwindet? Kann ja auch passieren. Gegen die Mauer fahren ist übrigens keine Option, da das Robotergesetz ihm verbietet absichtlich Schaden zu verursachen. Noch dazu käme das einen Robotersuizid gleich.

So, das wäre die Frage. Ich kam damals zu keiner befriedigenden Antwort. In eine zufällige Richtung zu drehen und dann weiter fahren erscheint mir am pragmatischsten. Doch woher (guten) Zufall nehmen. Damit hatte ich mich in einer meiner ersten Posts beschäftigt.
Die Natur hat aber eine Antwort parat wie ich heute in "Das Atom der Biologen" [1] gelesen haben. Es geht um Bakterien und Pilze.

Die Reaktion einiger Bakterien auf Licht (Phototaxis). Wenn Chromatium auf eine dunkle Region trifft, stößt es sich zurück, wartet eine Sekunde und schwimmt weiter. In der Pause schwankt es umher (Brownsche Bewegung), so daß sich seine neue Richtung zufällig ergibt.

Na also ^^ Zufällige Richtung ist die richtig Antwort. Aber die Zufallsentscheidung kommt nicht vom Roboter selbst, sondern von der Umgebung. Damit ich sozusagen die Verantwortung, wohin gefahren werden soll, an eine höhere Macht abgegeben worden. Was die Brownsche Bewegung ist und wie sie entsteht, muss noch genauer geklärt werden. Es hat aber irgendwas mit Wärme zu tun.

Natürlich hat die Brownsche Bewegung keinen Einfluss auf einen 5kg schweren Roboter. Aber es ist die Idee die zählt. Jetzt kann ich in diese Richtung weiter arbeiten.

In dem Buch werden übrigens auch andere Bakterien erwähnt die absichtlich sich zum Licht hinbewegen. Also der klassische Licht suchender Roboter. Wenn der Roboter sich also immer zur hellsten Stelle bewegen soll, er also eine Aufgabe bekommt, dann dann entsteht das oben geschilderte Problem nicht, dass irgendwann keine Entscheidung mehr getroffen werden kann, wohin gefahren werden soll? Falsch! :D Stell dir vor, es ist überall gleich hell. Wohin soll er fahren? Zufällige Richtung, oder warten bis es dunkel wird? Andere Situation, selbes Problem.

[1] Fischer - Das Atom der Biologen. S. 191

22.03.2017

Garten - Wasseruhr montiert

Filed under: Allgemein — Tags: — Thomas @ 18:03

Diese seit 1999 nicht mehr geeichte Wasseruhr fristete 18 Jahre ihr einsames Dasein in der Schublade. Nun bekommt sie eine neue Aufgabe: Zähle Wassermengen! Das kann eine Wasseruhr doch gut, auch wenn sie alt ist ^^ Ein paar Adapterfehlkäufe später war die Sache montiert. Sieht auch gar nicht soooo schlecht aus, oder? Jetzt muss nur noch jemand wieder das Wasser im Keller andrehen.

wasseruhr

C++ Guns - Funktionale Anwendung erkannt

Filed under: Allgemein — Tags: — Thomas @ 15:03

Ich habe gerade eine einfache Schleife mit 5 Zeilen geschrieben und auf einmal sah ich, dass das doch ein gutes Beispiel für funktionales programmieren wäre.
Gegeben ist ein Datenvector mit custom Typ und gesucht ist ein bestimmtes Datum und, falls vorhanden, davon ein bestimmter Wert. Die Schleife lässt sich von Hand so ausdrücken:


    struct Blah {
        size_t idx;
        int att;
    };

    vector<Blah> data { {2, -1}, {1, -1}, {5, 50}, {3, 10}};

    // skip -1
    size_t start = 0;
    for(size_t i=0; i < data.size(); ++i) {
        int att = data[i].att;
        if(att != -1) {
            start = data[i].idx;
            break;
        }
    }
    cout << "start " << start << "\n"; // print 5

Hier gibt es gleich eine ganze Reihe von Fehlerquellen. Von welchem Typ muss i sein, size_t oder int? Inkrement mit ++i oder i++ ? Ist der operator[] überhaupt vorhanden, und wenn ja auch effizient? Muss der Zugriff ueber const Referenz erfolgen? Und die Schleifen koennen wir beenden beim ersten Treffer, ja sicher oder ist das "break" zufällig da. Fuer alle das, muss man den Code Zeile fuer Zeile lesen und nachvollziehen und verstehen. Wie immer ist das "WAS und nicht WIE" Prinzip verletzte. Denn der Code sagt nicht, WAS er macht, sondern nur WIE. Ich hätte auch range-for nehmen können. Aber das ändert am Prinzip nichts.

Aus funktionaler Sicht ist die Schleife ja ein Muster fuer "find_if_apply" oder "apply_if_find" je nachdem ^^ Ob es in der funktionalen Welt so eine Funktion gibt, und wie sie genau heißt, weiß ich nicht. Aber ich probier mal meine eigene Version. Ich wäle den Namen "find_if_apply", da es schon eine C++ Funktion std::find_if gibt, und erweitere sie um eine "apply" componente.


template<class Container, class UnaryPredicate, class UnaryFunction>
void find_if_apply(const Container& data, UnaryPredicate p, UnaryFunction f) {
    for(const auto& x : data) {
        if(p(x)) {
            f(x);
            break;
        }
    }
}

size_t start = 0;
find_if_apply(data,
              [](const Blah& x) { return x.att != -1; },
              [&start](const Blah& x) { start = x.idx; }
              );
cout << "start " << start << "\n"; // print 5

Die Funktion find_if_apply nimmt zwei den Datensatz und zwei Funktionen. Die erste ist fuer find, und die zweite fuer apply.
Also die template Funktion selbst ist wirklich überraschend erstauling elegant einfach. Die Anwendung davon ist auch okay. Zwei einzeiler Funktionen sind noch lesbar.

Übrigends, std::find_if alleine hätte nichts geholfen. Da ein Iterator zurueck gegeben wird der wieder den Scope voll müllt und manuell auf Gültigkeit geprüft werden muss. Mit std::find_if wäre die Schleife und das if() weg gekapselt, aber gebracht hätte es nichts.

Noch eine Bemerkung: Die Variable idx in dem Beispiel ist explizit angegeben. Überwiegend kommt das in unseren Datenstrukturen und Algorithmen aber nicht vor. Dort ist die Position im Array der Index. Und schon funktioniert der funktionale Ansatz wieder nicht. Man könnte find_if_apply natürlich so erstellen und dokumentieren, dass das erste Argument der Lambdas der Laufindex ist. Aber nicht immer wird er auch in den Lambdas benötigt. Da mit Overloads und sonstige Tricks kommen macht alles wieder nur viel zu kompliziert. Noch dazu hat nicht jeder Container auch ein Laufindex. Bei Listen funktioniert es ist nicht, und da ist es dann Datenstruktur abhängig, wo der Index des Datums steht.

FORTRAN - QT Software - made my day

Filed under: Allgemein — Thomas @ 13:03

(Nein, nicht The Qt Company GUI Framework)

plusFORT, das Fortran Restrukturierungs- und Analysewerkzeug
ist in der neuen Version 7.0 erhältlich. Ausprobieren kann
man das darin enthaltene SPAG (den "Spaghetti Unscrambler")
auch online

Das ist, als würde man Ärzte speziell ausbilden, um Schussverletzungen in Füßen besser zu behandeln. Anstatt den Leuten das Schießen beizubringen.

Older Posts »

Powered by WordPress