Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
Conversion
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Vladislav Kiselev
Conversion
Commits
f52cfc4b
Commit
f52cfc4b
authored
May 14, 2019
by
Vladislav Kiselev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Тестирование с разными параметрами, time limit.
parent
4746f729
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
207 additions
and
80 deletions
+207
-80
src/inport/Main.java
src/inport/Main.java
+59
-50
src/inport/Testing.java
src/inport/Testing.java
+148
-30
No files found.
src/inport/Main.java
View file @
f52cfc4b
...
@@ -4,12 +4,18 @@ import java.io.*;
...
@@ -4,12 +4,18 @@ import java.io.*;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.TreeMap
;
import
java.util.TreeMap
;
import
java.util.function.BiFunction
;
import
java.util.function.Function
;
import
static
inport
.
Testing
.*;
import
static
inport
.
Testing
.*;
import
static
inport
.
Testing
.
solveTaskWithPartialCargoOp
;
import
inport.ConversionUtil.*
;
import
inport.ConversionUtil.*
;
public
class
Main
{
public
class
Main
{
static
final
int
DEFAULT_TIME_LIMIT_S
=
1
;
public
static
void
main
(
String
[]
args
)
{
public
static
void
main
(
String
[]
args
)
{
if
(
args
.
length
==
0
)
{
if
(
args
.
length
==
0
)
{
System
.
out
.
println
(
"To few arguments."
);
System
.
out
.
println
(
"To few arguments."
);
...
@@ -32,9 +38,9 @@ public class Main {
...
@@ -32,9 +38,9 @@ public class Main {
String
error
;
String
error
;
if
(!
task
.
isTypified
())
{
if
(!
task
.
isTypified
())
{
error
=
solveTask_1
(
task
);
error
=
solveTask_1
(
task
,
DEFAULT_TIME_LIMIT_S
);
}
else
{
}
else
{
error
=
solveTask_2
(
task
);
error
=
solveTask_2
(
task
,
DEFAULT_TIME_LIMIT_S
);
}
}
long
finish
=
System
.
currentTimeMillis
();
long
finish
=
System
.
currentTimeMillis
();
...
@@ -89,69 +95,72 @@ public class Main {
...
@@ -89,69 +95,72 @@ public class Main {
break
;
break
;
}
}
case
"debug"
:
{
case
"debug"
:
{
String
fileName
=
"experiment/in.ipp"
;
debug
(
Testing:
:
solveTask_2
,
DEFAULT_TIME_LIMIT_S
);
String
solverResults
=
"temp_data/solver_results.txt"
;
String
output
=
"experiment/debug_info.txt"
;
TaskCase
task
=
new
TaskCase
();
try
{
task
.
deserialize
(
fileName
);
}
catch
(
IOException
e
)
{
System
.
out
.
println
(
e
.
getMessage
());
break
;
}
String
error
=
solveTask_2
(
task
);
if
(!
error
.
isEmpty
())
{
System
.
out
.
println
(
"Error : "
+
error
);
break
;
}
else
{
task
.
serialize
(
fileName
);
}
debugInfo
(
task
,
solverResults
,
output
);
break
;
break
;
}
}
case
"debug 2"
:
{
case
"debug 2"
:
{
String
fileName
=
"experiment/in.ipp"
;
debug
(
Testing:
:
solveTaskWithPartialCargoOp
,
DEFAULT_TIME_LIMIT_S
);
String
solverResults
=
"temp_data/solver_results.txt"
;
String
output
=
"experiment/debug_info.txt"
;
TaskCase
task
=
new
TaskCase
();
try
{
task
.
deserialize
(
fileName
);
}
catch
(
IOException
e
)
{
System
.
out
.
println
(
e
.
getMessage
());
break
;
}
String
error
=
solveTaskWithPartialCargoOp
(
task
);
if
(!
error
.
isEmpty
())
{
System
.
out
.
println
(
"Error : "
+
error
);
break
;
}
else
{
task
.
serialize
(
fileName
);
}
debugInfo
(
task
,
solverResults
,
output
);
break
;
break
;
}
}
case
"testing"
:
case
"testing"
:
test_2
();
test_2
(
DEFAULT_TIME_LIMIT_S
);
break
;
break
;
case
"testing_with_partial_op"
:
case
"testing_with_partial_op"
:
testWithPartialOp
();
testWithPartialOp
(
DEFAULT_TIME_LIMIT_S
);
break
;
break
;
case
"testing_exp"
:
case
"different_parameters"
:
test_2_exp
();
try
{
testingWithDiffParameters
(
"tests/with_typing/Case2.tipp"
,
1
,
30
,
16
,
35
,
1.1
,
30
);
// testingWithDiffParameters(
// "tests/with_typing/TaskT.tipp",
// 10, 10,
// 32, 32,
// 1.1, 10);
}
catch
(
IOException
ex
)
{
System
.
out
.
println
(
ex
.
getMessage
());
}
break
;
break
;
default
:
default
:
System
.
out
.
println
(
"Unknown type \""
+
type
+
"\""
);
System
.
out
.
println
(
"Unknown type \""
+
type
+
"\""
);
}
}
}
}
private
static
void
debug
(
BiFunction
<
TaskCase
,
Integer
,
String
>
solver
,
int
timeLimitS
)
{
String
fileName
=
"experiment/in.ipp"
;
String
solverResults
=
"temp_data/solver_results.txt"
;
String
output
=
"experiment/debug_info.txt"
;
TaskCase
task
=
new
TaskCase
();
try
{
task
.
deserialize
(
fileName
);
}
catch
(
IOException
e
)
{
System
.
out
.
println
(
e
.
getMessage
());
return
;
}
long
start
=
System
.
currentTimeMillis
();
String
error
=
solver
.
apply
(
task
,
timeLimitS
);
long
finish
=
System
.
currentTimeMillis
();
System
.
out
.
println
(
" "
+
(
finish
-
start
)
/
1000.0
+
" s"
);
if
(!
error
.
isEmpty
())
{
System
.
out
.
println
(
"Error : "
+
error
);
return
;
}
else
{
task
.
serialize
(
fileName
);
}
debugInfo
(
task
,
solverResults
,
output
);
}
private
static
void
debugInfo
(
TaskCase
task
,
String
solverResults
,
String
output
)
{
private
static
void
debugInfo
(
TaskCase
task
,
String
solverResults
,
String
output
)
{
try
(
FileInputStream
fstream
=
new
FileInputStream
(
solverResults
))
{
try
(
FileInputStream
fstream
=
new
FileInputStream
(
solverResults
))
{
BufferedReader
br
=
new
BufferedReader
(
new
InputStreamReader
(
fstream
));
BufferedReader
br
=
new
BufferedReader
(
new
InputStreamReader
(
fstream
));
...
...
src/inport/Testing.java
View file @
f52cfc4b
...
@@ -2,8 +2,12 @@ package inport;
...
@@ -2,8 +2,12 @@ package inport;
import
java.io.*
;
import
java.io.*
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.locks.Condition
;
import
java.util.concurrent.locks.Lock
;
import
java.util.concurrent.locks.ReentrantLock
;
import
java.util.function.BiConsumer
;
import
java.util.function.BiConsumer
;
import
java.util.function.Function
;
import
java.util.function.
Bi
Function
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
public
class
Testing
{
public
class
Testing
{
...
@@ -19,52 +23,62 @@ public class Testing {
...
@@ -19,52 +23,62 @@ public class Testing {
dir
.
delete
();
dir
.
delete
();
}
}
public
static
String
solveTask_1
(
TaskCase
task
)
{
public
static
String
solveTask_1
(
TaskCase
task
,
int
timeLimitS
)
{
return
solveTask
(
return
solveTask
(
task
,
task
,
"conversion_1.mzn"
,
"conversion_1.mzn"
,
ConversionUtil:
:
portToMiniZinc_1
,
ConversionUtil:
:
portToMiniZinc_1
,
ConversionUtil:
:
resolveMiniZincResults
);
ConversionUtil:
:
resolveMiniZincResults
,
timeLimitS
);
}
}
public
static
String
solveTask_2
(
TaskCase
task
)
{
public
static
String
solveTask_2
(
TaskCase
task
,
int
timeLimitS
)
{
return
solveTask
(
return
solveTask
(
task
,
task
,
"conversion_2.mzn"
,
"conversion_2.mzn"
,
ConversionUtil:
:
portToMiniZinc_2
,
ConversionUtil:
:
portToMiniZinc_2
,
ConversionUtil:
:
resolveMiniZincResults
);
ConversionUtil:
:
resolveMiniZincResults
,
timeLimitS
);
}
}
public
static
String
solveTaskWithPartialCargoOp
(
TaskCase
task
)
{
public
static
String
solveTaskWithPartialCargoOp
(
TaskCase
task
,
int
timeLimitS
)
{
return
solveTask
(
return
solveTask
(
task
,
task
,
"conversion_2_with_partial_cargo_operations.mzn"
,
"conversion_2_with_partial_cargo_operations.mzn"
,
ConversionUtil:
:
portToMiniZinc_2
,
ConversionUtil:
:
portToMiniZinc_2
,
ConversionUtil:
:
resolveMiniZincResults
);
ConversionUtil:
:
resolveMiniZincResults
,
timeLimitS
);
}
}
public
static
String
solveTask_2_0
(
TaskCase
task
)
{
public
static
String
solveTask_2_0
(
TaskCase
task
,
int
timeLimitS
)
{
return
solveTask
(
return
solveTask
(
task
,
task
,
"conversion_2.0.mzn"
,
"conversion_2.0.mzn"
,
ConversionUtil:
:
portToMiniZinc_2
,
ConversionUtil:
:
portToMiniZinc_2
,
ConversionUtil:
:
resolveMiniZincResults
,
ConversionUtil:
:
resolveMiniZincResults
,
"temp_data_2"
);
"temp_data_2"
,
timeLimitS
);
}
}
public
static
String
solveTask
(
TaskCase
task
,
public
static
String
solveTask
(
TaskCase
task
,
String
constraintName
,
String
constraintName
,
BiConsumer
<
TaskCase
,
String
>
converterToMinizincFormat
,
BiConsumer
<
TaskCase
,
String
>
converterToMinizincFormat
,
BiConsumer
<
TaskCase
,
String
>
interpreter
)
{
BiConsumer
<
TaskCase
,
String
>
interpreter
,
return
solveTask
(
task
,
constraintName
,
converterToMinizincFormat
,
interpreter
,
"temp_data"
);
int
timeLimitS
)
{
return
solveTask
(
task
,
constraintName
,
converterToMinizincFormat
,
interpreter
,
"temp_data"
,
timeLimitS
);
}
}
private
final
static
Lock
lock
=
new
ReentrantLock
();
private
final
static
Condition
condition
=
lock
.
newCondition
();
private
static
Boolean
isDestroyed
;
/* Возвращает описание ошибки, если ошибки не было, то пустую строку. */
/* Возвращает описание ошибки, если ошибки не было, то пустую строку. */
public
static
String
solveTask
(
TaskCase
task
,
public
static
String
solveTask
(
TaskCase
task
,
String
constraintName
,
String
constraintName
,
BiConsumer
<
TaskCase
,
String
>
converterToMinizincFormat
,
BiConsumer
<
TaskCase
,
String
>
converterToMinizincFormat
,
BiConsumer
<
TaskCase
,
String
>
interpreter
,
BiConsumer
<
TaskCase
,
String
>
interpreter
,
String
tempDir
)
{
String
tempDir
,
final
int
timeLimitS
)
{
File
directory
=
new
File
(
tempDir
);
File
directory
=
new
File
(
tempDir
);
if
(!
directory
.
exists
())
{
if
(!
directory
.
exists
())
{
directory
.
mkdir
();
directory
.
mkdir
();
...
@@ -90,17 +104,61 @@ public class Testing {
...
@@ -90,17 +104,61 @@ public class Testing {
constraints
,
minizincData
,
constraints
,
minizincData
,
"-o"
,
solverResults
);
"-o"
,
solverResults
);
Process
process
=
pb
.
start
();
lock
.
lock
();
isDestroyed
=
false
;
lock
.
unlock
();
final
Process
process
=
pb
.
start
();
Thread
killer
=
new
Thread
(()
->
{
lock
.
lock
();
long
start
=
System
.
currentTimeMillis
();
try
{
while
(
process
.
isAlive
())
{
long
currentTimeMillis
=
System
.
currentTimeMillis
();
if
(
currentTimeMillis
-
start
>
timeLimitS
*
1000
)
{
process
.
destroyForcibly
();
isDestroyed
=
true
;
break
;
}
condition
.
await
(
timeLimitS
*
1000
-
(
currentTimeMillis
-
start
),
TimeUnit
.
MILLISECONDS
);
}
}
catch
(
InterruptedException
ex
)
{
isDestroyed
=
true
;
process
.
destroyForcibly
();
}
finally
{
lock
.
unlock
();
}
});
killer
.
start
();
int
exitCode
=
process
.
waitFor
();
int
exitCode
=
process
.
waitFor
();
lock
.
lock
();
try
{
condition
.
signal
();
}
finally
{
lock
.
unlock
();
}
killer
.
join
();
assert
exitCode
==
0
;
assert
exitCode
==
0
;
lock
.
lock
();
try
{
if
(
isDestroyed
)
{
return
"Time limit exceeded."
;
}
}
finally
{
lock
.
unlock
();
}
BufferedReader
br
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getInputStream
()));
BufferedReader
br
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getInputStream
()));
String
output
=
br
.
lines
().
collect
(
Collectors
.
joining
(
"\n"
));
String
output
=
br
.
lines
().
collect
(
Collectors
.
joining
(
"\n"
));
// BufferedReader br2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
// BufferedReader br2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
// String errors = br.lines().collect(Collectors.joining("\n"));
// String errors = br.lines().collect(Collectors.joining("\n"));
// System.out.println("output : " + output);
// System.out.println("output : " + output);
// System.out.println("errors : " + errors);
// System.out.println("errors : " + errors);
...
@@ -118,7 +176,7 @@ public class Testing {
...
@@ -118,7 +176,7 @@ public class Testing {
return
""
;
return
""
;
}
}
private
static
String
testCase
(
String
file
,
Function
<
TaskCase
,
String
>
solver
)
{
private
static
String
testCase
(
String
file
,
BiFunction
<
TaskCase
,
Integer
,
String
>
solver
,
int
timeLimitS
)
{
TaskCase
task
=
new
TaskCase
();
TaskCase
task
=
new
TaskCase
();
try
{
try
{
task
.
deserialize
(
file
);
task
.
deserialize
(
file
);
...
@@ -126,7 +184,7 @@ public class Testing {
...
@@ -126,7 +184,7 @@ public class Testing {
return
"Error : "
+
e
.
getMessage
();
return
"Error : "
+
e
.
getMessage
();
}
}
double
expected_result
=
task
.
getSolution_result
();
double
expected_result
=
task
.
getSolution_result
();
String
error
=
solver
.
apply
(
task
);
String
error
=
solver
.
apply
(
task
,
timeLimitS
);
double
result
=
task
.
getSolution_result
();
double
result
=
task
.
getSolution_result
();
if
(!
error
.
isEmpty
())
{
if
(!
error
.
isEmpty
())
{
return
"Error : "
+
error
;
return
"Error : "
+
error
;
...
@@ -137,7 +195,7 @@ public class Testing {
...
@@ -137,7 +195,7 @@ public class Testing {
return
"OK"
;
return
"OK"
;
}
}
public
static
void
testGroup
(
String
group
,
Function
<
TaskCase
,
String
>
solver
)
{
public
static
void
testGroup
(
String
group
,
BiFunction
<
TaskCase
,
Integer
,
String
>
solver
,
int
timeLimitS
)
{
File
testDir
=
new
File
(
"tests/"
+
group
+
"/"
);
File
testDir
=
new
File
(
"tests/"
+
group
+
"/"
);
System
.
out
.
println
(
testDir
.
toString
()
+
" :"
);
System
.
out
.
println
(
testDir
.
toString
()
+
" :"
);
...
@@ -148,10 +206,10 @@ public class Testing {
...
@@ -148,10 +206,10 @@ public class Testing {
long
start
=
System
.
currentTimeMillis
();
long
start
=
System
.
currentTimeMillis
();
String
res
=
testCase
(
testDir
.
toString
()
+
"/"
+
file
.
getName
(),
solver
);
String
res
=
testCase
(
testDir
.
toString
()
+
"/"
+
file
.
getName
(),
solver
,
timeLimitS
);
long
finish
=
System
.
currentTimeMillis
();
long
finish
=
System
.
currentTimeMillis
();
System
.
out
.
println
(
" "
+
res
+
", "
+
(
finish
-
start
)
+
" m
s"
);
System
.
out
.
println
(
" "
+
res
+
", "
+
(
finish
-
start
)
/
1000.0
+
"
s"
);
if
(
res
.
equals
(
"OK"
))
{
if
(
res
.
equals
(
"OK"
))
{
nPassedTests
++;
nPassedTests
++;
}
}
...
@@ -159,20 +217,80 @@ public class Testing {
...
@@ -159,20 +217,80 @@ public class Testing {
System
.
out
.
println
(
"Passed tests : "
+
nPassedTests
+
"/"
+
testDir
.
listFiles
().
length
);
System
.
out
.
println
(
"Passed tests : "
+
nPassedTests
+
"/"
+
testDir
.
listFiles
().
length
);
}
}
public
static
void
test_1
()
{
public
static
void
test_1
(
int
timeLimitS
)
{
testGroup
(
"without_typing"
,
Testing:
:
solveTask_1
);
testGroup
(
"without_typing"
,
Testing:
:
solveTask_1
,
timeLimitS
);
}
}
static
void
test_2
()
{
static
void
test_2
(
int
timeLimitS
)
{
testGroup
(
"with_typing"
,
Testing:
:
solveTask_2
);
testGroup
(
"with_typing"
,
Testing:
:
solveTask_2
,
timeLimitS
);
}
public
static
void
testWithPartialOp
()
{
testGroup
(
"with_typing"
,
Testing:
:
solveTaskWithPartialCargoOp
);
}
}
static
void
test_2_0
(
)
{
public
static
void
testWithPartialOp
(
int
timeLimitS
)
{
testGroup
(
"with_typing"
,
Testing:
:
solveTask
_2_0
);
testGroup
(
"with_typing"
,
Testing:
:
solveTask
WithPartialCargoOp
,
timeLimitS
);
}
}
static
void
test_2_exp
()
{
testGroup
(
"experiments"
,
Testing:
:
solveTask_2
);
static
void
testingWithDiffParameters
(
String
test
,
double
cargoMult
,
double
cargoMultMax
,
double
nIntevals
,
double
nIntervalsMax
,
double
step
,
int
timeLimitS
)
throws
IOException
{
System
.
out
.
println
(
test
);
System
.
out
.
print
(
"* "
);
for
(
double
i
=
Math
.
ceil
(
nIntevals
);
i
<=
nIntervalsMax
;
i
=
Math
.
ceil
(
step
*
i
))
{
System
.
out
.
print
(
i
+
" "
);
}
System
.
out
.
println
();
File
directory
=
new
File
(
"debug_dir/"
);
if
(!
directory
.
exists
())
{
directory
.
mkdir
();
}
for
(
double
mult
=
Math
.
ceil
(
cargoMult
);
mult
<=
cargoMultMax
;
mult
=
Math
.
ceil
(
step
*
mult
))
{
System
.
out
.
print
(
mult
+
" "
);
for
(
double
i
=
Math
.
ceil
(
nIntevals
);
i
<=
nIntervalsMax
;
i
=
Math
.
ceil
(
step
*
i
))
{
TaskCase
taskCase
=
new
TaskCase
();
taskCase
.
deserialize
(
test
);
taskCase
.
setPlanningInterval
(
i
);
for
(
OperationTemplate
template
:
taskCase
.
getTemplates
())
{
if
(
template
instanceof
LoadingTemplate
)
{
LoadingTemplate
op
=
(
LoadingTemplate
)
template
;
op
.
setIntensity
(
op
.
getIntensity
()
*
mult
);
}
}
for
(
TransportShip
ship
:
taskCase
.
getShips
())
{
ship
.
setCargoMax
(
ship
.
getCargoMax
()
*
mult
);
}
for
(
StorageState
state
:
taskCase
.
getStorageInitialState
())
{
state
.
setCargoState
(
state
.
getCargoState
()
*
mult
);
}
for
(
StorageState
state
:
taskCase
.
getStorageEndState
())
{
state
.
setCargoState
(
state
.
getCargoState
()
*
mult
);
}
for
(
Storage
storage
:
taskCase
.
getStorages
())
{
storage
.
setVolume
(
storage
.
getVolume
()
*
mult
);
}
for
(
Operation
operation
:
taskCase
.
getSolution
())
{
final
double
m
=
mult
;
operation
.
setIntensity
(
operation
.
getIntensity
().
map
(
v
->
(
int
)(
v
*
m
)));
}
// taskCase.serialize(directory + "/" + mult + " " + i + ".tipp");
long
start
=
System
.
currentTimeMillis
();
String
result
=
solveTaskWithPartialCargoOp
(
taskCase
,
timeLimitS
);
long
finish
=
System
.
currentTimeMillis
();
if
(
result
.
isEmpty
())
{
System
.
out
.
print
((
finish
-
start
)
/
1000.0
+
" "
);
}
else
if
(
result
.
equals
(
"Time limit exceeded."
))
{
System
.
out
.
print
(
"TL "
);
}
else
{
System
.
out
.
print
(
"ER "
);
}
}
System
.
out
.
println
();
}
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment