genericize chain remover to use it for bridge and addressed chains
This commit is contained in:
		
							parent
							
								
									79f9bc781a
								
							
						
					
					
						commit
						2966bd8661
					
				| @ -15,55 +15,63 @@ class Command(BaseCommand): | ||||
|         for context in markov_contexts: | ||||
|             self.stdout.write(self.style.NOTICE(f"scanning context {context}...")) | ||||
|             # get starting states that look like they came over the bridge | ||||
|             start_states = context.states.filter(k1=MarkovState._start1, k2=MarkovState._start2, | ||||
|                                                  v__regex=r'<.*>') | ||||
|             for start_state in start_states: | ||||
|                 self.stdout.write(self.style.NOTICE(f"  diving into {start_state}...")) | ||||
|                 # find the states that build off of the start | ||||
|                 second_states = context.states.filter(k1=start_state.k2, k2=start_state.v) | ||||
|             bridge_states = context.states.filter(k1=MarkovState._start1, k2=MarkovState._start2, | ||||
|                                                   v__regex=r'<.*>') | ||||
|             self._chain_remover(context, bridge_states) | ||||
| 
 | ||||
|                 for second_state in second_states: | ||||
|                     self.stdout.write(self.style.NOTICE(f"    diving into {second_state}...")) | ||||
|                     # find the third states | ||||
|                     leaf_states = context.states.filter(k1=second_state.k2, k2=second_state.v) | ||||
|     def _chain_remover(self, context, start_states): | ||||
|         """Remove a given k from markov states, deleting the found states after rebuilding subsequent states. | ||||
| 
 | ||||
|                     for leaf_state in leaf_states: | ||||
|                         self.stdout.write(self.style.NOTICE(f"      upserting state based on {leaf_state}")) | ||||
|                         # get/update state without the nick from the bridge | ||||
|                         try: | ||||
|                             updated_leaf = MarkovState.objects.get(k1=second_state.k1, k2=leaf_state.k2, v=leaf_state.v) | ||||
|                             updated_leaf.count += leaf_state.count | ||||
|                             updated_leaf.save() | ||||
|                             self.stdout.write(self.style.SUCCESS(f"        updated count for {updated_leaf}")) | ||||
|                         except MarkovState.DoesNotExist: | ||||
|                             new_leaf = MarkovState.objects.create(k1=second_state.k1, k2=leaf_state.k2, v=leaf_state.v, | ||||
|                                                                   context=context) | ||||
|                             new_leaf.count = leaf_state.count | ||||
|                             new_leaf.save() | ||||
|                             self.stdout.write(self.style.SUCCESS(f"        created {new_leaf}")) | ||||
|         As in, if trying to remove A,B -> X, then B,X -> C and X,C -> D must be rebuilt (A,B -> C / B,C -> D) | ||||
|         then the three states with X deleted. | ||||
|         """ | ||||
|         for start_state in start_states: | ||||
|             self.stdout.write(self.style.NOTICE(f"  diving into {start_state}...")) | ||||
|             # find the states that build off of the start | ||||
|             second_states = context.states.filter(k1=start_state.k2, k2=start_state.v) | ||||
| 
 | ||||
|                         # remove the migrated leaf state | ||||
|                         self.stdout.write(self.style.SUCCESS(f"        deleting {leaf_state}")) | ||||
|                         leaf_state.delete() | ||||
|             for second_state in second_states: | ||||
|                 self.stdout.write(self.style.NOTICE(f"    diving into {second_state}...")) | ||||
|                 # find the third states | ||||
|                 leaf_states = context.states.filter(k1=second_state.k2, k2=second_state.v) | ||||
| 
 | ||||
|                     # take care of the new middle state | ||||
|                     self.stdout.write(self.style.NOTICE(f"    upserting state based on {second_state}")) | ||||
|                 for leaf_state in leaf_states: | ||||
|                     self.stdout.write(self.style.NOTICE(f"      upserting state based on {leaf_state}")) | ||||
|                     # get/update state without the nick from the bridge | ||||
|                     try: | ||||
|                         updated_second = MarkovState.objects.get(k1=start_state.k1, k2=start_state.k2, v=second_state.v) | ||||
|                         updated_second.count += second_state.count | ||||
|                         updated_second.save() | ||||
|                         self.stdout.write(self.style.SUCCESS(f"      updated count for {updated_second}")) | ||||
|                         updated_leaf = MarkovState.objects.get(k1=second_state.k1, k2=leaf_state.k2, v=leaf_state.v) | ||||
|                         updated_leaf.count += leaf_state.count | ||||
|                         updated_leaf.save() | ||||
|                         self.stdout.write(self.style.SUCCESS(f"        updated count for {updated_leaf}")) | ||||
|                     except MarkovState.DoesNotExist: | ||||
|                         new_second = MarkovState.objects.create(k1=start_state.k1, k2=start_state.k2, v=second_state.v, | ||||
|                                                                 context=context) | ||||
|                         new_second.count = second_state.count | ||||
|                         new_second.save() | ||||
|                         self.stdout.write(self.style.SUCCESS(f"      created {new_second}")) | ||||
|                         new_leaf = MarkovState.objects.create(k1=second_state.k1, k2=leaf_state.k2, v=leaf_state.v, | ||||
|                                                               context=context) | ||||
|                         new_leaf.count = leaf_state.count | ||||
|                         new_leaf.save() | ||||
|                         self.stdout.write(self.style.SUCCESS(f"        created {new_leaf}")) | ||||
| 
 | ||||
|                     # remove the migrated second state | ||||
|                     self.stdout.write(self.style.SUCCESS(f"      deleting {second_state}")) | ||||
|                     second_state.delete() | ||||
|                     # remove the migrated leaf state | ||||
|                     self.stdout.write(self.style.SUCCESS(f"        deleting {leaf_state}")) | ||||
|                     leaf_state.delete() | ||||
| 
 | ||||
|                 # remove the dead end original start | ||||
|                 self.stdout.write(self.style.SUCCESS(f"    deleting {start_state}")) | ||||
|                 start_state.delete() | ||||
|                 # take care of the new middle state | ||||
|                 self.stdout.write(self.style.NOTICE(f"    upserting state based on {second_state}")) | ||||
|                 try: | ||||
|                     updated_second = MarkovState.objects.get(k1=start_state.k1, k2=start_state.k2, v=second_state.v) | ||||
|                     updated_second.count += second_state.count | ||||
|                     updated_second.save() | ||||
|                     self.stdout.write(self.style.SUCCESS(f"      updated count for {updated_second}")) | ||||
|                 except MarkovState.DoesNotExist: | ||||
|                     new_second = MarkovState.objects.create(k1=start_state.k1, k2=start_state.k2, v=second_state.v, | ||||
|                                                             context=context) | ||||
|                     new_second.count = second_state.count | ||||
|                     new_second.save() | ||||
|                     self.stdout.write(self.style.SUCCESS(f"      created {new_second}")) | ||||
| 
 | ||||
|                 # remove the migrated second state | ||||
|                 self.stdout.write(self.style.SUCCESS(f"      deleting {second_state}")) | ||||
|                 second_state.delete() | ||||
| 
 | ||||
|             # remove the dead end original start | ||||
|             self.stdout.write(self.style.SUCCESS(f"    deleting {start_state}")) | ||||
|             start_state.delete() | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user