val sunnyToday =Flip(0.2)println(VariableElimination.probability(sunnyToday,true))
Select
val language =Select(0.5->"Java",0.3->"Scala",0.2->"Python")println(VariableElimination.probability(language,"Scala"))
Binomial
val numSunnyDayInWeek =Binomial(7,0.5)println(VariableElimination.probability(numSunnyDayInWeek,3))
连续型
Normal 正态分布
val temperature =Normal(40,100)
val greaterThan50 =(d: Double)=> d >50println(Importance.probability(temperature, greaterThan50))
Uniform 连续均匀分布
val temperature2 =Uniform(10,81)println(Importance.probability(temperature2, greaterThan50))
2. 复合元素
If
val sunnyToday =Flip(0.2)
val greetingToday =If(sunnyToday,Select(0.6->"Hello World!",0.4->"Howdy, universe!"),Select(0.2->"Hello World!",0.8->"Oh no, not again!"))println(VariableElimination.probability(greetingToday,"Hello World!"))
sunnyToday.observe(true)println(VariableElimination.probability(greetingToday,"Hello World!"))
Dist
val goodMood =Dist(0.2->Flip(0.6),0.8->Flip(0.2))println(VariableElimination.probability(goodMood,true))
原子复合
val sunnyTodayProbability =Uniform(0,0.6)
val sunnyToday2 =Flip(sunnyTodayProbability)println(Importance.probability(sunnyToday2,true))
val tempMean =Normal(40,36)
val temperature =Normal(tempMean,100)println(Importance.probability(temperature,(d: Double)=> d >50))
Apply
val sunnyDaysInMonth =Binomial(30,0.2)
val getQuality =(i: Int)=>if(i >10)"good"elseif(i >5)"average"else"poor"
val monthQuality =Apply(sunnyDaysInMonth, getQuality)println(VariableElimination.probability(monthQuality,"good"))
val teamWinsInMonth =Binomial(5,0.4)
val monthQuality2 =Apply(sunnyDaysInMonth, teamWinsInMonth,(days: Int, wins: Int)=>{
val x = days * wins
if(x >20)"good"elseif(x >10)"average"else"poor"})println(VariableElimination.probability(monthQuality2,"good"))
Chain
val goodMood2 =Chain(monthQuality,(s: String)=>if(s =="good")Flip(0.9)elseif(s =="average")Flip(0.6)elseFlip(0.1))println(VariableElimination.probability(goodMood2,true))
val sunnyToday3 =Flip(0.2)
val goodMood3 =Chain(monthQuality, sunnyToday3,(quality: String, sunny: Boolean)=>{(quality, sunny) match {case("good",true)=>Flip(0.9)case("average",true)=>Flip(0.7)case(_,true)=>Flip(0.4)case("good",false)=>Flip(0.6)case("average",false)=>Flip(0.3)case(_,false)=>Flip(0.05)}})println(VariableElimination.probability(goodMood3,true))
3. 条件与约束
条件
val sunntDayInMonth =Binomial(30,0.2)
val monthQuality =Apply(sunntDayInMonth,(i: Int)=>if(i >10)"good"elseif(i >5)"average"else"poor")
val goodMood =Chain(monthQuality,(s: String)=>{if(s =="good")Flip(0.9)elseif(s =="average")Flip(0.6)elseFlip(0.1)})println(VariableElimination.probability(goodMood,true))// 设置条件,会清楚之前所有的条件
sunntDayInMonth.setCondition((i: Int)=> i >8)println(VariableElimination.probability(goodMood,true))// 添加条件
sunntDayInMonth.addCondition((i: Int)=> i %3==2)println(VariableElimination.probability(goodMood,true))// 移除条件
sunntDayInMonth.removeConditions()println(VariableElimination.probability(goodMood,true))
约束
goodMood.setConstraint((b: Boolean)=>if(b)0.5else1.0)println(VariableElimination.probability(goodMood,true))
val result1 =Flip(0.4)
val result2 =Flip(0.4)
val result3 =Flip(0.4)
val allWins =Apply(result1, result2, result3,(w1: Boolean, w2: Boolean, w3: Boolean)=> w1 && w2 && w3
)println(VariableElimination.probability(allWins,true))
def makeStreaky(r1: Element[Boolean], r2: Element[Boolean]): Unit ={
val pair =Apply(r1, r2,(b1: Boolean, b2: Boolean)=>(b1, b2))
pair.setConstraint((bb:(Boolean, Boolean))=>if(bb._1 == bb._2)1.0else0.5)}makeStreaky(result1, result2)makeStreaky(result2, result3)println(VariableElimination.probability(allWins,true))