Commit 874c2286 authored by Ashkan's avatar Ashkan

Optimized code by more than 2x faster

parent c21895fd
Pipeline #4320 failed with stages
in 2 seconds
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="1">
<item index="0" class="java.lang.String" itemvalue="cython" />
</list>
</value>
</option>
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/PRRT.iml" filepath="$PROJECT_DIR$/.idea/PRRT.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BookmarkManager">
<bookmark url="file://$PROJECT_DIR$/examples/receiver.py" line="0" mnemonic="1" />
</component>
<component name="ChangeListManager">
<list default="true" id="9bef3dd2-eebb-490a-9234-c387e9ee2243" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/.idea/PRRT.iml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FUSProjectUsageTrigger">
<session id="-141414039">
<usages-collector id="statistics.lifecycle.project">
<counts>
<entry key="project.closed" value="2" />
<entry key="project.open.time.2" value="1" />
<entry key="project.open.time.6" value="1" />
<entry key="project.opened" value="2" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.open">
<counts>
<entry key="py" value="1" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.open">
<counts>
<entry key="Python" value="1" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.edit">
<counts>
<entry key="py" value="43" />
<entry key="txt" value="50" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.edit">
<counts>
<entry key="PLAIN_TEXT" value="50" />
<entry key="Python" value="43" />
</counts>
</usages-collector>
</session>
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/examples/receiver.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="15" selection-start-column="15" selection-end-column="15" />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="Git.Settings">
<option name="PREVIOUS_COMMIT_AUTHORS">
<list>
<option value="Ashkan" />
</list>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/examples/receiver.py" />
</list>
</option>
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="39" />
<option name="y" value="25" />
<option name="width" value="1327" />
<option name="height" value="743" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="PRRT" type="b2602c69:ProjectViewProjectNode" />
<item name="PRRT" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="PRRT" type="b2602c69:ProjectViewProjectNode" />
<item name="PRRT" type="462c0819:PsiDirectoryNode" />
<item name="examples" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
</panes>
</component>
<component name="PropertiesComponent">
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="settings.editor.selected.configurable" value="vcs.Subversion.SSH" />
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="SvnConfiguration">
<configuration>$USER_HOME$/.subversion</configuration>
<option name="sshConnectionType" value="PASSWORD" />
<option name="sshUserName" value="ashkan.taslimi@gmail.com" />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="9bef3dd2-eebb-490a-9234-c387e9ee2243" name="Default Changelist" comment="" />
<created>1538599258029</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1538599258029</updated>
</task>
<task id="LOCAL-00001" summary="Testing git push with pycharm!">
<created>1538600078801</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1538600078801</updated>
</task>
<option name="localTasksCounter" value="2" />
<servers />
</component>
<component name="ToolWindowManager">
<frame x="39" y="25" width="1327" height="743" extended-state="6" />
<layout>
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.25" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Version Control" order="7" show_stripe_button="false" />
<window_info active="true" anchor="bottom" id="Terminal" order="8" sideWeight="0.49846625" visible="true" weight="0.47960848" />
<window_info anchor="bottom" id="Event Log" order="9" sideWeight="0.50153375" side_tool="true" visible="true" weight="0.47960848" />
<window_info anchor="bottom" id="Python Console" order="10" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
</layout>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="Testing git push with pycharm!" />
<option name="LAST_COMMIT_MESSAGE" value="Testing git push with pycharm!" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/examples/receiver.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="15" selection-start-column="15" selection-end-column="15" />
<folding>
<element signature="e#0#10#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
</project>
\ No newline at end of file
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/prrt.py
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/prrt.cpython-36m-x86_64-linux-gnu.so
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/EGG-INFO/requires.txt
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/EGG-INFO/SOURCES.txt
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/EGG-INFO/native_libs.txt
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/EGG-INFO/dependency_links.txt
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/EGG-INFO/PKG-INFO
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/EGG-INFO/not-zip-safe
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/EGG-INFO/top_level.txt
/usr/local/lib/python3.6/dist-packages/prrt-0.0.9+148.gf39b2c6.dirty-py3.6-linux-x86_64.egg/__pycache__/prrt.cpython-36.pyc
/usr/local/bin/cygdb
/usr/local/bin/cython
/usr/local/bin/cythonize
prrt.c
RestrictedIntegerComposition.c
\ No newline at end of file
# Default ignored files
/workspace.xml
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="1">
<item index="0" class="java.lang.String" itemvalue="cython" />
</list>
</value>
</option>
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/../../GreedySearch/.idea/GreedySearch.iml" filepath="$PROJECT_DIR$/../../GreedySearch/.idea/GreedySearch.iml" />
<module fileurl="file://$PROJECT_DIR$/../.idea/PRRT.iml" filepath="$PROJECT_DIR$/../.idea/PRRT.iml" />
<module fileurl="file://$PROJECT_DIR$/../../examples/.idea/examples.iml" filepath="$PROJECT_DIR$/../../examples/.idea/examples.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/prrt.iml" filepath="$PROJECT_DIR$/.idea/prrt.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="GreedySearch" />
<orderEntry type="module" module-name="examples" />
<orderEntry type="module" module-name="PRRT" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>
\ No newline at end of file
......@@ -10,7 +10,6 @@ class HECSearch:
prrtSystemParameters):
self.n_max = 255
self.n_min = 1
self.step_size = 1 # Step size in the estimation of the optimum code word length
self.n_p_min = n_p_min
self.n_p_max = n_p_max
self.prrtApplicationParameters = prrtApplicationParameters
......@@ -19,6 +18,7 @@ class HECSearch:
self.searchType = searchType
pass
# @profile
def search(self):
ri_opt = math.inf
k_opt = 0
......@@ -57,83 +57,54 @@ class HECSearch:
# n_p_opt = repair_schedule
# return prrt.PrrtCodingConfiguration(n_opt, k_opt, n_p_opt)
get_k_lim = self.get_k_lim(self.n_min, self.n_max)
if self.searchType == "GreedySearch":
for n_c in range(1, n_c_max + 1):
get_k = self.get_k(n_c, arq_delay_i)
# print(str(get_k) + " " + str(get_k_lim))
k_max = min(get_k, get_k_lim)
if k_max == 0:
get_k_lim = prrt_utils.get_k_lim(self.n_min, self.n_max, self.prrtChannelParameters.loss_rate_fwd, self.prrtApplicationParameters.max_residual_loss_rate) # Bottleneck
# if self.searchType == "GreedySearch":
for n_c in range(1, n_c_max + 1):
get_k = self.get_k(n_c, arq_delay_i)
# print(str(get_k) + " " + str(get_k_lim))
k_max = min(get_k, get_k_lim)
if k_max == 0:
continue
# print("k_max: " + str(k_max))
for k in [1, k_max]:
n = prrt_utils.estimate_n_for_k(k, min(self.n_max, n_c * self.n_p_max),
self.prrtChannelParameters.loss_rate_fwd,
self.prrtApplicationParameters.max_residual_loss_rate) # Bottleneck
redundancy = n - k
if redundancy * self.n_p_min < n_c:
continue
repair_schedule = ric.gen_repair_schedule(redundancy, n_c, self.n_p_min, self.n_p_max)
# print("k=" + str(k) + " r=" + str(redundancy) + " n_c=" + str(n_c) + " n_p=" + str(repair_schedule))
coding_conf = prrt.PrrtCodingConfiguration(n, k, repair_schedule, self.prrtApplicationParameters,
self.prrtChannelParameters, self.prrtSystemParameters)
# coding_conf_validation_result = coding_conf.is_valid_for() # Bottleneck
if not (coding_conf.is_maximum_latency_fulfilled() and
prrt_utils.is_maximum_loss_fulfilled(k, n,
self.prrtChannelParameters.loss_rate_fwd,
self.prrtApplicationParameters.max_residual_loss_rate)):
# print("Coding conf is not valid: " + str(coding_conf_validation_result))
continue
# print("k_max: " + str(k_max))
for k in [1, k_max]:
n = self.estimate_n_for_k(k, min(self.n_max, n_c * self.n_p_max))
redundancy = n - k
if redundancy * self.n_p_min < n_c:
continue
repair_schedule = ric.gen_repair_schedule(redundancy, n_c, self.n_p_min, self.n_p_max)
coding_conf = prrt.PrrtCodingConfiguration(n, k, repair_schedule, self.prrtApplicationParameters,
self.prrtChannelParameters, self.prrtSystemParameters)
# print("k=" + str(k) + " r=" + str(redundancy) + " n_c=" + str(n_c) + " n_p=" + str(repair_schedule))
coding_conf_validation_result = coding_conf.is_valid_for()
if not (coding_conf_validation_result[0] and coding_conf_validation_result[1]):
# print("Coding conf is not valid: " + str(coding_conf_validation_result))
continue
ri = coding_conf.get_redundant_information()
# print("k=" + str(k) + " r=" + str(redundancy) + " n_c=" + str(n_c) + " n_p=" + str(repair_schedule) + "RI= " + str(ri))
if ri < ri_opt:
ri_opt = ri
k_opt = k
n_opt = n
n_p_opt = repair_schedule
# print("k_opt=" + str(k_opt) + " n_opt=" + str(n_opt) + " n_p_opt=" + str(n_p_opt) + "RI= " + str(ri_opt))
if len(n_p_opt) != 0:
fec_balance = self.get_balance_delay_fec(n_p_opt[0], k_opt)
return [k_opt, n_opt, n_p_opt, fec_balance]
ri = coding_conf.get_redundant_information()
# print("k=" + str(k) + " r=" + str(redundancy) + " n_c=" + str(n_c) + " n_p=" + str(repair_schedule) + "RI= " + str(ri))
if ri < ri_opt:
ri_opt = ri
k_opt = k
n_opt = n
n_p_opt = repair_schedule
print("k_opt=" + str(k_opt) + " n_opt=" + str(n_opt) + " n_p_opt=" + str(n_p_opt) + "RI= " + str(ri_opt))
if len(n_p_opt) != 0:
fec_balance = self.get_balance_delay_fec(n_p_opt[0], k_opt)
return [k_opt, n_opt, n_p_opt, fec_balance]
def get_k(self, n_c, arq_delay_i):
return math.ceil((self.prrtApplicationParameters.max_latency -
self.prrtChannelParameters.rtt_prop_fwd -
n_c * arq_delay_i) / max(self.prrtSystemParameters.redundancy_packet_transmission_delay, self.prrtSystemParameters.source_packet_interval))
# @profile
def get_k_lim(self, smallestK, biggestK):
if biggestK < smallestK:
return smallestK
mid_point = math.ceil((biggestK + smallestK) / 2)
p_r = np.around(
self.residual_packet_erasure_rate(mid_point, self.n_max, self.prrtChannelParameters.loss_rate_fwd),
8) # Pr(k, n_max)
if p_r == self.prrtApplicationParameters.max_residual_loss_rate:
return int(mid_point)
elif p_r > self.prrtApplicationParameters.max_residual_loss_rate:
return self.get_k_lim(smallestK, mid_point - 1)
else:
return self.get_k_lim(mid_point + 1, biggestK)
def estimate_n_for_k(self, k, n_max):
n = k + 1
while self.residual_packet_erasure_rate(k, n,
self.prrtChannelParameters.loss_rate_fwd) > self.prrtApplicationParameters.max_residual_loss_rate \
and n <= n_max - self.step_size:
n = n + self.step_size
return n
def residual_packet_erasure_rate(self, k, n, ch_loss_rate):
# codingConf = prrt.PrrtCodingConfiguration(1,1,[0])
total_packet_erasure = 0
for i in range(1, k + 1):
for j in range(max(n - k + 1, i), n - k + i + 1):
packet_erasure_at_i = i * prrt_utils.hypergeometric_distribution(n, k, i, j) \
* prrt_utils.get_error_prob(j, n, ch_loss_rate)
total_packet_erasure += packet_erasure_at_i
# Pr(k, n)
residual_packet_erasure_rate = (1 / k) * total_packet_erasure
return residual_packet_erasure_rate
def get_fec_delay_min(self):
return max(self.prrtSystemParameters.redundancy_packet_transmission_delay,
......
from scipy.special import comb
import numpy as np
import math
cdef int step_size = 1 # Step size in the estimation of the optimum code word length
# TODO: Maybe running in parallel to optimize runtime
# Pm(e, m), Eq. 3.45, Page 91
def get_error_prob(j, sent_packets_item, p_e):
cpdef float get_error_prob(j, sent_packets_item, p_e):
return comb(sent_packets_item, j) * (p_e ** j) * ((1 - p_e) ** (sent_packets_item - j))
# TODO
# Check if it is able to fulfill application parameters given channel parameters.
def hypergeometric_distribution(n, k, i, j):
return (comb(k, i) * comb(n - k, j - i)) / comb(n, j)
\ No newline at end of file
cpdef float hypergeometric_distribution(n, k, i, j):
return (comb(k, i) * comb(n - k, j - i)) / comb(n, j)
cpdef float residual_packet_erasure_rate(k, n, ch_loss_rate):
cdef float total_packet_erasure = 0
for i in range(1, k + 1):
for j in range(max(n - k + 1, i), n - k + i + 1):
total_packet_erasure += i * hypergeometric_distribution(n, k, i, j) \
* get_error_prob(j, n, ch_loss_rate)
# Pr(k, n)
return (1 / k) * total_packet_erasure
cpdef int get_k_lim(smallestK, biggestK, loss_rate_fwd, max_residual_loss_rate):
if biggestK < smallestK:
return smallestK
mid_point = math.ceil((biggestK + smallestK) / 2)
cdef float p_r = np.around(residual_packet_erasure_rate(mid_point, biggestK, loss_rate_fwd),8) # Pr(k, n_max)
if p_r == max_residual_loss_rate:
return int(mid_point)
elif p_r > max_residual_loss_rate:
return get_k_lim(smallestK, mid_point - 1, loss_rate_fwd, max_residual_loss_rate)
else:
return get_k_lim(mid_point + 1, biggestK, loss_rate_fwd, max_residual_loss_rate)
cpdef int estimate_n_for_k(k, n_max, loss_rate_fwd, max_residual_loss_rate):
cdef int n = k + 1
while residual_packet_erasure_rate(k, n, loss_rate_fwd) > max_residual_loss_rate \
and n <= n_max - step_size:
n = n + step_size
return n
cpdef bint is_maximum_loss_fulfilled(k, n, loss_rate_fwd, max_residual_loss_rate):
cdef float total_packet_erasure = 0
for i in range(1, k):
for j in range(max(n - k + 1, i), n - k + i):
packet_erasure_at_i = i * hypergeometric_distribution(n, k, i, j) * \
get_error_prob(j, n, loss_rate_fwd)
total_packet_erasure += packet_erasure_at_i
residual_packet_erasure_rate = (1 / k) * total_packet_erasure # Pr(k, n)
if (residual_packet_erasure_rate <= max_residual_loss_rate):
return True
return False
\ No newline at end of file
This diff is collapsed.
config,duration,search
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[0, 0, []]",0.0,GreedySearch
"[240, 2, [1, 9]]",25.0,GreedySearch
"[240, 2, [1, 9]]",25.0,GreedySearch
"[240, 2, [1, 9]]",24.0,GreedySearch
"[240, 2, [1, 9]]",25.0,GreedySearch
"[240, 2, [1, 9]]",25.0,GreedySearch
"[240, 2, [1, 9]]",54.0,GreedySearch
"[240, 2, [1, 9]]",30.0,GreedySearch
"[240, 2, [1, 9]]",28.0,GreedySearch
"[240, 2, [1, 9]]",26.0,GreedySearch
"[240, 2, [1, 9]]",26.0,GreedySearch
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment