Advertisement
Guest User

Untitled

a guest
May 19th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 3.54 KB | None | 0 0
  1. type private baseSampler(n,sets, samplingMethod, length) =
  2.     let indexMap : ConcurrentDictionary<int,int> = new ConcurrentDictionary<int,int>()
  3.     let setMap : ConcurrentDictionary<int,int> = new ConcurrentDictionary<int,int>()
  4.     let samplerMap : (float*float*float)[][] = Array.init sets (fun i -> (samplingMethod n))
  5.     let n = n
  6.     let sets = sets
  7.     member this.length = length
  8.     member this.getNext (id:int) =
  9.         if indexMap.IsEmpty || (not (indexMap.ContainsKey(id)))
  10.         then
  11.             indexMap.TryAdd (id, (samplerMap.[0].Length-1)) |> ignore
  12.         if setMap.IsEmpty || (not (setMap.ContainsKey(id)))
  13.             then
  14.             setMap.TryAdd (id, ran.Next(0,samplerMap.Length-1))  |> ignore  
  15.        
  16.         let returnIndex = indexMap.Item id
  17.         let setIndex = setMap.Item id
  18.        
  19.         if returnIndex <= 0 // check if there are more samples left (0 if no)
  20.         then
  21.             let sampleSetLength = samplerMap.[0].Length-1
  22.             setMap.TryUpdate (id,ran.Next(0,samplerMap.Length-1), setIndex) |> ignore
  23.             indexMap.TryUpdate (id,sampleSetLength,returnIndex)  |> ignore
  24.  
  25.         indexMap.TryUpdate (id,returnIndex-1, returnIndex) |> ignore
  26.         samplerMap.[setIndex].[returnIndex]
  27.  
  28.     member this.getNextReg (id:int) =
  29.         if n = 1
  30.             then (0.5,0.5,0.0)
  31.         else
  32.         if indexMap.IsEmpty || (not (indexMap.ContainsKey(id)))
  33.         then
  34.             indexMap.TryAdd(id, this.length-1) |> ignore
  35.         let returnIndex = indexMap.Item id
  36.         if returnIndex = 0
  37.         then
  38.             indexMap.TryUpdate (id, this.length-1, returnIndex) |> ignore
  39.         indexMap.TryUpdate (id, returnIndex-1, returnIndex) |> ignore
  40.         samplerMap.[0].[returnIndex]
  41.  
  42.     interface ISampler with
  43.         member this.getNext id = this.getNext id
  44.         member this.length = length
  45.         member this.n = n
  46.         member this.sets = sets
  47.         member this.samplingMethod i = samplingMethod i
  48.    
  49. type private RegularSampler(n) =
  50.     inherit baseSampler(n, 1, mkRegular, n*n)
  51.     interface ISampler with
  52.         override this.getNext id = this.getNextReg id
  53.  
  54. type private RandomSampler(n, sets) =
  55.     inherit baseSampler(n, sets, mkRandom, n)
  56.  
  57. type private JitteredSampler(n, sets) =
  58.     inherit baseSampler(n, sets, mkJitter, n*n)
  59.  
  60. type private NRookSampler(n, sets) =
  61.     inherit baseSampler(n, sets, mkNRook, n)
  62.  
  63. type private MultiJittered(n, sets) =
  64.     inherit baseSampler(n, sets, mkMultiJitter, n*n)  
  65.  
  66. type private hemiSampler(sampler:ISampler, e) =
  67.     inherit baseSampler(sampler.n,sampler.sets,sampler.samplingMethod,sampler.length)
  68.     interface ISampler with
  69.         override this.samplingMethod i = transformToHemiMap (sampler.samplingMethod i) e
  70.    
  71. type private discSampler(sampler:ISampler) =
  72.     inherit baseSampler(sampler.n,sampler.sets,sampler.samplingMethod,sampler.length)
  73.     interface ISampler with
  74.         override this.samplingMethod i = transformToDiscMap (sampler.samplingMethod i)
  75.         override this.getNext id = this.getNext id
  76.  
  77. let mkRegularSampler n = new RegularSampler(n) :> ISampler
  78. let mkRandomSampler n sets = new RandomSampler(n, sets) :> ISampler
  79. let mkJitteredSampler n sets = new JitteredSampler(n, sets) :> ISampler
  80. let mkNRookSampler n sets = new NRookSampler(n, sets) :> ISampler
  81. let mkMultiJitteredSampler n sets = new MultiJittered(n, sets) :> ISampler
  82. let mkDiscSampler sampler:ISampler = new discSampler(sampler) :> ISampler
  83. let mkHemiSampler sampler:ISampler = new hemiSampler(sampler) :> ISampler
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement