From b058fba814f8cd1499abab93484b88aa6926f4f7 Mon Sep 17 00:00:00 2001 From: justin Date: Mon, 6 Dec 2021 15:56:44 +0000 Subject: [PATCH] Improve combinations algorithm speed --- src/Dodge/Combine.hs | 38 ++++++++++++++------ src/Dodge/Combine/Combinations.hs | 59 ++++++++++++++++--------------- 2 files changed, 59 insertions(+), 38 deletions(-) diff --git a/src/Dodge/Combine.hs b/src/Dodge/Combine.hs index d405390c1..a1628e914 100644 --- a/src/Dodge/Combine.hs +++ b/src/Dodge/Combine.hs @@ -1,4 +1,4 @@ ---{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} module Dodge.Combine ( combinePoss , combineSizes @@ -18,20 +18,36 @@ import Control.Lens import Data.Bifunctor import qualified Data.IntMap.Strict as IM --import qualified Data.IntSet as IS ---import qualified Data.Map.Strict as M +import qualified Data.Map.Strict as M import Data.Maybe -import Data.List (sort,scanl') +import Data.List (sort,scanl',sortOn) -combinationsTrie :: Trie CombineType Item +combinationsTrie :: Trie (Int,CombineType) Item combinationsTrie = foldr (uncurry insertInTrie) emptyTrie - $ map (first sort) itemCombinations + $ map (first (sortOn snd)) itemCombinations -lookupTypeTrie :: [CombineType] -> Maybe Item -lookupTypeTrie = flip lookupTrie combinationsTrie . sort +lookupTypeTrie :: [(CombineType,Int,Int)] -> Maybe ([Int],Item) +lookupTypeTrie = undefined + +lookupItems' :: [(CombineType,Int,Int)] -> [ ([Int],Item) ] +lookupItems' xs = lookupItems (sortOn (\(ct,_,_) -> ct) xs) combinationsTrie + +lookupItems :: [(CombineType,Int,Int)] -> Trie (Int,CombineType) Item -> [ ([Int],Item) ] +lookupItems [] t = maybeToList $ fmap ([],) $ _trieMVal t +lookupItems ((ct,i,n):xs) t = do + n' <- [1..min n 4] + let is = replicate n' i + concatMap (map (first (is ++)) . lookupItems xs) $ maybeToList (_trieChildren t M.!? (n',ct)) + +--lookupTypeTrie' :: [CombineType] -> Maybe Item +--lookupTypeTrie' = flip lookupTrie combinationsTrie . sort combineItemList :: IM.IntMap Item -> [([Int],Item)] -combineItemList = mapMaybe (pushOutMaybe . second lookupTypeTrie) - . listCombos +combineItemList = undefined + +--combineItemList :: IM.IntMap Item -> [([Int],Item)] +--combineItemList = mapMaybe (pushOutMaybe . second lookupTypeTrie) +-- . listCombos pushOutMaybe :: (a,Maybe b) -> Maybe (a,b) pushOutMaybe (_,Nothing) = Nothing @@ -54,8 +70,10 @@ invertListInv = IM.foldrWithKey (\k it -> ((_itType it, k, itStackAmount it) :) ) [] +combineItemListYou' :: World -> [([Int],Item)] +combineItemListYou' = combineItemList . yourInv combineItemListYou :: World -> [([Int],Item)] -combineItemListYou = combineItemList . yourInv +combineItemListYou = concatMap lookupItems' . invertListInvMult . yourInv toggleCombineInv :: World -> World toggleCombineInv w = case _inventoryMode w of diff --git a/src/Dodge/Combine/Combinations.hs b/src/Dodge/Combine/Combinations.hs index bf8e6ab22..244bce0af 100644 --- a/src/Dodge/Combine/Combinations.hs +++ b/src/Dodge/Combine/Combinations.hs @@ -1,40 +1,43 @@ +{-# LANGUAGE TupleSections #-} module Dodge.Combine.Combinations where import Dodge.Data import Dodge.Item.Weapon.BulletGuns import Dodge.Item.Weapon.Launcher -itemCombinations :: [([CombineType],Item)] +itemCombinations :: [([(Int,CombineType)],Item)] itemCombinations = - [ p [PIPE,HARDWARE] (bangStick 1) - , p [BANGSTICK 1,TIN] pistol - , p [PISTOL, SPRING, HARDWARE] autoPistol - , p [AUTOPISTOL, PLANK, HARDWARE] smg - , p [AUTOPISTOL, HARDWARE] machinePistol - , p [BANGSTICK 1,CAN] revolver - , p [REVOLVER, SPRING, HARDWARE] $ revolverX 1 + [ po [PIPE, HARDWARE] (bangStick 1) + , po [BANGSTICK 1, TIN] pistol + , po [PISTOL, SPRING, HARDWARE] autoPistol + , po [AUTOPISTOL, PLANK, HARDWARE] smg + , po [AUTOPISTOL, HARDWARE] machinePistol + , po [BANGSTICK 1,CAN] revolver + , po [REVOLVER, SPRING, HARDWARE] $ revolverX 1 - , p [PIPE,TUBE,HARDWARE] bangCone - , p [BANGCONE,PLANK] blunderbuss - , p [BLUNDERBUSS,TUBE] grapeShotCannon - , p [BANGCONE,PUMP,HARDWARE] $ grenadeLauncher 1 - , p [GRENADELAUNCHER 1,MOTOR,DRUM] $ grenadeLauncher 2 + , po [PIPE,TUBE,HARDWARE] bangCone + , po [BANGCONE,PLANK] blunderbuss + , po [BLUNDERBUSS,TUBE] grapeShotCannon + , po [BANGCONE,PUMP,HARDWARE] $ grenadeLauncher 1 + , po [GRENADELAUNCHER 1,MOTOR,DRUM] $ grenadeLauncher 2 - , p [PIPE,PIPE,HARDWARE] bangCane - , p [BANGCANE,PIPE,PIPE] (bangCaneX 2) - , p [BANGCANE,TIN] rifle - , p [RIFLE,SPRING,HARDWARE] autoRifle - , p [RIFLE,SPRING,CAN] assaultRifle - , p [BANGCANE,BANGCANE] miniGun + , p [p 2 PIPE,o HARDWARE] bangCane + , p [p 2 PIPE,o BANGCANE] (bangCaneX 2) + , po [BANGCANE,TIN] rifle + , po [RIFLE,SPRING,HARDWARE] autoRifle + , po [RIFLE,SPRING,CAN] assaultRifle + , po [BANGCANE,BANGCANE] miniGun - , p [PIPE,PIPE,PIPE,HARDWARE] bangRod - , p [BANGROD,PLANK,HARDWARE] elephantGun - , p [ELEPHANTGUN,HARDWARE,TIN] amr - , p [ELEPHANTGUN,HARDWARE,CAN] sniperRifle - , p [BANGROD,PLATE,DRUM,MOTOR] machineGun + , p [p 3 PIPE,o HARDWARE] bangRod + , po [BANGROD,PLANK,HARDWARE] elephantGun + , po [ELEPHANTGUN,HARDWARE,TIN] amr + , po [ELEPHANTGUN,HARDWARE,CAN] sniperRifle + , po [BANGROD,PLATE,DRUM,MOTOR] machineGun - , p [TUBE,TUBE,TUBE,HARDWARE] launcher + , p [p 3 TUBE,o HARDWARE] launcher ] - ++ map (\i -> ([PIPE,BANGSTICK i],bangStick (i+1))) [1..8] - ++ map (\i -> ([REVOLVERX i,CAN] ,revolverX (i+1))) [1..5] - ++ map (\i -> ([BANGCANEX i,PIPE,PIPE] ,bangCaneX (i+1))) [1..5] + ++ map (\i -> po [PIPE,BANGSTICK i] $ bangStick (i+1)) [1..8] + ++ map (\i -> po [REVOLVERX i,CAN] $ revolverX (i+1)) [1..5] + ++ map (\i -> p [o (BANGCANEX i),p 2 PIPE] $ bangCaneX (i+1)) [1..5] where p = (,) + po xs it = (map o xs,it) + o = (1,)