Skip to content

Commit

Permalink
Add algorithm field in repository and repository update
Browse files Browse the repository at this point in the history
  • Loading branch information
dougppaz committed Jan 21, 2019
1 parent 2ccf7bf commit 7a44a41
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 17 deletions.
2 changes: 2 additions & 0 deletions bothub/api/v1/serializers/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class Meta:
'name',
'slug',
'language',
'algorithm',
'use_language_model_featurizer',
'use_competing_intents',
'categories',
Expand Down Expand Up @@ -64,6 +65,7 @@ class Meta:
'slug',
'language',
'available_languages',
'algorithm',
'use_language_model_featurizer',
'use_competing_intents',
'categories',
Expand Down
1 change: 1 addition & 0 deletions bothub/api/v2/repository/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ class Meta:
'request_authorization',
'available_request_authorization',
'languages_warnings',
'algorithm',
'use_language_model_featurizer',
'use_competing_intents',
]
Expand Down
2 changes: 1 addition & 1 deletion bothub/common/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class RepositoryUpdateInline(admin.TabularInline):

fields = [
'language',
'use_language_model_featurizer',
'algorithm',
'use_competing_intents',
'created_at',
'by',
Expand Down
47 changes: 47 additions & 0 deletions bothub/common/migrations/0028_auto_20190121_1250.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Generated by Django 2.1.3 on 2019-01-21 12:50

from django.db import migrations, models


def populate_algorithm(apps, *args):
from bothub.common.models import Repository as R
Repository = apps.get_model('common', 'Repository')
for repository in Repository.objects.all():
repository.algorithm = R.ALGORITHM_NEURAL_NETWORK_EXTERNAL \
if repository.use_language_model_featurizer else \
R.ALGORITHM_NEURAL_NETWORK_INTERNAL
repository.save(update_fields=['algorithm'])
for update in repository.updates.all():
update.algorithm = R.ALGORITHM_NEURAL_NETWORK_EXTERNAL \
if update.use_language_model_featurizer else \
R.ALGORITHM_NEURAL_NETWORK_INTERNAL
update.save(update_fields=['algorithm'])


class Migration(migrations.Migration):

dependencies = [
('common', '0027_repositorycategory_icon'),
]

operations = [
migrations.AddField(
model_name='repository',
name='algorithm',
field=models.CharField(choices=[('statistical_model', 'Statistical Model'), ('neural_network_internal', 'Neural Network with internal vocabulary'), ('neural_network_external', 'Neural Network with external vocabulary (BETA)')], default='statistical_model', max_length=24, verbose_name='algorithm'),
),
migrations.AddField(
model_name='repositoryupdate',
name='algorithm',
field=models.CharField(choices=[('statistical_model', 'Statistical Model'), ('neural_network_internal', 'Neural Network with internal vocabulary'), ('neural_network_external', 'Neural Network with external vocabulary (BETA)')], default='statistical_model', max_length=24, verbose_name='algorithm'),
),
migrations.RunPython(populate_algorithm),
migrations.RemoveField(
model_name='repository',
name='use_language_model_featurizer',
),
migrations.RemoveField(
model_name='repositoryupdate',
name='use_language_model_featurizer',
),
]
50 changes: 40 additions & 10 deletions bothub/common/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,24 @@ class Meta:
'the same purpose')
DESCRIPTION_HELP_TEXT = _('Tell what your bot do!')

ALGORITHM_STATISTICAL_MODEL = 'statistical_model'
ALGORITHM_NEURAL_NETWORK_INTERNAL = 'neural_network_internal'
ALGORITHM_NEURAL_NETWORK_EXTERNAL = 'neural_network_external'
ALGORITHM_CHOICES = [
(
ALGORITHM_STATISTICAL_MODEL,
_('Statistical Model'),
),
(
ALGORITHM_NEURAL_NETWORK_INTERNAL,
_('Neural Network with internal vocabulary'),
),
(
ALGORITHM_NEURAL_NETWORK_EXTERNAL,
_('Neural Network with external vocabulary (BETA)'),
),
]

