simulate to a thousands simulations

This commit is contained in:
Julien Calixte
2023-07-25 00:37:50 +02:00
parent eaac5520e8
commit 00ccbe21a7
5 changed files with 101 additions and 23 deletions

View File

@@ -5,7 +5,7 @@ import { Strategy } from '@/modules/lean/strategy'
import { FeatureState } from '@/store-type' import { FeatureState } from '@/store-type'
import { getMean, pickRandomElement, popNElement, shuffleArray } from '@/utils' import { getMean, pickRandomElement, popNElement, shuffleArray } from '@/utils'
const MAX_FEATURES = 30 const MAX_FEATURES = 200
const HARD_STOP = 5000 const HARD_STOP = 5000
const hasQualityIssue = ({ const hasQualityIssue = ({
@@ -22,7 +22,7 @@ const hasQualityIssue = ({
daysWithProblemSolving daysWithProblemSolving
) )
let multiplicator = getOverburdenMultiplicator(tasksInParallel) const multiplicator = getOverburdenMultiplicator(tasksInParallel)
const quality = Math.random() const quality = Math.random()
return quality > qualityProbability / multiplicator return quality > qualityProbability / multiplicator

View File

@@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { useSimulationStore } from '@/modules/simulation/simulation-store' import { useSimulationStore } from '@/modules/simulation/simulation-store'
const simulationStore = useSimulationStore() const simulationStore = useSimulationStore()
const NUMBER_OF_SIMULATION = 300 const NUMBER_OF_SIMULATION = 1000
</script> </script>
<template> <template>

View File

@@ -31,6 +31,30 @@ const simulationStore = useSimulationStore()
{{ simulationStore.meanPullDPSLeadTime }} {{ simulationStore.meanPullDPSLeadTime }}
</td> </td>
</tr> </tr>
<tr>
<td>Complexity</td>
<td>
{{ simulationStore.meanPushComplexity }}
</td>
<td>
{{ simulationStore.meanPullComplexity }}
</td>
<td>
{{ simulationStore.meanPullDPSComplexity }}
</td>
</tr>
<tr>
<td>Quality issue</td>
<td>
{{ simulationStore.meanPushQuality }}
</td>
<td>
{{ simulationStore.meanPullQuality }}
</td>
<td>
{{ simulationStore.meanPullDPSQuality }}
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@@ -1,15 +1,30 @@
import { featureSteps } from '@/modules/feature/feature-steps' import { featureSteps } from '@/modules/feature/feature-steps'
import { Strategy } from '@/modules/lean/strategy' import { Strategy } from '@/modules/lean/strategy'
import { Dashboard, Meta } from '@/store-type' import { Dashboard, Meta } from '@/store-type'
import { getMean } from '@/utils' import { getRound } from '@/utils'
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
type Mean = {
leadTimeSum: number
complexitySum: number
qualityIssueSum: number
simulations: number
}
type State = { type State = {
dashboards: Dashboard[] dashboards: Dashboard[]
requestedSimulation: number requestedSimulation: number
simulationsDone: number simulationsDone: number
mean: Record<Strategy, Mean>
} }
const newMean = (): Mean => ({
leadTimeSum: 0,
complexitySum: 0,
qualityIssueSum: 0,
simulations: 0
})
const instance = new ComlinkWorker<typeof import('../feature/feature-board')>( const instance = new ComlinkWorker<typeof import('../feature/feature-board')>(
new URL('../feature/feature-board', import.meta.url) new URL('../feature/feature-board', import.meta.url)
) )
@@ -29,7 +44,12 @@ export const useSimulationStore = defineStore('dashboard', {
return { return {
dashboards: [], dashboards: [],
requestedSimulation: 0, requestedSimulation: 0,
simulationsDone: 0 simulationsDone: 0,
mean: {
push: newMean(),
pull: newMean(),
'problem-solving': newMean()
}
} }
}, },
actions: { actions: {
@@ -55,7 +75,7 @@ export const useSimulationStore = defineStore('dashboard', {
a.qualityIssue > b.qualityIssue ? -1 : 1 a.qualityIssue > b.qualityIssue ? -1 : 1
) )
this.newDashboard({ const dashboard: Dashboard = {
uuid: new Date().getTime().toString(), uuid: new Date().getTime().toString(),
meta: newState.meta, meta: newState.meta,
analysis: { analysis: {
@@ -67,7 +87,13 @@ export const useSimulationStore = defineStore('dashboard', {
worstFeature, worstFeature,
strategy strategy
} }
}) }
this.newDashboard(dashboard)
this.mean[strategy].leadTimeSum += dashboard.analysis.meanLeadTime
this.mean[strategy].complexitySum += dashboard.analysis.meanComplexity
this.mean[strategy].qualityIssueSum += dashboard.analysis.meanQualityIssue
this.mean[strategy].simulations++
}, },
async multiSimulation(simulations: number, strategy: Strategy) { async multiSimulation(simulations: number, strategy: Strategy) {
this.requestedSimulation += simulations this.requestedSimulation += simulations
@@ -82,26 +108,51 @@ export const useSimulationStore = defineStore('dashboard', {
}, },
getters: { getters: {
meanPushLeadTime: (state) => { meanPushLeadTime: (state) => {
return getMean( return getRound(state.mean.push.leadTimeSum, state.mean.push.simulations)
state.dashboards
.filter((dashboard) => dashboard.analysis.strategy === 'push')
.map((dashboard) => dashboard.analysis.meanLeadTime)
)
}, },
meanPullLeadTime: (state) => { meanPullLeadTime: (state) => {
return getMean( return getRound(state.mean.pull.leadTimeSum, state.mean.pull.simulations)
state.dashboards
.filter((dashboard) => dashboard.analysis.strategy === 'pull')
.map((dashboard) => dashboard.analysis.meanLeadTime)
)
}, },
meanPullDPSLeadTime: (state) => { meanPullDPSLeadTime: (state) => {
return getMean( return getRound(
state.dashboards state.mean['problem-solving'].leadTimeSum,
.filter( state.mean['problem-solving'].simulations
(dashboard) => dashboard.analysis.strategy === 'problem-solving'
) )
.map((dashboard) => dashboard.analysis.meanLeadTime) },
meanPushComplexity: (state) => {
return getRound(
state.mean.push.complexitySum,
state.mean.push.simulations
)
},
meanPullComplexity: (state) => {
return getRound(
state.mean.pull.complexitySum,
state.mean.pull.simulations
)
},
meanPullDPSComplexity: (state) => {
return getRound(
state.mean['problem-solving'].complexitySum,
state.mean['problem-solving'].simulations
)
},
meanPushQuality: (state) => {
return getRound(
state.mean.push.qualityIssueSum,
state.mean.push.simulations
)
},
meanPullQuality: (state) => {
return getRound(
state.mean.pull.qualityIssueSum,
state.mean.pull.simulations
)
},
meanPullDPSQuality: (state) => {
return getRound(
state.mean['problem-solving'].qualityIssueSum,
state.mean['problem-solving'].simulations
) )
} }
} }

View File

@@ -1,6 +1,9 @@
export const getMean = (data: number[]) => export const getMean = (data: number[]) =>
Math.round(100 * (sumElements(data) / data.length)) / 100 Math.round(100 * (sumElements(data) / data.length)) / 100
export const getRound = (data: number, total: number) =>
Math.round(100 * (data / total)) / 100
export const clone = (data: any) => JSON.parse(JSON.stringify(data)) export const clone = (data: any) => JSON.parse(JSON.stringify(data))
export const shuffleArray = <T>(array: T[]) => { export const shuffleArray = <T>(array: T[]) => {