From f0d3e4dc8a3800eb3ccba39f930b46bee775066d Mon Sep 17 00:00:00 2001 From: Mo Date: Fri, 4 Nov 2016 16:55:22 +0300 Subject: [PATCH] fix near systems analyze --- .../trader/analysis/PowerPlayAnalyzator.java | 45 ++++++++++--------- .../analysis/PowerPlayAnalyzatorTest.java | 33 +++++++------- 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/core/src/main/java/ru/trader/analysis/PowerPlayAnalyzator.java b/core/src/main/java/ru/trader/analysis/PowerPlayAnalyzator.java index a6de876..c16f4d6 100644 --- a/core/src/main/java/ru/trader/analysis/PowerPlayAnalyzator.java +++ b/core/src/main/java/ru/trader/analysis/PowerPlayAnalyzator.java @@ -1,6 +1,7 @@ package ru.trader.analysis; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.core.*; @@ -45,7 +46,7 @@ public class PowerPlayAnalyzator { } public Collection getNear(Collection starSystems){ - Stream candidates = market.get().stream().filter(p -> p.getPower() == POWER.NONE && p.getFaction() != FACTION.NONE); + Stream candidates = market.get().stream().filter(p -> p.getFaction() != FACTION.NONE); return getNear(candidates, starSystems, CONTROLLING_RADIUS, CONTROLLING_RADIUS*2).collect(Collectors.toList()); } @@ -70,12 +71,27 @@ public class PowerPlayAnalyzator { } public static Stream getNear(Stream starSystems, Collection centers, double radius, double maxDistance){ - IntersectsMapper controllingMapper = new IntersectsMapper(centers, radius, true, true); IntersectsMapper distanceMapper = new IntersectsMapper(centers, maxDistance, false, true); - return starSystems.filter(new FarDropper(centers, maxDistance)) - .map(controllingMapper) - .filter(d -> d.getCount() == 0) - .map(d -> distanceMapper.apply(d.getStarSystem())) + Predicate isControlling = intersectsAnyPredicate(centers, radius); + + Collection candidates = new ArrayList<>(); + Collection checked = new ArrayList<>(); + starSystems.filter(new FarDropper(centers, maxDistance)) + .forEach(p -> { + if (isControlling != null && isControlling.test(p)) checked.add(p); + else{ + if (p.getPower() == POWER.NONE) { + candidates.add(p); + } + } + }); + candidates.removeAll(centers); + Predicate isCheckedControlling = intersectsAnyPredicate(checked, radius); + if (isCheckedControlling == null) isCheckedControlling = p -> false; + + return candidates.stream() + .filter(isCheckedControlling.negate()) + .map(distanceMapper) .filter(IntersectData::isIntersect) .sorted(new DistanceComparator()); } @@ -118,7 +134,8 @@ public class PowerPlayAnalyzator { .map(mapper) .filter(d -> d.getCount() == needCount); } -/* + + @Nullable private static Predicate intersectsAnyPredicate(Collection places, double radius){ Predicate intersects = null; for (Place place : places) { @@ -128,20 +145,6 @@ public class PowerPlayAnalyzator { return intersects; } - - private static Predicate intersectsPredicate(Collection places, double radius){ - Predicate intersects = null; - for (Place place : places) { - if (intersects == null) intersects = new Controlling(place, radius); - else intersects = intersects.and(new Controlling(place, radius)); - } - return intersects; - } - - private static Predicate intersectsPredicate(Place checkedPlace, Collection places, double radius){ - return new Controlling(checkedPlace, radius).and(intersectsAnyPredicate(places, radius)); - } - */ private static class Controlling implements Predicate { private final Place center; private final double radius; diff --git a/core/src/test/java/ru/trader/analysis/PowerPlayAnalyzatorTest.java b/core/src/test/java/ru/trader/analysis/PowerPlayAnalyzatorTest.java index bd7a769..71613af 100644 --- a/core/src/test/java/ru/trader/analysis/PowerPlayAnalyzatorTest.java +++ b/core/src/test/java/ru/trader/analysis/PowerPlayAnalyzatorTest.java @@ -6,6 +6,8 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.core.Market; +import ru.trader.core.POWER; +import ru.trader.core.POWER_STATE; import ru.trader.core.Place; import ru.trader.store.simple.Store; @@ -31,15 +33,16 @@ public class PowerPlayAnalyzatorTest extends Assert { aulin = world.get("Aulin"); morgor = world.get("Morgor"); lhs417 = world.get("LHS 417"); + world.get().forEach(p -> p.setPower(POWER.NONE, POWER_STATE.NONE)); } @Test public void intersectTest() throws Exception { Collection starSystems = world.get(); - Collection controllingLhs3262 = starSystems.stream().filter(p -> p.getDistance(lhs3262) <= 15).collect(Collectors.toList()); - Collection controllingAulin = starSystems.stream().filter(p -> p.getDistance(aulin) <= 15).collect(Collectors.toList()); - Collection controllingMorgor = starSystems.stream().filter(p -> p.getDistance(morgor) <= 15).collect(Collectors.toList()); + Collection controllingLhs3262 = starSystems.stream().filter(p -> p != lhs3262 && p.getDistance(lhs3262) <= 15).collect(Collectors.toList()); + Collection controllingAulin = starSystems.stream().filter(p -> p != aulin && p.getDistance(aulin) <= 15).collect(Collectors.toList()); + Collection controllingMorgor = starSystems.stream().filter(p -> p != morgor && p.getDistance(morgor) <= 15).collect(Collectors.toList()); Collection expectedIntersect = controllingLhs3262.stream().filter(controllingAulin::contains).collect(Collectors.toList()); Collection expected3Intersect = controllingLhs3262.stream().filter(controllingAulin::contains).filter(controllingMorgor::contains).collect(Collectors.toList()); @@ -52,7 +55,7 @@ public class PowerPlayAnalyzatorTest extends Assert { for (PowerPlayAnalyzator.IntersectData intersect : intersects) { assertTrue(lhs3262.getDistance(intersect.getStarSystem()) <= 15); } - assertTrue(intersects.containsAll(controllingLhs3262)); + assertTrue(intersects.stream().map(d -> d.getStarSystem()).collect(Collectors.toList()).containsAll(controllingLhs3262)); assertEquals(controllingLhs3262.size(), intersects.size()); centers.add(aulin); @@ -62,7 +65,7 @@ public class PowerPlayAnalyzatorTest extends Assert { assertTrue(lhs3262.getDistance(intersect.getStarSystem()) <= 15); assertTrue(aulin.getDistance(intersect.getStarSystem()) <= 15); } - assertTrue(intersects.containsAll(expectedIntersect)); + assertTrue(intersects.stream().map(d -> d.getStarSystem()).collect(Collectors.toList()).containsAll(expectedIntersect)); assertEquals(expectedIntersect.size(), intersects.size()); centers.add(morgor); @@ -73,7 +76,7 @@ public class PowerPlayAnalyzatorTest extends Assert { assertTrue(aulin.getDistance(intersect.getStarSystem()) <= 15); assertTrue(morgor.getDistance(intersect.getStarSystem()) <= 15); } - assertTrue(intersects.containsAll(expected3Intersect)); + assertTrue(intersects.stream().map(d -> d.getStarSystem()).collect(Collectors.toList()).containsAll(expected3Intersect)); assertEquals(expected3Intersect.size(), intersects.size()); intersects = PowerPlayAnalyzator.getIntersects(starSystems, centers, 12); @@ -90,10 +93,10 @@ public class PowerPlayAnalyzatorTest extends Assert { @Test public void intersectTest2() throws Exception { Collection starSystems = world.get(); - Collection controllingLhs3262 = starSystems.stream().filter(p -> p.getDistance(lhs3262) <= 12).collect(Collectors.toList()); - Collection controllingAulin = starSystems.stream().filter(p -> p.getDistance(aulin) <= 12).collect(Collectors.toList()); - Collection controllingMorgor = starSystems.stream().filter(p -> p.getDistance(morgor) <= 12).collect(Collectors.toList()); - Collection controllingLhs417 = starSystems.stream().filter(p -> p.getDistance(lhs417) <= 12).collect(Collectors.toList()); + Collection controllingLhs3262 = starSystems.stream().filter(p -> p != lhs3262 && p.getDistance(lhs3262) <= 12).collect(Collectors.toList()); + Collection controllingAulin = starSystems.stream().filter(p -> p != aulin && p.getDistance(aulin) <= 12).collect(Collectors.toList()); + Collection controllingMorgor = starSystems.stream().filter(p -> p != morgor && p.getDistance(morgor) <= 12).collect(Collectors.toList()); + Collection controllingLhs417 = starSystems.stream().filter(p -> p != lhs417 && p.getDistance(lhs417) <= 12).collect(Collectors.toList()); Collection expectedIntersect = controllingLhs417.stream().filter(p -> controllingLhs3262.contains(p) || controllingAulin.contains(p)).collect(Collectors.toList()); Collection expected3Intersect = controllingLhs417.stream().filter(p -> controllingLhs3262.contains(p) || controllingAulin.contains(p) || controllingMorgor.contains(p)).collect(Collectors.toList()); Collection expected2Intersect = controllingLhs417.stream().filter(p -> controllingAulin.contains(p) || controllingMorgor.contains(p)).collect(Collectors.toList()); @@ -108,7 +111,7 @@ public class PowerPlayAnalyzatorTest extends Assert { assertTrue(lhs3262.getDistance(intersect.getStarSystem()) <= 12 || aulin.getDistance(intersect.getStarSystem()) <= 12); assertTrue(lhs417.getDistance(intersect.getStarSystem()) <= 12); } - assertTrue(intersects.containsAll(expectedIntersect)); + assertTrue(intersects.stream().map(d -> d.getStarSystem()).collect(Collectors.toList()).containsAll(expectedIntersect)); assertEquals(expectedIntersect.size(), intersects.size()); centers.add(morgor); @@ -118,7 +121,7 @@ public class PowerPlayAnalyzatorTest extends Assert { assertTrue(lhs3262.getDistance(intersect.getStarSystem()) <= 12 || aulin.getDistance(intersect.getStarSystem()) <= 12 || morgor.getDistance(intersect.getStarSystem()) <= 12); assertTrue(lhs417.getDistance(intersect.getStarSystem()) <= 12); } - assertTrue(intersects.containsAll(expected3Intersect)); + assertTrue(intersects.stream().map(d -> d.getStarSystem()).collect(Collectors.toList()).containsAll(expected3Intersect)); assertEquals(expected3Intersect.size(), intersects.size()); centers.clear(); @@ -138,7 +141,7 @@ public class PowerPlayAnalyzatorTest extends Assert { assertTrue(aulin.getDistance(intersect.getStarSystem()) <= 12 || morgor.getDistance(intersect.getStarSystem()) <= 12); assertTrue(lhs417.getDistance(intersect.getStarSystem()) <= 12); } - assertTrue(intersects.containsAll(expected2Intersect)); + assertTrue(intersects.stream().map(d -> d.getStarSystem()).collect(Collectors.toList()).containsAll(expected2Intersect)); assertEquals(expected2Intersect.size(), intersects.size()); @@ -155,11 +158,11 @@ public class PowerPlayAnalyzatorTest extends Assert { Collection centers = new ArrayList<>(); centers.add(lhs3262); centers.add(aulin); - Collection near = PowerPlayAnalyzator.getNear(starSystems, centers, 15, 30); + Collection near = PowerPlayAnalyzator.getNear(starSystems, centers, 14, 30); LOG.info("Test near by LHS 3262 and Aulin, found {}", near.size()); assertTrue(near.size() > 0); for (PowerPlayAnalyzator.IntersectData place : near) { - Collection intersect = PowerPlayAnalyzator.getIntersects(place.getStarSystem(), starSystems, centers, 15); + Collection intersect = PowerPlayAnalyzator.getIntersects(place.getStarSystem(), starSystems, centers, 14); assertEquals(0, intersect.size()); }