Advertisement
Guest User

rain-sprinkler-wet

a guest
Jan 13th, 2015
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 4.13 KB | None | 0 0
  1. package cc.factorie.example
  2.  
  3. import cc.factorie.directed.{DirectedFactorWithStatistics1, DirectedFactorWithStatistics3, DirectedModel}
  4. import cc.factorie.infer.Maximize
  5. import cc.factorie.model.{Factor1, ItemizedModel, TupleFactorWithStatistics3}
  6. import cc.factorie.variable.{BooleanValue, BooleanVariable, MaximizeDiscrete, RefVariable}
  7.  
  8. import scala.util.Random
  9.  
  10. /**
  11.  * Created by ali on 1/13/15.
  12.  */
  13. object SimpleVDirected {
  14.   def main(args: Array[String]) {
  15.     implicit val model = DirectedModel()
  16.     implicit val random = new Random(0)
  17.  
  18.     val rain = new BooleanVariable()
  19.     val sprinkler = new BooleanVariable()
  20.     val wet = new BooleanVariable()
  21.  
  22.     val f1 = new DirectedFactorWithStatistics1(rain) {
  23.       val probability = 0.7
  24.       override def pr(v1: BooleanVariable#Value): Double = {
  25.         if (v1.booleanValue)
  26.           probability
  27.         else
  28.           1 - probability
  29.       }
  30.       override def sampledValue(implicit random: Random): BooleanVariable#Value = {
  31.         BooleanValue(random.nextDouble() < probability)
  32.       }
  33.     }
  34.     val f2 = new DirectedFactorWithStatistics1(sprinkler) {
  35.       val probability = 0.3
  36.       override def pr(v1: BooleanVariable#Value): Double = {
  37.         if (v1.booleanValue)
  38.           probability
  39.         else
  40.           1 - probability
  41.       }
  42.       override def sampledValue(implicit random: Random): BooleanVariable#Value = {
  43.         BooleanValue(random.nextDouble() < probability)
  44.       }
  45.     }
  46.  
  47.     val f3 = new DirectedFactorWithStatistics3(wet, rain, sprinkler) {
  48.       val cpt = Array(
  49.         // (sprinkler=f,sprinkler=t)
  50.         Array(0.1, 0.7),   // no rain
  51.         Array(0.8, 0.9)    // rain
  52.       )
  53.       override def pr(v1: BooleanVariable#Value, rainVal: BooleanVariable#Value, sprinklerVal: BooleanVariable#Value): Double = {
  54.         val probability = cpt(rainVal.intValue)(sprinklerVal.intValue)
  55.         if (v1.booleanValue) probability else 1 - probability
  56.       }
  57.       override def sampledValue(p1: BooleanVariable#Value, p2: BooleanVariable#Value)(implicit random: Random): BooleanVariable#Value = {
  58.         val probability = cpt(p1.intValue)(p2.intValue)
  59.         BooleanValue(random.nextDouble() < probability)
  60.       }
  61.     }
  62.  
  63.     // add factors to model
  64.     model ++= Seq(f1, f2, f3)
  65.  
  66.     // observed variables
  67.     wet := true
  68.  
  69.     val t = new RefVariable[BooleanVariable]()
  70.     t := rain
  71.  
  72.     Maximize(t.value)
  73.     // When add more observation, the result without maximize in equal to maximize result
  74.     println("Max " + t.value + " " + t.value.proportions(model))
  75.   }
  76. }
  77.  
  78. object SimpleVFactor {
  79.   def main(args: Array[String]) {
  80.     implicit val model = new ItemizedModel()
  81.     implicit val random = new Random(0)
  82.  
  83.     val rain = new BooleanVariable()
  84.     val sprinkler = new BooleanVariable()
  85.     val wet = new BooleanVariable()
  86.  
  87.     val f1 = new Factor1(rain) {
  88.       val probability = 0.7
  89.       override def score(v1: BooleanVariable#Value): Double = {
  90.         if (v1.booleanValue)
  91.           probability
  92.         else
  93.           1 - probability
  94.       }
  95.  
  96.       override type StatisticsType = this.type
  97.     }
  98.  
  99.     val f2 = new Factor1(rain) {
  100.       val probability = 0.3
  101.       override def score(v1: BooleanVariable#Value): Double = {
  102.         if (v1.booleanValue)
  103.           probability
  104.         else
  105.           1 - probability
  106.       }
  107.  
  108.       override type StatisticsType = this.type
  109.     }
  110.  
  111.     val f3 = new TupleFactorWithStatistics3(wet, rain, sprinkler) {
  112.       val cpt = Array(
  113.         // (sprinkler=f,sprinkler=t)
  114.         Array(0.1, 0.7),   // no rain
  115.         Array(0.8, 0.9)    // rain
  116.       )
  117.       override def score(v1: BooleanVariable#Value, v2: BooleanVariable#Value, v3: BooleanVariable#Value): Double = {
  118.         val probability = cpt(v2.intValue)(v3.intValue)
  119.         if (v1.booleanValue)
  120.           math.log(probability)
  121.         else
  122.           math.log(1 - probability)
  123.       }
  124.     }
  125.  
  126.     model ++= Seq(f1, f2, f3)
  127.     wet := true
  128.  
  129.     val t = new RefVariable[BooleanVariable]()
  130.     t := rain
  131.  
  132.     MaximizeDiscrete(rain, model)
  133.     println("Max " + t.value + " " + t.value.proportions(model))
  134.   }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement