class PROTEIN_FOLDING_COMMAND_2_0
Prediction of protein-folding in the 2D HP Model for grids conforming to GRID_2_X. Version 2.0
note
	description: "[
		Prediction of protein-folding in the 2D HP Model for grids conforming to ${GRID_2_X}.
		Version 2.0
	]"
	author: "Finnian Reilly"
	copyright: "Copyright (C) 2016-2017  Gerrit Leder, Finnian Reilly"
	contact: "finnian at eiffel hyphen loop dot com; gerrit.leder@gmail.com"
	license: "[https://www.gnu.org/licenses/gpl-3.0.en.html GNU General Public License]"
	date: "2024-01-20 19:18:24 GMT (Saturday 20th January 2024)"
	revision: "7"
		
		deferred class
	PROTEIN_FOLDING_COMMAND_2_0 [G -> GRID_2_X create make end]
inherit
	PROTEIN_FOLDING_COMMAND
		export
			{FOLD_ARRAY} print_progress
		redefine
			make
		end
	BOOLEAN_CONSTANTS
	DIRECTION_CONSTANTS
feature {EL_COMMAND_LINE_APPLICATION} -- Initialization
	initialize
		deferred
		end
	make (a_strseq: like strseq; a_output_path: FILE_PATH)
		do
			Precursor (a_strseq, a_output_path)
			minimum_loss := 9999
			create fold_list.make
			create seq.make (strseq.count)
			seq := convert_str_bool_string (strseq)
			seq_count := seq.count
			initialize
		end
feature -- Basic operations
	gen_folds
		deferred
		end
	print_folds
		do
			output.put_new_line
			output.put_new_line
		end
	print_indices
		do
			output.put_new_line
			output.put_new_line
		end
	print_item (fold: STRING; index: INTEGER)
		do
			output.put_character_8 ('#')
			output.put_integer (index)
			output.put_character_8 (' ')
			output.put_string_8 (fold)
			output.put_new_line
		end
	print_losses
		do
			output.put_new_line
			output.put_new_line
		end
	print_min_fold
		do
			sorted_fold_list.do_all_with_index (agent print_item)
		end
feature {FOLD_ARRAY} -- Basic operations
	calc_losses (fold: like new_fold; iteration_count: NATURAL_32)
		deferred
		end
feature {NONE} -- Implementation
	add_fold_crc (fold: like new_fold)
		do
			fold.update_crc (crc)
		end
	convert_str_bool_string (a_strseq: STRING): PF_BOOL_STRING
			--Given a bit string of values '0's and '1's return a sequence of values False and True
		local
			i: INTEGER
		do
			create Result.make (a_strseq.count)
			from
				i := 1
			until
				i = a_strseq.count
			loop
				i := i + 1
			end
			from
				i := 1
			until
				i = a_strseq.count + 1
			loop
				if a_strseq.item (i).is_equal ('1') then
					Result.put (True, i)
				else
					Result.put (False, i)
				end
				i := i + 1
			end
		end
	fold_string (a_fold: like new_fold): STRING
		local
			i: INTEGER; c: CHARACTER
		do
			create Result.make (a_fold.count)
			from i := 1 until i > a_fold.count loop
				inspect a_fold [i]
					when N then
						c := 'N'
					when S then
						c := 'S'
					when E then
						c := 'E'
					when W then
						c := 'W'
				else
				end
				Result.append_character (c)
				i := i + 1
			end
		end
	sorted_fold_list: EL_SORTABLE_ARRAYED_LIST [STRING]
		do
			create Result.make (fold_list.count)
			across fold_list as fold loop
				Result.extend (fold_string (fold.item))
			end
			Result.compare_objects
			Result.ascending_sort
		end
	update_minimum_loss (fold: like new_fold)
		do
			if fold.grid_used_has_zero then
				if fold.losses = minimum_loss then
					fold_list.extend (fold.twin)
					check
						fold_list.has (fold)
					end
				elseif fold.losses < minimum_loss then
					fold_list.wipe_out
					fold_list.extend (fold.twin)
					check
						fold_list.has (fold)
					end
					minimum_loss := fold.losses
				end
			end
		end
feature {FOLD_ARRAY} -- Factory
	new_fold: FOLD_ARRAY
		do
			create Result.make (strseq)
		end
	new_grid: GRID_2_X
		do
			create {G} Result.make (seq)
		end
feature {PROTEIN_FOLDING_COMMAND} -- Internal attributes
	fold_list: FOLD_ARRAY_LIST
	seq: PF_BOOL_STRING
	seq_count: INTEGER
end