- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在随机射线跟踪器的情况下,我想将MC集成(路径跟踪,双向路径跟踪)与样本生成(均匀随机,分层,泊松,都会,...)分离。其中大多数已经实现,但是使用起来很繁琐。因此,我放弃了这一点,并尝试通过将采样的计算分为两个阶段来构建更好的东西:在SampleGen
中,允许您使用mk1d
和mk2d
函数请求随机值,然后为它们提供实际的Float
由采样算法决定。可以在SampleRun
中检查这些值以进行实际计算。这是一些带有分层采样器有趣部分的代码,它的使用是:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Control.Applicative
import Control.Monad.State.Strict
import Control.Monad.Primitive
import System.Random.MWC as MWC
-- allows to construct sampled computations
newtype SampleGen s m a = SampleGen (StateT s m a)
deriving ( Functor, Applicative, Monad
, MonadState s, MonadTrans )
-- allows to evaluate sampled computations constructed in SampleGen
newtype SampleRun s m a = SampleRun (StateT s m a)
deriving ( Functor, Applicative, Monad
, MonadState s )
-- a sampled computation, parametrized over the generator's state g,
-- the evaluator's state r, the underlying monad m and the result
-- type a
type Sampled g r m a = SampleGen g m (SampleRun r m a)
----------------------
-- Stratified Sampling
----------------------
-- | we just count the number of requested 1D samples
type StratGen = Int
-- | the pre-computed values and a RNG for additional ones
type StratRun m = ([Float], Gen (PrimState m))
-- | specialization of Sampled for stratified sampling
type Stratified m a = Sampled StratGen (StratRun m) m a
-- | gives a sampled value in [0..1), this is kind
-- of the "prime" value, upon which all computations
-- are built
mk1d :: PrimMonad m => Stratified m Float
mk1d = do
n1d <- get
put $ n1d + 1
return $ SampleRun $ do
fs <- gets fst
if length fs > n1d
then return (fs !! n1d)
else gets snd >>= lift . MWC.uniform
-- | gives a pair of stratified values, should really also
-- be a "prime" value, but here we just construct them
-- from two 1D samples for fun
mk2d :: (Functor m, PrimMonad m) => Stratified m (Float, Float)
mk2d = mk1d >>= \f1 -> mk1d >>= \f2 ->
return $ (,) <$> f1 <*> f2
-- | evaluates a stratified computation
runStratified
:: (PrimMonad m)
=> Int -- ^ number of samples
-> Stratified m a -- ^ computation to evaluate
-> m [a] -- ^ the values produced, a list of nsamples values
runStratified nsamples (SampleGen c) = do
(SampleRun x, n1d) <- runStateT c 0
-- let's just pretend I'd use n1d to actually
-- compute stratified samples
gen <- MWC.create
replicateM nsamples $ evalStateT x ([{- samples would go here #-}], gen)
-- estimate Pi by Monte Carlo sampling
-- mcPi :: (Functor m, PrimMonad m) => Sampled g r m Float
mcPi :: (Functor m, PrimMonad m) => Stratified m Float
mcPi = do
v <- mk2d
return $ v >>= \(x, y) -> return $ if x * x + y * y < 1 then 4 else 0
main :: IO ()
main = do
vs <- runStratified 10000 mcPi :: IO [Float]
print $ sum vs / fromIntegral (length vs)
mcPi
函数的当前形式具有类型
mcPi :: (Functor m, PrimMonad m) => Stratified m Float
mcPi :: (Functor m, PrimMonad m) => Sampled g r m Float
Sampled
上的四个类型参数并不是很漂亮,但是至少类似这样会有用。总而言之,我正在寻找可以独立于采样算法来表达
mcPi
之类的计算的东西,例如:
SampleGen
阶段保持任何状态,而在
SampleRun
阶段仅需要RNG
SampleGen
和
SampleRun
实现,以便仅在
SampleGen
和
SampleRun
之间发生的事情不同(向量的实际填充方式)
SampleRun
阶段将使用
lazy sample generation技术
MultiParamTypeClasses
和
TypeFamilies
对我来说还可以,但是我没有提出任何可以远程使用的东西。
最佳答案
我将从一个截然不同的问题开始,即“代码应该是什么样子?”,然后朝着“采样框架如何组合在一起”这个问题着手。
代码应该是什么样子mcPi
的定义应为
mcPi :: (Num s, Num p) => s -> s -> p
mcPi x y = if x * x + y * y < 1 then 4 else 0
simpleRandomProcess :: (Monad m, MonadCoinFlip m) => m Coin
simpleRandomProcess =
do
firstFlip <- flipACoin
case firstFlip of
Heads -> flipACoin
Tails -> firstFlip
data Coin = Heads | Tails
class MonadCoinFlip m where
flipACoin :: m Coin -- The coin should be fair
Monad
。
class MonadSample m where
sample :: m Float -- Should be on the interval [0..1)
MonadRandom
实现本质上需要在自己选择的某个范围内提供统一的随机
Int
。您的采样器将在间隔[0..1)上提供未知分布的
Float
样本。这足够不同,足以证明拥有自己的新课程。
Monad
Applicative
更改,我将为该类建议一个不同的名称
SampleSource
。
class SampleSource f where
sample :: f Float -- Should be on the interval [0..1)
sample
替换代码中的
mk1d
。
mk2d
也可以被替换,同样也不知道样本的来源。
sample2d
的替代品
mk2d
可以与任何
Applicative
样本源一起使用,不需要成为
Monad
。不需要
Monad
的原因是,它不会根据采样结果来决定要获取多少个样本,或者要做什么?它的计算结构是提前知道的。
sample2d :: (Applicative f, SampleSource f) => f (Float, Float)
sample2d = (,) <$> sample <*> sample
class SampleSource f where
sample :: f Float
sample2d :: f (Float, Float)
sample3d :: f (Float, Float, Float)
sample4d :: f (Float, Float, Float, Float)
class SampleSource f where
sample :: f Float
samples :: Int -> f (Vector Float)
SampleSource
。例如,我将为最差的示例源之一实现
SampleSource
。
newtype ZeroSampleSourceT m a = ZeroSampleSourceT {
unZeroSampleSourceT :: IdentityT m a
} deriving (MonadTrans, Monad, Functor, MonadPlus, Applicative, Alternative, MonadIO)
instance (Monad m) => SampleSource (ZeroSampleSourceT m a) where
sample = return 0
runZeroSampleSourceT :: (Monad m) => ZeroSampleSourceT m a -> m a
runZeroSampleSourceT = runIdentityT . unZeroSampleSourceT
Monad
是
Applicative
时,我改写
instance (Applicative f) => SampleSource (ZeroSampleSourceT f) where
sample = pure 0
SampleSource
。
newtype MWCUniformSampleSourceT m a = MWCUniformSampleSourceT m a {
unMWCUniformSampleSourceT :: ReaderT (Gen (PrimState m)) m a
} deriving (MonadTrans, Monad, Functor, MonadPlus, Applicative, Alternative, MonadIO)
runMWCUniformSampleSourceT :: MWCUniformSampleSourceT m a -> (Gen (PrimState m)) -> m a
runMWCUniformSampleSourceT = runReaderT . unMWCUniformSampleSourceT
-- MWC's uniform generates floats on the open-closed interval (0,1]
uniformClosedOpen :: PrimMonad m => Gen (PrimState m) -> m Float
uniformClosedOpen = fmap (\x -> x - 2**(-33)) . uniform
instance (PrimMonad m) => SampleSource (MWCUniformSampleSourceT m) where
sample = MWCUniformSampleSourceT . ReaderT $ uniformClosedOpen
Stratified
或
runStratified
,因为您的示例代码未包含针对它们的完整实现。
Applicative
接口,则可以提前测试整个计算将需要多少个样本。
class SampleSource f where
sample :: f Float
samples :: Int -> f ([Float])
sampleN :: Int -> f (Vector Float)
samplesN :: Int -> Int -> f ([Vector Float])
Applicative
查询语言。该语言将需要在
Applicative
已有功能的基础上添加两个功能。它需要能够重复请求,并且需要将样本请求分组在一起,以识别哪些分组是有意义的。它受以下代码的激励,该代码想要获取6个不同的2d样本,其中
sample2d
与我们的第一个定义相同。
take 6 (repeat sample2d)
take 6 (repeat sample) :: SampleSource f => [f Float]
[f a]
转到
f [a]
的方法。这已经存在;是
Data.Traversable
的
sequenceA
,要求
f
为
Applicative
。因此,我们已经从
Applicative
获得了重复。
sequenceA . take 6 . repeat $ sample2d
mark
中添加一个函数,该分组有意义。
sequenceA . take 6 . repeat . mark $ sample2d
class Mark f where
mark :: f a -> f a
class (Applicative f, Mark f, SampleSource f) => QueryableSampleSouce f where
TypeFamilies
。
class MonadQuery m where
type Query m :: * -> *
interpret :: (Query m a) -> m a
Applicative
查询语言的monad示例源的类
class (MonadQuery m, QueryableSampleSource (Query m), SampleSource m, Monad m) => MonadSample m where
interpret sample == sample
interpret (sequenceA a) = sequence (interpret a)
mark
,样本源就无法对查询做任何特别的事情。这意味着要对泊松磁盘对2d点进行特殊处理和对点集进行特殊处理的查询需要标记两次:
mark . sequenceA . take 6 . repeat . mark $ sample2d
Applicative
查询语言的排序方式与您的
StratGen
类型相对应;通过拥有一个很小的
Applicative
接口,它可以使您提前查看传入查询的结构。然后
Monad
与您的
StratRun
类型相对应。
关于haskell - 如何概括抽样框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24652230/
我需要开发一个简单的网站,我通常使用 bootstrap CSS 框架,但是我想使用 Gumbyn,它允许我使用 16 列而不是 12 列。 我想知道是否: 我可以轻松地改变绿色吗? 如何使用固定布局
这个问题在这里已经有了答案: 关闭 13 年前。 与直接编写 PHP 代码相比,使用 PHP 框架有哪些优点/缺点?
我开发了一个 Spring/JPA 应用程序:服务、存储库和域层即将完成。 唯一缺少的层是网络层。我正在考虑将 Playframework 2.0 用于 Web 层,但我不确定是否可以在我的 Play
我现有的 struts Web 应用程序具有单点登录功能。然后我将使用 spring 框架创建一个不同的 Web 应用程序。然后想要使用从 struts 应用程序登录的用户来链接新的 spring 应
我首先使用Spark框架和ORMLite处理网页上表单提交的数据,在提交中文字符时看到了unicode问题。我首先想到问题可能是由于ORMLite,因为我的MySQL数据库的字符集已设置为使用utf8
我有一个使用 .Net 4.5 功能的模块,我们的应用程序也适用于 XP 用户。所以我正在考虑将这个 .net 4.5 依赖模块移动到单独的项目中。我怎样才能有一个解决方案,其中有两个项目针对不同的版
我知道这是一个非常笼统的问题,但我想我并不是真的在寻找明确的答案。作为 PHP 框架的新手,我很难理解它。 Javascript 框架,尤其是带有 UI 扩展的框架,似乎通过将 JS 代码与设计分开来
我需要收集一些关于现有 ORM 解决方案的信息。 请随意编写任何编程语言。 你能谈谈你用过的最好的 ORM 框架吗?为什么它比其他的更好? 最佳答案 我使用了 NHibernate 和 Entity
除了 Apple 的 SDK 之外,还有什么强大的 iPhone 框架可供开始开发?有没有可以加快开发时间的方法? 最佳答案 此类框架最大的是Three20 。 Facebook 和许多其他公司都使用
有人可以启发我使用 NodeJS 的 Web 框架吗?我最近开始从免费代码营学习express js,虽然一切进展顺利,但我对express到底是什么感到困惑。是全栈框架吗?纯粹是为了后端吗?我发现您
您可以推荐哪种 Ajax 框架/工具包来构建使用 struts 的 Web 应用程序的 GUI? 最佳答案 我会说你的 AJAX/javascript 库选择应该较少取决于你的后端是如何实现的,而更多
我有生成以下错误的 python 代码: objc[36554]: Class TKApplication is implemented in both /Library/Frameworks/Tk.
首先,很抱歉,如果我问的问题很明显,因为我没有编程背景,那我去吧: 我想运行一系列测试场景并在背景部分声明了几个变量(我打印它们以仔细检查它们是否已正确声明),第一个是整数,另外两个字符串为你可以看到
在我们承担的一个项目中,我们正在寻找一个视频捕获和录制库。我们的基础工作(基于 google 搜索)表明 vlc (libvlc)、ffmpeg (libavcodec) 和 gstreamer 是三
我试过没有运气的情况下寻找某种功能来杀死/中断Play中的正常工作!框架。 我想念什么吗?还是玩了!实际没有添加此功能? 最佳答案 Java stop类中没有像Thread方法那样的东西,由于种种原因
我们希望在我们的系统中保留所有重大事件的记录。例如,在数据库可能存储当前用户状态的地方,事件日志应记录对该状态的所有更改以及更改发生的时间。 事件记录工具应该尽可能接近于事件引发器的零开销,应该容纳结
那里有 ActionScript 2.0/3.0 的测试框架列表吗? 最佳答案 2010-05-18 更新 由于这篇文章有点旧,而且我刚刚收到了赞成票,因此可能值得提供一些更新的信息,这样人们就不会追
我有一个巨大的 numpy 数组列表(一维),它们是不同事件的时间序列。每个点都有一个标签,我想根据其标签对 numpy 数组进行窗口化。我的标签是 0、1 和 2。每个窗口都有一个固定的大小 M。
我是 Play 的新手!并编写了我的第一个应用程序。这个应用程序有一组它依赖的 URL,从 XML 响应中提取数据并返回有效的 URL。 此应用程序需要在不同的环境(Dev、Staging 和 Pro
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我是一名优秀的程序员,十分优秀!