class FOLD_ARRAY
Sequence of fold directions
note
	description: "Sequence of fold directions"
	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: "2022-02-08 15:50:06 GMT (Tuesday 8th February 2022)"
	revision: "3"
		
		class
	FOLD_ARRAY
inherit
	ARRAY [NATURAL_8]
		rename
			make as make_array
		end
	DIRECTION_CONSTANTS
		undefine
			is_equal, copy
		end
	EL_MODULE_LIO
create
	make
feature {NONE} -- Initialization
	make (strseq: STRING)
		do
			make_filled (N, 1, strseq.count - 1)
		end
feature -- Access
	grid_used_has_zero: BOOLEAN
	losses: INTEGER
feature -- Element change
	set_grid_used_has_zero (a_grid_used_has_zero: like grid_used_has_zero)
		do
			grid_used_has_zero := a_grid_used_has_zero
		end
	set_losses (a_losses: like losses)
		do
			losses := a_losses
		end
	set_data (other: FOLD_ARRAY)
		require
			same_count: count = other.count
		do
			area.copy_data (other.area, 0, 0, count)
		end
feature -- Status query
	is_last_north: BOOLEAN
feature -- Basic operations
	permute (pf: PROTEIN_FOLDING_COMMAND_2_0 [GRID_2_X])
		-- permute over all valid permutations of fold directions
		local
			i, l_count: INTEGER; iteration_count: NATURAL_32
			l_area: like area
		do
			l_area := area; l_count := count
			from until is_done (iteration_count) loop
				i := l_count - 1
				from half_add (i, l_area) until i = 1 loop
					if is_last_north then
						half_add (i - 1, l_area)
					end
					i := i - 1
				end
				if not is_last_north then
					iteration_count := iteration_count + 1
					calc_losses (pf, iteration_count)
				end
			end
		end
	update_crc (crc: EL_CYCLIC_REDUNDANCY_CHECK_32)
		local
			i, l_count: INTEGER; c: CHARACTER
			l_area: like area
		do
			l_area := area; l_count := count
			from i := 0 until i = l_count loop
				inspect l_area [i]
					when N then
						c := 'N'
					when S then
						c := 'S'
					when E then
						c := 'E'
					when W then
						c := 'W'
				else
				end
				crc.add_character_8 (c)
				i := i + 1
			end
		end
feature {NONE} -- Implementation
	calc_losses (pf: PROTEIN_FOLDING_COMMAND_2_0 [GRID_2_X]; iteration_count: NATURAL_32)
		do
			pf.calc_losses (Current, iteration_count)
		end
	half_add (i: INTEGER; a_area: like area)
		do
			is_last_north := False
			inspect a_area.item (i)
				when N then
					a_area.put (E, i)
				when E then
					a_area.put (S, i)
				when S then
					a_area.put (W, i)
			else
				a_area.put (N, i)
				is_last_north := True
			end
		end
	is_done (iteration_count: NATURAL_32): BOOLEAN
		do
			Result := is_last_north
		end
end