| 
									
										
										
										
											2019-02-18 05:28:05 +00:00
										 |  |  | #! /usr/bin/env python3 | 
					
						
							|  |  |  | from argparse import ArgumentParser | 
					
						
							|  |  |  | from datetime import datetime | 
					
						
							| 
									
										
										
										
											2019-02-19 03:25:00 +00:00
										 |  |  | from multiprocessing import Process, Queue | 
					
						
							| 
									
										
										
										
											2019-02-19 03:33:56 +00:00
										 |  |  | from pathlib import Path | 
					
						
							| 
									
										
										
										
											2019-02-19 03:25:00 +00:00
										 |  |  | from queue import Empty | 
					
						
							| 
									
										
										
										
											2019-02-18 05:28:05 +00:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2019-02-19 03:25:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 03:33:56 +00:00
										 |  |  | from .mutation import generation, flip, seed_shell | 
					
						
							| 
									
										
										
										
											2019-02-18 23:16:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def sins(): | 
					
						
							| 
									
										
										
										
											2019-02-18 05:28:05 +00:00
										 |  |  |     now = '{0:%Y%m%dT%H%M%S}'.format(datetime.utcnow()) | 
					
						
							|  |  |  |     parser = ArgumentParser( | 
					
						
							|  |  |  |         description='position independent code (PIC) mutation experiment.') | 
					
						
							|  |  |  |     parser.add_argument('-v', '--verbose', action='count') | 
					
						
							| 
									
										
										
										
											2019-02-18 23:16:25 +00:00
										 |  |  |     parser.add_argument('-s', '--seed', help='path to PIC image.') | 
					
						
							| 
									
										
										
										
											2019-02-18 05:28:05 +00:00
										 |  |  |     parser.add_argument('-o', '--output', help='path to results directory.') | 
					
						
							| 
									
										
										
										
											2019-02-19 03:25:00 +00:00
										 |  |  |     parser.add_argument('-l', '--lineage', default=10, | 
					
						
							| 
									
										
										
										
											2019-02-19 03:33:56 +00:00
										 |  |  |                         help='max count of unsuccessful generation.') | 
					
						
							| 
									
										
										
										
											2019-02-18 05:28:05 +00:00
										 |  |  |     args = parser.parse_args() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     log_level = logging.INFO | 
					
						
							|  |  |  |     log_format = logging.Formatter('%(message)s') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if args.verbose: | 
					
						
							|  |  |  |         log_level = logging.DEBUG | 
					
						
							|  |  |  |         log_format = logging.Formatter( | 
					
						
							|  |  |  |             '%(levelname)s %(filename)s:%(lineno)d\n%(message)s\n') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     logger = logging.getLogger('sins') | 
					
						
							|  |  |  |     logger.setLevel(log_level) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stream_handler = logging.StreamHandler() | 
					
						
							|  |  |  |     stream_handler.setLevel(log_level) | 
					
						
							|  |  |  |     stream_handler.setFormatter(log_format) | 
					
						
							|  |  |  |     logger.addHandler(stream_handler) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if args.output: | 
					
						
							|  |  |  |         log_path = f'{args.output}/sins-{now}.log' | 
					
						
							|  |  |  |         file_handler = logging.FileHandler(log_path) | 
					
						
							|  |  |  |         file_handler.setLevel(log_level) | 
					
						
							|  |  |  |         file_handler.setFormatter(log_format) | 
					
						
							|  |  |  |         logger.addHandler(file_handler) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 23:16:25 +00:00
										 |  |  |     logger.info(now) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     seed_data = seed_shell | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if args.seed: | 
					
						
							|  |  |  |         seed = Path(args.seed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         with seed.open('rb') as seed_file: | 
					
						
							|  |  |  |             seed_data = seed_file.read() | 
					
						
							| 
									
										
										
										
											2019-02-18 05:28:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 03:25:00 +00:00
										 |  |  |     logger.info(f'seed:\n{seed_data}') | 
					
						
							| 
									
										
										
										
											2019-02-19 00:28:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 03:25:00 +00:00
										 |  |  |     queue = Queue() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while True: | 
					
						
							|  |  |  |         lineage = 0 | 
					
						
							|  |  |  |         seed_flipped = flip(seed_data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         while lineage < args.lineage: | 
					
						
							|  |  |  |             logger.info(f'lineage: {lineage}') | 
					
						
							|  |  |  |             result = None | 
					
						
							| 
									
										
										
										
											2019-02-19 00:28:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 03:25:00 +00:00
										 |  |  |             proc = Process(target=generation, args=(queue, seed_flipped)) | 
					
						
							|  |  |  |             proc.start() | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 result = queue.get(timeout=1) | 
					
						
							|  |  |  |             except Empty: | 
					
						
							|  |  |  |                 lineage += 1 | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2019-02-18 05:28:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 03:25:00 +00:00
										 |  |  |             if not result: | 
					
						
							|  |  |  |                 lineage += 1 | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2019-02-18 23:16:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 03:25:00 +00:00
										 |  |  |             logger.info(f'scrap:\n{seed_flipped}') | 
					
						
							|  |  |  |             logger.info(f'result: {result}') | 
					
						
							|  |  |  |             lineage = 0 | 
					
						
							|  |  |  |             seed_flipped = flip(seed_flipped) |