uuid = models.UUIDField(
_('UUID'),
primary_key=True,
Expand All @@ -123,12 +141,12 @@ class Meta:
validators=[
languages.validate_language,
])
use_language_model_featurizer = models.BooleanField(
_('Use language model featurizer'),
help_text=_('You can use language featurizer to get words ' +
'similarity. You need less examples to create a great ' +
'bot.'),
default=True)
algorithm = models.CharField(
_('algorithm'),
max_length=24,
choices=ALGORITHM_CHOICES,
default=ALGORITHM_STATISTICAL_MODEL,
)
use_competing_intents = models.BooleanField(
_('Use competing intents'),
help_text=_('When using competing intents the confidence of the ' +
Expand Down Expand Up @@ -288,6 +306,10 @@ def admins(self):
]
return list(set(admins))

@property
def use_language_model_featurizer(self):
return self.algorithm != Repository.ALGORITHM_NEURAL_NETWORK_INTERNAL

def __str__(self):
return 'Repository {} - {}/{}'.format(
self.name,
Expand Down Expand Up @@ -389,7 +411,12 @@ class Meta:
validators=[
languages.validate_language,
])
use_language_model_featurizer = models.BooleanField(default=True)
algorithm = models.CharField(
_('algorithm'),
max_length=24,
choices=Repository.ALGORITHM_CHOICES,
default=Repository.ALGORITHM_STATISTICAL_MODEL,
)
use_competing_intents = models.BooleanField(default=False)
created_at = models.DateTimeField(
_('created at'),
Expand Down Expand Up @@ -525,6 +552,10 @@ def warnings(self):
self.RECOMMENDED_INTENTS))
return w

@property
def use_language_model_featurizer(self):
return self.algorithm != Repository.ALGORITHM_NEURAL_NETWORK_INTERNAL

def __str__(self):
return 'Repository Update #{}'.format(self.id)

Expand All @@ -542,14 +573,13 @@ def start_training(self, by):
self.validate_init_train(by)
self.by = by
self.training_started_at = timezone.now()
self.use_language_model_featurizer = self.repository \
.use_language_model_featurizer
self.algorithm = self.repository.algorithm
self.use_competing_intents = self.repository.use_competing_intents
self.save(
update_fields=[
'by',
'training_started_at',
'use_language_model_featurizer',
'algorithm',
'use_competing_intents',
])

Expand Down
16 changes: 10 additions & 6 deletions bothub/common/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -768,7 +768,7 @@ def setUp(self):
name='Test',
slug='test',
language=languages.LANGUAGE_EN,
use_language_model_featurizer=False)
algorithm=Repository.ALGORITHM_NEURAL_NETWORK_INTERNAL)

def test_be_true(self):
RepositoryExample.objects.create(
Expand Down Expand Up @@ -874,7 +874,8 @@ def test_entity_dont_have_min_examples(self):

def test_settings_change_exists_requirements(self):
self.repository.current_update().start_training(self.owner)
self.repository.use_language_model_featurizer = True
self.repository.algorithm = Repository \
.ALGORITHM_NEURAL_NETWORK_EXTERNAL
self.repository.save()
RepositoryExample.objects.create(
repository_update=self.repository.current_update(),
Expand Down Expand Up @@ -1124,7 +1125,7 @@ def setUp(self):
name='Test',
slug='test',
language=self.language,
use_language_model_featurizer=True)
algorithm=Repository.ALGORITHM_NEURAL_NETWORK_EXTERNAL)

RepositoryExample.objects.create(
repository_update=self.repository.current_update(),
Expand All @@ -1141,16 +1142,19 @@ def test_change_ready_for_train(self):
current_update.start_training(self.owner)
current_update.save_training(b'')
self.assertFalse(self.repository.ready_for_train)
self.repository.use_language_model_featurizer = False
self.repository.algorithm = Repository \
.ALGORITHM_NEURAL_NETWORK_INTERNAL
self.repository.save()
self.assertTrue(self.repository.ready_for_train)
self.repository.use_language_model_featurizer = True
self.repository.algorithm = Repository \
.ALGORITHM_NEURAL_NETWORK_EXTERNAL
self.repository.save()
self.assertFalse(self.repository.ready_for_train)

def test_equal_repository_value_after_train(self):
current_update = self.repository.current_update()
self.repository.use_language_model_featurizer = False
self.repository.algorithm = Repository \
.ALGORITHM_NEURAL_NETWORK_INTERNAL
self.repository.save()
current_update.start_training(self.owner)
current_update.save_training(b'')
Expand Down

0 comments on commit 7a44a41

Please sign in to comment.