Prüfen ob ein iterator noch gültig ist oder nicht.



  • Ok dann führ ich das etwas genauer aus:
    Ich habe eine liste einer liste von sagen wir doubles. also 2 Dimensionen. Ich gehe nun nach bestimmten regelen Einträge durch und speichere mir die iteratoren dieser einträge in einen Vektor.
    Es passiert, dass ich zu einem Eintrag (double zahl) komme, deren iterator schon im Vektor steht und ich diesen Eintrag löschen muss. Natürlich kann ich den Vektor nach dem iterator durchsuchen, da ich dies aber in etwa 10^8 mal machen müsste möchte ich es vermeiden.

    Danke auf jeden fall.



  • Dafür sind Iteratoren einfach nicht geeignet.
    Beschreib doch mal etwas genauer was du machen willst. Also was, nicht wie.



  • Puh das wird schwierig, ich verüble es keinem wenn er sich da nicht hineindenken will:

    Also, ich hab ein 1d Gitter, also diskrete punkte von 1…L. Jeder dieser Punkte hat eine Achse (ich zeichne sie immer nach oben ein) mit kontinuierlichen Werten von 0 bis 1. Die Achse hat periodische Bedingungen also der Punkt 0 ist der selbe Punkt wie der Punkt 1.

    Auf diesem Gitter-Achse System existieren Linien, die sich entlang der Achsen nach oben bewegen, dabei von Gitterpunkt zu Gitterpunkt springen können, sich irgendwann aber wieder schließen müssen. Die Anzahl der Linien variiert während des runs, und die Linien sind ununterscheidbar.

    Da die Achse kontinuierliche Werte (was das ganze eigentlich so knifflig macht) hat speichere ich mir für jeden Gitterpunkt Werte der Achse (zwischen 0 und 1) an denen eine Linie hin oder wegspringt. Falls an einem Gitterpunkt keine Linie ist wird das auch gespeichert.

    Ich muss jetzt in diesem System einen "Loop" erzeugen, der von einer Linienkonfiguration zur nächsten führt. (Ich mache eine Monte Carlo Simulation) Ein loop ist eine geschlossene Kurve auf diesem Gitter-Achsen system der entlang der Linien aufwärts läuft, dort wo keine Linie ist abwärts, und geschlossen sein muss. Springt eine Linie oder die "Nicht-Linie" springt der loop. Dazwischen darf er nach gewissen regeln auch springen.

    Was der Loop mit den Linien macht ist, dort wo der loop gelaufen ist, wird eine Linie zu einer "Nicht-Linie" und umgekehrt.

    Hmm glaub es macht keinen sinn mehr weiterzuschreiten. Will es aber auch nicht löschen, vielleicht macht jemanden sowas ja spaß. Falls das wirklich jmd weiterwissen will, soll er/sie antworten, dann erkläre ich weiter.



  • Hallo Daniel_B,

    ich mache auch Monte Carlo Simulationen, habe aber ehrlich gesagt keine Ahnung was du genau tust. 😕

    Ich vermute, dass du diskrete (Gitter-) Punkte hast und auf diesen mit gleichverteilten Zufallszahlen zwischen 0 und 1 arbeitest? Das meinst du kontinuerlichen Zahlen zwischen 0 und 1?

    Also ich interpretiere das so, dass du L Gitterpunkte hast, d.h. einen Vektor mit L Elementen: std::vector<double> vec(L, 0.0)

    Und in jedem Element initialisierst du eine Zufallszahl zwischen 0 und 1?

    Oder?

    Gruß,
    -- Klaus.



  • Ah ok,

    Ich mache ein Weltlinien Quantenmonte Carlo. Dabei möchte man Thermodynamische Erwartungswerte von Spinsystemen berechnen. Man hat als Parameter das Gitter (ich in meinem Fall ein 1d-kette), also was diskretes. Und ich habe die Temperatur, welche Kontinuierlich ist.

    Da ich nicht weiß was dein Background ist, erkläre ich Dinge ausführlich. Spind kann man sich als kleine Magnete vorstellen die entweder die Nordpol oben haben oder den Südpol, also 2 Basiszustände bzw. voneinander unabhängige Einstellungen haben. Kurz: ich hab ein Gitter von kleinen Magneten, die fix an ihrem platz sind und sich nur umpolen können.

    Für den Fall dass du nicht verstehst warum man hier MC macht: Bei gegebener Temperatur hat ein Zustand (die Anordnung der spins) mit Energie E die wahrscheinlichkeit p= e^(E/T) (ohne Normierung).

    Man kann das nun so darstellen, dass von jedem Gitterpunkt von 0 bis T (eigentlich 1/T, ist aber nicht so wichtig) eine Achse nach oben läuft. Auf diesen Achsen befinden sich sogenannte Weltlinien (der name kommt nicht von mir), die nach oben laufen, von Platz zu Platz springen können, sich aber schlussendlich wieder schließen müssen. Sprünge von Weltlinien passieren Horizontal, die Temperatur verändert sich also nicht.

    Weltlinien bedeute spin up bzw. Magnet nach oben. Ist also eine Weltlinie an einem Platz i=(1,…,L) bei einer Temperatur T, so zeigt der Magnet dort nach oben. Die Aufgrund der Physik hab ich periodische Randbedingungen in T, also der Punkt 0 und T_max sind der selbe. Geht also eine Weltlinie an den oberen Rand, so kommt sie am selben Platz unten wieder heraus.

    Was ich nun mache ist ich Sample Weltlinienkonfigurationen. Von einer Konfiguration zur nächsten komme ich indem ich eine geschlossene kurve (den loop) mache und entlang dieses loops alles umdrehe. Wo eine Weltlinie war ist nachher keine, wo keine war ist nachher ein. Die Konstruktion eines loops passiert so, dass immer gültige Konfigurationen herauskommen (Weltlinien müssen gschlossen sein) mit der richtigen Wahrscheinlichkeit.

    Ich speichere mir für jeden Platz i={1,…,L} Temperaturen T an denen sich die Besetzung mit einer weltlinie ändert. Eine solche Änderung nenne ich event, wozu ich mir eine struct gemacht hab:

    struct event{
        double temp;
        int spin;
        bool visited;
    };
    

    temp geht von 0-T, spin = +-1 und visited sagt mir ob ich beim konstruieren des loops schon an diesem event war, was passieren kann.
    Das Problem das ich habe ist dass ich bei diesen updates mir events erzeuge, die eigentlich gar keine Information mehr beinhalten, da die Weltlinie sich dort in Wahrheit gar nicht ändert. Die Entscheidung ob ein Event noch relevant ist oder nicht, kann aber leider nicht immer lokal (also beim konstruieren des loops) gemacht werden, sondern erst wenn der loop fertig ist.
    In der hälfte der Fälle kann ich es aber lokal entscheiden. Diese events möchte ich mir sofort löschen, da mehr events bedeuten mein Programm wird langsamer. Sie sind aber auch schon im loop gespeichert (als iterator auf das event). ist der loop fertig würde ich gerne alle events im loop durchgehen und prüfen ob sie noch richtig sind, wenn nicht sie löschen. Das geht aber mit den iterator ja leider nicht, da ich nicht weiß ob ich das event nicht schon vorher gelöscht habe.

    puh! ich hoffe du verstehst in etwa was ich mache 🙂



  • Ah was ich noch vergessen hab: Die ganzen events Speicher ich mir in einem

    std::vector< std::list<events> >
    

    wobei der Vektor von 1…L die Gitterpunkte darstellt. Die liste hab ich genommen, da ich oft events irgendwo einfügen oder löschen muss.



  • Bei Boost.Intrusive gibt's Container wo du ausgehend von einem Zeiger auf ein Objekt im Container nen Iterator bekommen kannst.

    Wenn du dann noch ein "in container" Flag bzw. einen Zeiger auf den Container in das "Event" Objekt reinpackst, dann kannst du auch überprüfen ob ein Event noch in einem Container ist, bzw. in welchem.
    Und da du für's Löschen der Objekte dann selbst verantwortlich bist, kannst du auch dafür sorgen dass die Dinger so lange Leben bleiben wie nötig.

    Bzw. sonst kannst du dir die Liste natürlich auch selbst implementieren - klassische doppelt verkettete Liste halt.



  • Hallo Daniel,

    ich mache auch Physik, wenn auch thematisch was anderes. Ich kann dir inhaltlich etwas folgen. 🙂

    Ich dachte bei deiner Beschreibung spontan an das Ising Modell und mein erster Treffer im Zusammenhang mit Weltlinien führte zu diesem Skript.

    Meinst du das?

    Gruß,
    -- Klaus.



  • @hustbaer vielen dank, werde mir das mal ansehen.

    @Klaus82 ja genau sowas mach ich. ich schaue mir halt das 1d später 2d Heisenbergmodel an. In dem Skript sind wie ich gesehen hab für QMC Methoden nur lokale updates drin.
    So wie man beim Ising Model den Wolff Algorithmus machen kann (keine lokalen updates mehr), der den Vorteil von geringeren autocorrelationen hat, so ist der loop Algorithmus ein Cluster-Algorithmus für Spinsysteme.
    Hab keine Ahnung ob es einen loop eigentlich auch fürs Hubbarbd Modell gibt… muss ich mal nachschaun.

    Was machst du genau?



  • Daniel_B schrieb:

    Was machst du genau?

    Ich probiere mich an kinetischen Monte Carlo Methoden zur klassischen Elektronendynamik in der Ultrakurzzeitphysik.

    Aber hast du schon geschaut, ob es nicht Codes gibt, welche deine Weltenlinien berechnen? Wenn ich eins recht schnell gelernt habe, dann dass meine Probleme nicht die ersten ihrer Art sind. 😉

    Und wenn dieses Konzept in der Weltenlinien in QMC Methoden etabliert sind, dann werden das doch bestimmt schon kluge Köpfe programmiert haben.

    Gruß,
    -- Klaus.



  • Ja ich hab schon Programme gefunden. Ich möchte jedoch später den Algorithmus verändern, und alles was ich gefunden hab ist so kompliziert, dass ich mich entschieden hab es selbst zu machen.

    Zur zeit läuft das Programm eh schon, muss nur noch herausfinden wie genau man in der weltliniendarstellung misst, dann werd ich sehen, ob ich alles richtig gemacht hab.



  • Und, wie haste es jetzt umgesetzt? Würde mich interessieren...


Anmelden zum Antworten