Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 62ca9818 authored by hhakim's avatar hhakim
Browse files

Merge pyfaust.params and pyfaust.constraints into one sub-module...

Merge pyfaust.params and pyfaust.constraints into one sub-module pyfaust.factparams in order to simplify pkg organization.
parent 0ee027b9
Branches
Tags
No related merge requests found
......@@ -10,7 +10,7 @@ if(BUILD_DOCUMENTATION)
string(CONCAT DOXYGEN_FILE_PATTERNS ${DOXYGEN_FILE_PATTERNS} " Faust.m StoppingCriterion.m ConstraintGeneric.m ConstraintMat.m ConstraintReal.m ConstraintInt.m ConstraintName.m ParamsFact.m ParamsHierarchicalFact.m ParamsPalm4MSA.m FaustFactory.m norm_hadamard.m demo_fact_hadamard.m speed_up_hadamard.m construct_Faust_from_factors.m quick_start.m factorize_matrix.m speed_up_fourier.m Fig_BSL.m BSL.m Fig_runtime_comparison.m runtime_comparison.m runall.m")
endif()
if(BUILD_WRAPPER_PYTHON)
string(CONCAT DOXYGEN_FILE_PATTERNS ${DOXYGEN_FILE_PATTERNS} " __init__.py constraints.py params.py demo.py")
string(CONCAT DOXYGEN_FILE_PATTERNS ${DOXYGEN_FILE_PATTERNS} " __init__.py factparams.py demo.py")
endif()
configure_file(${FAUST_DOC_SRC_DIR}/Doxyfile.in ${PROJECT_BINARY_DIR}/doc/Doxyfile @ONLY)
# ./gen_doc/images/* files is duplicated in doc/html/ to call images documentation in the source code with relative path of image's files, from build directory.
......
@PYTHON_EXECUTABLE@ -m doxypypy.doxypypy -a -c %1 %2 | @PYTHON_EXECUTABLE@ py_filterout_namespace.py pyfaust.__init__. pyfaust.constraints. pyfaust.params. pyfaust.demo.
@PYTHON_EXECUTABLE@ -m doxypypy.doxypypy -a -c %1 %2 | @PYTHON_EXECUTABLE@ py_filterout_namespace.py pyfaust.__init__. pyfaust.factparams. pyfaust.demo.
#!/bin/bash
@PYTHON_EXECUTABLE@ -m doxypypy.doxypypy -a -c $* | @PYTHON_EXECUTABLE@ py_filterout_namespace.py pyfaust.__init__. pyfaust.constraints. pyfaust.params. pyfaust.demo.
@PYTHON_EXECUTABLE@ -m doxypypy.doxypypy -a -c $* | @PYTHON_EXECUTABLE@ py_filterout_namespace.py pyfaust.__init__. pyfaust.factparams. pyfaust.demo.
......@@ -435,9 +435,9 @@ class TestFaustFactory(unittest.TestCase):
def testFactPalm4MSA(self):
print("Test FaustFactory.fact_palm4msa()")
from pyfaust import FaustFactory;
from pyfaust.constraints import ConstraintReal,\
from pyfaust.factparams import ConstraintReal,\
ConstraintInt, ConstraintName
from pyfaust.params import ParamsPalm4MSA, StoppingCriterion
from pyfaust.factparams import ParamsPalm4MSA, StoppingCriterion
num_facts = 2
is_update_way_R2L = False
init_lambda = 1.0
......@@ -469,8 +469,8 @@ class TestFaustFactory(unittest.TestCase):
def testFactHierarch(self):
print("Test FaustFactory.fact_hierarchical()")
from pyfaust import FaustFactory
from pyfaust.params import ParamsHierarchicalFact, StoppingCriterion
from pyfaust.constraints import ConstraintReal, ConstraintInt,\
from pyfaust.factparams import ParamsHierarchicalFact, StoppingCriterion
from pyfaust.factparams import ConstraintReal, ConstraintInt,\
ConstraintName
num_facts = 4
is_update_way_R2L = False
......@@ -505,8 +505,8 @@ class TestFaustFactory(unittest.TestCase):
def testFactHierarchCplx(self):
print("Test FaustFactory.fact_hierarchicalCplx()")
from pyfaust import FaustFactory
from pyfaust.params import ParamsHierarchicalFact, StoppingCriterion
from pyfaust.constraints import ConstraintReal,\
from pyfaust.factparams import ParamsHierarchicalFact, StoppingCriterion
from pyfaust.factparams import ConstraintReal,\
ConstraintInt, ConstraintName
num_facts = 4
is_update_way_R2L = False
......@@ -543,8 +543,8 @@ class TestFaustFactory(unittest.TestCase):
def testFactPalm4MSACplx(self):
print("Test FaustFactory.fact_palm4msaCplx()")
from pyfaust import FaustFactory
from pyfaust.params import ParamsPalm4MSA,StoppingCriterion
from pyfaust.constraints import ConstraintReal,\
from pyfaust.factparams import ParamsPalm4MSA,StoppingCriterion
from pyfaust.factparams import ConstraintReal,\
ConstraintInt, ConstraintName
num_facts = 2
is_update_way_R2L = False
......
......@@ -1117,7 +1117,8 @@ class FaustFactory:
The Faust object result of the factorization.
Examples:
>>> from pyfaust import FaustFactory, ParamsPalm4MSA, ConstraintReal,\
>>> from pyfaust import FaustFactory
>>> from pyfaust.factparams import ParamsPalm4MSA, ConstraintReal,\
>>> ConstraintInt, ConstraintName, StoppingCriterion
>>> import numpy as np
>>> num_facts = 2
......@@ -1146,7 +1147,7 @@ class FaustFactory:
>>> print(norm(F.get_factor(1)[:,i]), end=end)
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
"""
if(not isinstance(p, pyfaust.params.ParamsPalm4MSA)):
if(not isinstance(p, pyfaust.factparams.ParamsPalm4MSA)):
raise ValueError("p must be a ParamsPalm4MSA object.")
FaustFactory._check_fact_mat('FaustFactory.fact_palm4msa()', M)
return Faust(core_obj=FaustCorePy.FaustFact.fact_palm4MSA(M, p))
......@@ -1164,7 +1165,8 @@ class FaustFactory:
The Faust object result of the factorization.
Examples:
>>> from pyfaust import FaustFactory, ParamsHierarchicalFact, ConstraintReal,\
>>> from pyfaust import FaustFactory
>>> from pyfaust.factparams import ParamsHierarchicalFact, ConstraintReal,\
>>> ConstraintInt, ConstraintName, StoppingCriterion
>>> import numpy as np
>>> num_facts = 4
......@@ -1199,7 +1201,7 @@ class FaustFactory:
- FACTOR 2 (real) SPARSE, size 32x32, density 0.09375, nnz 96
- FACTOR 3 (real) SPARSE, size 32x32, density 0.325195, nnz 333
"""
if(not isinstance(p, pyfaust.params.ParamsHierarchicalFact)):
if(not isinstance(p, pyfaust.factparams.ParamsHierarchicalFact)):
raise ValueError("p must be a ParamsHierarchicalFact object.")
FaustFactory._check_fact_mat('FaustFactory.fact_hierarchical()', M)
return Faust(core_obj=FaustCorePy.FaustFact.fact_hierarchical(M, p))
......
# -*- coding: utf-8 -*-
from pyfaust import *
"""
This module provides all the classes that represent the input parameters needed
by factorization algorithms FaustFactory.fact_palm4msa()
FaustFactory.fact_hierarchical()
"""
class ConstraintGeneric(object):
"""
This is the parent class for representing a factor constraint in FAµST factorization algorithms.
......@@ -171,3 +178,95 @@ class ConstraintName:
def is_mat_constraint(self):
return self.name in [ConstraintName.SUPP, ConstraintName.CONST ]
class ParamsFact(object):
def __init__(self, num_facts, is_update_way_R2L, init_lambda,
constraints, step_size, constant_step_size=False, is_verbose=False,
):
self.num_facts = num_facts
self.is_update_way_R2L = is_update_way_R2L
self.init_lambda = init_lambda
self.step_size = step_size
self.constraints = constraints
self.is_verbose = is_verbose
self.constant_step_size = constant_step_size
class ParamsHierarchicalFact(ParamsFact):
def __init__(self, num_facts, is_update_way_R2L, init_lambda,
fact_constraints, res_constraints, data_num_rows,
data_num_cols, stop_crits,
step_size=10.0**-16, constant_step_size=False,
is_verbose=False,
is_fact_side_left = False):
constraints = fact_constraints + res_constraints
super(ParamsHierarchicalFact, self).__init__(num_facts,
is_update_way_R2L,
init_lambda,
constraints, step_size,
constant_step_size,
is_verbose)
self.data_num_rows = data_num_rows
self.data_num_cols = data_num_cols
self.stop_crits = stop_crits
self.is_fact_side_left = is_fact_side_left
#TODO: verify number of constraints is consistent with num_facts in
if((not isinstance(stop_crits, list) and not isinstance(stop_crits,
tuple)) or
len(stop_crits) != 2 or
not isinstance(stop_crits[0],StoppingCriterion) or not
isinstance(stop_crits[1],StoppingCriterion)):
raise TypeError('ParamsHierarchicalFact stop_crits argument must be a list/tuple of two '
'StoppingCriterion objects')
if((not isinstance(constraints, list) and not isinstance(constraints,
tuple)) or
np.array([not isinstance(constraints[i],ConstraintGeneric) for i in
range(0,len(constraints))]).any()):
raise TypeError('constraints argument must be a list/tuple of '
'ConstraintGeneric (or subclasses) objects')
class ParamsPalm4MSA(ParamsFact):
def __init__(self, num_facts, is_update_way_R2L, init_lambda,
constraints, stop_crit, init_facts=None, step_size=10.0**-16,
constant_step_size=False,
is_verbose=False):
super(ParamsPalm4MSA, self).__init__(num_facts, is_update_way_R2L,
init_lambda,
constraints, step_size,
constant_step_size,
is_verbose)
if(init_facts != None and (not isinstance(init_facts, list) and not isinstance(init_facts,
tuple) or
len(init_facts) != num_facts)):
raise ValueError('ParamsPalm4MSA init_facts argument must be a '
'list/tuple of '+str(num_facts)+" (num_facts) arguments.")
else:
self.init_facts = init_facts
if(not isinstance(stop_crit, StoppingCriterion)):
raise TypeError('ParamsPalm4MSA stop_crit argument must be a StoppingCriterion '
'object')
self.stop_crit = stop_crit
#TODO: verify number of constraints is consistent with num_facts
class StoppingCriterion(object):
def __init__(self, is_criterion_error = False , error_treshold = 0.3,
num_its = 500,
max_num_its = 1000):
self.is_criterion_error = is_criterion_error
self.error_treshold = error_treshold
self.num_its = num_its
self.max_num_its = max_num_its
#TODO: check_validity() like C++ code does
if(is_criterion_error and num_its != 500):
raise ValueError("It's forbidden to set a number of iterations as stopping"
" criterion when is_criterion_error == True.")
elif(not is_criterion_error and (max_num_its != 1000 or error_treshold
!= 0.3)):
raise ValueError("When is_criterion_error == True it's forbidden to use"
" other arguments than num_its argument to define "
"the stopping criterion.")
# -*- coding: utf-8 -*-
from pyfaust import *
from pyfaust.constraints import *
class ParamsFact(object):
def __init__(self, num_facts, is_update_way_R2L, init_lambda,
constraints, step_size, constant_step_size=False, is_verbose=False,
):
self.num_facts = num_facts
self.is_update_way_R2L = is_update_way_R2L
self.init_lambda = init_lambda
self.step_size = step_size
self.constraints = constraints
self.is_verbose = is_verbose
self.constant_step_size = constant_step_size
class ParamsHierarchicalFact(ParamsFact):
def __init__(self, num_facts, is_update_way_R2L, init_lambda,
fact_constraints, res_constraints, data_num_rows,
data_num_cols, stop_crits,
step_size=10.0**-16, constant_step_size=False,
is_verbose=False,
is_fact_side_left = False):
constraints = fact_constraints + res_constraints
super(ParamsHierarchicalFact, self).__init__(num_facts,
is_update_way_R2L,
init_lambda,
constraints, step_size,
constant_step_size,
is_verbose)
self.data_num_rows = data_num_rows
self.data_num_cols = data_num_cols
self.stop_crits = stop_crits
self.is_fact_side_left = is_fact_side_left
#TODO: verify number of constraints is consistent with num_facts in
if((not isinstance(stop_crits, list) and not isinstance(stop_crits,
tuple)) or
len(stop_crits) != 2 or
not isinstance(stop_crits[0],StoppingCriterion) or not
isinstance(stop_crits[1],StoppingCriterion)):
raise TypeError('ParamsHierarchicalFact stop_crits argument must be a list/tuple of two '
'StoppingCriterion objects')
if((not isinstance(constraints, list) and not isinstance(constraints,
tuple)) or
np.array([not isinstance(constraints[i],ConstraintGeneric) for i in
range(0,len(constraints))]).any()):
raise TypeError('constraints argument must be a list/tuple of '
'ConstraintGeneric (or subclasses) objects')
class ParamsPalm4MSA(ParamsFact):
def __init__(self, num_facts, is_update_way_R2L, init_lambda,
constraints, stop_crit, init_facts=None, step_size=10.0**-16,
constant_step_size=False,
is_verbose=False):
super(ParamsPalm4MSA, self).__init__(num_facts, is_update_way_R2L,
init_lambda,
constraints, step_size,
constant_step_size,
is_verbose)
if(init_facts != None and (not isinstance(init_facts, list) and not isinstance(init_facts,
tuple) or
len(init_facts) != num_facts)):
raise ValueError('ParamsPalm4MSA init_facts argument must be a '
'list/tuple of '+str(num_facts)+" (num_facts) arguments.")
else:
self.init_facts = init_facts
if(not isinstance(stop_crit, StoppingCriterion)):
raise TypeError('ParamsPalm4MSA stop_crit argument must be a StoppingCriterion '
'object')
self.stop_crit = stop_crit
#TODO: verify number of constraints is consistent with num_facts
class StoppingCriterion(object):
def __init__(self, is_criterion_error = False , error_treshold = 0.3,
num_its = 500,
max_num_its = 1000):
self.is_criterion_error = is_criterion_error
self.error_treshold = error_treshold
self.num_its = num_its
self.max_num_its = max_num_its
#TODO: check_validity() like C++ code does
if(is_criterion_error and num_its != 500):
raise ValueError("It's forbidden to set a number of iterations as stopping"
" criterion when is_criterion_error == True.")
elif(not is_criterion_error and (max_num_its != 1000 or error_treshold
!= 0.3)):
raise ValueError("When is_criterion_error == True it's forbidden to use"
" other arguments than num_its argument to define "
"the stopping criterion.")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment