2012-11-16 11 views
5

मेरे हैकेल प्रोग्राम को प्रोफाइल करने के बाद, मैंने पाया है कि प्रोग्राम में 66% समय सूचियों में अनुक्रमणित किया जाता है। समाधान डेटा.वेक्टर का उपयोग कर रहा है, लेकिन मुझे कनवर्ट करने में समस्या आ रही है: जब मैं वेक्टर का उपयोग करने के लिए कोड बदलता हूं तो यह टन और बहुत मेमोरी का उपयोग करता है, और इतनी बुरी तरह लटकता है कि मैं इसे भी प्रोफ़ाइल नहीं कर सकता। इसका कारण क्या हो सकता है? मैं गलत क्या कर रहा हूँ https://github.com/drew-gross/Blokus-AI/blob/convert-to-vector/Grid.hsहास्केल - सूची से डेटा में कनवर्ट करना। वेक्टर

कोई भी विचार: यह बदलने में https://github.com/drew-gross/Blokus-AI/blob/master/Grid.hs

और मेरे प्रयास:

यहाँ फ़ाइल मैं परिवर्तित करना है होगा? या कम से कम, कहाँ देखना है?

उत्तर

6
makeEmptyGrid width height defaultCell = Grid (Data.Vector.take arraySize $ fromList $ repeat defaultCell) width height 

यह वहां एक हत्यारा है। fromList एक संपूर्ण सूची को Vector पर परिवर्तित करता है, लेकिन repeat defaultCell एक अनंत सूची है।

makeEmptyGrid width height defaultCell = Grid (fromListN arraySize $ repeat defaultCell) width height 

या

makeEmptyGrid width height defaultCell = Grid (fromList $ replicate arraySize defaultCell) width height 

कि ठीक होगा।

बाकी पर एक सरसरी देखो के परिणामस्वरूप आगे स्पष्ट जाल नहीं हुआ, लेकिन मैं आसानी से कुछ को अनदेखा कर सकता हूं।

+0

धन्यवाद! उस और एक ही समस्या में एक ही समस्या ने हल किया। – Drew

5

यह डैनियल पर एक अतिरिक्त विचार है। ऐसा लगता है कि आपके Grids केवल Colors थे, शायद यह एक छोटे 'ग्रिड' के लिए बहुत कुछ नहीं करेगा, लेकिन Color के लिए Unbox उदाहरण बनाने के लिए तुलनात्मक रूप से आसान है। फिर एक ग्रिड में एक अनबॉक्स किए गए सरणी होगी। Grid.hs में आप Data.Vector के बजाय Data.Vector.Unboxed आयात करेंगे। यह कई कारणों से सामान्य अधिक में बेहतर है, लेकिन आपको कई परिभाषाओं पर Unbox a => बाधा डालने की आवश्यकता होगी। इसका परिणाम हो सकता है यदि आप Color की तुलना में किसी अन्य प्रकार की चीज़ों से भरे ग्रिड में 'मानचित्र' बनाना चाहते हैं, जब तक कि इसमें Unbox उदाहरण न हो।

नीचे मैं केवल vector-th-unbox से TH incantation जोड़ता हूं (मैंने हाल ही में उस पैकेज के बारे में सीखा है, और इस अवसर को फिर से परीक्षण करने के लिए अवसर ले रहा हूं) और दो आवश्यक परिभाषाएं। Data.Vector.Unboxed.Base में बूल इंस्टेंस के बाद इसे हाथ से लिखना ज्यादा कठिन नहीं होगा।

{-#LANGUAGE TemplateHaskell, TypeFamilies, MultiParamTypeClasses#-} 
module Color where 

import Display 
import Data.Vector.Unboxed.Deriving 
import qualified Data.Vector.Unboxed as V 
import qualified Data.Vector.Generic   as G 
import qualified Data.Vector.Generic.Mutable as M 
import Data.Word (Word8) 

data Color = Yellow | Red | Green | Blue | Empty  
      deriving (Show, Eq, Ord, Enum, Bounded) 

fromColor :: Color -> Word8 
{-# INLINE fromColor #-} 
fromColor = fromIntegral . fromEnum 

toColor :: Word8 -> Color 
{-# INLINE toColor #-} 
toColor x | x < 5 = toEnum (fromIntegral x) 
toColor _ = Empty 

derivingUnbox "Color" 
    [t| Color -> Word8 |] 
    [| fromColor |] 
    [| toColor |] 

-- test 
colorCycle :: Int -> V.Vector Color 
colorCycle n = V.unfoldr colorop 0 where 
    colorop m | m < n = Just (toColor (fromIntegral (m `mod` 5)),m+1) 
    colorop _ = Nothing 
-- *Colour> colorCycle 12 
-- fromList [Yellow,Red,Green,Blue,Empty,Yellow, 
-- Red,Green,Blue,Empty,Yellow,Red] 

colorBlack = "\ESC[0;30m" 
colorRed = "\ESC[0;31m" 
colorGreen = "\ESC[0;32m" 
colorYellow = "\ESC[0;33m" 
colorBlue = "\ESC[0;34m" 

instance Display Color where 
    display Red = colorRed ++ "R" ++ colorBlack 
    display Green = colorGreen ++ "G" ++ colorBlack 
    display Yellow = colorYellow ++ "Y" ++ colorBlack 
    display Blue = colorBlue ++ "B" ++ colorBlack 
    display Empty = "." 

संपादित करें: पूर्ववर्ती 0.1 निम्नलिखित टेम्पलेट vector-th-unbox के संस्करणों में इस्तेमाल किया गया था:

derivingUnbox "Color" 
    [d| instance Unbox' (Color) Word8 |] 
    [| fromColor |] 
    [| toColor |] 
संबंधित मुद्दे