front/models/experiment.js
import { Record } from 'immutable'
import axios from 'axios'
const ExperimentRecord = Record({
id: 0,
projectId: 0,
name: '',
config: {},
isActive: false,
createdAt: '',
updatedAt: '',
metrics: {}
})
export class Experiment extends ExperimentRecord {
static get (projectId, id) {
return new Promise((resolve, reject) => {
axios.get(`/api/projects/${projectId}/experiments/${id}`)
.then((res) => {
const experiment = Experiment.fromResponse(res.data)
resolve(experiment)
return experiment
})
.catch((err) => reject(err))
})
}
static getAll (projectId) {
return new Promise((resolve, reject) => {
axios.get(`/api/projects/${projectId}/experiments`)
.then((res) => {
const experiments = res.data.experiments.map(Experiment.fromResponse)
resolve(experiments)
return experiments
})
.catch((err) => reject(err))
})
}
static create (projectId, name, config, progressCallback = () => {}) {
const axiosConfig = { onUploadProgress: progressCallback }
const data = {
project_id: projectId,
name: name,
config: config
}
return new Promise((resolve, reject) => {
axios.post(`/api/projects/${projectId}/experiments`, data, axiosConfig)
.then((res) => {
const experiment = Experiment.fromResponse(res.data)
resolve(experiment)
return experiment
})
.catch((err) => reject(err))
})
}
delete () {
const url = `/api/projects/${this.projectId}/experiments/${this.id}`
return axios.delete(url)
}
update () {
const url = `/api/projects/${this.projectId}/experiments/${this.id}`
return axios.put(url, this.toRequest())
}
cancel () {
const url = `/api/projects/${this.projectId}/experiments/${this.id}/cancel`
return axios.post(url, this.toRequest())
}
downloadPolicy (epoch, format) {
const { projectId, id } = this
const url = `/api/projects/${projectId}/experiments/${id}/download`
window.location.href = `${url}?epoch=${epoch}&format=${format}`
}
static fromResponse (data) {
const experiment = new Experiment({
id: data.id,
projectId: data.project_id,
name: data.name,
config: JSON.parse(data.config),
isActive: data.is_active,
createdAt: data.created_at,
updatedAt: data.updated_at,
metrics: data.metrics
})
return experiment
}
toRequest () {
return {
id: this.id,
project_id: this.projectId,
name: this.name
}
}
}