def _cftp(self, start_row): """ Implement coupling from the past. ALGORITHM: The set of Gelfand-Tsetlin patterns can partially ordered by elementwise domination. The partial order has unique maximum and minimum elements that are computed by the methods :meth:`_cftp_upper` and :meth:`_cftp_lower`. We then run the Markov chain that randomly toggles each element up or down from the past until the state reached from the upper and lower start points coalesce as described in [Propp1997]_. EXAMPLES:: sage: G = GelfandTsetlinPatterns(3, 5) sage: G._cftp(0) # random [[5, 3, 2], [4, 2], [3]] sage: G._cftp(0) in G True """ from sage.misc.randstate import current_randstate from sage.misc.randstate import seed from sage.misc.randstate import random count = self._n * self._k seedlist = [(current_randstate().long_seed(), count)] upper = [] lower = [] while True: upper = self._cftp_upper() lower = self._cftp_lower() for currseed, count in seedlist: with seed(currseed): for _ in range(count): for row in range(start_row, self._n): for col in range(self._n - row): direction = random() % 2 self._toggle_markov_chain( upper, row, col, direction) self._toggle_markov_chain( lower, row, col, direction) if all( all(x == y for x, y in zip(l1, l2)) for l1, l2 in zip(upper, lower)): break count = seedlist[0][1] * 2 seedlist.insert(0, (current_randstate().long_seed(), count)) return GelfandTsetlinPattern(upper)
def _cftp(self, start_row): """ Implement coupling from the past. ALGORITHM: The set of Gelfand-Tsetlin patterns can partially ordered by elementwise domination. The partial order has unique maximum and minimum elements that are computed by the methods :meth:`_cftp_upper` and :meth:`_cftp_lower`. We then run the Markov chain that randomly toggles each element up or down from the past until the state reached from the upper and lower start points coalesce as described in [Propp1997]_. EXAMPLES:: sage: G = GelfandTsetlinPatterns(3, 5) sage: G._cftp(0) # random [[5, 3, 2], [4, 2], [3]] sage: G._cftp(0) in G True """ from sage.misc.randstate import current_randstate from sage.misc.randstate import seed from sage.misc.randstate import random count = self._n * self._k seedlist = [(current_randstate().long_seed(), count)] upper = [] lower = [] while True: upper = self._cftp_upper() lower = self._cftp_lower() for currseed, count in seedlist: with seed(currseed): for _ in range(count): for row in range(start_row, self._n): for col in range(self._n - row): direction = random() % 2 self._toggle_markov_chain(upper, row, col, direction) self._toggle_markov_chain(lower, row, col, direction) if all(all(x == y for x,y in zip(l1, l2)) for l1, l2 in zip(upper, lower)): break count = seedlist[0][1] * 2 seedlist.insert(0, (current_randstate().long_seed(), count)) return GelfandTsetlinPattern(upper)